[
  {
    "path": ".github/workflows/main.yml",
    "content": "name: CI\n\non: [pull_request, push]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v1\n    - uses: actions/setup-node@v1\n      with:\n        node-version: '10.x'\n    - run: npm install\n    - run: npm run build\n    - run: npm test\n\n"
  },
  {
    "path": ".gitignore",
    "content": "coverage\nnode_modules\n.nyc_output/\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Brian Folts\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."
  },
  {
    "path": "README.md",
    "content": "# plantcode\n\nProvides a command line utility to generate code in various languages given a plantuml class diagram.\n\n## Command line options\n\n```shell\nUsage: plantcode [options] <inputFile>\n\nGenerates classfile(s) for the provided PlantUML file specified by <input_file>\nand writes to standard output.\n\nOptions:\n  -l, --language <language>          name of the programming language\n                                     which the produced class files\n                                     will be written in\n  -o, --out <output_path>            the path to output the file(s) to\n      --show-languages               displays all the current supported\n                                     programming languages for use\n                                     for with the language option\n  -h, --help                         print help and exit\n```\n\nThe currently supported languages are\n* CoffeeScript (coffeescript) [default]\n* C# (csharp)\n* ECMAScript5 (javascript)\n* ECMAScript6 (javascript2.0)\n* Java (java)\n* PHP (php)\n* Python (python)\n* Ruby (ruby)\n* TypeScript (typescript)\n* Swift (swift)\n* Kotlin (kotlin)\n\n## PEG.js\nThe most recent version of [PlantUML](http://plantuml.sourceforge.net/) does not have a defined grammar to use with\nparsing the PlantUML code. Below is a guess as to what the grammer for\nthe language should be, relative to the [PEG.js](https://github.com/dmajda/pegjs) parser. This creates\na parser which is then used in the creation of all output files. This grammar should validate to any valid PlantUML file.\n\n```\nplantumlfile\n  = items:((noise newline { return null }) / (noise \"@startuml\" noise newline filelines:umllines noise \"@enduml\" noise { var UMLBlock = require(\"./UMLBlock\"); return new UMLBlock(filelines) }))* { for (var i = 0; i < items.length; i++) { if (items[i] === null) { items.splice(i, 1); i--; } } return items }\numllines\n  = lines:(umlline*) { for (var i = 0; i < lines.length; i++) { if (lines[i]===null) { lines.splice(i, 1); i--; } } return lines; }\numlline\n  = propertyset newline { return null }\n  / titleset newline { return null }\n  / noise newline { return null }\n  / commentline { return null }\n  / noteline { return null }\n  / hideline newline { return null }\n  / skinparams newline { return null }\n  / declaration:packagedeclaration newline { return declaration }\n  / declaration:namespacedeclaration newline { return declaration }\n  / declaration:classdeclaration newline { return declaration }\n  / declaration:interfacedeclaration newline { return declaration }\n  / declaration:abstractclassdeclaration newline { return declaration }\n  / declaration:memberdeclaration newline { return declaration }\n  / declaration:connectordeclaration newline { return declaration }\nhideline\n  = noise \"hide empty members\" noise\nskinparams\n  = noise \"skinparam\" noise [^\\r\\n]+\nconnectordeclaration\n  = noise leftObject:objectname noise connectordescription? noise connector:connectortype noise connectordescription? noise rightObject:objectname noise ([:] [^\\r\\n]+)? { var Connection = require(\"./Connection\"); return new Connection(leftObject, connector, rightObject) }\nconnectordescription\n  = noise [\"]([\\\\][\"]/[^\"])*[\"] noise\ntitleset\n  = noise \"title \" noise [^\\r\\n]+ noise\ncommentline\n  = noise \"'\" [^\\r\\n]+ noise\n  / noise \"..\" [^\\r\\n\\.]+ \"..\" noise\n  / noise \"--\" [^\\r\\n\\-]+ \"--\" noise\n  / noise \"__\" [^\\r\\n\\_]+ \"__\" noise\nnoteline\n  = noise \"note \" noise [^\\r\\n]+ noise\nconnectortype\n  = item:extends { return item }\n  / concatenates { var Composition = require(\"./Composition\"); return new Composition() }\n  / aggregates { var Aggregation = require(\"./Aggregation\"); return new Aggregation() }\n  / connectorsize { return null }\nextends\n  = \"<|\" connectorsize { var Extension = require(\"./Extension\"); return new Extension(true) }\n  / connectorsize \"|>\" { var Extension = require(\"./Extension\"); return new Extension(false) }\nconnectorsize\n  = \"..\"\n  / \"-up-\"\n  / \"-down-\"\n  / \"-left-\"\n  / \"-right-\"\n  / \"---\"\n  / \"--\"\n  / [.]\n  / [-]\nconcatenates\n  = \"*\" connectorsize\n  / connectorsize [*]\naggregates\n  = \"o\" connectorsize\n  / connectorsize [o]\nstartblock\n  = noise [{] noise\nendblock\n  = noise [}]\npropertyset\n  = \"setpropname.*\"\npackagedeclaration\n  = \"package \" objectname startblock newline umllines endblock\n  / \"package \" objectname newline umllines \"end package\"\nabstractclassdeclaration\n  = noise \"abstract \" noise \"class \"? noise classname:objectname noise startblock lines:umllines endblock { var AbstractClass = require(\"./AbstractClass\"); return new AbstractClass(classname, lines) }\n  / noise \"abstract \" noise \"class \"? noise classname:objectname noise { var AbstractClass = require(\"./AbstractClass\"); return new AbstractClass(classname) }\n  / noise \"abstract \" noise \"class \"? noise classname:objectname noise newline noise lines:umllines \"end class\" { var AbstractClass = require(\"./AbstractClass\"); return new AbstractClass(classname, lines) }\nnoise\n  = [ \\t]*\nnewline\n  = [\\r\\n]\n  / [\\n]\nclassdeclaration\n  = noise \"class \" noise classname:objectname noise startblock lines:umllines endblock { var Class = require(\"./Class\"); return new Class(classname, lines) }\n  / noise \"class \" noise classname:objectname noise \"<<\" noise [^>]+ noise \">>\" noise { var Class = require(\"./Class\"); return new Class(classname) }\n  / noise \"class \" noise classname:objectname noise { var Class = require(\"./Class\"); return new Class(classname) }\n  / noise \"class \" noise classname:objectname noise newline noise lines:umllines \"end class\" { var Class = require(\"./Class\"); return new Class(classname, lines) }\ninterfacedeclaration\n  = noise \"interface \" noise interfacename:objectname noise startblock lines:umllines endblock { var Interface = require(\"./Interface\"); return new Interface(interfacename, lines) }\n  / noise \"interface \" noise interfacename:objectname noise \"<<\" noise [^>]+ noise \">>\" noise { var Interface = require(\"./Interface\"); return new Interface(interfacename) }\n  / noise \"interface \" noise interfacename:objectname noise { var Interface = require(\"./Interface\"); return new Interface(interfacename) }\n  / noise \"interface \" noise interfacename:objectname noise newline noise lines:umllines \"end interface\" { var  Interface = require(\"./Interface\"); return new Interface(interfacename, lines) }\ncolor\n  = [#][0-9a-fA-F]+\nnamespacedeclaration\n  = noise \"namespace \" noise namespacename:objectname noise color? noise startblock lines:umllines endblock { var Namespace = require(\"./Namespace\"); return new Namespace(namespacename, lines) }\n  / noise \"namespace \" noise namespacename:objectname noise newline umllines \"end namespace\" { var Namespace = require(\"./Namespace\"); return new Namespace(namespacename) }\nstaticmemberdeclaration\n  = \"static \" memberdeclaration\nmemberdeclaration\n  = declaration:methoddeclaration { return declaration }\n  / declaration:fielddeclaration { return declaration }\nfielddeclaration\n  = noise accessortype:accessortype noise returntype:returntype noise membername:membername noise { var Field = require(\"./Field\"); return new Field(accessortype, returntype, membername) }\n  / noise accessortype:accessortype noise membername:membername noise [:] noise returntype:returntype noise { var Field = require(\"./Field\"); return new Field(accessortype, returntype, membername) }\n  / noise accessortype:accessortype noise membername:membername noise { var Field = require(\"./Field\"); return new Field(accessortype, \"void\", membername) }\n  / noise returntype:returntype noise membername:membername noise { var Field = require(\"./Field\"); return new Field(\"+\", returntype, membername) }\n  / noise membername:membername noise [:] noise returntype:returntype noise { var Field = require(\"./Field\"); return new Field(\"+\", returntype, membername) }\nmethoddeclaration\n  = noise field:fielddeclaration [(] parameters:methodparameters [)] noise [:] noise returntype:returntype noise { var Method = require(\"./Method\"); return new Method(field.getAccessType(), returntype, field.getName(), parameters); }\n  / noise field:fielddeclaration [(] parameters:methodparameters [)] noise { var Method = require(\"./Method\"); return new Method(field.getAccessType(), field.getReturnType(), field.getName(), parameters); }\nmethodparameters\n  = items:methodparameter* { return items; }\nmethodparameter\n  = noise item:returntype membername:([ ] membername)? [,]? { var Parameter = require(\"./Parameter\"); return new Parameter(item, membername ? membername[1] : null); }\nreturntype\n  = items:[^ ,\\n\\r\\t(){}]+ { return items.join(\"\") }\nobjectname\n  = objectname:([A-Za-z_][A-Za-z0-9.]*) { return [objectname[0], objectname[1].join(\"\")].join(\"\") }\nmembername\n  = items:([A-Za-z_][A-Za-z0-9_]*) { return [items[0], items[1].join(\"\")].join(\"\") }\naccessortype\n  = publicaccessor\n  / privateaccessor\n  / protectedaccessor\npublicaccessor\n  = [+]\nprivateaccessor\n  = [-]\nprotectedaccessor\n  = [#]\n```\n\n## Goals\nInitially this project will only run with node.js and output coffeescript classes.\nThe general idea is that, given any PlantUML file, we will be able\nto generate class files in any output language. Eventually moving on from node.js and supporting\nother tools to use for conversion.\n\n## Example\n\nThe current example is very basic and features a common example of a car.\n\n### PlantUML Code:\n\n```\n@startuml\n\nhide empty members\n\nabstract Car {\n  + void setModel(String model)\n  + void setMake(String make)\n  + void setYear(Number)\n  + String getModel()\n  + String getMake()\n  + Number getYear()\n}\n  \nclass Toyota\nclass Honda\nclass Ford\n  \nToyota --|> Car\nHonda --|> Car\nFord --|> Car\n\n@enduml\n```\n\n### CoffeeScript Produced:\n\n```coffeescript\nclass Car\n\n  setModel: (model) ->\n\n  setMake: (make) ->\n\n  setYear: (paramX) ->\n\n  getModel:  ->\n\n  getMake:  ->\n\n  getYear:  ->\n\nclass Toyota extends Car\n\nclass Honda extends Car\n\nclass Ford extends Car\n```\n\n### Running:\n\n```\nnpm install\nplantcode -l coffescript tests/car.pegjs > tests/car.coffee\n```\n\n### Testing:\n```\nnpm test\n```\n\n### Updating PEGJS grammar:\n\nIf you update the PEGJS grammar file `src/plantuml.pegjs` you must run this command to update the corresponding\n`src/plantuml.js` file.\n\n```\nnpm run build\n```\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"plantcode\",\n  \"version\": \"0.2.2\",\n  \"description\": \"PlantUML to class file generator.\",\n  \"author\": \"Brian Folts <brian.folts@gmail.com>\",\n  \"main\": \"plantcode\",\n  \"scripts\": {\n    \"build\": \"node scripts/build_templates.js && node node_modules/pegjs/bin/pegjs src/plantuml.pegjs src/plantuml.js\",\n    \"test\": \"node node_modules/.bin/nyc node tests/integration.js\"\n  },\n  \"bin\": \"plantcode\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/bafolts/plantuml-code-generator.git\"\n  },\n  \"dependencies\": {\n    \"handlebars\": \"^4.7.6\"\n  },\n  \"devDependencies\": {\n    \"nyc\": \"^15.1.0\",\n    \"pegjs\": \"^0.9.0\"\n  },\n  \"engines\": {\n    \"node\": \">= 0.8\"\n  },\n  \"license\": \"(MIT OR Apache-2.0)\"\n}\n"
  },
  {
    "path": "plantcode",
    "content": "#!/usr/bin/env node\n\nvar fs = require(\"fs\");\nvar hbs = require(\"handlebars\");\nvar parser = require(\"./src/plantuml\");\nvar index = require(\"./src/plantcode\");\nvar templates = require(\"./templates/index\");\nvar os = require(\"os\");\n\nvar options = {\n  language: \"typescript\",\n  output: null\n};\n\nvar supported_languages = index.getSupportedLanguages();\n\nvar args = process.argv.slice(2); // Trim \"node\" and the script path.\n\nif (args.length === 0) {\n  printUsage();\n} else {\n  index.convertFile(getArguments());\n}\n\nfunction printLanguages() {\n  supported_languages.forEach(function (item) {\n    console.log(item);\n  })\n  exitSuccess();\n}\n\nfunction printUsage() {\n  console.log(\"Usage: plantcode [options] <inputFile>\");\n  console.log(\"\");\n  console.log(\"Generates classfile(s) for the provided PlantUML file specified by <input_file> and writes to standard output.\");\n  console.log(\"\");\n  console.log(\"Options:\");\n  console.log(\"  -l, --language <language>          name of the programming language\");\n  console.log(\"                                     which the produced class files\")\n  console.log(\"                                     will be written in\");\n  console.log(\"  -o, --out <output_path>            the path to output the file(s) to\");\n  console.log(\"      --show-languages               displays all the current supported\");\n  console.log(\"                                     programming languages for use\")\n  console.log(\"                                     for with the language option\");\n  console.log(\"  -h, --help                         print help and exit\");\n  exitSuccess();\n}\n\nfunction isValidLanguage(language) {\n  return supported_languages.indexOf(language) !== -1;\n}\n\nfunction getArguments() {\n\n  while (args.length > 0 && isOption(args[0])) {\n    switch (args[0]) {\n      case \"-o\":\n      case \"--out\":\n        nextArg();\n        if (args.length === 0) {\n          abort(\"Missing output directory or file for -o/--out option.\");\n        }\n        options.output = args[0];\n        break;\n      case \"-l\":\n      case \"--language\":\n        nextArg();\n        if (args.length === 0) {\n          abort(\"Missing language of the -l/--language option.\");\n        } else if (!isValidLanguage(args[0])) {\n          abort(\"Invalid language provided.\");\n        }\n        options.language = args[0];\n        break;\n      case \"--show-languages\":\n        printLanguages();\n        break;\n      case \"-h\":\n      case \"--help\":\n        printUsage();\n        break;\n      default:\n        abort(\"Invalid option \" + args[0]);\n        break;\n    }\n    nextArg();\n  }\n\n  switch (args.length) {\n    case 1:\n      options.input = args[0];\n    break;\n    default:\n      abort(\"No input file provided.\");\n  }\n\n  return options;\n\n}\n\nfunction exitFailure() {\n  process.exit(1);\n}\n\nfunction exitSuccess() {\n  process.exit(0);\n}\n\nfunction abort(message) {\n  for (var i = 0, length = arguments.length; i < length; i++) {\n    console.error(arguments[i]);\n  }\n  exitFailure();\n}\n\nfunction isOption(arg) {\n  return (/^-/).test(arg);\n}\n\nfunction nextArg() {\n  args.shift();\n}\n\n"
  },
  {
    "path": "scripts/build_templates.js",
    "content": "\nconst fs = require(\"fs\");\nconst index = require(\"../src/plantcode\");\n\nconst supportedLanguages = index.getSupportedLanguages();\n\nlet output = \"// DO NOT EDIT THIS FILE. GENERATED WITH scripts/build_templates.js\\n\";\n\nsupportedLanguages.forEach(function (supportedLanguage) {\n  let template = fs.readFileSync(\"./templates/\" + supportedLanguage + \".hbs\").toString();\n  template = template.replace(/\\$/g, \"\\\\$$\");\n  output += `exports.${supportedLanguage} = \\`${template}\\`;\\n`;\n});\n\nfs.writeFileSync('./templates/index.js', output);\n"
  },
  {
    "path": "src/AbstractClass.js",
    "content": "\nvar Class = require(\"./Class\");\n\nclass AbstractClass extends Class {\n  getKeyword() {\n    return \"abstract class\";\n  }\n\n  isAbstract() {\n    return true;\n  }\n}\n\nmodule.exports = AbstractClass;\n"
  },
  {
    "path": "src/Aggregation.js",
    "content": "\nmodule.exports = (function () {\n\n  var Aggregation = function () {\n\n  }\n\n  return Aggregation;\n\n})()\n"
  },
  {
    "path": "src/Class.js",
    "content": "\nmodule.exports = (function () {\n\n  var Field = require(\"./Field\");\n  var Method = require(\"./Method\");\n\n  var Class = function (className, fileLines) {\n    this.cExtends = null;\n    this.fileLines = fileLines || [];\n    this.className = className;\n    this.nNamespace = null;\n  }\n\n  Class.prototype.getKeyword = function () {\n    return \"class\";\n  }\n\n  Class.prototype.setExtends = function (className) {\n    this.cExtends = className;\n  }\n  \n  Class.prototype.getExtends = function () {\n    return this.cExtends;\n  }\n\n  Class.prototype.setNamespace = function (namespace) {\n    this.nNamespace = namespace;\n  }\n  \n  Class.prototype.getNamespace = function () {\n    return this.nNamespace;\n  }\n\n  Class.prototype.isAbstract = function () {\n    return false;\n  }\n\n  Class.prototype.getName = function () {\n    return this.className;\n  }\n \n  Class.prototype.hasMethods = function () {\n    for (var i = 0, length = this.fileLines.length; i < length; i++) {\n      if (this.fileLines[i] instanceof Method) {\n        return true;\n      }\n    }\n    return false;\n  }\n \n  Class.prototype.getMethods = function () {\n    var aResult = [];\n    for (var i = 0, length = this.fileLines.length; i < length; i++) {\n      if (this.fileLines[i] instanceof Method) {\n        aResult.push(this.fileLines[i]);\n      }\n    }\n    return aResult;\n  }\n \n  Class.prototype.hasFields = function () {\n    for (var i = 0, length = this.fileLines.length; i < length; i++) {\n      if (!(this.fileLines[i] instanceof Method) && this.fileLines[i] instanceof Field) {\n        return true;\n      }\n    }\n    return false;\n  }\n \n  Class.prototype.getFields = function () {\n    var aResult = [];\n    for (var i = 0, length = this.fileLines.length; i < length; i++) {\n      if (!(this.fileLines[i] instanceof Method) && this.fileLines[i] instanceof Field) {\n        aResult.push(this.fileLines[i]);\n      }\n    }\n    return aResult;\n  }\n\n  Class.prototype.getFullName = function () {\n    if (this.getNamespace() !== null) {\n      return this.getNamespace().getFullName() + \".\" + this.getName();\n    } else {\n      return this.getName();\n    }\n  }\n\n  return Class;\n\n})()\n"
  },
  {
    "path": "src/Composition.js",
    "content": "\nmodule.exports = (function () {\n\n  var Composition = function () {\n\n  }\n\n  return Composition;\n\n})()\n"
  },
  {
    "path": "src/Connection.js",
    "content": "\nmodule.exports = (function () {\n\n  var Connection = function (leftObject, connector, rightObject) {\n    this.leftObject = leftObject;\n    this.connector = connector;\n    this.pNamespace = null;\n    this.rightObject = rightObject;\n  }\n\n  Connection.prototype.setNamespace = function (namespace) {\n    this.pNamespace = namespace;\n  }\n\n  Connection.prototype.getConnector = function () {\n    return this.connector;\n  }\n\n  Connection.prototype.getNamespace = function () {\n    return this.pNamespace;\n  }\n\n  return Connection;\n\n})()\n"
  },
  {
    "path": "src/Extension.js",
    "content": "\nmodule.exports = (function () {\n\n  var Extension = function (bIsLeft) {\n    this.bIsLeft = bIsLeft;\n  }\n  \n  Extension.prototype.isLeft = function () {\n    return this.bIsLeft;\n  }\n\n  return Extension;\n\n})()\n"
  },
  {
    "path": "src/Field.js",
    "content": "\nmodule.exports = (function () {\n\n  var Field = function (accessType, returnType, fieldName) {\n    this.sAccessType = accessType;\n    this.sReturnType = returnType;\n    this.sFieldName = fieldName;\n  }\n\n  Field.prototype.getAccessType = function () {\n    return this.sAccessType;\n  }\n\n  Field.prototype.getReturnType = function () {\n    return this.sReturnType;\n  }\n  \n  Field.prototype.getName = function () {\n    return this.sFieldName;\n  }\n\n  Field.prototype.isPrivate = function () {\n    return this.sAccessType === '-';\n  }\n\n  Field.prototype.isProtected = function () {\n    return this.sAccessType === '#';\n  }\n\n  Field.prototype.isPublic = function () {\n    return this.sAccessType === '+';\n  }\n\n  return Field;\n\n})()\n"
  },
  {
    "path": "src/Interface.js",
    "content": "\nmodule.exports = (function () {\n\n  var Field = require(\"./Field\");\n  var Method = require(\"./Method\");\n\n  var Interface = function (interfaceName, fileLines) {\n    this.cExtends = null;\n    this.fileLines = fileLines || [];\n    this.interfaceName = interfaceName;\n    this.nNamespace = null;\n  }\n\n  Interface.prototype.getKeyword = function () {\n    return \"interface\";\n  }\n  \n  Interface.prototype.setExtends = function (interfaceName) {\n    this.cExtends = interfaceName;\n  }\n  \n  Interface.prototype.getExtends = function () {\n    return this.cExtends;\n  }\n\n  Interface.prototype.setNamespace = function (namespace) {\n    this.nNamespace = namespace;\n  }\n  \n  Interface.prototype.getNamespace = function () {\n    return this.nNamespace;\n  }\n\n  Interface.prototype.getName = function () {\n    return this.interfaceName;\n  }\n \n  Interface.prototype.hasMethods = function () {\n    for (var i = 0, length = this.fileLines.length; i < length; i++) {\n      if (this.fileLines[i] instanceof Method) {\n        return true;\n      }\n    }\n    return false;\n  }\n \n  Interface.prototype.getMethods = function () {\n    var aResult = [];\n    for (var i = 0, length = this.fileLines.length; i < length; i++) {\n      if (this.fileLines[i] instanceof Method) {\n        aResult.push(this.fileLines[i]);\n      }\n    }\n    return aResult;\n  }\n \n  Interface.prototype.hasFields = function () {\n    for (var i = 0, length = this.fileLines.length; i < length; i++) {\n      if (!(this.fileLines[i] instanceof Method) && this.fileLines[i] instanceof Field) {\n        return true;\n      }\n    }\n    return false;\n  }\n \n  Interface.prototype.getFields = function () {\n    var aResult = [];\n    for (var i = 0, length = this.fileLines.length; i < length; i++) {\n      if (!(this.fileLines[i] instanceof Method) && this.fileLines[i] instanceof Field) {\n        aResult.push(this.fileLines[i]);\n      }\n    }\n    return aResult;\n  }\n\n  Interface.prototype.getFullName = function () {\n    if (this.getNamespace() !== null) {\n      return this.getNamespace().getFullName() + \".\" + this.getName();\n    } else {\n      return this.getName();\n    }\n  }\n\n  return Interface;\n\n})()\n"
  },
  {
    "path": "src/Method.js",
    "content": "\nvar Field = require(\"./Field\");\n\nclass Method extends Field {\n  constructor (accessType, returnType, fieldName, aParameters) {\n    super(accessType, returnType, fieldName);\n    this.aParameters = aParameters;\n  }\n\n  needsReturnStatement() {\n    return this.sReturnType !== \"void\";\n  }\n  \n  getParameters() {\n    return this.aParameters;\n  }\n}\n\nmodule.exports = Method;\n"
  },
  {
    "path": "src/Namespace.js",
    "content": "\nmodule.exports = (function () {\n\n  var Class = require(\"./Class\");\n  var AbstractClass = require(\"./AbstractClass\");\n  var Connection = require(\"./Connection\");\n\n  var Namespace = function (namespaceName, fileLines) {\n    this.namespaceName = namespaceName;\n    this.aItems = fileLines;\n    this.nNamespace = null;\n    this.init();\n  }\n  \n  Namespace.prototype.getName = function () {\n    return this.namespaceName;\n  }\n  \n  Namespace.prototype.getItems = function () {\n    return this.aItems;\n  }\n\n  Namespace.prototype.setNamespace = function (namespace) {\n    this.nNamespace = namespace;\n  }\n\n  Namespace.prototype.getNamespace = function () {\n    return this.nNamespace;\n  }\n  \n  Namespace.prototype.getFullName = function () {\n    var aFull = [this.getName()];\n    var nSpace = this.getNamespace();\n    while (nSpace !== null) {\n      aFull.unshift(nSpace.getName());\n      nSpace = nSpace.getNamespace();\n    }\n    return aFull.join(\".\");\n  }\n\n  Namespace.prototype.init = function () {\n    for (var i = 0, length = this.aItems.length; i < length; i++) {\n      if (this.aItems[i] instanceof Namespace) {\n        this.aItems[i].setNamespace(this);\n      } else if (this.aItems[i] instanceof Class || this.aItems[i] instanceof AbstractClass) {\n        this.aItems[i].setNamespace(this);\n      } else if (this.aItems[i] instanceof Connection) {\n        this.aItems[i].setNamespace(this);\n      }\n    }\n  }\n\n  return Namespace;\n\n})()\n"
  },
  {
    "path": "src/Package.js",
    "content": "\nmodule.exports = (function () {\n\n\n  var Package = function (namespaceName, fileLines) {\n    this.namespaceName = namespaceName;\n    this.fileLines = fileLines;\n  }\n\n  return Package;\n\n})()\n"
  },
  {
    "path": "src/Parameter.js",
    "content": "\nmodule.exports = (function () {\n\n  var Parameter = function (returnType, memberName) {\n    this.sReturnType = returnType;\n    this.sParameterName = memberName;\n  }\n  \n  Parameter.prototype.getReturnType = function () {\n    return this.sReturnType;\n  }\n\n  Parameter.prototype.getName = function () {\n    return this.sParameterName;\n  }\n\n  return Parameter;\n\n})()\n"
  },
  {
    "path": "src/UMLBlock.js",
    "content": "\nmodule.exports = (function () {\n\n  var Namespace = require(\"./Namespace\");\n  var Class = require(\"./Class\");\n  var AbstractClass = require(\"./AbstractClass\");\n  var Connection = require(\"./Connection\");\n  var Package = require(\"./Package\");\n  var Extension = require(\"./Extension\");\n  var Interface = require(\"./Interface\");\n\n  var UMLBlock = function (fileLines) {\n\n    this.aNamespaces = []; // contains all defined namespaces\n    this.aPackages = []; // contains all defined packages\n    this.aClasses = []; // contains all defined classes\n    this.aConnections = []; // contains all defined connections\n\n    this.aItems = fileLines;\n\n    this.populateGlobals(this);\n    this.setupConnections();\n  }\n\n  UMLBlock.prototype.getClasses = function () {\n    return this.aClasses;\n  }\n\n  UMLBlock.prototype.getItems = function () {\n    return this.aItems;\n  }\n\n  UMLBlock.prototype.setupConnections = function () {\n    for (var i = 0, length = this.aConnections.length; i < length; i++) {\n      this.setupConnection(this.aConnections[i]);\n    }\n  }\n\n  UMLBlock.prototype.setupConnection = function (connection) {\n    var cLeft = null;\n    var cRight = null;\n    for (var i = 0, length = this.aClasses.length; i < length; i++) {\n    \n      if (connection.leftObject.indexOf(\".\") !== -1) {\n        if (connection.leftObject.indexOf(\".\") === 0) {\n          if (this.aClasses[i].getNamespace()===null && this.aClasses[i].getName() === connection.leftObject.substring(1)) {\n            cLeft = this.aClasses[i];\n          }\n        } else {\n          if (this.aClasses[i].getFullName() === connection.leftObject) {\n            cLeft = this.aClasses[i];\n          }\n        }\n      } else if (this.aClasses[i].getName() === connection.leftObject && this.aClasses[i].getNamespace() === connection.getNamespace()) {\n        cLeft = this.aClasses[i];\n      }\n      \n      if (connection.rightObject.indexOf(\".\") !== -1) {\n        if (connection.rightObject.indexOf(\".\") === 0) {\n          if (this.aClasses[i].getNamespace()===null && this.aClasses[i].getName() === connection.rightObject.substring(1)) {\n            cRight = this.aClasses[i];\n          }\n        } else {\n          if (this.aClasses[i].getFullName() === connection.rightObject) {\n            cRight = this.aClasses[i];\n          }\n        }\n      } else if (this.aClasses[i].getName() === connection.rightObject && this.aClasses[i].getNamespace() === connection.getNamespace()) {\n        cRight = this.aClasses[i];\n      }\n\n    }\n\n    if (cLeft !== null && cRight !== null) {\n      if (connection.getConnector() instanceof Extension) {\n        if (connection.getConnector().isLeft()) {\n          cRight.setExtends(cLeft);\n        } else {\n          cLeft.setExtends(cRight);\n        }\n      }\n    }\n  }\n  \n  UMLBlock.prototype.populateGlobals = function (item) {\n  \n    var items = item.getItems();\n  \n    for (var i = 0, length = items.length; i < length; i++) {\n      if (items[i] instanceof Namespace) {\n        this.aNamespaces.push(items[i]);\n        this.populateGlobals(items[i]);\n      } else if (items[i] instanceof Class || items[i] instanceof AbstractClass || items[i] instanceof Interface) {\n        this.aClasses.push(items[i]);\n      } else if (items[i] instanceof Package) {\n        this.aPackages.push(items[i]);\n        this.populateGlobals(items[i]);\n      } else if (items[i] instanceof Connection) {\n        this.aConnections.push(items[i]);\n      } else {\n        throw \"Unknown type\";\n      }\n    }\n  \n  }\n  \n  return UMLBlock;\n\n})()\n"
  },
  {
    "path": "src/plantcode.js",
    "content": "var fs = require(\"fs\");\nvar hbs = require(\"handlebars\");\nvar parser = require(\"./plantuml\");\nvar os = require(\"os\");\nvar templates = require(\"../templates/index\");\n\nvar supported_languages = [\"coffeescript\", \"csharp\", \"ecmascript5\", \"ecmascript6\", \"java\", \"php\", \"python\", \"ruby\", \"typescript\", \"swift\", \"kotlin\"];\n\nhbs.registerHelper('if_ne', function(a, b, opts) {\n    if (a() != b) {\n        return opts.fn(this);\n    } else {\n        return opts.inverse(this);\n    }\n});\n\n// sReturnType Check\nhbs.registerHelper('if_ne2', function(a, b, opts) {\n  if (a[\"sReturnType\"] != b) {\n      return opts.fn(this);\n  } else {\n      return opts.inverse(this);\n  }\n});\n\n// Workaround for an apparent bug in Handlebars: functions are not called with the parent scope\n// as context.\n//\n// Here the getFullName is found in the parent scope (Class), but it is called with the current\n// scope (Field) as context:\n//\n// {{#each getFields}}\n//   {{../getFullName}}\n// {{/each}}\n//\n// The following helper works around it:\n//\n// {{#each getFields}}\n//   {{#call ../this ../getFullName}}\n// {{/each}}\nhbs.registerHelper('call', function (context, member, options) {\n   return member.call(context);\n});\n\nfunction convertFile(config) {\n  fs.readFile(config.input, { encoding: \"UTF-8\" }, function (err, data) {\n    if (err === null) {\n      var output = convertText(config, data);\n      if (config.output === null) {\n        console.log(output);\n      } else {\n        fs.writeFile(config.output, output, function (err) {\n          if (err !== null) {\n            console.error(\"Unable to write output file for \" + config.output + \".\");\n          }\n        })\n      }\n    } else {\n      console.error(\"Unable to read input file.\");\n    }\n  });\n}\n\nfunction getSupportedLanguages() {\n  return supported_languages;\n}\n\nfunction convertText(config, data) {\n  try {\n    var aUMLBlocks = parser.parse(data);\n  } catch(e) {\n    console.error(\"Error parsing input file: \", config.input, e);\n    return;\n  }\n  var data = templates[config.language];\n  if (data === undefined) {\n    console.error(\"Unable to read template file for \" + config.language + \".\");\n    return;\n  }\n  return processTemplateFile(config, data, aUMLBlocks);\n}\n\nfunction processTemplateFile(config, templateData, dictionary) {\n  var template = hbs.compile(templateData);\n\n  var output = \"\";\n\n  dictionary.forEach(function (element) {\n    element.getClasses().forEach(function (element) {\n      output += template(element, {\n        allowedProtoMethods: {\n         \"getExtends\": true,\n         \"getFields\": true,\n         \"getFullName\": true,\n         \"getKeyword\": true,\n         \"getMethods\": true,\n         \"getName\": true,\n         \"getParameters\": true,\n         \"getReturnType\": true,\n         \"hasFields\": true,\n         \"hasMethods\": true,\n         \"isPrivate\": true,\n         \"isProtected\": true,\n         \"isPublic\": true,\n         \"needsReturnStatement\": true\n        }\n      }) + os.EOL + os.EOL;\n    })\n  })\n\n  return output;\n}\n\nexports.getSupportedLanguages = getSupportedLanguages;\nexports.convertFile = convertFile;\nexports.convertText = convertText;\n"
  },
  {
    "path": "src/plantuml.js",
    "content": "module.exports = (function() {\n  \"use strict\";\n\n  /*\n   * Generated by PEG.js 0.9.0.\n   *\n   * http://pegjs.org/\n   */\n\n  function peg$subclass(child, parent) {\n    function ctor() { this.constructor = child; }\n    ctor.prototype = parent.prototype;\n    child.prototype = new ctor();\n  }\n\n  function peg$SyntaxError(message, expected, found, location) {\n    this.message  = message;\n    this.expected = expected;\n    this.found    = found;\n    this.location = location;\n    this.name     = \"SyntaxError\";\n\n    if (typeof Error.captureStackTrace === \"function\") {\n      Error.captureStackTrace(this, peg$SyntaxError);\n    }\n  }\n\n  peg$subclass(peg$SyntaxError, Error);\n\n  function peg$parse(input) {\n    var options = arguments.length > 1 ? arguments[1] : {},\n        parser  = this,\n\n        peg$FAILED = {},\n\n        peg$startRuleFunctions = { plantumlfile: peg$parseplantumlfile },\n        peg$startRuleFunction  = peg$parseplantumlfile,\n\n        peg$c0 = function() { return null },\n        peg$c1 = \"@startuml\",\n        peg$c2 = { type: \"literal\", value: \"@startuml\", description: \"\\\"@startuml\\\"\" },\n        peg$c3 = \"@enduml\",\n        peg$c4 = { type: \"literal\", value: \"@enduml\", description: \"\\\"@enduml\\\"\" },\n        peg$c5 = function(filelines) { var UMLBlock = require(\"./UMLBlock\"); return new UMLBlock(filelines) },\n        peg$c6 = function(items) { for (var i = 0; i < items.length; i++) { if (items[i] === null) { items.splice(i, 1); i--; } } return items },\n        peg$c7 = function(lines) { for (var i = 0; i < lines.length; i++) { if (lines[i]===null) { lines.splice(i, 1); i--; } } return lines; },\n        peg$c8 = function(declaration) { return declaration },\n        peg$c9 = \"hide empty members\",\n        peg$c10 = { type: \"literal\", value: \"hide empty members\", description: \"\\\"hide empty members\\\"\" },\n        peg$c11 = \"skinparam\",\n        peg$c12 = { type: \"literal\", value: \"skinparam\", description: \"\\\"skinparam\\\"\" },\n        peg$c13 = /^[^\\r\\n]/,\n        peg$c14 = { type: \"class\", value: \"[^\\\\r\\\\n]\", description: \"[^\\\\r\\\\n]\" },\n        peg$c15 = /^[:]/,\n        peg$c16 = { type: \"class\", value: \"[:]\", description: \"[:]\" },\n        peg$c17 = function(leftObject, connector, rightObject) { var Connection = require(\"./Connection\"); return new Connection(leftObject, connector, rightObject) },\n        peg$c18 = /^[\"]/,\n        peg$c19 = { type: \"class\", value: \"[\\\"]\", description: \"[\\\"]\" },\n        peg$c20 = /^[\\\\]/,\n        peg$c21 = { type: \"class\", value: \"[\\\\\\\\]\", description: \"[\\\\\\\\]\" },\n        peg$c22 = /^[^\"]/,\n        peg$c23 = { type: \"class\", value: \"[^\\\"]\", description: \"[^\\\"]\" },\n        peg$c24 = \"title \",\n        peg$c25 = { type: \"literal\", value: \"title \", description: \"\\\"title \\\"\" },\n        peg$c26 = \"'\",\n        peg$c27 = { type: \"literal\", value: \"'\", description: \"\\\"'\\\"\" },\n        peg$c28 = \"..\",\n        peg$c29 = { type: \"literal\", value: \"..\", description: \"\\\"..\\\"\" },\n        peg$c30 = /^[^\\r\\n.]/,\n        peg$c31 = { type: \"class\", value: \"[^\\\\r\\\\n\\\\.]\", description: \"[^\\\\r\\\\n\\\\.]\" },\n        peg$c32 = \"--\",\n        peg$c33 = { type: \"literal\", value: \"--\", description: \"\\\"--\\\"\" },\n        peg$c34 = /^[^\\r\\n\\-]/,\n        peg$c35 = { type: \"class\", value: \"[^\\\\r\\\\n\\\\-]\", description: \"[^\\\\r\\\\n\\\\-]\" },\n        peg$c36 = \"__\",\n        peg$c37 = { type: \"literal\", value: \"__\", description: \"\\\"__\\\"\" },\n        peg$c38 = /^[^\\r\\n_]/,\n        peg$c39 = { type: \"class\", value: \"[^\\\\r\\\\n\\\\_]\", description: \"[^\\\\r\\\\n\\\\_]\" },\n        peg$c40 = \"note \",\n        peg$c41 = { type: \"literal\", value: \"note \", description: \"\\\"note \\\"\" },\n        peg$c42 = function(item) { return item },\n        peg$c43 = function() { var Composition = require(\"./Composition\"); return new Composition() },\n        peg$c44 = function() { var Aggregation = require(\"./Aggregation\"); return new Aggregation() },\n        peg$c45 = \"<|\",\n        peg$c46 = { type: \"literal\", value: \"<|\", description: \"\\\"<|\\\"\" },\n        peg$c47 = function() { var Extension = require(\"./Extension\"); return new Extension(true) },\n        peg$c48 = \"|>\",\n        peg$c49 = { type: \"literal\", value: \"|>\", description: \"\\\"|>\\\"\" },\n        peg$c50 = function() { var Extension = require(\"./Extension\"); return new Extension(false) },\n        peg$c51 = \"-up-\",\n        peg$c52 = { type: \"literal\", value: \"-up-\", description: \"\\\"-up-\\\"\" },\n        peg$c53 = \"-down-\",\n        peg$c54 = { type: \"literal\", value: \"-down-\", description: \"\\\"-down-\\\"\" },\n        peg$c55 = \"-left-\",\n        peg$c56 = { type: \"literal\", value: \"-left-\", description: \"\\\"-left-\\\"\" },\n        peg$c57 = \"-right-\",\n        peg$c58 = { type: \"literal\", value: \"-right-\", description: \"\\\"-right-\\\"\" },\n        peg$c59 = \"---\",\n        peg$c60 = { type: \"literal\", value: \"---\", description: \"\\\"---\\\"\" },\n        peg$c61 = /^[.]/,\n        peg$c62 = { type: \"class\", value: \"[.]\", description: \"[.]\" },\n        peg$c63 = /^[\\-]/,\n        peg$c64 = { type: \"class\", value: \"[-]\", description: \"[-]\" },\n        peg$c65 = \"*\",\n        peg$c66 = { type: \"literal\", value: \"*\", description: \"\\\"*\\\"\" },\n        peg$c67 = /^[*]/,\n        peg$c68 = { type: \"class\", value: \"[*]\", description: \"[*]\" },\n        peg$c69 = \"o\",\n        peg$c70 = { type: \"literal\", value: \"o\", description: \"\\\"o\\\"\" },\n        peg$c71 = /^[o]/,\n        peg$c72 = { type: \"class\", value: \"[o]\", description: \"[o]\" },\n        peg$c73 = /^[{]/,\n        peg$c74 = { type: \"class\", value: \"[{]\", description: \"[{]\" },\n        peg$c75 = /^[}]/,\n        peg$c76 = { type: \"class\", value: \"[}]\", description: \"[}]\" },\n        peg$c77 = \"setpropname.*\",\n        peg$c78 = { type: \"literal\", value: \"setpropname.*\", description: \"\\\"setpropname.*\\\"\" },\n        peg$c79 = \"package \",\n        peg$c80 = { type: \"literal\", value: \"package \", description: \"\\\"package \\\"\" },\n        peg$c81 = \"end package\",\n        peg$c82 = { type: \"literal\", value: \"end package\", description: \"\\\"end package\\\"\" },\n        peg$c83 = \"abstract \",\n        peg$c84 = { type: \"literal\", value: \"abstract \", description: \"\\\"abstract \\\"\" },\n        peg$c85 = \"class \",\n        peg$c86 = { type: \"literal\", value: \"class \", description: \"\\\"class \\\"\" },\n        peg$c87 = function(classname, lines) { var AbstractClass = require(\"./AbstractClass\"); return new AbstractClass(classname, lines) },\n        peg$c88 = function(classname) { var AbstractClass = require(\"./AbstractClass\"); return new AbstractClass(classname) },\n        peg$c89 = \"end class\",\n        peg$c90 = { type: \"literal\", value: \"end class\", description: \"\\\"end class\\\"\" },\n        peg$c91 = /^[ \\t]/,\n        peg$c92 = { type: \"class\", value: \"[ \\\\t]\", description: \"[ \\\\t]\" },\n        peg$c93 = /^[\\r\\n]/,\n        peg$c94 = { type: \"class\", value: \"[\\\\r\\\\n]\", description: \"[\\\\r\\\\n]\" },\n        peg$c95 = /^[\\n]/,\n        peg$c96 = { type: \"class\", value: \"[\\\\n]\", description: \"[\\\\n]\" },\n        peg$c97 = function(classname, lines) { var Class = require(\"./Class\"); return new Class(classname, lines) },\n        peg$c98 = \"<<\",\n        peg$c99 = { type: \"literal\", value: \"<<\", description: \"\\\"<<\\\"\" },\n        peg$c100 = /^[^>]/,\n        peg$c101 = { type: \"class\", value: \"[^>]\", description: \"[^>]\" },\n        peg$c102 = \">>\",\n        peg$c103 = { type: \"literal\", value: \">>\", description: \"\\\">>\\\"\" },\n        peg$c104 = function(classname) { var Class = require(\"./Class\"); return new Class(classname) },\n        peg$c105 = \"interface \",\n        peg$c106 = { type: \"literal\", value: \"interface \", description: \"\\\"interface \\\"\" },\n        peg$c107 = function(interfacename, lines) { var Interface = require(\"./Interface\"); return new Interface(interfacename, lines) },\n        peg$c108 = function(interfacename) { var Interface = require(\"./Interface\"); return new Interface(interfacename) },\n        peg$c109 = \"end interface\",\n        peg$c110 = { type: \"literal\", value: \"end interface\", description: \"\\\"end interface\\\"\" },\n        peg$c111 = function(interfacename, lines) { var  Interface = require(\"./Interface\"); return new Interface(interfacename, lines) },\n        peg$c112 = /^[#]/,\n        peg$c113 = { type: \"class\", value: \"[#]\", description: \"[#]\" },\n        peg$c114 = /^[0-9a-fA-F]/,\n        peg$c115 = { type: \"class\", value: \"[0-9a-fA-F]\", description: \"[0-9a-fA-F]\" },\n        peg$c116 = \"namespace \",\n        peg$c117 = { type: \"literal\", value: \"namespace \", description: \"\\\"namespace \\\"\" },\n        peg$c118 = function(namespacename, lines) { var Namespace = require(\"./Namespace\"); return new Namespace(namespacename, lines) },\n        peg$c119 = \"end namespace\",\n        peg$c120 = { type: \"literal\", value: \"end namespace\", description: \"\\\"end namespace\\\"\" },\n        peg$c121 = function(namespacename) { var Namespace = require(\"./Namespace\"); return new Namespace(namespacename) },\n        peg$c122 = \"static \",\n        peg$c123 = { type: \"literal\", value: \"static \", description: \"\\\"static \\\"\" },\n        peg$c124 = function(accessortype, returntype, membername) { var Field = require(\"./Field\"); return new Field(accessortype, returntype, membername) },\n        peg$c125 = function(accessortype, membername, returntype) { var Field = require(\"./Field\"); return new Field(accessortype, returntype, membername) },\n        peg$c126 = function(accessortype, membername) { var Field = require(\"./Field\"); return new Field(accessortype, \"void\", membername) },\n        peg$c127 = function(returntype, membername) { var Field = require(\"./Field\"); return new Field(\"+\", returntype, membername) },\n        peg$c128 = function(membername, returntype) { var Field = require(\"./Field\"); return new Field(\"+\", returntype, membername) },\n        peg$c129 = /^[(]/,\n        peg$c130 = { type: \"class\", value: \"[(]\", description: \"[(]\" },\n        peg$c131 = /^[)]/,\n        peg$c132 = { type: \"class\", value: \"[)]\", description: \"[)]\" },\n        peg$c133 = function(field, parameters, returntype) { var Method = require(\"./Method\"); return new Method(field.getAccessType(), returntype, field.getName(), parameters); },\n        peg$c134 = function(field, parameters) { var Method = require(\"./Method\"); return new Method(field.getAccessType(), field.getReturnType(), field.getName(), parameters); },\n        peg$c135 = function(items) { return items; },\n        peg$c136 = /^[ ]/,\n        peg$c137 = { type: \"class\", value: \"[ ]\", description: \"[ ]\" },\n        peg$c138 = /^[,]/,\n        peg$c139 = { type: \"class\", value: \"[,]\", description: \"[,]\" },\n        peg$c140 = function(item, membername) { var Parameter = require(\"./Parameter\"); return new Parameter(item, membername ? membername[1] : null); },\n        peg$c141 = /^[^ ,\\n\\r\\t(){}]/,\n        peg$c142 = { type: \"class\", value: \"[^ ,\\\\n\\\\r\\\\t(){}]\", description: \"[^ ,\\\\n\\\\r\\\\t(){}]\" },\n        peg$c143 = function(items) { return items.join(\"\") },\n        peg$c144 = /^[A-Za-z_]/,\n        peg$c145 = { type: \"class\", value: \"[A-Za-z_]\", description: \"[A-Za-z_]\" },\n        peg$c146 = /^[A-Za-z0-9.]/,\n        peg$c147 = { type: \"class\", value: \"[A-Za-z0-9.]\", description: \"[A-Za-z0-9.]\" },\n        peg$c148 = function(objectname) { return [objectname[0], objectname[1].join(\"\")].join(\"\") },\n        peg$c149 = /^[A-Za-z0-9_]/,\n        peg$c150 = { type: \"class\", value: \"[A-Za-z0-9_]\", description: \"[A-Za-z0-9_]\" },\n        peg$c151 = function(items) { return [items[0], items[1].join(\"\")].join(\"\") },\n        peg$c152 = /^[+]/,\n        peg$c153 = { type: \"class\", value: \"[+]\", description: \"[+]\" },\n\n        peg$currPos          = 0,\n        peg$savedPos         = 0,\n        peg$posDetailsCache  = [{ line: 1, column: 1, seenCR: false }],\n        peg$maxFailPos       = 0,\n        peg$maxFailExpected  = [],\n        peg$silentFails      = 0,\n\n        peg$result;\n\n    if (\"startRule\" in options) {\n      if (!(options.startRule in peg$startRuleFunctions)) {\n        throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n      }\n\n      peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n    }\n\n    function text() {\n      return input.substring(peg$savedPos, peg$currPos);\n    }\n\n    function location() {\n      return peg$computeLocation(peg$savedPos, peg$currPos);\n    }\n\n    function expected(description) {\n      throw peg$buildException(\n        null,\n        [{ type: \"other\", description: description }],\n        input.substring(peg$savedPos, peg$currPos),\n        peg$computeLocation(peg$savedPos, peg$currPos)\n      );\n    }\n\n    function error(message) {\n      throw peg$buildException(\n        message,\n        null,\n        input.substring(peg$savedPos, peg$currPos),\n        peg$computeLocation(peg$savedPos, peg$currPos)\n      );\n    }\n\n    function peg$computePosDetails(pos) {\n      var details = peg$posDetailsCache[pos],\n          p, ch;\n\n      if (details) {\n        return details;\n      } else {\n        p = pos - 1;\n        while (!peg$posDetailsCache[p]) {\n          p--;\n        }\n\n        details = peg$posDetailsCache[p];\n        details = {\n          line:   details.line,\n          column: details.column,\n          seenCR: details.seenCR\n        };\n\n        while (p < pos) {\n          ch = input.charAt(p);\n          if (ch === \"\\n\") {\n            if (!details.seenCR) { details.line++; }\n            details.column = 1;\n            details.seenCR = false;\n          } else if (ch === \"\\r\" || ch === \"\\u2028\" || ch === \"\\u2029\") {\n            details.line++;\n            details.column = 1;\n            details.seenCR = true;\n          } else {\n            details.column++;\n            details.seenCR = false;\n          }\n\n          p++;\n        }\n\n        peg$posDetailsCache[pos] = details;\n        return details;\n      }\n    }\n\n    function peg$computeLocation(startPos, endPos) {\n      var startPosDetails = peg$computePosDetails(startPos),\n          endPosDetails   = peg$computePosDetails(endPos);\n\n      return {\n        start: {\n          offset: startPos,\n          line:   startPosDetails.line,\n          column: startPosDetails.column\n        },\n        end: {\n          offset: endPos,\n          line:   endPosDetails.line,\n          column: endPosDetails.column\n        }\n      };\n    }\n\n    function peg$fail(expected) {\n      if (peg$currPos < peg$maxFailPos) { return; }\n\n      if (peg$currPos > peg$maxFailPos) {\n        peg$maxFailPos = peg$currPos;\n        peg$maxFailExpected = [];\n      }\n\n      peg$maxFailExpected.push(expected);\n    }\n\n    function peg$buildException(message, expected, found, location) {\n      function cleanupExpected(expected) {\n        var i = 1;\n\n        expected.sort(function(a, b) {\n          if (a.description < b.description) {\n            return -1;\n          } else if (a.description > b.description) {\n            return 1;\n          } else {\n            return 0;\n          }\n        });\n\n        while (i < expected.length) {\n          if (expected[i - 1] === expected[i]) {\n            expected.splice(i, 1);\n          } else {\n            i++;\n          }\n        }\n      }\n\n      function buildMessage(expected, found) {\n        function stringEscape(s) {\n          function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }\n\n          return s\n            .replace(/\\\\/g,   '\\\\\\\\')\n            .replace(/\"/g,    '\\\\\"')\n            .replace(/\\x08/g, '\\\\b')\n            .replace(/\\t/g,   '\\\\t')\n            .replace(/\\n/g,   '\\\\n')\n            .replace(/\\f/g,   '\\\\f')\n            .replace(/\\r/g,   '\\\\r')\n            .replace(/[\\x00-\\x07\\x0B\\x0E\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n            .replace(/[\\x10-\\x1F\\x80-\\xFF]/g,    function(ch) { return '\\\\x'  + hex(ch); })\n            .replace(/[\\u0100-\\u0FFF]/g,         function(ch) { return '\\\\u0' + hex(ch); })\n            .replace(/[\\u1000-\\uFFFF]/g,         function(ch) { return '\\\\u'  + hex(ch); });\n        }\n\n        var expectedDescs = new Array(expected.length),\n            expectedDesc, foundDesc, i;\n\n        for (i = 0; i < expected.length; i++) {\n          expectedDescs[i] = expected[i].description;\n        }\n\n        expectedDesc = expected.length > 1\n          ? expectedDescs.slice(0, -1).join(\", \")\n              + \" or \"\n              + expectedDescs[expected.length - 1]\n          : expectedDescs[0];\n\n        foundDesc = found ? \"\\\"\" + stringEscape(found) + \"\\\"\" : \"end of input\";\n\n        return \"Expected \" + expectedDesc + \" but \" + foundDesc + \" found.\";\n      }\n\n      if (expected !== null) {\n        cleanupExpected(expected);\n      }\n\n      return new peg$SyntaxError(\n        message !== null ? message : buildMessage(expected, found),\n        expected,\n        found,\n        location\n      );\n    }\n\n    function peg$parseplantumlfile() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = peg$currPos;\n      s3 = peg$parsenoise();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parsenewline();\n        if (s4 !== peg$FAILED) {\n          peg$savedPos = s2;\n          s3 = peg$c0();\n          s2 = s3;\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = peg$currPos;\n        s3 = peg$parsenoise();\n        if (s3 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 9) === peg$c1) {\n            s4 = peg$c1;\n            peg$currPos += 9;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c2); }\n          }\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parsenoise();\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parsenewline();\n              if (s6 !== peg$FAILED) {\n                s7 = peg$parseumllines();\n                if (s7 !== peg$FAILED) {\n                  s8 = peg$parsenoise();\n                  if (s8 !== peg$FAILED) {\n                    if (input.substr(peg$currPos, 7) === peg$c3) {\n                      s9 = peg$c3;\n                      peg$currPos += 7;\n                    } else {\n                      s9 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$c4); }\n                    }\n                    if (s9 !== peg$FAILED) {\n                      s10 = peg$parsenoise();\n                      if (s10 !== peg$FAILED) {\n                        peg$savedPos = s2;\n                        s3 = peg$c5(s7);\n                        s2 = s3;\n                      } else {\n                        peg$currPos = s2;\n                        s2 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s2;\n                      s2 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s2;\n                    s2 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s2;\n                  s2 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s2;\n                s2 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s2;\n              s2 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      }\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$currPos;\n        s3 = peg$parsenoise();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parsenewline();\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s2;\n            s3 = peg$c0();\n            s2 = s3;\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n        if (s2 === peg$FAILED) {\n          s2 = peg$currPos;\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 9) === peg$c1) {\n              s4 = peg$c1;\n              peg$currPos += 9;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c2); }\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsenoise();\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsenewline();\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parseumllines();\n                  if (s7 !== peg$FAILED) {\n                    s8 = peg$parsenoise();\n                    if (s8 !== peg$FAILED) {\n                      if (input.substr(peg$currPos, 7) === peg$c3) {\n                        s9 = peg$c3;\n                        peg$currPos += 7;\n                      } else {\n                        s9 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$c4); }\n                      }\n                      if (s9 !== peg$FAILED) {\n                        s10 = peg$parsenoise();\n                        if (s10 !== peg$FAILED) {\n                          peg$savedPos = s2;\n                          s3 = peg$c5(s7);\n                          s2 = s3;\n                        } else {\n                          peg$currPos = s2;\n                          s2 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s2;\n                        s2 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s2;\n                      s2 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s2;\n                    s2 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s2;\n                  s2 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s2;\n                s2 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s2;\n              s2 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c6(s1);\n      }\n      s0 = s1;\n\n      return s0;\n    }\n\n    function peg$parseumllines() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = peg$parseumlline();\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parseumlline();\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c7(s1);\n      }\n      s0 = s1;\n\n      return s0;\n    }\n\n    function peg$parseumlline() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      s1 = peg$parsepropertyset();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parsenewline();\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$c0();\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parsetitleset();\n        if (s1 !== peg$FAILED) {\n          s2 = peg$parsenewline();\n          if (s2 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c0();\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parsenoise();\n          if (s1 !== peg$FAILED) {\n            s2 = peg$parsenewline();\n            if (s2 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$c0();\n              s0 = s1;\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parsecommentline();\n            if (s1 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$c0();\n            }\n            s0 = s1;\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              s1 = peg$parsenoteline();\n              if (s1 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$c0();\n              }\n              s0 = s1;\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                s1 = peg$parsehideline();\n                if (s1 !== peg$FAILED) {\n                  s2 = peg$parsenewline();\n                  if (s2 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$c0();\n                    s0 = s1;\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  s1 = peg$parseskinparams();\n                  if (s1 !== peg$FAILED) {\n                    s2 = peg$parsenewline();\n                    if (s2 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$c0();\n                      s0 = s1;\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    s1 = peg$parsepackagedeclaration();\n                    if (s1 !== peg$FAILED) {\n                      s2 = peg$parsenewline();\n                      if (s2 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s1 = peg$c8(s1);\n                        s0 = s1;\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                    if (s0 === peg$FAILED) {\n                      s0 = peg$currPos;\n                      s1 = peg$parsenamespacedeclaration();\n                      if (s1 !== peg$FAILED) {\n                        s2 = peg$parsenewline();\n                        if (s2 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s1 = peg$c8(s1);\n                          s0 = s1;\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                      if (s0 === peg$FAILED) {\n                        s0 = peg$currPos;\n                        s1 = peg$parseclassdeclaration();\n                        if (s1 !== peg$FAILED) {\n                          s2 = peg$parsenewline();\n                          if (s2 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s1 = peg$c8(s1);\n                            s0 = s1;\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                        if (s0 === peg$FAILED) {\n                          s0 = peg$currPos;\n                          s1 = peg$parseinterfacedeclaration();\n                          if (s1 !== peg$FAILED) {\n                            s2 = peg$parsenewline();\n                            if (s2 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s1 = peg$c8(s1);\n                              s0 = s1;\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                          if (s0 === peg$FAILED) {\n                            s0 = peg$currPos;\n                            s1 = peg$parseabstractclassdeclaration();\n                            if (s1 !== peg$FAILED) {\n                              s2 = peg$parsenewline();\n                              if (s2 !== peg$FAILED) {\n                                peg$savedPos = s0;\n                                s1 = peg$c8(s1);\n                                s0 = s1;\n                              } else {\n                                peg$currPos = s0;\n                                s0 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                            if (s0 === peg$FAILED) {\n                              s0 = peg$currPos;\n                              s1 = peg$parsememberdeclaration();\n                              if (s1 !== peg$FAILED) {\n                                s2 = peg$parsenewline();\n                                if (s2 !== peg$FAILED) {\n                                  peg$savedPos = s0;\n                                  s1 = peg$c8(s1);\n                                  s0 = s1;\n                                } else {\n                                  peg$currPos = s0;\n                                  s0 = peg$FAILED;\n                                }\n                              } else {\n                                peg$currPos = s0;\n                                s0 = peg$FAILED;\n                              }\n                              if (s0 === peg$FAILED) {\n                                s0 = peg$currPos;\n                                s1 = peg$parseconnectordeclaration();\n                                if (s1 !== peg$FAILED) {\n                                  s2 = peg$parsenewline();\n                                  if (s2 !== peg$FAILED) {\n                                    peg$savedPos = s0;\n                                    s1 = peg$c8(s1);\n                                    s0 = s1;\n                                  } else {\n                                    peg$currPos = s0;\n                                    s0 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s0;\n                                  s0 = peg$FAILED;\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsehideline() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 18) === peg$c9) {\n          s2 = peg$c9;\n          peg$currPos += 18;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c10); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            s1 = [s1, s2, s3];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseskinparams() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 9) === peg$c11) {\n          s2 = peg$c11;\n          peg$currPos += 9;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c12); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            if (peg$c13.test(input.charAt(peg$currPos))) {\n              s5 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c14); }\n            }\n            if (s5 !== peg$FAILED) {\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                if (peg$c13.test(input.charAt(peg$currPos))) {\n                  s5 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c14); }\n                }\n              }\n            } else {\n              s4 = peg$FAILED;\n            }\n            if (s4 !== peg$FAILED) {\n              s1 = [s1, s2, s3, s4];\n              s0 = s1;\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseconnectordeclaration() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseobjectname();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parseconnectordescription();\n            if (s4 === peg$FAILED) {\n              s4 = null;\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsenoise();\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parseconnectortype();\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parsenoise();\n                  if (s7 !== peg$FAILED) {\n                    s8 = peg$parseconnectordescription();\n                    if (s8 === peg$FAILED) {\n                      s8 = null;\n                    }\n                    if (s8 !== peg$FAILED) {\n                      s9 = peg$parsenoise();\n                      if (s9 !== peg$FAILED) {\n                        s10 = peg$parseobjectname();\n                        if (s10 !== peg$FAILED) {\n                          s11 = peg$parsenoise();\n                          if (s11 !== peg$FAILED) {\n                            s12 = peg$currPos;\n                            if (peg$c15.test(input.charAt(peg$currPos))) {\n                              s13 = input.charAt(peg$currPos);\n                              peg$currPos++;\n                            } else {\n                              s13 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$c16); }\n                            }\n                            if (s13 !== peg$FAILED) {\n                              s14 = [];\n                              if (peg$c13.test(input.charAt(peg$currPos))) {\n                                s15 = input.charAt(peg$currPos);\n                                peg$currPos++;\n                              } else {\n                                s15 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$c14); }\n                              }\n                              if (s15 !== peg$FAILED) {\n                                while (s15 !== peg$FAILED) {\n                                  s14.push(s15);\n                                  if (peg$c13.test(input.charAt(peg$currPos))) {\n                                    s15 = input.charAt(peg$currPos);\n                                    peg$currPos++;\n                                  } else {\n                                    s15 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$c14); }\n                                  }\n                                }\n                              } else {\n                                s14 = peg$FAILED;\n                              }\n                              if (s14 !== peg$FAILED) {\n                                s13 = [s13, s14];\n                                s12 = s13;\n                              } else {\n                                peg$currPos = s12;\n                                s12 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s12;\n                              s12 = peg$FAILED;\n                            }\n                            if (s12 === peg$FAILED) {\n                              s12 = null;\n                            }\n                            if (s12 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s1 = peg$c17(s2, s6, s10);\n                              s0 = s1;\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseconnectordescription() {\n      var s0, s1, s2, s3, s4, s5, s6;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (peg$c18.test(input.charAt(peg$currPos))) {\n          s2 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c19); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = [];\n          s4 = peg$currPos;\n          if (peg$c20.test(input.charAt(peg$currPos))) {\n            s5 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c21); }\n          }\n          if (s5 !== peg$FAILED) {\n            if (peg$c18.test(input.charAt(peg$currPos))) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c19); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          if (s4 === peg$FAILED) {\n            if (peg$c22.test(input.charAt(peg$currPos))) {\n              s4 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c23); }\n            }\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$currPos;\n            if (peg$c20.test(input.charAt(peg$currPos))) {\n              s5 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c21); }\n            }\n            if (s5 !== peg$FAILED) {\n              if (peg$c18.test(input.charAt(peg$currPos))) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c19); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n            if (s4 === peg$FAILED) {\n              if (peg$c22.test(input.charAt(peg$currPos))) {\n                s4 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c23); }\n              }\n            }\n          }\n          if (s3 !== peg$FAILED) {\n            if (peg$c18.test(input.charAt(peg$currPos))) {\n              s4 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c19); }\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsenoise();\n              if (s5 !== peg$FAILED) {\n                s1 = [s1, s2, s3, s4, s5];\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsetitleset() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 6) === peg$c24) {\n          s2 = peg$c24;\n          peg$currPos += 6;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c25); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            if (peg$c13.test(input.charAt(peg$currPos))) {\n              s5 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c14); }\n            }\n            if (s5 !== peg$FAILED) {\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                if (peg$c13.test(input.charAt(peg$currPos))) {\n                  s5 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c14); }\n                }\n              }\n            } else {\n              s4 = peg$FAILED;\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsenoise();\n              if (s5 !== peg$FAILED) {\n                s1 = [s1, s2, s3, s4, s5];\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsecommentline() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 39) {\n          s2 = peg$c26;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c27); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = [];\n          if (peg$c13.test(input.charAt(peg$currPos))) {\n            s4 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c14); }\n          }\n          if (s4 !== peg$FAILED) {\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              if (peg$c13.test(input.charAt(peg$currPos))) {\n                s4 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c14); }\n              }\n            }\n          } else {\n            s3 = peg$FAILED;\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parsenoise();\n            if (s4 !== peg$FAILED) {\n              s1 = [s1, s2, s3, s4];\n              s0 = s1;\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parsenoise();\n        if (s1 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 2) === peg$c28) {\n            s2 = peg$c28;\n            peg$currPos += 2;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c29); }\n          }\n          if (s2 !== peg$FAILED) {\n            s3 = [];\n            if (peg$c30.test(input.charAt(peg$currPos))) {\n              s4 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c31); }\n            }\n            if (s4 !== peg$FAILED) {\n              while (s4 !== peg$FAILED) {\n                s3.push(s4);\n                if (peg$c30.test(input.charAt(peg$currPos))) {\n                  s4 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s4 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c31); }\n                }\n              }\n            } else {\n              s3 = peg$FAILED;\n            }\n            if (s3 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 2) === peg$c28) {\n                s4 = peg$c28;\n                peg$currPos += 2;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c29); }\n              }\n              if (s4 !== peg$FAILED) {\n                s5 = peg$parsenoise();\n                if (s5 !== peg$FAILED) {\n                  s1 = [s1, s2, s3, s4, s5];\n                  s0 = s1;\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parsenoise();\n          if (s1 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 2) === peg$c32) {\n              s2 = peg$c32;\n              peg$currPos += 2;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c33); }\n            }\n            if (s2 !== peg$FAILED) {\n              s3 = [];\n              if (peg$c34.test(input.charAt(peg$currPos))) {\n                s4 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c35); }\n              }\n              if (s4 !== peg$FAILED) {\n                while (s4 !== peg$FAILED) {\n                  s3.push(s4);\n                  if (peg$c34.test(input.charAt(peg$currPos))) {\n                    s4 = input.charAt(peg$currPos);\n                    peg$currPos++;\n                  } else {\n                    s4 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$c35); }\n                  }\n                }\n              } else {\n                s3 = peg$FAILED;\n              }\n              if (s3 !== peg$FAILED) {\n                if (input.substr(peg$currPos, 2) === peg$c32) {\n                  s4 = peg$c32;\n                  peg$currPos += 2;\n                } else {\n                  s4 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c33); }\n                }\n                if (s4 !== peg$FAILED) {\n                  s5 = peg$parsenoise();\n                  if (s5 !== peg$FAILED) {\n                    s1 = [s1, s2, s3, s4, s5];\n                    s0 = s1;\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parsenoise();\n            if (s1 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 2) === peg$c36) {\n                s2 = peg$c36;\n                peg$currPos += 2;\n              } else {\n                s2 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c37); }\n              }\n              if (s2 !== peg$FAILED) {\n                s3 = [];\n                if (peg$c38.test(input.charAt(peg$currPos))) {\n                  s4 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s4 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c39); }\n                }\n                if (s4 !== peg$FAILED) {\n                  while (s4 !== peg$FAILED) {\n                    s3.push(s4);\n                    if (peg$c38.test(input.charAt(peg$currPos))) {\n                      s4 = input.charAt(peg$currPos);\n                      peg$currPos++;\n                    } else {\n                      s4 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$c39); }\n                    }\n                  }\n                } else {\n                  s3 = peg$FAILED;\n                }\n                if (s3 !== peg$FAILED) {\n                  if (input.substr(peg$currPos, 2) === peg$c36) {\n                    s4 = peg$c36;\n                    peg$currPos += 2;\n                  } else {\n                    s4 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$c37); }\n                  }\n                  if (s4 !== peg$FAILED) {\n                    s5 = peg$parsenoise();\n                    if (s5 !== peg$FAILED) {\n                      s1 = [s1, s2, s3, s4, s5];\n                      s0 = s1;\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsenoteline() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 5) === peg$c40) {\n          s2 = peg$c40;\n          peg$currPos += 5;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c41); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            if (peg$c13.test(input.charAt(peg$currPos))) {\n              s5 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c14); }\n            }\n            if (s5 !== peg$FAILED) {\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                if (peg$c13.test(input.charAt(peg$currPos))) {\n                  s5 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c14); }\n                }\n              }\n            } else {\n              s4 = peg$FAILED;\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsenoise();\n              if (s5 !== peg$FAILED) {\n                s1 = [s1, s2, s3, s4, s5];\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseconnectortype() {\n      var s0, s1;\n\n      s0 = peg$currPos;\n      s1 = peg$parseextends();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c42(s1);\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseconcatenates();\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$c43();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parseaggregates();\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c44();\n          }\n          s0 = s1;\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parseconnectorsize();\n            if (s1 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$c0();\n            }\n            s0 = s1;\n          }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parseextends() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c45) {\n        s1 = peg$c45;\n        peg$currPos += 2;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c46); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseconnectorsize();\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$c47();\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseconnectorsize();\n        if (s1 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 2) === peg$c48) {\n            s2 = peg$c48;\n            peg$currPos += 2;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c49); }\n          }\n          if (s2 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c50();\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parseconnectorsize() {\n      var s0;\n\n      if (input.substr(peg$currPos, 2) === peg$c28) {\n        s0 = peg$c28;\n        peg$currPos += 2;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c29); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 4) === peg$c51) {\n          s0 = peg$c51;\n          peg$currPos += 4;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c52); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 6) === peg$c53) {\n            s0 = peg$c53;\n            peg$currPos += 6;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c54); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 6) === peg$c55) {\n              s0 = peg$c55;\n              peg$currPos += 6;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c56); }\n            }\n            if (s0 === peg$FAILED) {\n              if (input.substr(peg$currPos, 7) === peg$c57) {\n                s0 = peg$c57;\n                peg$currPos += 7;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c58); }\n              }\n              if (s0 === peg$FAILED) {\n                if (input.substr(peg$currPos, 3) === peg$c59) {\n                  s0 = peg$c59;\n                  peg$currPos += 3;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c60); }\n                }\n                if (s0 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 2) === peg$c32) {\n                    s0 = peg$c32;\n                    peg$currPos += 2;\n                  } else {\n                    s0 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$c33); }\n                  }\n                  if (s0 === peg$FAILED) {\n                    if (peg$c61.test(input.charAt(peg$currPos))) {\n                      s0 = input.charAt(peg$currPos);\n                      peg$currPos++;\n                    } else {\n                      s0 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$c62); }\n                    }\n                    if (s0 === peg$FAILED) {\n                      if (peg$c63.test(input.charAt(peg$currPos))) {\n                        s0 = input.charAt(peg$currPos);\n                        peg$currPos++;\n                      } else {\n                        s0 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$c64); }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parseconcatenates() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 42) {\n        s1 = peg$c65;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c66); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseconnectorsize();\n        if (s2 !== peg$FAILED) {\n          s1 = [s1, s2];\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseconnectorsize();\n        if (s1 !== peg$FAILED) {\n          if (peg$c67.test(input.charAt(peg$currPos))) {\n            s2 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c68); }\n          }\n          if (s2 !== peg$FAILED) {\n            s1 = [s1, s2];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parseaggregates() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 111) {\n        s1 = peg$c69;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c70); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseconnectorsize();\n        if (s2 !== peg$FAILED) {\n          s1 = [s1, s2];\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseconnectorsize();\n        if (s1 !== peg$FAILED) {\n          if (peg$c71.test(input.charAt(peg$currPos))) {\n            s2 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c72); }\n          }\n          if (s2 !== peg$FAILED) {\n            s1 = [s1, s2];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsestartblock() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (peg$c73.test(input.charAt(peg$currPos))) {\n          s2 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c74); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            s1 = [s1, s2, s3];\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseendblock() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (peg$c75.test(input.charAt(peg$currPos))) {\n          s2 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c76); }\n        }\n        if (s2 !== peg$FAILED) {\n          s1 = [s1, s2];\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsepropertyset() {\n      var s0;\n\n      if (input.substr(peg$currPos, 13) === peg$c77) {\n        s0 = peg$c77;\n        peg$currPos += 13;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c78); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsepackagedeclaration() {\n      var s0, s1, s2, s3, s4, s5, s6;\n\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 8) === peg$c79) {\n        s1 = peg$c79;\n        peg$currPos += 8;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c80); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseobjectname();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsestartblock();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parsenewline();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parseumllines();\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parseendblock();\n                if (s6 !== peg$FAILED) {\n                  s1 = [s1, s2, s3, s4, s5, s6];\n                  s0 = s1;\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 8) === peg$c79) {\n          s1 = peg$c79;\n          peg$currPos += 8;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c80); }\n        }\n        if (s1 !== peg$FAILED) {\n          s2 = peg$parseobjectname();\n          if (s2 !== peg$FAILED) {\n            s3 = peg$parsenewline();\n            if (s3 !== peg$FAILED) {\n              s4 = peg$parseumllines();\n              if (s4 !== peg$FAILED) {\n                if (input.substr(peg$currPos, 11) === peg$c81) {\n                  s5 = peg$c81;\n                  peg$currPos += 11;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c82); }\n                }\n                if (s5 !== peg$FAILED) {\n                  s1 = [s1, s2, s3, s4, s5];\n                  s0 = s1;\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parseabstractclassdeclaration() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 9) === peg$c83) {\n          s2 = peg$c83;\n          peg$currPos += 9;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c84); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 6) === peg$c85) {\n              s4 = peg$c85;\n              peg$currPos += 6;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c86); }\n            }\n            if (s4 === peg$FAILED) {\n              s4 = null;\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsenoise();\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parseobjectname();\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parsenoise();\n                  if (s7 !== peg$FAILED) {\n                    s8 = peg$parsestartblock();\n                    if (s8 !== peg$FAILED) {\n                      s9 = peg$parseumllines();\n                      if (s9 !== peg$FAILED) {\n                        s10 = peg$parseendblock();\n                        if (s10 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s1 = peg$c87(s6, s9);\n                          s0 = s1;\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parsenoise();\n        if (s1 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 9) === peg$c83) {\n            s2 = peg$c83;\n            peg$currPos += 9;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c84); }\n          }\n          if (s2 !== peg$FAILED) {\n            s3 = peg$parsenoise();\n            if (s3 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 6) === peg$c85) {\n                s4 = peg$c85;\n                peg$currPos += 6;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c86); }\n              }\n              if (s4 === peg$FAILED) {\n                s4 = null;\n              }\n              if (s4 !== peg$FAILED) {\n                s5 = peg$parsenoise();\n                if (s5 !== peg$FAILED) {\n                  s6 = peg$parseobjectname();\n                  if (s6 !== peg$FAILED) {\n                    s7 = peg$parsenoise();\n                    if (s7 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$c88(s6);\n                      s0 = s1;\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parsenoise();\n          if (s1 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 9) === peg$c83) {\n              s2 = peg$c83;\n              peg$currPos += 9;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c84); }\n            }\n            if (s2 !== peg$FAILED) {\n              s3 = peg$parsenoise();\n              if (s3 !== peg$FAILED) {\n                if (input.substr(peg$currPos, 6) === peg$c85) {\n                  s4 = peg$c85;\n                  peg$currPos += 6;\n                } else {\n                  s4 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c86); }\n                }\n                if (s4 === peg$FAILED) {\n                  s4 = null;\n                }\n                if (s4 !== peg$FAILED) {\n                  s5 = peg$parsenoise();\n                  if (s5 !== peg$FAILED) {\n                    s6 = peg$parseobjectname();\n                    if (s6 !== peg$FAILED) {\n                      s7 = peg$parsenoise();\n                      if (s7 !== peg$FAILED) {\n                        s8 = peg$parsenewline();\n                        if (s8 !== peg$FAILED) {\n                          s9 = peg$parsenoise();\n                          if (s9 !== peg$FAILED) {\n                            s10 = peg$parseumllines();\n                            if (s10 !== peg$FAILED) {\n                              if (input.substr(peg$currPos, 9) === peg$c89) {\n                                s11 = peg$c89;\n                                peg$currPos += 9;\n                              } else {\n                                s11 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$c90); }\n                              }\n                              if (s11 !== peg$FAILED) {\n                                peg$savedPos = s0;\n                                s1 = peg$c87(s6, s10);\n                                s0 = s1;\n                              } else {\n                                peg$currPos = s0;\n                                s0 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsenoise() {\n      var s0, s1;\n\n      s0 = [];\n      if (peg$c91.test(input.charAt(peg$currPos))) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c92); }\n      }\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        if (peg$c91.test(input.charAt(peg$currPos))) {\n          s1 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c92); }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsenewline() {\n      var s0;\n\n      if (peg$c93.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c94); }\n      }\n      if (s0 === peg$FAILED) {\n        if (peg$c95.test(input.charAt(peg$currPos))) {\n          s0 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c96); }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parseclassdeclaration() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 6) === peg$c85) {\n          s2 = peg$c85;\n          peg$currPos += 6;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c86); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parseobjectname();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsenoise();\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsestartblock();\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parseumllines();\n                  if (s7 !== peg$FAILED) {\n                    s8 = peg$parseendblock();\n                    if (s8 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$c97(s4, s7);\n                      s0 = s1;\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parsenoise();\n        if (s1 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 6) === peg$c85) {\n            s2 = peg$c85;\n            peg$currPos += 6;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c86); }\n          }\n          if (s2 !== peg$FAILED) {\n            s3 = peg$parsenoise();\n            if (s3 !== peg$FAILED) {\n              s4 = peg$parseobjectname();\n              if (s4 !== peg$FAILED) {\n                s5 = peg$parsenoise();\n                if (s5 !== peg$FAILED) {\n                  if (input.substr(peg$currPos, 2) === peg$c98) {\n                    s6 = peg$c98;\n                    peg$currPos += 2;\n                  } else {\n                    s6 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$c99); }\n                  }\n                  if (s6 !== peg$FAILED) {\n                    s7 = peg$parsenoise();\n                    if (s7 !== peg$FAILED) {\n                      s8 = [];\n                      if (peg$c100.test(input.charAt(peg$currPos))) {\n                        s9 = input.charAt(peg$currPos);\n                        peg$currPos++;\n                      } else {\n                        s9 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$c101); }\n                      }\n                      if (s9 !== peg$FAILED) {\n                        while (s9 !== peg$FAILED) {\n                          s8.push(s9);\n                          if (peg$c100.test(input.charAt(peg$currPos))) {\n                            s9 = input.charAt(peg$currPos);\n                            peg$currPos++;\n                          } else {\n                            s9 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$c101); }\n                          }\n                        }\n                      } else {\n                        s8 = peg$FAILED;\n                      }\n                      if (s8 !== peg$FAILED) {\n                        s9 = peg$parsenoise();\n                        if (s9 !== peg$FAILED) {\n                          if (input.substr(peg$currPos, 2) === peg$c102) {\n                            s10 = peg$c102;\n                            peg$currPos += 2;\n                          } else {\n                            s10 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$c103); }\n                          }\n                          if (s10 !== peg$FAILED) {\n                            s11 = peg$parsenoise();\n                            if (s11 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s1 = peg$c104(s4);\n                              s0 = s1;\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parsenoise();\n          if (s1 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 6) === peg$c85) {\n              s2 = peg$c85;\n              peg$currPos += 6;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c86); }\n            }\n            if (s2 !== peg$FAILED) {\n              s3 = peg$parsenoise();\n              if (s3 !== peg$FAILED) {\n                s4 = peg$parseobjectname();\n                if (s4 !== peg$FAILED) {\n                  s5 = peg$parsenoise();\n                  if (s5 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$c104(s4);\n                    s0 = s1;\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parsenoise();\n            if (s1 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 6) === peg$c85) {\n                s2 = peg$c85;\n                peg$currPos += 6;\n              } else {\n                s2 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c86); }\n              }\n              if (s2 !== peg$FAILED) {\n                s3 = peg$parsenoise();\n                if (s3 !== peg$FAILED) {\n                  s4 = peg$parseobjectname();\n                  if (s4 !== peg$FAILED) {\n                    s5 = peg$parsenoise();\n                    if (s5 !== peg$FAILED) {\n                      s6 = peg$parsenewline();\n                      if (s6 !== peg$FAILED) {\n                        s7 = peg$parsenoise();\n                        if (s7 !== peg$FAILED) {\n                          s8 = peg$parseumllines();\n                          if (s8 !== peg$FAILED) {\n                            if (input.substr(peg$currPos, 9) === peg$c89) {\n                              s9 = peg$c89;\n                              peg$currPos += 9;\n                            } else {\n                              s9 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$c90); }\n                            }\n                            if (s9 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s1 = peg$c97(s4, s8);\n                              s0 = s1;\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parseinterfacedeclaration() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 10) === peg$c105) {\n          s2 = peg$c105;\n          peg$currPos += 10;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c106); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parseobjectname();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsenoise();\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsestartblock();\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parseumllines();\n                  if (s7 !== peg$FAILED) {\n                    s8 = peg$parseendblock();\n                    if (s8 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$c107(s4, s7);\n                      s0 = s1;\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parsenoise();\n        if (s1 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 10) === peg$c105) {\n            s2 = peg$c105;\n            peg$currPos += 10;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c106); }\n          }\n          if (s2 !== peg$FAILED) {\n            s3 = peg$parsenoise();\n            if (s3 !== peg$FAILED) {\n              s4 = peg$parseobjectname();\n              if (s4 !== peg$FAILED) {\n                s5 = peg$parsenoise();\n                if (s5 !== peg$FAILED) {\n                  if (input.substr(peg$currPos, 2) === peg$c98) {\n                    s6 = peg$c98;\n                    peg$currPos += 2;\n                  } else {\n                    s6 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$c99); }\n                  }\n                  if (s6 !== peg$FAILED) {\n                    s7 = peg$parsenoise();\n                    if (s7 !== peg$FAILED) {\n                      s8 = [];\n                      if (peg$c100.test(input.charAt(peg$currPos))) {\n                        s9 = input.charAt(peg$currPos);\n                        peg$currPos++;\n                      } else {\n                        s9 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$c101); }\n                      }\n                      if (s9 !== peg$FAILED) {\n                        while (s9 !== peg$FAILED) {\n                          s8.push(s9);\n                          if (peg$c100.test(input.charAt(peg$currPos))) {\n                            s9 = input.charAt(peg$currPos);\n                            peg$currPos++;\n                          } else {\n                            s9 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$c101); }\n                          }\n                        }\n                      } else {\n                        s8 = peg$FAILED;\n                      }\n                      if (s8 !== peg$FAILED) {\n                        s9 = peg$parsenoise();\n                        if (s9 !== peg$FAILED) {\n                          if (input.substr(peg$currPos, 2) === peg$c102) {\n                            s10 = peg$c102;\n                            peg$currPos += 2;\n                          } else {\n                            s10 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$c103); }\n                          }\n                          if (s10 !== peg$FAILED) {\n                            s11 = peg$parsenoise();\n                            if (s11 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s1 = peg$c108(s4);\n                              s0 = s1;\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parsenoise();\n          if (s1 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 10) === peg$c105) {\n              s2 = peg$c105;\n              peg$currPos += 10;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c106); }\n            }\n            if (s2 !== peg$FAILED) {\n              s3 = peg$parsenoise();\n              if (s3 !== peg$FAILED) {\n                s4 = peg$parseobjectname();\n                if (s4 !== peg$FAILED) {\n                  s5 = peg$parsenoise();\n                  if (s5 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$c108(s4);\n                    s0 = s1;\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parsenoise();\n            if (s1 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 10) === peg$c105) {\n                s2 = peg$c105;\n                peg$currPos += 10;\n              } else {\n                s2 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c106); }\n              }\n              if (s2 !== peg$FAILED) {\n                s3 = peg$parsenoise();\n                if (s3 !== peg$FAILED) {\n                  s4 = peg$parseobjectname();\n                  if (s4 !== peg$FAILED) {\n                    s5 = peg$parsenoise();\n                    if (s5 !== peg$FAILED) {\n                      s6 = peg$parsenewline();\n                      if (s6 !== peg$FAILED) {\n                        s7 = peg$parsenoise();\n                        if (s7 !== peg$FAILED) {\n                          s8 = peg$parseumllines();\n                          if (s8 !== peg$FAILED) {\n                            if (input.substr(peg$currPos, 13) === peg$c109) {\n                              s9 = peg$c109;\n                              peg$currPos += 13;\n                            } else {\n                              s9 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$c110); }\n                            }\n                            if (s9 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s1 = peg$c111(s4, s8);\n                              s0 = s1;\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsecolor() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      if (peg$c112.test(input.charAt(peg$currPos))) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c113); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        if (peg$c114.test(input.charAt(peg$currPos))) {\n          s3 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c115); }\n        }\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            if (peg$c114.test(input.charAt(peg$currPos))) {\n              s3 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c115); }\n            }\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          s1 = [s1, s2];\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsenamespacedeclaration() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 10) === peg$c116) {\n          s2 = peg$c116;\n          peg$currPos += 10;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c117); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parseobjectname();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsenoise();\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsecolor();\n                if (s6 === peg$FAILED) {\n                  s6 = null;\n                }\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parsenoise();\n                  if (s7 !== peg$FAILED) {\n                    s8 = peg$parsestartblock();\n                    if (s8 !== peg$FAILED) {\n                      s9 = peg$parseumllines();\n                      if (s9 !== peg$FAILED) {\n                        s10 = peg$parseendblock();\n                        if (s10 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s1 = peg$c118(s4, s9);\n                          s0 = s1;\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parsenoise();\n        if (s1 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 10) === peg$c116) {\n            s2 = peg$c116;\n            peg$currPos += 10;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c117); }\n          }\n          if (s2 !== peg$FAILED) {\n            s3 = peg$parsenoise();\n            if (s3 !== peg$FAILED) {\n              s4 = peg$parseobjectname();\n              if (s4 !== peg$FAILED) {\n                s5 = peg$parsenoise();\n                if (s5 !== peg$FAILED) {\n                  s6 = peg$parsenewline();\n                  if (s6 !== peg$FAILED) {\n                    s7 = peg$parseumllines();\n                    if (s7 !== peg$FAILED) {\n                      if (input.substr(peg$currPos, 13) === peg$c119) {\n                        s8 = peg$c119;\n                        peg$currPos += 13;\n                      } else {\n                        s8 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$c120); }\n                      }\n                      if (s8 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s1 = peg$c121(s4);\n                        s0 = s1;\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsestaticmemberdeclaration() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 7) === peg$c122) {\n        s1 = peg$c122;\n        peg$currPos += 7;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c123); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parsememberdeclaration();\n        if (s2 !== peg$FAILED) {\n          s1 = [s1, s2];\n          s0 = s1;\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsememberdeclaration() {\n      var s0, s1;\n\n      s0 = peg$currPos;\n      s1 = peg$parsemethoddeclaration();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c8(s1);\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parsefielddeclaration();\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$c8(s1);\n        }\n        s0 = s1;\n      }\n\n      return s0;\n    }\n\n    function peg$parsefielddeclaration() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseaccessortype();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenoise();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parsereturntype();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsenoise();\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsemembername();\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parsenoise();\n                  if (s7 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$c124(s2, s4, s6);\n                    s0 = s1;\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parsenoise();\n        if (s1 !== peg$FAILED) {\n          s2 = peg$parseaccessortype();\n          if (s2 !== peg$FAILED) {\n            s3 = peg$parsenoise();\n            if (s3 !== peg$FAILED) {\n              s4 = peg$parsemembername();\n              if (s4 !== peg$FAILED) {\n                s5 = peg$parsenoise();\n                if (s5 !== peg$FAILED) {\n                  if (peg$c15.test(input.charAt(peg$currPos))) {\n                    s6 = input.charAt(peg$currPos);\n                    peg$currPos++;\n                  } else {\n                    s6 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$c16); }\n                  }\n                  if (s6 !== peg$FAILED) {\n                    s7 = peg$parsenoise();\n                    if (s7 !== peg$FAILED) {\n                      s8 = peg$parsereturntype();\n                      if (s8 !== peg$FAILED) {\n                        s9 = peg$parsenoise();\n                        if (s9 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s1 = peg$c125(s2, s4, s8);\n                          s0 = s1;\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parsenoise();\n          if (s1 !== peg$FAILED) {\n            s2 = peg$parseaccessortype();\n            if (s2 !== peg$FAILED) {\n              s3 = peg$parsenoise();\n              if (s3 !== peg$FAILED) {\n                s4 = peg$parsemembername();\n                if (s4 !== peg$FAILED) {\n                  s5 = peg$parsenoise();\n                  if (s5 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$c126(s2, s4);\n                    s0 = s1;\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parsenoise();\n            if (s1 !== peg$FAILED) {\n              s2 = peg$parsereturntype();\n              if (s2 !== peg$FAILED) {\n                s3 = peg$parsenoise();\n                if (s3 !== peg$FAILED) {\n                  s4 = peg$parsemembername();\n                  if (s4 !== peg$FAILED) {\n                    s5 = peg$parsenoise();\n                    if (s5 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$c127(s2, s4);\n                      s0 = s1;\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              s1 = peg$parsenoise();\n              if (s1 !== peg$FAILED) {\n                s2 = peg$parsemembername();\n                if (s2 !== peg$FAILED) {\n                  s3 = peg$parsenoise();\n                  if (s3 !== peg$FAILED) {\n                    if (peg$c15.test(input.charAt(peg$currPos))) {\n                      s4 = input.charAt(peg$currPos);\n                      peg$currPos++;\n                    } else {\n                      s4 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$c16); }\n                    }\n                    if (s4 !== peg$FAILED) {\n                      s5 = peg$parsenoise();\n                      if (s5 !== peg$FAILED) {\n                        s6 = peg$parsereturntype();\n                        if (s6 !== peg$FAILED) {\n                          s7 = peg$parsenoise();\n                          if (s7 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s1 = peg$c128(s2, s6);\n                            s0 = s1;\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            }\n          }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsemethoddeclaration() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parsefielddeclaration();\n        if (s2 !== peg$FAILED) {\n          if (peg$c129.test(input.charAt(peg$currPos))) {\n            s3 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c130); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parsemethodparameters();\n            if (s4 !== peg$FAILED) {\n              if (peg$c131.test(input.charAt(peg$currPos))) {\n                s5 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c132); }\n              }\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsenoise();\n                if (s6 !== peg$FAILED) {\n                  if (peg$c15.test(input.charAt(peg$currPos))) {\n                    s7 = input.charAt(peg$currPos);\n                    peg$currPos++;\n                  } else {\n                    s7 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$c16); }\n                  }\n                  if (s7 !== peg$FAILED) {\n                    s8 = peg$parsenoise();\n                    if (s8 !== peg$FAILED) {\n                      s9 = peg$parsereturntype();\n                      if (s9 !== peg$FAILED) {\n                        s10 = peg$parsenoise();\n                        if (s10 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s1 = peg$c133(s2, s4, s9);\n                          s0 = s1;\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parsenoise();\n        if (s1 !== peg$FAILED) {\n          s2 = peg$parsefielddeclaration();\n          if (s2 !== peg$FAILED) {\n            if (peg$c129.test(input.charAt(peg$currPos))) {\n              s3 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c130); }\n            }\n            if (s3 !== peg$FAILED) {\n              s4 = peg$parsemethodparameters();\n              if (s4 !== peg$FAILED) {\n                if (peg$c131.test(input.charAt(peg$currPos))) {\n                  s5 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c132); }\n                }\n                if (s5 !== peg$FAILED) {\n                  s6 = peg$parsenoise();\n                  if (s6 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$c134(s2, s4);\n                    s0 = s1;\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsemethodparameters() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = peg$parsemethodparameter();\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parsemethodparameter();\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c135(s1);\n      }\n      s0 = s1;\n\n      return s0;\n    }\n\n    function peg$parsemethodparameter() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = peg$parsenoise();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parsereturntype();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$currPos;\n          if (peg$c136.test(input.charAt(peg$currPos))) {\n            s4 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c137); }\n          }\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parsemembername();\n            if (s5 !== peg$FAILED) {\n              s4 = [s4, s5];\n              s3 = s4;\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n          if (s3 === peg$FAILED) {\n            s3 = null;\n          }\n          if (s3 !== peg$FAILED) {\n            if (peg$c138.test(input.charAt(peg$currPos))) {\n              s4 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c139); }\n            }\n            if (s4 === peg$FAILED) {\n              s4 = null;\n            }\n            if (s4 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$c140(s2, s3);\n              s0 = s1;\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsereturntype() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      s1 = [];\n      if (peg$c141.test(input.charAt(peg$currPos))) {\n        s2 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c142); }\n      }\n      if (s2 !== peg$FAILED) {\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          if (peg$c141.test(input.charAt(peg$currPos))) {\n            s2 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c142); }\n          }\n        }\n      } else {\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c143(s1);\n      }\n      s0 = s1;\n\n      return s0;\n    }\n\n    function peg$parseobjectname() {\n      var s0, s1, s2, s3, s4;\n\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      if (peg$c144.test(input.charAt(peg$currPos))) {\n        s2 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c145); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        if (peg$c146.test(input.charAt(peg$currPos))) {\n          s4 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c147); }\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          if (peg$c146.test(input.charAt(peg$currPos))) {\n            s4 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c147); }\n          }\n        }\n        if (s3 !== peg$FAILED) {\n          s2 = [s2, s3];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c148(s1);\n      }\n      s0 = s1;\n\n      return s0;\n    }\n\n    function peg$parsemembername() {\n      var s0, s1, s2, s3, s4;\n\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      if (peg$c144.test(input.charAt(peg$currPos))) {\n        s2 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c145); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        if (peg$c149.test(input.charAt(peg$currPos))) {\n          s4 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c150); }\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          if (peg$c149.test(input.charAt(peg$currPos))) {\n            s4 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c150); }\n          }\n        }\n        if (s3 !== peg$FAILED) {\n          s2 = [s2, s3];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c151(s1);\n      }\n      s0 = s1;\n\n      return s0;\n    }\n\n    function peg$parseaccessortype() {\n      var s0;\n\n      s0 = peg$parsepublicaccessor();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseprivateaccessor();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseprotectedaccessor();\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsepublicaccessor() {\n      var s0;\n\n      if (peg$c152.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c153); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseprivateaccessor() {\n      var s0;\n\n      if (peg$c63.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c64); }\n      }\n\n      return s0;\n    }\n\n    function peg$parseprotectedaccessor() {\n      var s0;\n\n      if (peg$c112.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c113); }\n      }\n\n      return s0;\n    }\n\n    peg$result = peg$startRuleFunction();\n\n    if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n      return peg$result;\n    } else {\n      if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n        peg$fail({ type: \"end\", description: \"end of input\" });\n      }\n\n      throw peg$buildException(\n        null,\n        peg$maxFailExpected,\n        peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n        peg$maxFailPos < input.length\n          ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n          : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n      );\n    }\n  }\n\n  return {\n    SyntaxError: peg$SyntaxError,\n    parse:       peg$parse\n  };\n})();\n"
  },
  {
    "path": "src/plantuml.pegjs",
    "content": "plantumlfile\n  = items:((noise newline { return null }) / (noise \"@startuml\" noise newline filelines:umllines noise \"@enduml\" noise { var UMLBlock = require(\"./UMLBlock\"); return new UMLBlock(filelines) }))* { for (var i = 0; i < items.length; i++) { if (items[i] === null) { items.splice(i, 1); i--; } } return items }\numllines\n  = lines:(umlline*) { for (var i = 0; i < lines.length; i++) { if (lines[i]===null) { lines.splice(i, 1); i--; } } return lines; }\numlline\n  = propertyset newline { return null }\n  / titleset newline { return null }\n  / noise newline { return null }\n  / commentline { return null }\n  / noteline { return null }\n  / hideline newline { return null }\n  / skinparams newline { return null }\n  / declaration:packagedeclaration newline { return declaration }\n  / declaration:namespacedeclaration newline { return declaration }\n  / declaration:classdeclaration newline { return declaration }\n  / declaration:interfacedeclaration newline { return declaration }\n  / declaration:abstractclassdeclaration newline { return declaration }\n  / declaration:memberdeclaration newline { return declaration }\n  / declaration:connectordeclaration newline { return declaration }\nhideline\n  = noise \"hide empty members\" noise\nskinparams\n  = noise \"skinparam\" noise [^\\r\\n]+\nconnectordeclaration\n  = noise leftObject:objectname noise connectordescription? noise connector:connectortype noise connectordescription? noise rightObject:objectname noise ([:] [^\\r\\n]+)? { var Connection = require(\"./Connection\"); return new Connection(leftObject, connector, rightObject) }\nconnectordescription\n  = noise [\"]([\\\\][\"]/[^\"])*[\"] noise\ntitleset\n  = noise \"title \" noise [^\\r\\n]+ noise\ncommentline\n  = noise \"'\" [^\\r\\n]+ noise\n  / noise \"..\" [^\\r\\n\\.]+ \"..\" noise\n  / noise \"--\" [^\\r\\n\\-]+ \"--\" noise\n  / noise \"__\" [^\\r\\n\\_]+ \"__\" noise\nnoteline\n  = noise \"note \" noise [^\\r\\n]+ noise\nconnectortype\n  = item:extends { return item }\n  / concatenates { var Composition = require(\"./Composition\"); return new Composition() }\n  / aggregates { var Aggregation = require(\"./Aggregation\"); return new Aggregation() }\n  / connectorsize { return null }\nextends\n  = \"<|\" connectorsize { var Extension = require(\"./Extension\"); return new Extension(true) }\n  / connectorsize \"|>\" { var Extension = require(\"./Extension\"); return new Extension(false) }\nconnectorsize\n  = \"..\"\n  / \"-up-\"\n  / \"-down-\"\n  / \"-left-\"\n  / \"-right-\"\n  / \"---\"\n  / \"--\"\n  / [.]\n  / [-]\nconcatenates\n  = \"*\" connectorsize\n  / connectorsize [*]\naggregates\n  = \"o\" connectorsize\n  / connectorsize [o]\nstartblock\n  = noise [{] noise\nendblock\n  = noise [}]\npropertyset\n  = \"setpropname.*\"\npackagedeclaration\n  = \"package \" objectname startblock newline umllines endblock\n  / \"package \" objectname newline umllines \"end package\"\nabstractclassdeclaration\n  = noise \"abstract \" noise \"class \"? noise classname:objectname noise startblock lines:umllines endblock { var AbstractClass = require(\"./AbstractClass\"); return new AbstractClass(classname, lines) }\n  / noise \"abstract \" noise \"class \"? noise classname:objectname noise { var AbstractClass = require(\"./AbstractClass\"); return new AbstractClass(classname) }\n  / noise \"abstract \" noise \"class \"? noise classname:objectname noise newline noise lines:umllines \"end class\" { var AbstractClass = require(\"./AbstractClass\"); return new AbstractClass(classname, lines) }\nnoise\n  = [ \\t]*\nnewline\n  = [\\r\\n]\n  / [\\n]\nclassdeclaration\n  = noise \"class \" noise classname:objectname noise startblock lines:umllines endblock { var Class = require(\"./Class\"); return new Class(classname, lines) }\n  / noise \"class \" noise classname:objectname noise \"<<\" noise [^>]+ noise \">>\" noise { var Class = require(\"./Class\"); return new Class(classname) }\n  / noise \"class \" noise classname:objectname noise { var Class = require(\"./Class\"); return new Class(classname) }\n  / noise \"class \" noise classname:objectname noise newline noise lines:umllines \"end class\" { var Class = require(\"./Class\"); return new Class(classname, lines) }\ninterfacedeclaration\n  = noise \"interface \" noise interfacename:objectname noise startblock lines:umllines endblock { var Interface = require(\"./Interface\"); return new Interface(interfacename, lines) }\n  / noise \"interface \" noise interfacename:objectname noise \"<<\" noise [^>]+ noise \">>\" noise { var Interface = require(\"./Interface\"); return new Interface(interfacename) }\n  / noise \"interface \" noise interfacename:objectname noise { var Interface = require(\"./Interface\"); return new Interface(interfacename) }\n  / noise \"interface \" noise interfacename:objectname noise newline noise lines:umllines \"end interface\" { var  Interface = require(\"./Interface\"); return new Interface(interfacename, lines) }\ncolor\n  = [#][0-9a-fA-F]+\nnamespacedeclaration\n  = noise \"namespace \" noise namespacename:objectname noise color? noise startblock lines:umllines endblock { var Namespace = require(\"./Namespace\"); return new Namespace(namespacename, lines) }\n  / noise \"namespace \" noise namespacename:objectname noise newline umllines \"end namespace\" { var Namespace = require(\"./Namespace\"); return new Namespace(namespacename) }\nstaticmemberdeclaration\n  = \"static \" memberdeclaration\nmemberdeclaration\n  = declaration:methoddeclaration { return declaration }\n  / declaration:fielddeclaration { return declaration }\nfielddeclaration\n  = noise accessortype:accessortype noise returntype:returntype noise membername:membername noise { var Field = require(\"./Field\"); return new Field(accessortype, returntype, membername) }\n  / noise accessortype:accessortype noise membername:membername noise [:] noise returntype:returntype noise { var Field = require(\"./Field\"); return new Field(accessortype, returntype, membername) }\n  / noise accessortype:accessortype noise membername:membername noise { var Field = require(\"./Field\"); return new Field(accessortype, \"void\", membername) }\n  / noise returntype:returntype noise membername:membername noise { var Field = require(\"./Field\"); return new Field(\"+\", returntype, membername) }\n  / noise membername:membername noise [:] noise returntype:returntype noise { var Field = require(\"./Field\"); return new Field(\"+\", returntype, membername) }\nmethoddeclaration\n  = noise field:fielddeclaration [(] parameters:methodparameters [)] noise [:] noise returntype:returntype noise { var Method = require(\"./Method\"); return new Method(field.getAccessType(), returntype, field.getName(), parameters); }\n  / noise field:fielddeclaration [(] parameters:methodparameters [)] noise { var Method = require(\"./Method\"); return new Method(field.getAccessType(), field.getReturnType(), field.getName(), parameters); }\nmethodparameters\n  = items:methodparameter* { return items; }\nmethodparameter\n  = noise item:returntype membername:([ ] membername)? [,]? { var Parameter = require(\"./Parameter\"); return new Parameter(item, membername ? membername[1] : null); }\nreturntype\n  = items:[^ ,\\n\\r\\t(){}]+ { return items.join(\"\") }\nobjectname\n  = objectname:([A-Za-z_][A-Za-z0-9.]*) { return [objectname[0], objectname[1].join(\"\")].join(\"\") }\nmembername\n  = items:([A-Za-z_][A-Za-z0-9_]*) { return [items[0], items[1].join(\"\")].join(\"\") }\naccessortype\n  = publicaccessor\n  / privateaccessor\n  / protectedaccessor\npublicaccessor\n  = [+]\nprivateaccessor\n  = [-]\nprotectedaccessor\n  = [#]\n"
  },
  {
    "path": "templates/coffeescript.hbs",
    "content": "{{#if_ne getKeyword \"interface\"}}class {{getFullName}}{{#if getExtends}} extends {{#with getExtends}}{{getFullName}}{{/with}}{{/if}}\n{{#each getFields}}\n  {{this.getName}}: undefined\n{{/each}}\n{{#each getMethods}}\n  {{this.getName}}: {{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{/if}} ->\n{{/each}}{{/if_ne}}\n"
  },
  {
    "path": "templates/csharp.hbs",
    "content": "{{getKeyword}} {{getFullName}}{{#if getExtends}} : {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#each getFields}}\n  private {{this.getReturnType}} {{this.getName}};\n{{/each}}\n{{#each getMethods}}\n  public {{this.getReturnType}} {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{this.getReturnType}} {{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{else}}(){{/if}} {\n    {{#if this.needsReturnStatement}}\n      return null;\n    {{/if}}\n  }\n{{/each}}\n}\n"
  },
  {
    "path": "templates/ecmascript5.hbs",
    "content": "{{#if_ne getKeyword \"interface\"}}\n{{#if getExtends}}\n  function {{getFullName}}() {\n    {{#with getExtends}}{{getFullName}}{{/with}}.prototype.constructor.apply(this, arguments);\n  }\n  {{getFullName}}.prototype = Object.create({{#with getExtends}}{{getFullName}}{{/with}}.prototype);\n  {{getFullName}}.prototype.constructor = {{getFullName}};\n{{else}}\n  function {{getFullName}}() {}\n{{/if}}\n{{#each getFields}}\n  {{#call ../this ../getFullName}}{{/call}}.prototype.{{getName}} = undefined;\n{{/each}}\n{{#each getMethods}}\n  {{#call ../this ../getFullName}}{{/call}}.prototype.{{getName}} = function ({{#if getParameters}}{{#each getParameters}}{{#if @first}}{{else}},{{/if}}{{#if getName}}{{getName}}{{else}}param{{@index}}{{/if}}{{/each}}{{/if}}) {};\n{{/each}}\n{{/if_ne}}\n"
  },
  {
    "path": "templates/ecmascript6.hbs",
    "content": "{{#if_ne getKeyword \"interface\"}}class {{getFullName}}{{#if getExtends}} extends {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#if getExtends}}\n {{#if hasFields}}\n  constructor: function () {\n    super().apply(this, arguments);\n   {{#each getFields}}\n    this.{{getName}} = undefined;\n   {{/each}}\n  }{{#if hasMethods}},{{/if}}\n {{/if}}\n{{else}}\n {{#if hasFields}}\n  constructor: function () {\n   {{#each getFields}}\n    this.{{getName}} = undefined;\n   {{/each}}\n  }{{#if hasMethods}},{{/if}}\n {{/if}}\n{{/if}}\n{{#each getMethods}}\n  {{getName}}: function ({{#if getParameters}}{{#each getParameters}}{{#if @first}}{{else}},{{/if}}{{#if getName}}{{getName}}{{else}}param{{@index}}{{/if}}{{/each}}{{/if}}) {}{{#if @last}}{{else}},{{/if}}\n{{/each}}\n}{{/if_ne}}\n"
  },
  {
    "path": "templates/index.js",
    "content": "// DO NOT EDIT THIS FILE. GENERATED WITH scripts/build_templates.js\nexports.coffeescript = `{{#if_ne getKeyword \"interface\"}}class {{getFullName}}{{#if getExtends}} extends {{#with getExtends}}{{getFullName}}{{/with}}{{/if}}\n{{#each getFields}}\n  {{this.getName}}: undefined\n{{/each}}\n{{#each getMethods}}\n  {{this.getName}}: {{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{/if}} ->\n{{/each}}{{/if_ne}}\n`;\nexports.csharp = `{{getKeyword}} {{getFullName}}{{#if getExtends}} : {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#each getFields}}\n  private {{this.getReturnType}} {{this.getName}};\n{{/each}}\n{{#each getMethods}}\n  public {{this.getReturnType}} {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{this.getReturnType}} {{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{else}}(){{/if}} {\n    {{#if this.needsReturnStatement}}\n      return null;\n    {{/if}}\n  }\n{{/each}}\n}\n`;\nexports.ecmascript5 = `{{#if_ne getKeyword \"interface\"}}\n{{#if getExtends}}\n  function {{getFullName}}() {\n    {{#with getExtends}}{{getFullName}}{{/with}}.prototype.constructor.apply(this, arguments);\n  }\n  {{getFullName}}.prototype = Object.create({{#with getExtends}}{{getFullName}}{{/with}}.prototype);\n  {{getFullName}}.prototype.constructor = {{getFullName}};\n{{else}}\n  function {{getFullName}}() {}\n{{/if}}\n{{#each getFields}}\n  {{#call ../this ../getFullName}}{{/call}}.prototype.{{getName}} = undefined;\n{{/each}}\n{{#each getMethods}}\n  {{#call ../this ../getFullName}}{{/call}}.prototype.{{getName}} = function ({{#if getParameters}}{{#each getParameters}}{{#if @first}}{{else}},{{/if}}{{#if getName}}{{getName}}{{else}}param{{@index}}{{/if}}{{/each}}{{/if}}) {};\n{{/each}}\n{{/if_ne}}\n`;\nexports.ecmascript6 = `{{#if_ne getKeyword \"interface\"}}class {{getFullName}}{{#if getExtends}} extends {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#if getExtends}}\n {{#if hasFields}}\n  constructor: function () {\n    super().apply(this, arguments);\n   {{#each getFields}}\n    this.{{getName}} = undefined;\n   {{/each}}\n  }{{#if hasMethods}},{{/if}}\n {{/if}}\n{{else}}\n {{#if hasFields}}\n  constructor: function () {\n   {{#each getFields}}\n    this.{{getName}} = undefined;\n   {{/each}}\n  }{{#if hasMethods}},{{/if}}\n {{/if}}\n{{/if}}\n{{#each getMethods}}\n  {{getName}}: function ({{#if getParameters}}{{#each getParameters}}{{#if @first}}{{else}},{{/if}}{{#if getName}}{{getName}}{{else}}param{{@index}}{{/if}}{{/each}}{{/if}}) {}{{#if @last}}{{else}},{{/if}}\n{{/each}}\n}{{/if_ne}}\n`;\nexports.java = `{{getKeyword}} {{getFullName}}{{#if getExtends}} extends {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#each getFields}}\n  private {{this.getReturnType}} {{this.getName}};\n{{/each}}\n{{#each getMethods}}\n  public {{this.getReturnType}} {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{this.getReturnType}} {{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{else}}(){{/if}} {\n    {{#if this.needsReturnStatement}}\n      return null;\n    {{/if}}\n  }\n{{/each}}\n}\n`;\nexports.php = `<?php\n{{getKeyword}} {{getFullName}}{{#if getExtends}} extends {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#each getFields}}\n  private {{this.getName}};\n{{/each}}\n{{#each getMethods}}\n  public function {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}\\${{this.getName}}{{else}}\\$param{{@index}}{{/if}}{{/each}}){{else}}(){{/if}} {\n    {{#if this.needsReturnStatement}}\n      return null;\n    {{/if}}\n  }\n{{/each}}\n}\n?>\n`;\nexports.python = `class {{getFullName}}{{#if getExtends}}({{#with getExtends}}{{getFullName}}{{/with}}){{/if}}:\n    def __init__(self):\n{{#each getFields}}\n        self.{{this.getName}} = None;\n{{/each}}\n        pass;\n{{#each getMethods}}\n    def {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{else}}(){{/if}}:\n        pass;\n{{/each}}\n\n`;\nexports.ruby = `{{#if_ne getKeyword \"interface\"}}class {{getFullName}}{{#if getExtends}} < {{#with getExtends}}{{getFullName}}{{/with}}{{/if}}\n{{#each getFields}}\n  @{{this.getName}}\n{{/each}}\n{{#each getMethods}}\n  def {{this.getName}}{{#if this.getParameters}} ({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{/if}}\n    return\n  end\n{{/each}}\nend{{/if_ne}}\n`;\nexports.typescript = `{{getKeyword}} {{getFullName}}{{#if getExtends}} extends {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#each getFields}}\n  {{#if this.isPublic}}public{{else if this.isPrivate}}private{{else if this.isProtected}}protected{{/if}} {{this.getName}} : {{this.getReturnType}};\n{{/each}}\n{{#each getMethods}}\n  {{#if this.isPublic}}public{{else if this.isPrivate}}private{{else if this.isProtected}}protected{{/if}} {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{else}}(){{/if}} {\n    return;\n  }\n{{/each}}\n}\n`;\nexports.swift = `class {{getFullName}}{{#if getExtends}} : {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#each getFields}}\n  var {{this.getName}}: {{this.getReturnType}}?  = nil;\n{{/each}}\n{{#each getMethods}}\n  func {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}{{this.getName}}:{{this.getReturnType}}{{else}}param{{@index}}: Any{{/if}}{{/each}}){{else}}(){{/if}}{{#if_ne2 this \"void\"}} -> {{this.getReturnType}}{{/if_ne2}}{\n    {{#if_ne2 this \"void\"}} return {{this.getReturnType}}(){{/if_ne2}}\n  }\n{{/each}}\n}\n\n`;\nexports.kotlin = `{{getKeyword}} {{getFullName}}{{#if getExtends}} : {{#with getExtends}}{{getFullName}}{{/with}}(){{/if}} {\n{{#each getFields}}\n  var {{this.getReturnType}} {{this.getName}}: {{this.getReturnType}}\n{{/each}}\n{{#each getMethods}}\n  public fun {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{this.getReturnType}} {{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{else}}(): {{this.getReturnType}}{{/if}} {\n    {{#if this.needsReturnStatement}}\n      return null\n    {{/if}}\n  }\n{{/each}}\n}\n`;\n"
  },
  {
    "path": "templates/java.hbs",
    "content": "{{getKeyword}} {{getFullName}}{{#if getExtends}} extends {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#each getFields}}\n  private {{this.getReturnType}} {{this.getName}};\n{{/each}}\n{{#each getMethods}}\n  public {{this.getReturnType}} {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{this.getReturnType}} {{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{else}}(){{/if}} {\n    {{#if this.needsReturnStatement}}\n      return null;\n    {{/if}}\n  }\n{{/each}}\n}\n"
  },
  {
    "path": "templates/kotlin.hbs",
    "content": "{{getKeyword}} {{getFullName}}{{#if getExtends}} : {{#with getExtends}}{{getFullName}}{{/with}}(){{/if}} {\n{{#each getFields}}\n  var {{this.getReturnType}} {{this.getName}}: {{this.getReturnType}}\n{{/each}}\n{{#each getMethods}}\n  public fun {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{this.getReturnType}} {{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{else}}(): {{this.getReturnType}}{{/if}} {\n    {{#if this.needsReturnStatement}}\n      return null\n    {{/if}}\n  }\n{{/each}}\n}\n"
  },
  {
    "path": "templates/php.hbs",
    "content": "<?php\n{{getKeyword}} {{getFullName}}{{#if getExtends}} extends {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#each getFields}}\n  private {{this.getName}};\n{{/each}}\n{{#each getMethods}}\n  public function {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}${{this.getName}}{{else}}$param{{@index}}{{/if}}{{/each}}){{else}}(){{/if}} {\n    {{#if this.needsReturnStatement}}\n      return null;\n    {{/if}}\n  }\n{{/each}}\n}\n?>\n"
  },
  {
    "path": "templates/python.hbs",
    "content": "class {{getFullName}}{{#if getExtends}}({{#with getExtends}}{{getFullName}}{{/with}}){{/if}}:\n    def __init__(self):\n{{#each getFields}}\n        self.{{this.getName}} = None;\n{{/each}}\n        pass;\n{{#each getMethods}}\n    def {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{else}}(){{/if}}:\n        pass;\n{{/each}}\n\n"
  },
  {
    "path": "templates/ruby.hbs",
    "content": "{{#if_ne getKeyword \"interface\"}}class {{getFullName}}{{#if getExtends}} < {{#with getExtends}}{{getFullName}}{{/with}}{{/if}}\n{{#each getFields}}\n  @{{this.getName}}\n{{/each}}\n{{#each getMethods}}\n  def {{this.getName}}{{#if this.getParameters}} ({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{/if}}\n    return\n  end\n{{/each}}\nend{{/if_ne}}\n"
  },
  {
    "path": "templates/swift.hbs",
    "content": "class {{getFullName}}{{#if getExtends}} : {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#each getFields}}\n  var {{this.getName}}: {{this.getReturnType}}?  = nil;\n{{/each}}\n{{#each getMethods}}\n  func {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}{{this.getName}}:{{this.getReturnType}}{{else}}param{{@index}}: Any{{/if}}{{/each}}){{else}}(){{/if}}{{#if_ne2 this \"void\"}} -> {{this.getReturnType}}{{/if_ne2}}{\n    {{#if_ne2 this \"void\"}} return {{this.getReturnType}}(){{/if_ne2}}\n  }\n{{/each}}\n}\n\n"
  },
  {
    "path": "templates/typescript.hbs",
    "content": "{{getKeyword}} {{getFullName}}{{#if getExtends}} extends {{#with getExtends}}{{getFullName}}{{/with}}{{/if}} {\n{{#each getFields}}\n  {{#if this.isPublic}}public{{else if this.isPrivate}}private{{else if this.isProtected}}protected{{/if}} {{this.getName}} : {{this.getReturnType}};\n{{/each}}\n{{#each getMethods}}\n  {{#if this.isPublic}}public{{else if this.isPrivate}}private{{else if this.isProtected}}protected{{/if}} {{this.getName}}{{#if this.getParameters}}({{#each this.getParameters}}{{#if @first}}{{else}},{{/if}}{{#if this.getName}}{{this.getName}}{{else}}param{{@index}}{{/if}}{{/each}}){{else}}(){{/if}} {\n    return;\n  }\n{{/each}}\n}\n"
  },
  {
    "path": "tests/car.coffee",
    "content": "class Car\n  model: undefined\n  make: undefined\n  year: undefined\n  setModel: (model) ->\n  setMake: (make) ->\n  setYear: (param0) ->\n  getModel:  ->\n  getMake:  ->\n  getYear:  ->\n  getDescription:  ->\n\n\n\n\n\n\nclass NamesInThings\n  field: undefined\n  field1: undefined\n  _some_private: undefined\n  field_2: undefined\n  member_d: undefined\n  member:  ->\n  member2:  ->\n  member3:  ->\n  member_s:  ->\n\n\n\nclass Toyota extends Car\n\n\n\nclass Honda extends Car\n\n\n\nclass Ford extends Car\n\n\n\nclass Hyundai extends Car\n\n\n\n"
  },
  {
    "path": "tests/car.cs",
    "content": "abstract class Car {\n  private String model;\n  private String make;\n  private Number year;\n  public void setModel(String model) {\n  }\n  public void setMake(String make) {\n  }\n  public void setYear(Number param0) {\n  }\n  public String getModel() {\n      return null;\n  }\n  public String getMake() {\n      return null;\n  }\n  public Number getYear() {\n      return null;\n  }\n  public String getDescription() {\n      return null;\n  }\n}\n\n\ninterface Driver {\n  private String name;\n}\n\n\nclass NamesInThings {\n  private String field;\n  private String1 field1;\n  private String _some_private;\n  private String_2 field_2;\n  private String member_d;\n  public void member() {\n  }\n  public String1 member2() {\n      return null;\n  }\n  public void member3() {\n  }\n  public String2 member_s() {\n      return null;\n  }\n}\n\n\nclass Toyota : Car {\n}\n\n\nclass Honda : Car {\n}\n\n\nclass Ford : Car {\n}\n\n\nclass Hyundai : Car {\n}\n\n\n"
  },
  {
    "path": "tests/car.java",
    "content": "abstract class Car {\n  private String model;\n  private String make;\n  private Number year;\n  public void setModel(String model) {\n  }\n  public void setMake(String make) {\n  }\n  public void setYear(Number param0) {\n  }\n  public String getModel() {\n      return null;\n  }\n  public String getMake() {\n      return null;\n  }\n  public Number getYear() {\n      return null;\n  }\n  public String getDescription() {\n      return null;\n  }\n}\n\n\ninterface Driver {\n  private String name;\n}\n\n\nclass NamesInThings {\n  private String field;\n  private String1 field1;\n  private String _some_private;\n  private String_2 field_2;\n  private String member_d;\n  public void member() {\n  }\n  public String1 member2() {\n      return null;\n  }\n  public void member3() {\n  }\n  public String2 member_s() {\n      return null;\n  }\n}\n\n\nclass Toyota extends Car {\n}\n\n\nclass Honda extends Car {\n}\n\n\nclass Ford extends Car {\n}\n\n\nclass Hyundai extends Car {\n}\n\n\n"
  },
  {
    "path": "tests/car.js",
    "content": "  function Car() {}\n  Car.prototype.model = undefined;\n  Car.prototype.make = undefined;\n  Car.prototype.year = undefined;\n  Car.prototype.setModel = function (model) {};\n  Car.prototype.setMake = function (make) {};\n  Car.prototype.setYear = function (param0) {};\n  Car.prototype.getModel = function () {};\n  Car.prototype.getMake = function () {};\n  Car.prototype.getYear = function () {};\n  Car.prototype.getDescription = function () {};\n\n\n\n\n  function NamesInThings() {}\n  NamesInThings.prototype.field = undefined;\n  NamesInThings.prototype.field1 = undefined;\n  NamesInThings.prototype._some_private = undefined;\n  NamesInThings.prototype.field_2 = undefined;\n  NamesInThings.prototype.member_d = undefined;\n  NamesInThings.prototype.member = function () {};\n  NamesInThings.prototype.member2 = function () {};\n  NamesInThings.prototype.member3 = function () {};\n  NamesInThings.prototype.member_s = function () {};\n\n\n  function Toyota() {\n    Car.prototype.constructor.apply(this, arguments);\n  }\n  Toyota.prototype = Object.create(Car.prototype);\n  Toyota.prototype.constructor = Toyota;\n\n\n  function Honda() {\n    Car.prototype.constructor.apply(this, arguments);\n  }\n  Honda.prototype = Object.create(Car.prototype);\n  Honda.prototype.constructor = Honda;\n\n\n  function Ford() {\n    Car.prototype.constructor.apply(this, arguments);\n  }\n  Ford.prototype = Object.create(Car.prototype);\n  Ford.prototype.constructor = Ford;\n\n\n  function Hyundai() {\n    Car.prototype.constructor.apply(this, arguments);\n  }\n  Hyundai.prototype = Object.create(Car.prototype);\n  Hyundai.prototype.constructor = Hyundai;\n\n\n"
  },
  {
    "path": "tests/car.js6",
    "content": "class Car {\n  constructor: function () {\n    this.model = undefined;\n    this.make = undefined;\n    this.year = undefined;\n  },\n  setModel: function (model) {},\n  setMake: function (make) {},\n  setYear: function (param0) {},\n  getModel: function () {},\n  getMake: function () {},\n  getYear: function () {},\n  getDescription: function () {}\n}\n\n\n\n\n\nclass NamesInThings {\n  constructor: function () {\n    this.field = undefined;\n    this.field1 = undefined;\n    this._some_private = undefined;\n    this.field_2 = undefined;\n    this.member_d = undefined;\n  },\n  member: function () {},\n  member2: function () {},\n  member3: function () {},\n  member_s: function () {}\n}\n\n\nclass Toyota extends Car {\n}\n\n\nclass Honda extends Car {\n}\n\n\nclass Ford extends Car {\n}\n\n\nclass Hyundai extends Car {\n}\n\n\n"
  },
  {
    "path": "tests/car.kt",
    "content": "abstract class Car {\n  var String model: String\n  var String make: String\n  var Number year: Number\n  public fun setModel(String model) {\n  }\n  public fun setMake(String make) {\n  }\n  public fun setYear(Number param0) {\n  }\n  public fun getModel(): String {\n      return null\n  }\n  public fun getMake(): String {\n      return null\n  }\n  public fun getYear(): Number {\n      return null\n  }\n  public fun getDescription(): String {\n      return null\n  }\n}\n\n\ninterface Driver {\n  var String name: String\n}\n\n\nclass NamesInThings {\n  var String field: String\n  var String1 field1: String1\n  var String _some_private: String\n  var String_2 field_2: String_2\n  var String member_d: String\n  public fun member(): void {\n  }\n  public fun member2(): String1 {\n      return null\n  }\n  public fun member3(): void {\n  }\n  public fun member_s(): String2 {\n      return null\n  }\n}\n\n\nclass Toyota : Car() {\n}\n\n\nclass Honda : Car() {\n}\n\n\nclass Ford : Car() {\n}\n\n\nclass Hyundai : Car() {\n}\n\n\n"
  },
  {
    "path": "tests/car.pegjs",
    "content": "\n@startuml\n\nhide empty members\n\n' This is a comment line\n\nabstract Car {\n  + void setModel(String model)\n  + void setMake(String make)\n  + void setYear(Number)\n  + String getModel()\n  + String getMake()\n  + Number getYear()\n  + getDescription() : String\n  # String model\n  - String make\n  - Number year\n}\n\ninterface Driver {\n  + String name\n}\n\nclass NamesInThings {\n  + String field\n  + String1 field1\n  - String _some_private\n  - String_2 field_2\n  + void member()\n  - String1 member2()\n  # void member3()\n  - String2 member_s()\n  - member_d : String\n}\n\nclass Toyota\nclass Honda\nclass Ford\nclass Hyundai\n\nToyota -left-|> Car\nHonda -right-|> Car\nFord -up-|> Car\nHyundai -down-|> Car\n\n@enduml\n"
  },
  {
    "path": "tests/car.php",
    "content": "<?php\nabstract class Car {\n  private model;\n  private make;\n  private year;\n  public function setModel($model) {\n  }\n  public function setMake($make) {\n  }\n  public function setYear($param0) {\n  }\n  public function getModel() {\n      return null;\n  }\n  public function getMake() {\n      return null;\n  }\n  public function getYear() {\n      return null;\n  }\n  public function getDescription() {\n      return null;\n  }\n}\n?>\n\n\n<?php\ninterface Driver {\n  private name;\n}\n?>\n\n\n<?php\nclass NamesInThings {\n  private field;\n  private field1;\n  private _some_private;\n  private field_2;\n  private member_d;\n  public function member() {\n  }\n  public function member2() {\n      return null;\n  }\n  public function member3() {\n  }\n  public function member_s() {\n      return null;\n  }\n}\n?>\n\n\n<?php\nclass Toyota extends Car {\n}\n?>\n\n\n<?php\nclass Honda extends Car {\n}\n?>\n\n\n<?php\nclass Ford extends Car {\n}\n?>\n\n\n<?php\nclass Hyundai extends Car {\n}\n?>\n\n\n"
  },
  {
    "path": "tests/car.py",
    "content": "class Car:\n    def __init__(self):\n        self.model = None;\n        self.make = None;\n        self.year = None;\n        pass;\n    def setModel(model):\n        pass;\n    def setMake(make):\n        pass;\n    def setYear(param0):\n        pass;\n    def getModel():\n        pass;\n    def getMake():\n        pass;\n    def getYear():\n        pass;\n    def getDescription():\n        pass;\n\n\n\nclass Driver:\n    def __init__(self):\n        self.name = None;\n        pass;\n\n\n\nclass NamesInThings:\n    def __init__(self):\n        self.field = None;\n        self.field1 = None;\n        self._some_private = None;\n        self.field_2 = None;\n        self.member_d = None;\n        pass;\n    def member():\n        pass;\n    def member2():\n        pass;\n    def member3():\n        pass;\n    def member_s():\n        pass;\n\n\n\nclass Toyota(Car):\n    def __init__(self):\n        pass;\n\n\n\nclass Honda(Car):\n    def __init__(self):\n        pass;\n\n\n\nclass Ford(Car):\n    def __init__(self):\n        pass;\n\n\n\nclass Hyundai(Car):\n    def __init__(self):\n        pass;\n\n\n\n"
  },
  {
    "path": "tests/car.rb",
    "content": "class Car\n  @model\n  @make\n  @year\n  def setModel (model)\n    return\n  end\n  def setMake (make)\n    return\n  end\n  def setYear (param0)\n    return\n  end\n  def getModel\n    return\n  end\n  def getMake\n    return\n  end\n  def getYear\n    return\n  end\n  def getDescription\n    return\n  end\nend\n\n\n\n\n\nclass NamesInThings\n  @field\n  @field1\n  @_some_private\n  @field_2\n  @member_d\n  def member\n    return\n  end\n  def member2\n    return\n  end\n  def member3\n    return\n  end\n  def member_s\n    return\n  end\nend\n\n\nclass Toyota < Car\nend\n\n\nclass Honda < Car\nend\n\n\nclass Ford < Car\nend\n\n\nclass Hyundai < Car\nend\n\n\n"
  },
  {
    "path": "tests/car.swift",
    "content": "class Car {\n  var model: String?  = nil;\n  var make: String?  = nil;\n  var year: Number?  = nil;\n  func setModel(model:String){\n    \n  }\n  func setMake(make:String){\n    \n  }\n  func setYear(param0: Any){\n    \n  }\n  func getModel() -> String{\n     return String()\n  }\n  func getMake() -> String{\n     return String()\n  }\n  func getYear() -> Number{\n     return Number()\n  }\n  func getDescription() -> String{\n     return String()\n  }\n}\n\n\n\nclass Driver {\n  var name: String?  = nil;\n}\n\n\n\nclass NamesInThings {\n  var field: String?  = nil;\n  var field1: String1?  = nil;\n  var _some_private: String?  = nil;\n  var field_2: String_2?  = nil;\n  var member_d: String?  = nil;\n  func member(){\n    \n  }\n  func member2() -> String1{\n     return String1()\n  }\n  func member3(){\n    \n  }\n  func member_s() -> String2{\n     return String2()\n  }\n}\n\n\n\nclass Toyota : Car {\n}\n\n\n\nclass Honda : Car {\n}\n\n\n\nclass Ford : Car {\n}\n\n\n\nclass Hyundai : Car {\n}\n\n\n\n"
  },
  {
    "path": "tests/car.ts",
    "content": "abstract class Car {\n  protected model : String;\n  private make : String;\n  private year : Number;\n  public setModel(model) {\n    return;\n  }\n  public setMake(make) {\n    return;\n  }\n  public setYear(param0) {\n    return;\n  }\n  public getModel() {\n    return;\n  }\n  public getMake() {\n    return;\n  }\n  public getYear() {\n    return;\n  }\n  public getDescription() {\n    return;\n  }\n}\n\n\ninterface Driver {\n  public name : String;\n}\n\n\nclass NamesInThings {\n  public field : String;\n  public field1 : String1;\n  private _some_private : String;\n  private field_2 : String_2;\n  private member_d : String;\n  public member() {\n    return;\n  }\n  private member2() {\n    return;\n  }\n  protected member3() {\n    return;\n  }\n  private member_s() {\n    return;\n  }\n}\n\n\nclass Toyota extends Car {\n}\n\n\nclass Honda extends Car {\n}\n\n\nclass Ford extends Car {\n}\n\n\nclass Hyundai extends Car {\n}\n\n\n"
  },
  {
    "path": "tests/comment-file-simple.java",
    "content": "class A extends B {\n}\n\n\nclass B {\n}\n\n\n"
  },
  {
    "path": "tests/comment-file-simple.pegjs",
    "content": "@startuml\n  ' this is a comment\n  class A\n  class B\n  A --|> B\n@enduml\n"
  },
  {
    "path": "tests/comments-dots.java",
    "content": "class User {\n  private int age;\n  private String password;\n  public void getName() {\n  }\n  public void getAddress() {\n  }\n  public void setName() {\n  }\n}\n\n\n"
  },
  {
    "path": "tests/comments-dots.pegjs",
    "content": "@startuml\nclass User {\n  .. Simple Getter ..\n  + getName()\n  + getAddress()\n  .. Some setter ..\n  + setName()\n  __ private data __\n  int age\n  -- encrypted --\n  String password\n}\n\n@enduml\n"
  },
  {
    "path": "tests/integration.js",
    "content": "var plantcode = require(\"../src/plantcode\");\nvar exec = require('child_process').exec;\nvar AbstractClass = require('../src/AbstractClass');\nvar Method = require(\"../src/Method\");\n\nvar inputs = [{\n  language: \"java\",\n  input: \"tests/notes-file.pegjs\",\n  output: \"tests/notes-file.java\"\n}, {\n  language: \"java\",\n  input: \"tests/comment-file-simple.pegjs\",\n  output: \"tests/comment-file-simple.java\"\n}, {\n  language: \"java\",\n  input: \"tests/comments-dots.pegjs\",\n  output: \"tests/comments-dots.java\"\n}, {\n  language: \"csharp\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.cs\"\n}, {\n  language: \"java\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.java\"\n}, {\n  language: \"coffeescript\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.coffee\"\n}, {\n  language: \"typescript\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.ts\"\n}, {\n  language: \"ruby\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.rb\"\n}, {\n  language: \"php\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.php\"\n}, {\n  language: \"ecmascript5\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.js\"\n}, {\n  language: \"ecmascript6\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.js6\"\n}, {\n  language: \"swift\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.swift\"\n}, {\n  language: \"python\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.py\"\n}, {\n  language: \"kotlin\",\n  input: \"tests/car.pegjs\",\n  output: \"tests/car.kt\"\n}];\n\nfor(var i = 0; i < inputs.length; i++) {\n  plantcode.convertFile(inputs[i]);\n}\n\nfor(var i = 0; i < inputs.length; i++) {\n  exec('node plantcode -o ' + inputs[i].output + ' -l ' + inputs[i].language + ' ' + inputs[i].input,\n    function(error, stdout, stderr) {\n      if (error || stderr) {\n        console.error(stderr);\n        process.exit(0);\n      }\n    }\n  );\n}\n\nconst abstractClass = new AbstractClass(\"FooBar\", []);\nconsole.assert(abstractClass.getKeyword() === \"abstract class\");\nconsole.assert(abstractClass.getName() === \"FooBar\");\nconsole.assert(abstractClass.isAbstract() === true);\n\nconst method = new Method(\"public\", \"string\", \"foobar\", []);\nconsole.assert(method.getReturnType() === \"string\");\nconsole.assert(method.getParameters().length === 0);\nconsole.assert(method.needsReturnStatement() === true);\n"
  },
  {
    "path": "tests/notes-file.java",
    "content": "class Object {\n}\n\n\nclass Foo {\n}\n\n\n"
  },
  {
    "path": "tests/notes-file.pegjs",
    "content": "@startuml\nclass Object << general >>\nObject <|--- ArrayList\n\nnote top of Object : In java, every class\\nextends this one.\n\nnote \"This is a floating note\" as N1\nnote \"This note is connected\\nto several objects.\" as N2\nObject .. N2\nN2 .. ArrayList\n\nclass Foo\nnote left: On last defined class\n\n@enduml\n"
  }
]