Skip to content

Interface

github-actions[bot] edited this page Aug 7, 2025 · 1 revision

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-08-07, 09:05:58 UTC presenting an overview of flowR's interfaces (v2.4.0, using R v4.5.0). Please do not edit this file/wiki page directly.

Although far from being as detailed as the in-depth explanation of flowR, this wiki page explains how to interface with flowR in more detail. In general, command line arguments and other options provide short descriptions on hover over.

💬 Communicating with the Server

As explained in the Overview, you can simply run the TCP server by adding the --server flag (and, due to the interactive mode, exit with the conventional CTRL+C). Currently, every connection is handled by the same underlying RShell - so the server is not designed to handle many clients at a time. Additionally, the server is not well guarded against attacks (e.g., you can theoretically spawn an arbitrary number of RShell sessions on the target machine).

Every message has to be given in a single line (i.e., without a newline in-between) and end with a newline character. Nevertheless, we will pretty-print example given in the following segments for the ease of reading.

Note

The default --server uses a simple TCP connection. If you want flowR to expose a WebSocket server instead, add the --ws flag (i.e., --server --ws) when starting flowR from the command line.

  • Hello Message (hello)
    View Details. The server informs the client about the successful connection and provides Meta-Information.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client-->Server: connects
        Server->>Client: hello
    	
    
    Loading

    After launching flowR, for example, with docker run -it --rm eagleoutice/flowr --server (🐳️), simply connecting should present you with a hello message, that amongst others should reveal the versions of flowR and R, using the semver 2.0 versioning scheme. The message looks like this:

    {
      "type": "hello",
      "clientName": "client-0",
      "versions": {
        "flowr": "2.4.0",
        "r": "4.5.0",
        "engine": "r-shell"
      }
    }

    There are currently a few messages that you can send after the hello message. If you want to slice a piece of R code you first have to send an analysis request, so that you can send one or multiple slice requests afterward. Requests for the REPL are independent of that.


    Message schema (hello)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-hello.ts.

    • . object [required]
      • type string [required] The type of the hello message. Allows only the values: 'hello'
      • id any [forbidden] The id of the message is always undefined (as it is the initial message and not requested).
      • clientName string [required] A unique name that is assigned to each client. It has no semantic meaning and is only used/useful for debugging.
      • versions object [required]
        • flowr string [required] The version of the flowr server running in semver format.
        • r string [required] The version of the underlying R shell running in semver format.
        • engine string [required] The parser backend that is used to parse the R code.

  • Analysis Message (request-file-analysis)
    View Details. The server builds the dataflow graph for a given input file (or a set of files).
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-file-analysis
        alt
            Server-->>Client: response-file-analysis
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    The request allows the server to analyze a file and prepare it for slicing. The message can contain a filetoken, which is used to identify the file in later slice or lineage requests (if you do not add one, the request will not be stored and therefore, it is not available for subsequent requests).

    Please note!
    If you want to send and process a lot of analysis requests, but do not want to slice them, please do not pass the filetoken field. This will save the server a lot of memory allocation.

    Furthermore, the request must contain either a content field to directly pass the file's content or a filepath field which contains the path to the file (this path must be accessible for the server to be useful). If you add the id field, the answer will use the same id so you can match requests and the corresponding answers. See the implementation of the request-file-analysis message for more information.

    Example of the request-file-analysis Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.4.0",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details

      Let' suppose you simply want to analyze the following script:

      x <- 1
      x + 1

      For this, you can send the following request:

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. response-file-analysis (response)
      Show Details

      The results field of the response effectively contains three keys of importance:

      • parse: which contains 1:1 the parse result in CSV format that we received from the RShell (i.e., the AST produced by the parser of the R interpreter).
      • normalize: which contains the normalized AST, including ids (see the info field and the Normalized AST wiki page).
      • dataflow: especially important is the graph field which contains the dataflow graph as a set of root vertices (see the Dataflow Graph wiki page).

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11054-P64gTGe3QwGj-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11054-P64gTGe3QwGj-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-11054-P64gTGe3QwGj-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11054-P64gTGe3QwGj-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11054-P64gTGe3QwGj-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-11054-P64gTGe3QwGj-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11054-P64gTGe3QwGj-.R","role":"root","index":0}},".meta":{"timing":3}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":12,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11054-P64gTGe3QwGj-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":4}}}}
      

    The complete round-trip took 19.1 ms (including time required to validate the messages, start, and stop the internal mock server).

    You receive an error if, for whatever reason, the analysis fails (e.g., the message or code you sent contained syntax errors). It contains a human-readable description why the analysis failed (see the error message implementation for more details).

    Example Error Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.4.0",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filename": "sample.R",
        "content": "x <-"
      }
    3. error (response)
      Show Details
      {
        "id": "1",
        "type": "error",
        "fatal": false,
        "reason": "Error while analyzing file sample.R: GuardError: unable to parse R code (see the log for more information) for request {\"request\":\"file\",\"content\":\"/tmp/tmp-11054-jsN6nF3tZpOk-.R\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.4.0%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22file%22%2C%22content%22%3A%22%2Ftmp%2Ftmp%2D11054%2DjsN6nF3tZpOk%2D.R%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A75%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A184%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A148%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A58%3A18%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A207%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A266%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A152%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09"
      }

    The complete round-trip took 9.1 ms (including time required to validate the messages, start, and stop the internal mock server).

     

    Including the Control Flow Graph

    While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add cfg: true to its list of options.

    Requesting a Control Flow Graph

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.4.0",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "if(unknown > 0) { x <- 2 } else { x <- 5 }\nfor(i in 1:x) { print(x); print(i) }",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

      The response looks basically the same as a response sent without the cfg flag. However, additionally it contains a cfg field. If you are interested in a visual representation of the control flow graph, see the visualization with mermaid.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]",".meta":{"timing":4}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RIfThenElse","condition":{"type":"RBinaryOp","location":[1,12,1,12],"lhs":{"type":"RSymbol","location":[1,4,1,10],"content":"unknown","lexeme":"unknown","info":{"fullRange":[1,4,1,10],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},"rhs":{"location":[1,14,1,14],"lexeme":"0","info":{"fullRange":[1,14,1,14],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"},"type":"RNumber","content":{"num":0,"complexNumber":false,"markedAsInt":false}},"operator":">","lexeme":">","info":{"fullRange":[1,4,1,14],"additionalTokens":[],"id":2,"parent":15,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","role":"if-cond"}},"then":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,21,1,22],"lhs":{"type":"RSymbol","location":[1,19,1,19],"content":"x","lexeme":"x","info":{"fullRange":[1,19,1,19],"additionalTokens":[],"id":5,"parent":7,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},"rhs":{"location":[1,24,1,24],"lexeme":"2","info":{"fullRange":[1,24,1,24],"additionalTokens":[],"id":6,"parent":7,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"},"type":"RNumber","content":{"num":2,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,19,1,24],"additionalTokens":[],"id":7,"parent":8,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":0,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[1,17,1,17],"content":"{","lexeme":"{","info":{"fullRange":[1,17,1,26],"additionalTokens":[],"id":3,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},{"type":"RSymbol","location":[1,26,1,26],"content":"}","lexeme":"}","info":{"fullRange":[1,17,1,26],"additionalTokens":[],"id":4,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":1,"role":"if-then"}},"location":[1,1,1,2],"lexeme":"if","info":{"fullRange":[1,1,1,42],"additionalTokens":[],"id":15,"parent":32,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":0,"role":"expr-list-child"},"otherwise":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,37,1,38],"lhs":{"type":"RSymbol","location":[1,35,1,35],"content":"x","lexeme":"x","info":{"fullRange":[1,35,1,35],"additionalTokens":[],"id":11,"parent":13,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},"rhs":{"location":[1,40,1,40],"lexeme":"5","info":{"fullRange":[1,40,1,40],"additionalTokens":[],"id":12,"parent":13,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"},"type":"RNumber","content":{"num":5,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,35,1,40],"additionalTokens":[],"id":13,"parent":14,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":0,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[1,33,1,33],"content":"{","lexeme":"{","info":{"fullRange":[1,33,1,42],"additionalTokens":[],"id":9,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},{"type":"RSymbol","location":[1,42,1,42],"content":"}","lexeme":"}","info":{"fullRange":[1,33,1,42],"additionalTokens":[],"id":10,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":2,"role":"if-otherwise"}}},{"type":"RForLoop","variable":{"type":"RSymbol","location":[2,5,2,5],"content":"i","lexeme":"i","info":{"additionalTokens":[],"id":16,"parent":31,"role":"for-variable","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},"vector":{"type":"RBinaryOp","location":[2,11,2,11],"lhs":{"location":[2,10,2,10],"lexeme":"1","info":{"fullRange":[2,10,2,10],"additionalTokens":[],"id":17,"parent":19,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"rhs":{"type":"RSymbol","location":[2,12,2,12],"content":"x","lexeme":"x","info":{"fullRange":[2,12,2,12],"additionalTokens":[],"id":18,"parent":19,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":1,"role":"for-vector"}},"body":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[2,17,2,21],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,17,2,21],"content":"print","lexeme":"print","info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":22,"parent":25,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},"arguments":[{"type":"RArgument","location":[2,23,2,23],"lexeme":"x","value":{"type":"RSymbol","location":[2,23,2,23],"content":"x","lexeme":"x","info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":23,"parent":24,"role":"arg-value","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":0,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[2,27,2,31],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,27,2,31],"content":"print","lexeme":"print","info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":26,"parent":29,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},"arguments":[{"type":"RArgument","location":[2,33,2,33],"lexeme":"i","value":{"type":"RSymbol","location":[2,33,2,33],"content":"i","lexeme":"i","info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":27,"parent":28,"role":"arg-value","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":1,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[2,15,2,15],"content":"{","lexeme":"{","info":{"fullRange":[2,15,2,36],"additionalTokens":[],"id":20,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}},{"type":"RSymbol","location":[2,36,2,36],"content":"}","lexeme":"}","info":{"fullRange":[2,15,2,36],"additionalTokens":[],"id":21,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-11054-L6x860yTDK3M-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":true}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11054-L6x860yTDK3M-.R"],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"function-call","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"variable-definition","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"function-call","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"variable-definition","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"function-call","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"variable-definition","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"function-call","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"function-call","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"function-call","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":2}}}}
      

    The complete round-trip took 10.4 ms (including time required to validate the messages, start, and stop the internal mock server).

     

    Retrieve the Output as RDF N-Quads

    The default response is formatted as JSON. However, by specifying format: "n-quads", you can retrieve the individual results (e.g., the Normalized AST), as RDF N-Quads. This works with and without the control flow graph as described above.

    Requesting RDF N-Quads

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.4.0",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "n-quads",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

      Please note, that the base message format is still JSON. Only the individual results get converted. While the context is derived from the filename, we currently offer no way to customize other parts of the quads (please open a new issue if you require this).

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"n-quads","id":"1","cfg":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/exitPoints> \"6-exit\" <unknown> .\n","results":{"parse":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/token> \"exprlist\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/text> \"\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/text> \"x <- 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/token> \"LEFT_ASSIGN\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/text> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/text> \"x + 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/token> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/text> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n","normalize":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/type> \"RExpressionList\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/operator> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lexeme> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/operator> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lexeme> \"+\" <unknown> .\n","dataflow":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/tag> \"variable-definition\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/name> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/nodeId> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/nodeId> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/origin> \"builtin:assignment\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/tag> \"use\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/nodeId> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/nodeId> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/origin> \"builtin:default\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"returns\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"built-in:<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
      

    The complete round-trip took 7.1 ms (including time required to validate the messages, start, and stop the internal mock server).

    Retrieve the Output in a Compacted Form

    The default response is formatted as JSON. But this can get very big quickly. By specifying format: "compact", you can retrieve the results heavily compacted (using lz-string). This works with and without the control flow graph as described above.

    Requesting Compacted Results

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.4.0",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "compact",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

      Please note, that the base message format is still JSON. Only the individual results are printed as binary objects.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀஠洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾࿛⩬ᰡ暁∠ᰠ⵲䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ჈䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ๝吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭⵮埋ℜঋ殍ᯕ獺฀䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰  ","results":"ᯡࠣ䄬Ԁ朥ᢠ⹲⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠᥶N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫ೉ҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨ྠؓ吐ဥဧ奠㣎ҰƘშࠢƠ౤䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥ௔う᧡㉕ࡉ᳎ᨨ漡╁Ř⵬ో੅ⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ᫰气፾䥓ѣ⤀㐽ᩢɀᐲᲵ䎴䭌ذ綞卒佢ᡨ㄂侶䧴䜉䮂疲䀾䂁拠ᏹ籅憐䩁␆ࠠԭ㥠ͪ㡘嬥Ⴤ情๘⋥┰é᥈ఋԧ┊字⇰䡏⧠獜榺灢慫୲湺⮊敪殜䬥ᥦ泺宖旸箃⿺ܢɘപ↸❉漥べ櫨ᝰ᳘䁵滚ၪᗚժ⍩ޝ梙〫溚伥涚澛攚得樛㽿瀚æ≉䵀抳ಐ朡⪹䝞Ⅸ㓄।卓漤ᢕᧇ㓤Α䰰ǩ₎溠戸°棄·°ཙ㔇⛩〱ම᡼楈ʵ檤䭞♸⭊捻ℙౠᭆ拹掂᷻㽒ዚܩ檡瓲೫㝞៘䀣惦㌱ቅ⼻枚ᾇ朘㽏搙缠እ圢恆➉斣ᅥ曈ಁ්畬ద䵠榸ⵋ┠浛ⓨ⃸欈፧䇐ᑘᘥ礠溈䎐椻⍨᜻ඕ䙓፽ᜆ㌢捔ჩ⚗夐座⋌᭸໢ࢶࢴ姠㭔寻をᒡᑊះਮ婴䁆὚ᝐᘶ嫂古瞞᱘䬃晄⪩ᵷⓚ坆᫥ᐧᓶḤ捈ზ㩘✤⻌ಥ䋔ᤴジ嶧盢ㅓἄ峊勲៺㋺ⓨ犳倯梹杘夐㶖⇎ᓫ⇢廷戁᢭䓪奄檹ί擆哅ᦕ囄㓐旄璺ំ䀣Ꭹೆ⊅䁓ᆄ㗋ᎅᦛᤇ᳷ᆸ㴅ḅⁿᖄ䁅䠷ˌ܏䦨娡⋬᬴਑䧰ᧂ᜔䤔嫯壡怮㦬架䗽湍Ӓ啎⾄㕆櫹ჴᔆ儮㣪Ꮽ㫾䏶֞叉界㿸滞⁦᧖昼㺬唽႘灶Ꮨ㲼䂒嵏叙㚯㏅㦪௬敘奁➽嫪ਆ熜⡩囒♍⠅ảᴨ۠ᴠ༌ᖬՉ浹ܑⓅᰦ惔懁嘅᎙▭⻒擷ɥ䩥䐨䋒ォ䕵戯焹ท㿃搜绝䪵൯猔ᙬ〹䊉䲶紀Ἑ↳穽ᰕ⥤Аဦ尧䗘乶䒹!峘ᓡ崤䇲ោᩌॄ⧡⒘䊕‣⦬ਣ⢦㊠Ă᥼ ฮ㔼䨼漍➨㢭䥥ᣳ〨ƴ⺥梞䂡砌⃨᪣ᒣ�͓Ǒ䌊ὴ剤ȱᄽ䇘ᯨ٢够割咆ዒနㄥഀ┱⑊ᩱ䉈фᏢѬ⊨䣵爩઄⤾䇒ᒃ੘↴╁沚䚐Ḭ⁍ഀᴵ䃾ῂ偆͓౓ಉ䓈嶬Ⴛࢨ⥪⡁ྃQ捄㤛⑦ߘ䦬磓౩撹䑘᠃㲪ঌ䷓ᾡⓄ䣗ӡ枱༼兵ᖂॕᏤ⍅偬䗨周㔜䩉ഴ䂅ᰳᦢტユ⊔☄戡ഘ亰ဦࡑு䨺勤ㄥᱪڄ殪璩乱禸姵ሡ䕟才妱恶̌勭ഈ௉溻䥛გᝆ㈤ⱂ媊柔噫㤑䨉䐬秞ᒒନ㌆㌄⊝⛼妮㳧䤠'熙凍壌Ồᵛ፞㐶ၔᘻ㋀ẞᔠͨ汑ŸㄪÉͫ协ㆴ犰哩⍥䠶᥀匳僂૝䖆憟䏢䮬璼䦩2䳈≨壒㤀᜷熁ᜲ䴵ኬ䝅厹䰠ႂ坃䭆ⷸ↋筨Ϊᤶ⺑඾旨匲䫄Ǚ㌷Ԯᕙ჊ኪࡐㅺ〲崜㫆⮡✇㖓⛬䀢僢潃䌕ⱥྻ△ᴋ棇䬙ヵ熇2䧉ኡ伵s痴孊嫛樽⁥༫囊歈櫄⬕攰䷞忊粠ᮭ⑵䵸㑺䁈曈淕涶ㄩ優/⢺屭⨱㸅㙷杶暍犣⠵⍴෢媋曎ō㉳᭩㝼妌₊梥(⇍㝿ⶻᝋ䩂㩻㿷宀㜦庉盞櫠秸ᷓ嚂Ꮒਠᾲ㬋ⶶ卽噬䈈⻖氵仲ෂ偻㷀௯⮔排䐾䑌㪿⪅坴㵉娋⟙⏿⭹㎖ᕎ溎盛潽䳠͕፪翌戠戴OĮྒ㒚掉⋄ᰣ国䵀㶛⯜ء㌯℔㗆妬我湣敶䥩弊ෛ㬰ಖ⤎咂瘾Nj楽じ䂄倫ಈધⰆ磤ᐠἪ໱䴎㻓ळ௳䐌㗻⇋䟣┇ᾴ䵞椼‱ᢥ䄪Ᏻ姊檋⟄涬㭧࿩眺⦰吃穕叢㥧ῆ䚔攗ݰ䵑廍㈞ⶳ᯿䴪㡺暋¼括┚佁暹妵ⷍ呗⌡㡁亅䜷㷯烷俾侼晈怓㵔௶᭒4䦷媘箟㢗㋶໥冻䧻桫ࡒ¥㱧○猪戶㋱焅唿㽉毫瑓भ㓷䲏歏Ⓦ㳺琢杽◸ᱠ⇟⮮哷㚌ᛤ睬䜆Ɑ兽瘅测佚㌴喡王嚍㾬円淦敼剩崫囓縍㥓ᦐ眶晭笜ⷍ擈ᶪ⋻媿⌷㤗箓ᦺ焤仺࿱䟾痀ᮓᯙ掗㴜羛㞞羌ൔ業矸䗕ᪧ⯘㏫㿶҉᠙㪊哨汃䑏䀠ҕ旳心㲘䞠粯㞑⟶獓ਕⴍ䱮Ꮌ㮠岕ऐ⒉ᾙ䯢籭哾ὓ懁Ꮌ毣悑⠗㷮ⴘ㞧⑾秣ᵓ圦⨺⎇⿱染㹏ഊႅ瞐ഉạ䦺ఇ眇㖗ី糏匁榗੽ㅅᎯ౞线堫㲞㞎⇏紘曪搾┽屻壚紗㮒ࡵ⑐ಀ憠亍浭締㸓渾㯵姷䥪ྡ獯璖‖掘畖儧屙ค祄唘眱狖΍ན筞෷昷囇涭─Ŭ屶磎຋牋櫟䏼⸫瞼叽ⳏթ睈僿Ḃ஻ܰ⦕㼽痟⠁瀏䈔潠総⸞矧渥壘ᰥ崛扟₥牪杕獖瘅௷犝䧫㹅宝瀘砫帖弰ڕᰞ栒氄㤵棙煿瀉籟篗㽽猲瀂੍歫怦剻焝垭籱⸞㐣羾糕挎椒怨Ο湜挖�奠ᑈᲐߜȟ浦槖徹涴『ャₘȥ洞૕悞ɯ旮启扞汙�洒徻⸈浡⌐㾲汀ᔾᨖ㽃˫晡ᇔ炞沀ம⠧Ⱨ槮ᇗ炀䈨᤾紓㟘䌀ᣞ⺐࢒ɒ恂ࠣ恺㵤ᱚ唫ㅓώ攞䠯や僔἞䦲ᡤᓇϜ䰧䮽丈ံ猨剅䐞欆➓柊᳻极ܯ䡶ᵠ⾁緗⼫ᄜ䖁䰩塺䴜ေ䜬㿋τᾖ傮楗Χ⌱猓䁎優䠱墐條㲲᧠ᒯѫ̨῁᠖㽙禲Ỏ砩䒱⋒᪎攩B僉Ũባず䊵明平呣⊓泾∨ʭ⍺ᲁᰩ㒝␖攨੠橃⏗挲↩ಛ⋇澱ૐ䲏⋬❑ࡰ㨼崈ᡮÖⲄ䉼Ṷp汼⋞⇑▩㈵ႏੑ
䓒扮ᕑ㴫ち⍅Ƒ䨧䲂Ȏῖ斯硉提ᚂ垬汪ᷖᚮ⾫汪ᓞኡ綅⑨䊺ኪ羑ɮ⎔ᤱ圮ு䠡ᝮ䍃⾠呗怡⸓ᲄ攑൸澯Ꭱ䋐ඩ嚕ᑶ፱ῖḁ቎ᴐ⨩䀨粂ǩᥩТ岌᎞᛾穪劑Ꮄ⛩Р䋄ĥࣩ單ި涙ᚸ屨ᾥⶥᣩ๫ᢤ吖慉ޮ剦ᎉᝉ公瑺ᶵᢩ䦶⩹䏻▨ൡ䀶׾ὦ䍵檞創ፑv᩾刭ᇉ攴媉募挠ⱤӁ刢曈❨愹劎ᅶ㝮㩭勬␉ཨ䊾壔䖾ᝫ⧐㋀ਹ♫摷刡ℹ⣪䩠▩⤹ᆨ䊠冕ᗈ栠䀿絕䃉Ⱟ凚㏕ֹ᳭䒔኱泩垒恁㍓ᔌዬ㲕㎫ᚸ浃⚃叟涤墨ઈ糞⺹㛭晹㍕挹⢮㼯㏕仹竭㚈獕䋹ⱦⱶ㳘عᇗ⚌犽Ը棪䡼Ꭷᤉ旯乿匰ә⎫乴㇇Ἱ䦬皚≱⺹Ꮼ穰猬ᤉ⯭溅玳ᨹ槮傄㍏溩糨ך㍿ቨ簑䗎⏷ዩ篖纓僿ṙ履Ə獁擤䬫ẘኂ┠ᡎ幦獅ࢥ嗤㱺જᐹ⧢漾㎢ቖ੡憒ઠ崜䉉㉎ଳᙥ⸂٪ㅷᜥㆬ䳐揖䛙ⶬ嚆ジ嫙䩍冀捆䥰来偧琐屚⌥ਿઈᗡ绮㡯拸剈幏煤䭜᱅㥏ঞ涱཈䕥㨾૶ᛆ㕈⨾桸嵅⠬晎䩔呩䕊粩䬖䄪ร羠␈妩攱奡䃢Ꮑ独๪ૐԅクᥪᓜ峹⪯ሾ䯵澅婬ւ偪ᬅǬŬ䫢嶱Ὀ羺凢卨槩⼡ბ۠➃昶䬥ᧁ䝭╤Dz妵䥬䕴䬑ᮑ⫫斊礪媒߬啺⩒媒㼒啣⫒刵穗斕⫒奅崔ᦞፓǵᛌ䪜⭆⁕⋏涻パ˨牢ࡷ泡ქ攰䵴橻౥᥌ⶔ款ᛕ旋ᢙੇ涵⻩⊮஖巵ຯ᩺ᴮ彞౉浥檣ᆕ㷏Ṭ⒮創ịᕥⲮ展׎嵵⋹ۘ໬খ䩦渕㻪㵩殃ᚮ䂍᚛櫬⸭ឬᨵာס㛏Ⲍᰁ動⍎穒ᨴ崖⒎刪᫳ᅨ㸳嶜੬ᾭ咋疟ၩ儙ኋ瞹့ᙞ᪈ᥫ模⿾䞮㎙粬ԥ䊏䵹䒟᠙ố䊛䩨奈Ẍ㲐婁⇈⑌獣䫬⹍瑈㍸刡⍍Ἥ溂媦䕱憩嚍᫞⻍栥᎙⯸呹ࢊ掘㈭孉琣㒂᫴映㎍殘反寙⮈㑤ᐠցᐵ䘝❊彂盘;堻区ۖ禛⃽ჸ䁠盪㡋滿媸䦠ɋ羿月嗃㩚䇴㛁♴⛤ᯪ岒ᔯ䌢椴✅ே㻣᧳㚠Ⰷ㴡׻岲瘷➲Ⲩᐸ�ቒ怣ᬖ㩊㺬怭⻓⧷⒰෴⻕◗㛛痷ᄄ眮嗚㗱滎瑢䆡竉᛺⑯㗔狺哖磯⥚れᵥ砍嚑➡�㡧㼋ፎ庮₃埻圳㳦ზᾛ༷廭盪⭜榮紌痭⩻ࠦ�矎ປ❶潇甆⬉䇱纻瞷䈡⑂摈䁛㍻帏绉愠滻䝷眃皆ৰQǖ䙆⸧恜Ƽ㦀䷺石Ⓜ㯀篚㈳䇽栊㥊唶౓悠晄⑐㻸痙㹚擱∓皰戵⒦悓㞏㝚ି⣤฿⋒棴懤༧㞧简-㘁䢒㋢ᭆᐭ࿃方䜱揦撂઴亠ơ㤴⏪ᑱ悤咕縞濛㪯ᒑ燚ᥱ珔嬩姊᭑Ꮧಈ൴᪪欵凜挦ő漅沄掬ᵑ场炞瘣湾埩ᑆ抻櫲ࡄⷑ㤲䞄㮯ݘ፰丮徬䊌愡ᶁ坖ဤጦニ≮ፚ፿⢎岁㏘ⅸᠫ㴂嬻ⅶᳬ倂瞿㰴䙰ā怤წᮠ‘筿㢌䝞り笿䠵䈢I犓Ꭿउ狂埠ᖻ湖Ŗʘ㬛根䥘㢡䃺΀ᡠ瞯纛➊Պ⚚㏣ඌ⒙乴偉Ή婘䚓䀤汬盭硢ଊࠉ仮岈玀Թ䛛䚑㍓ῦ✁恺珫ᮬ⫮㌬ᄋ᳹宙亂玩䴙䧭ᙘ玣ᮩ䐖⯼獇᳙綦ᠡ珓Ὰ㜳溊㍗᪙䫹嚃㌵㘥埯ϕ௟᫈䰣纕揸夥滮⋊玐岙瑌瑲ୋᱥ䯭庘䅘塁乌Ⅷ̘嶑捍㺐䰀墹煍↞ᡐ寤㥌ᆃ晨徙緸妔ன䤵䇭⩗⃔娹埩▉䮀嶊὎䦌晪壄㏭智䬠厵婎ߖⰔ嫈犣▐௔䱕糏筈䭫ᬅ䇐喓䬴堵問ᆀ૆姵垬兹殸姑!咭㦣月ח园㛫䕽嫼暙㜠啿⬋朽㚮ù㫩౦欻ཽ䲯埒㠋㕕匙培㫋燣የ㞵ऻ䵻⎦㝂㓫䘹✌檒㛆ɤ۵䙍㼫秀丢朓㛋䩸欔㛻浻㣹喪ᕛ㒻İ䑙㚻娙㕐໭㜙僢⳾㛮㚍㦋㭻曀噊橛⻽叄撷㟻瀤䙣岅㊪映箮㰬͢濡⑜ᮾ㜬ڻ䀳⛋᫳♢ᔉ㏕犻⸵♯䭳罤⃗光৸愦㦂瀥ߴᗬ煠๲ॊ怠㉘南㨃磺ཤ່ễࠡ匴稸ᜧў畡盀қᏼ勹盀ࣳ䉶㓷Ř宛篸ὃ睊㵳埻ⵛ癊ᘛῸ矟瘨秈ɞȂॠ稄␖⇰殕㏞๚⟔Ċḽ彾໦㴘綱⟋⇦໕છ窹懥眐疛䉘਽眗䄛ા㻭❜樶࿽潗癹ఛ匀ȃ๋೧幥㇥ⱗ䉇ኮޙ俰硴Ṩ㩃㨵暻Ⅿ姩ᶫ͇䯼昣ຏ㣇扛ᔊ俨燇ప槭ྔ睧绂税咸爧じˑ壧䤑㣙礌攲甉㠥憖盃徇哘冄⫼箧㾗䨆Ⴈ糇቟秫眢缜惙槾倈綛䣚ᨔ⻸羖ᓚ渥௟喷囟涣�ಌ椵㤗⾚痘坟ủ乺デ抹ᗿ亿〷廤樕࿊瘷᬴͜⹸猷㒐෥⍘笋ᢰ淿⿯旝䅚঍絏凎㳝䧡⽜睷⌠ડ䆼䘰੣熋❂䶹籢䐵ᅃᡘĴ垦塋ৌȶ秤潪㩧㕘凼潟プ㿿׽⺠磷૓ᾎ狯噍ᨲ惟Ꭽ㽦樲䀪ᾦ缇㥜帇௎紈㯘㷣྾纜̣㷧澭จ唫䁏濔倗ဦᗰỪ织姚؜澈礯◟嘇Ƭ瑨㗛㞦ố糍撞牵⋩༧咜ḟ殧⅏ᑝ旨澑癗㠁拍満ྗ䟚䙉὾缗䘰♕ẞ缤窞⤳Ṵ絗狛㐅⹙稷⺘䗬ὶ瓷栃䯶滀瘒枛⽫Ⴘ̇䑘֤ポ缷叜⯥澵狌喚ᐆ彫̗犝氇渭筯⎘砩府祗悙䷻睦䕷亟槽并犇Ɵ嶿弲纝侚៿㳧䂍ݞ塬廞⩽煊⤖‒羧㫝ᰉ⿭端甛岘ồ筷䁝栟Ἵ祈嬘埫ᯫ獹ⓘࣟ嵰䧜ⵂ៯忨ᕟ牉倗怛ᚗ凘䗫㻆癧஘矶Ǎ獷⢝矣⸽籡ḃ硦碷瀿䓬俹繏繟悆䁌繒篝ࠞ⿢庑簿ࣘᏺ幕牯徂䟥ἕ猛䚾㪚᐀޲们秗樯㭜帑寻ᾈ㴛癠὞栁䌢翅绡检ᔠ⦜結ᠱ罔㵯暔᚞ᘙЄ濞ẁ篋汯ᏼ耓Ꮰø緞瞯倎┚Ȇ㞶缍穱憿Ἕ஑柨罜簧灄䂡昛ύ₶Ŗᄊ່ᴜ⎅ࡎŗ紻瑋䰡彚名徻ƽ箉淿ȝڕ珶༠⥄ಘ孡Ბ匫৔帾桢⿀䎝枑၈垄籀ঀ⨡⮘怿志἖礐ᱡঢёᡏ帾恻%僡䤈䛁灸僆׏泿▣䰩Ϣ坊ᴌഀ㸡渧簁⬺烿䊘ይᾢዑ墦>ࣧ䋴ᥠ䡀ᲄ羮ʉߣ⦰珀๒ၝ羓̄९䖾ᬧ䈲傌ŝ篈៯∣㰪厯Ⴌ䋒ఌ塚咧籏䢋∞⣸䷪㎴㑅㣯僰५ᚰⳡ夦ᨌࢋ㻶֤Ỡ䑣㜒䑃℃簵啬ᢁ䞩ذᡯ቟瀽檻Ⴜ䏲汀Ⴥ㷷璸㎞傦⸅⡨⼖֐ᣐ厣㆗汞涝䉁␱啠ߣ㸃䡹䑯Ӝᦟ⣣į෼°䋳牰㞞㦥怸㿕慑Т䈐䂢岑䒲घ巧圴ᘁ㰥哠怢ᅿո櫟⇢䄪おン䊗瓬Ρ禦䄿⢉丠僂ᡠ炔撩㧯ℚ疐༐➚ᰫ姂ֺሃ嬵ౠ磢ᰐ⡕䃐㷊೘ↁ扥ံ睃ሄ䝢ᥒ⃀㒪剘䌭熉৸⤎ᑱ䌥ᒋ缈䗒ឯ֣墩᱀ऎ≎ನ⢱䴥凯ᒐ击㬏⃈层唵埳烪粢ᛏ䔴㍦ᔲ摦ᄿ禂᠐乂᪮䁇䤍⌊෴ⷜ᭥倲ᒒ䓾䗿歿㓂ᗒ㧬㹑焨༘㌱徧搱⡬懪֊ᡨ䟂䬫⎰ᣈ⌭ఔⱑ।䐻橙凎ᩨᎸ悜┯㉘烮⍊මⷱӧᜍࡣℵ㈆᪸毜⣅噄梻ं౴౰糥常䀫ㆾࠆᱰ䲢⪫ᑊ惼⌡࿤㠱媦⬶ҕㅬ楄ᏸ炔嶫㙓᣹䦑枌⤱ᇑ᜻㑠ᴖ䚴ᅐ嫂▭䙈ऒ扡౬✁㒑圳瑺ㆆኾស⹙㤂و㭹⊂⛜㱑╦ି沖煮䟊ᣀ曂ᄔṜ㤞⌺ठሑ㫧㮀籭焫䐨䶘猂璫ヱ(᏷ඓ᎑⋤眳౹憅䟦ᐘ作羨営ӓ搋ढ❑ࡱ縉ɬ其䞰樏ྂᆨ㩊ᤒ䍀௼⒑ϥ䜱䊇儥禱ᐤ䬍䩄ᅌԀジ֑䱐湄ଷ汨㺏䝦፤䨲熮繁䓧ϡ௴⾩䓪碷㐫㉐ɚ஘掽㬮癡⡅ጀ䰅ĩ埤㤼䉾ᆹ磴ᛀ瀂䱬湱⒭‭෢ⓢ畇䲹扯Ӹ妇䳄喜䘨羺嶟璌亄⎑敦һ剨䨚␲Ấ撳Ꭺ泵撧፸䢀䑉睅瀆ᒇ㫣箨Ṏ⍃ㅭ癌ソᎫ௲㢑͆礳呲ㅒࡅᙟ⏥八8㾋ᖦ์཰䝆ⴼ犄擥䃰䩴稠侫婋擃䊰丒㵉罄⒰䁩ᆈ獵ᔠ⵲᙮Ŋ咲千ϊ㎩ᓘ儺燈椤孞၄即澭湔┝拰侊⫑仇必䮸樖槍Ჰ牼妓㧧࢒愩ΪⰄᓚ皿婡憴⛊᭔婲徭⡁悮別ૠᤉ㙡皹⼢⹛╝᪔嶼揢戵ȨǫÔ❚碸匃穿榇▎ᐄ瓣獫兑㓃ጸ仪㧎ⳛƲㅋ楿♃សၓ犡㑼㒤㉑䷈吹䑆⺲檕榦⛽᳔緳ᦧ⍛冄㈬ܚ✹⍡琽6⛡䛉ᲀ䍒磩╙咨㌜䴼☹䃄嚼ᜡაЅ၌潭㴫༵→刡䢞䕐ɡ䌯⪇䥏䞙᪴慓⺮䍄䲩挙䱈䱹妅䊰୔娂播ᗈ෽焐癌c㎽ާ䥉ᾤ⺼ኇ᧍➓ᛌ昳㆓ᭃ㴬㧟嚖ㄾⱹ῅尤娗櫲⏷㒨狯䅑哧⊍䨼⢹䳅༵ቬ䉾无ߴ嬲晇筛泮Ꮽખې䚅漲⊄摉柽sͲ૩䵔Ჷ⎌࿂➹㯇缽乺㦯ࡷᶤ࣓㍀ᨽ瞕ᒮᓪ嗦笄മ力湯懓ᣌ䝒懩⭜⓲獩倜㗙䜄㮱৏円ጯỼ玒Ѭ瑈⽉㶨䳊㶩娆䘅湡㧴⛻Ḽ篃䙫䍙ą獑熗忉☇䰂幪ድ䄛᥻༥⢴݋─狈䰼⣙玧箰癩䥢楿Ꮜ媹Ҷࡖ㈲ਇѤ⨩碸羽㺉プ杻Ờ澓䗭⭊烧㋱搡㸙ᇒ恴沒⺀ᯇዄ縃᪶⃕㲰狠⢞㔩⠅⁲繣椸៻↢壕玤䘠Ἦ扳֎卩怷玵䆝禿䘗᎔縪㯬䨪䌒ୀ瑞㩺㈶㢹ၳ㦽昽ჸ潱籊䉢䓐㊵䣾⦥抄塼㱻㲜ᚯᏀ炪੉掮ᜣȷ䨐✢唶ぷ㺟憬ᑠ垢彂ъ厫⊢೔⩸䁴瘂⡈ᆙ戶១Հ哳䥮着䳩ఔ⺁ュ嘶砋ㅵ䖩䯡ۜᶫ̱截းœᐬ᫥䦲伤२◥⡘喌䄃㩊牊⊨珗䶱⏦䂷ɷ燃戱ោ堸⟳攕ˤ洛ᶹ撺⽙槇桿উㆂ◘喴䩫俤◨勊㐊ⷩ∐⧡堪呇へ斯ೲ䭁ⵉሽ匞ጼ⭾↥Ҷ屽ᆛ䕕ᙪࢷᝪ㵋瓑ᥩ䩺⮉㙲筛䪌窓倸Ŀࣈ㨡䘤ణ劣ƶ⿺ⵐ琣噰ᰶ旼Έ娢僪ᕈⵀ挊䫃侦Ⲙ㶶⯠㥱斻ឌ凔緪撧泍㊬㉾ⵙ㝅䉨側牦䗲䯹瀒姪煎㩏⋧狊Ⲯ⡉嗅䞪ջ旇䋂⭼䂨ⲡ⏳ß珴⿄⨺瑵yਨ؀咞᱒呋⍉峖ଛ壱⷟䯆屶㢶湠焇撦ᘒᵋ䍨祈᳚ઔ⢥㢵尷ⅼ䦍旯捒圼凅彊罀⊗㍗勤ขシᑦᕸ2喢呄瘫჎狔䪸⩕䲴ٵ㥶睁啻扫હٜⓊᶯ㸱ᝩ⭍䲬㴅状梱䩶秐枬察Ịء᫝஛⪕⫥吖ٷᦷ✻啔᠂廪秋᳌峊ഋ䭵⭆㫂⽴炵憂ā⪖Ɋ䣁డ恓૆㋰⹱ܚ磶女㺏喤嗭ᗬ䦓俨磓ᠴ欥⠫Õ乆ఏ㎡啋䜮䩺绋狏͜ʲ⪲⧕⾵᧠䰆ⶑ㼞硚孉㳫㵌吡႑勛ⴌߕ᫴⑷ⶒ唭圓ሺ猡嵋㓐㬛㘛ⰽㆦ䩢儿窏娔ㄎӚ儊㷩惒劵⮙⽅㨘㗶୵ⷂ畑圻೚䘒䏲⍟勸䨵⣙㋵㛄޾噤疷囬咬濘咧㫉᫓ࣉޝ㯵往ॳ㵥喰敺典掊築䞧笐氃䱠ᰕᣴ惿㏞┵喜䜦夑⋓ࣟೢ犵⻽ⲕ㌄⫬䍡䃂嬧➦笍忊ᳰ䩋℈呣┴቗‥⑙഻坘剚嘻囏ໟ礊᫨濎ሂ㙖棱捻畉䋰䈚暓䩆经䚬⫳ⷁ㓅๵॰ඐഡ━倪ズ沥৓䋈ᨴ瀃㎩濷怠ᑒ倢㙏ᘚ忘˄⥂䡜⬟⣭‭罵潿㙬䕭喀dž䆻媋䃘㩻᫔橓㵭⩡房吨䗎ᮞ弆唀੊廌櫬櫎䱩㦭㥕凭玁倾㘙墹㡻瘵秚㳊䖑晖㊭ߤⶶ䎛᤬㖎喒佋₋⫋d婮瑬彍祄ዳ印ᕐ✹嫨榻㗌旐ᬌ婸櫢ㄕ嗤捹Ⓐ㳱呆冼溺と⢣⡖嫤樕≭㽵⓱㍮㕶㖡垶睻㶎⧞䘶媚榭㠉杊䫽䕾犀ጟ៶䦺Όיⲱ䯐氾⋌秖囵᭷牋㛡列ᙁ倥❁ܮ抃獛㚤篃棱䍷ᕬ㒡彶粻➏᷎盽旎澛㙈歈䡥搰ٮ䅤୘⋻偫〯皠㩀ȧ㏚忶⫱孹䵣㔡徚溋㛌昬༎⁁檧㇍碫䇸⪄ᷠ皑ᚮ翻㤍㣰亨㰎汵㈍Ⳕ睳䭨㗄眳寙ᵚ亥硧໠㮅儌ㆽ䢖旊㖙榻㓘彺䡻㮈ʣ仈䃙渮塽瑊绾䞎ᵱĀ䰕䀒࿶௖⼒㮏Ⱨ㋭ㆷ⳺䝫ᶰ畋僮囚㌉歲⼟嬛厠ᙙ盖偸፹䓄眻媎嫻ㄈೌ匓᭵椻㵽㇖㗾䞕嵸疜䖎嶔✉䛔亼℡濧⊥擕⪾ݠ㶘督宎皲么㷚⛄㭦淫ⷽ翗䏹䝣䵾疧堾撚砗築仉⭍棯℉溗䑹嶆൴甍多耂㨌៌⺢箹潧╝㚔䏸犡㵂畋⑾稺ᔋ䟍⻒⬳湊ם冗䞽㉟㵸⥴╾绚猊拔ຶ窕澏㵍夗۹ū川疯卞䶛瘌ω⻣㫂Ïᣠ㹨⟸䵥嵣矃叞弛䬌Ǜ᫥窛淇㰽ᐕਸ਼徟淗畮⩞硛溉Ꮕ纨嫯沗⌝⃶睼徛綍矿唰Ⱊ濏箳༰㰂ン㤾૗⏸ᦙ綖杛喞欻∃�Ị᮰᫡ԕᙠⷠե⦅㛗ⶡ糊怗߷羂刟熯䪾㨤䀰柕ⷅ盵嵮䯺㷰႞浌ޏ⍬䱐䷚岊傧О㔓孅෽䐼偔䈊Ϩῷ劣ԛ⡜ᵭⵒ㕍ᅾ廻氻痡禙ڦ獿Օ圸焪僯ͻ䔰㹠䒝嬖䟲佱ޠ༰熡ೖ桝უ痰ᔿ䇁廭⨺ⱺ∼݅䷄厎崇斷ޖ䍟稨㎅ໜغP漦Ι沃ⳝƖ摓壝䎯୘㡑᲋⹖墍ᛡᏼᣀ⭾⨧㱘|㹴ಸ㽞叛᠎۟礋࠘㊨糥汁ᗈ㖗娿皈㹐籧㨺⒟↴䛤‐總⳷恕䤏絁埡ࡱ䞥Ѝ㒃纥氐澾ℝ他䤣椁΄Ҙ㢱傧䤽偈懚䚈᳇⺣猖ⱑ熫〬⌎⁑䌰榰〭⡮߶ᦐ涵㜯ِ䤄㻢ഘ㪱熦ĺ䢞ễ穣⣟΃ߩ㙛ᓄヂ䅲৅৓眼㲈䥸䝟珸狃ㆯ⩑᣿䏦窼㚁秧࠿੥燭ᖆⴤ溹⪫⡾ᑓ倨楗嵉㷧အ⍬凷扊᥀毣ᾬ⡙᤟搕ഥ巖灧猽哑৸☲癄眺⡬䤫棧⶘๲㑑缦㨿⊌䇃䞊᧤窃⼔ၝ䤘勔俻⭩盄怳柁᎕ᴉ᱇䆳伭ᥓ⤖Ꮐ܂㗖罛侍׍慁➗ၔఢڑ⤦̠吐NJ㨺੆焼粑䧣䙅ᰘ橳㙬៳罭ḟ䚊㻉嘝廳ƭ᥺࣫儌㴍㌊査唝ፃ఼㹑噆䚸䢄庹䟬ṧ⍽繣浑帢粣畚㈹弥↠䘴犭⛃Წᮃ瓶癖甞掚೰ᘉ紣Ⲽ䢐਎筙ᬈ乓ᣭ』䳪ᔠ✃䷡䞃垮炅榯䞳ᬘ挳㓮ౝ甚⎽皺㝶糆㩕ᚁ⇢婛Ṱ慍岒夨䧙㎝䵝᱉砜⦺咞姿ٓṔ歓㽭ś䳩煣䳄氽㘃綿欬慟泔䁨ΰ䯗慐䦦獰Ǝ㥏आȽಎ妱݇᭨怳姬獜棰稛举㊧ゔ代濁科㲌╄᣸怤᱒嵱㗰疞㲙棇➿ગ燉暝ᵐ笓๮潛ᢿ獟㪦㺘圸ぽ司妳P㒿㹆ᑌÞ甊㐇似㕑䴇沺㒜樄䶬ɾ勩孨䣟孙̢䵱㕹嗼窻઀榰ᝏẴ澽凴॔ㅨT⸱奯ഓ㟳ↁ絟㵐嬼簃৮烙䴏匤ⶺメ宙ɽ湰◑㓒ᛸ⿃㋔⯩溰䯕伡㺹猶⚼撊◖未ᑲ涁䍍姏䄍琢䴨ዡ纈㪾嚄⧌៧᧢斳槬ⓒ洝К⴫⁠斶灻ᆛ䴯ᘨᮆ䉃獏ᴠ଍௄Ӷ㿉柆ලƉ妵㯟涌災ⶹ˖࣢ẩⴑ॥尠卶濛慓欹⫃㵋䂴匣幝䕅៻娵涷䉻ẙ䧩⛠壨癋坏拖潖࠹ⰵㄎ㑺祼斐嗔噒媂ੀ缢惋崃⮡ផ㯵窷慼抒ᘍ᠐妒溃์ەݥၝ⿔㼥泶䍽⭦批嚚煂௭㛌㛝氨欬ⱥ㆙䧦ⱼҖ㈖ᜓⴂ箋圊盙箅殻⼛䛵楀䬺巁痁ᇌ寂汋緍䛘㫾௮⼉㜵䡦憉㶉ㇶ噒岚渓妲曜唖⬾噬䤭拆ⅹ⯣痀᜸嫲椋ᵎ櫝ᬙ殐瀒㈭恪僼疐ዒ恩㍤幽婪曔⛵嚏⺵㩙䚶⣿ඍ෩圞寊总ۍ嫑⛴ࡗⲅ㻭喴唵䶎嶊璀à⮋⛍✠吰孴湃㙵浖ݻউ昐ᝄ怚炳ᤑ嫟書孚檓㾵棗˸ᯗ䷖圇ഴᢋ橍痔䢁嬨溧播䟆彽䮚嘆暹峦攽ௌ㋟圉室㜻㼰壁䍿嶃ᗎشẚ篻┯≼⬕疈亝㩅掶㛹䖑凝᠊忛ᚋᾍ܁圊尡氳㔰ᚰ厤ⅽ⷟㜢⭮涰熍䷗惴寃⶧㕵瑶瀼潎⦸瞿䖺杛എහ嫻⭕洫㘍皗皽垎৲㘳悎痛తⓎ礛殥溧ㄅ䦖垸⮙䷅㚌欎絛Ἆ㣹Ἆ㯰Ʒ䳽呠乕晫᷅癌ㄸ♅Ô௓⛱㭣湖㉝哶杸㮖㘅看弒稭㛎俒仹㐝ⷕ㥹得哹Ẓ渂砗幚洃ᯭࣟ፽箽仛ㆵ䜧௿殘ⷠ䬠㢶系ȏᇓ᜘㯅涟唽拖㍻㮕壽䶟帡楁ᔎᒃ≋毋激瘭延ၚ宊Σ眍婞灓姏゚笎᭱ư竑滖᥾幈Ϫထ攡箛⠏ベ⬋簈滠癝簯㑜㄂䏚༷廜㦼徎濓懰䜩瀇㈽帮⿺䖐䎬㞨㶗ㇻ䂶ҙⴒܬᶨ縭䂩歹媌㡃㙒峔杧ि棕ᇾ筒ᷟ㶹搷ῼΏ␍๺嵱罧ᾐ梘অД὘瓣撯俹ᤂ㗿圄㣎斻复濜l箟渤瀣剢୿償⸐仼㩑揧㘾䲑戙㯒㙷㳍取慙㮐㻹坂㴖燧ᦕᔡ⣝ݟ栄紳䗗ⱜ᪞Ꮶ㚜㩩濧⬍嫘⧵碩淴礩嫶⫹ⱀヽဒ嶉掛ℍ㟞爉❬ⱓ㸃术盹ᄅ厺ᅶ౮綁Ấ⇖櫵㗰溞冝坶ⷊ䟟竾倌宩毧禎࿛爘箹䍍㓓懺∁䴟㎴矘垉獋䁚㟛愊杂⺘灓曮䑞洛䎮佘啱箪䘏塝ⰿ○沜篜ⸯㅛᔃ㎺嚦㾱矝旎⯫稂㭟῔壝粫䷫ᴖ஡ବ㥉涇}溔؂❒ഌ磃呠ࣛཞ嶬垑㥮歰ᰌ㯐ୌ毤庖ㄝ擖㯼ྜྷ㏔⾍峉猷➼熒処➍Ⱳ珹獯廹抾䏱愫櫅氧᩿ಗ◯気Ṓ熁獎糚Ԑዉ⼷妠ච⢠㑚弜垪嵤㱳砯罟甔Ⱄ⾢沙欻淌ᖛ䣻រḺ羱乮ᴯ⑞䎫⾱ᩥ捷㺾凝嗣០帊粝盷䴮䬈጗⼷婵摧䂴扙㧶䍑Ὼ罭描ᇸ挂Ⱍ⽡孵抧嬬犜眚qµ༤ίⓜᴕᐗ㘭塭楗డ纜ท氂ⶪ紋啮壜攄淌澕٭揷磾᎑ⷮ㞫湦☸Ҁ⓿熌䷖嘻㪍睗ᑽ㖐ⷮ堘䳚牓䙷淛ʕ⏁溺㺹擷⭾㢀น⍡嶖焋侎仟܀ᦥ࿶封壷㒶᷇෦㇡盆牖♯寚ᖕ憲埉㦁溗ჼពฎ埥归犸搻᷺㮀箴癒咇ᨳ稿ᾓ㲝掽峼牋䘎旺弉䯨漩塔Зɗ垘丐࿏巪皸኷咺ⷝ㘈ở㣊男僽羗渕瞠㴤傧抖粶ᗋ䯠䪲淽燭㛎勽ḊᏓ從粧瀎ず⼁Ằ殆壖㕧྅焗ᬁ寿Ṳઍ䃏䱜ƓⰙ漅帍癳瑞嶕欛ྫ⾿㳕䢾⧸憌珉ᾍ㨵枯珽礘帟眱崩瞭䔷৸憞尝栈㺜棁也⺔䐗㞪㹾皧䀿⪚䐷⟖䋠糓檇䴽嫚㋱䀿㛏ㄇ䗻ǺἘḒἬ縃扛呜Ԗ㏠瞡ᓙ爖䔮䆙緇Ꭷ 㢫絷㥝玝㜔ܨ瞪糛桏皜妃殨庁㦞喛䎆秎珯➾㺉デ便咞⨉៚Ό㦞䊧泜亙槭㟟㣆狻縎ᵛആ䉺彋㺫甗੝ഔ⯢⽥怙狛棯紪䀵垼湆㧋筗嗏䞘ᬆ㯞崣廍沾ᶚ稐堘帺ᧃ挃噔暗ᰊ䝭洄疢ॎඛ጖君睨綔滷㏿玜㐏侌〖翷䙷㮙羌ߛ彙㲻絧坜岝ᅋ瀍㾑笷䄮晘䆐䘉᠜㰞縏惞咙寋澫淯ὣ摟ᾛ妓堏ᾶ篤濯ᕜ̝彪礳Ჿḷ䥆杚⊗布庌妫洏㣞撛氒ὗ㸥疯䡾Ⓖ⾚৷䝂碤焯˟伝毪潅㻱绗䙶㔞༌߮㻧㯓擷暒ʖ㧪城῭瘗慞㾘┕俕徐桕恿Ῐ㶜៨➑巄繻嵾ᅙⰘ㞧ؔ翫溻⚜ሓᓵ澢㳃疳櫞涘億濭㹳峹㱐䎘⊞噍彐羵㣯兟㾝྘㏒㺠ῗ繞⫽㸚槂箇抰䅾ᕇ朌痚币䔣縦筿摽戔少Ή㼢㘝䙶ș懸෵ླ稯澢ɣ䨌櫼枧瘪ഈ㭶⵺䠔瞸缕箯橿ԝ凯倖㽹⴫ၿ亟ᨘ᠄ή揋稠甧䞟◟䈐篎綌璏䊯⸙Ċ罌绻磭營犛㫕⯦口籯煷熞ԝ᠅濩㽬絇矝圜栕绀綋繲Ϋ笁瓯ရ㿶ᾗ᫿纋๝爟漜羫㶷珿䏮縝〚㾣罤碭㤟炽研०䤖⊪ݕ湍䐜䉣翏繛緾搛䌏ㅾ昝▘ⵑ耎翺桟罁縥綟祠ંٟ䑽ᱢƬ師眒玬ῢ匦ޟȠΉ㩱瘠᏷幟㴆᳄ؚ〩‷⿼佉¤䋏紈㥯灏捠㑿ⱞ䰝ఘ⪑ᐆY悽þ།֧簐狥侟䊰┞᜜簦⠐〴矷⿓á交ˀ妔∰ᅷ䮠䆞♀喚怕䴍翾ₑ朼Ǣ崐ݓ瑧梏俏Ḟ唣淋䠪ό㧵翗ᭇ䙧綧窸஘暟创ᣞ؜ጘ堬䠹ㇸ䂙ṫƦͼ۟甄஬嚠祜伢嘧㪒崃埲ϗ㽅繨糸ݨࡏ氀ム摡堝ፚ⸖砹䫹垰澑帬糤߸ࢰᅿ䢠罒笜掚殔䀅͵忌℄䇏紀٭ʩ桀㘠搡劣⠛簬܍࿩䁺⃢溮ȡ笋䂠Ꭸဟ㩮硍⸘䨬耍䧥თÆ㢛㶴奍喏泃劷㖡ᏽ㘧樮а灃ၴ䃊缝ϴ㨸സᔗ䊞ㄞ䦼⨤气␲䡈ႛܹ䇀˹篐೸ᡗ僠竡堝⊣ᰗᠰ⿼炛㼱ƽ緄㨢牳濐㩿㡡犙圦䠕㡅㡐ϑ⃪䆿簤ټཇ䷰➟๾ᶭ䟚֐⸌矡傟༽ŋ籣⦔ਘᐨム恁䔣㰤⨫㐽㐰翁ཏ㣍ɟ筴෫怰⻀䑁榣椥Ḭ堌灍羺ჩ倽ϯ姢ࣄᦻ儠䫎ᓡ影ⴣ☭糼窶ჸĪ崹ՠڌ۸ְ盡⼝㬧भа㡅灰╮∞৙ݒࣞȐ‰磁♣㲤⾥䀁㟹ႜ℅⇙Й߼࿅抇塰珡禢丘㘑⨳\\伺僕㻥Ͻ㯤໕殯䛀䴎ɣ⤥ब㐻ᡉ恶₠∆䊭ښ甈⃝䔰燁㋼ᬤ䠔ℋ䑄ࡧ佻⅛Ϫ㤪຤ᘰ⽰矁೼咥‖ဏ෱m♛㔅ϩ牆ઽ消ⲯめţ↤ᴩሹ䡅偡㽴憦̫ܴঁ䦨▹ⳁൣ㝘儑3呔䢓僑↨䍗㨔ீᗒ䌧᏶羣ᑚ嬩愎偞➵缰䈁䉥٦ഌᵸᯐ寁⨼ᩛ⩆စ撷梔炾懿㸍բછ⮟嘰唁㪨ಲమ临呅⿏傳㺵䊠ֈࡗ擘㝠䬁絢᧙⊓㨻展翜㹮甐Ɲݾଠ஘⺐磞ף༦欫昸ᑠ塥〻愧昒ܯ矜ᮘ㰀流彣崥眬栿埵䖱炸∀ͱҟ瑤ᐐㄠ疎ᕣ䦥紬硋櫮ႍ惠ƀ⏫笆ஸᙨㄨ竁ᥢ⡤㷕ᰇⷫ梟羄ᄨʿ׸জ᷈ₐ滁㉣ᑥ崨‸ɘѢሬᇘ˚管ग़瀉傐奁䡨灥坓ᄳ嫸῀ᖁ䅟糎姙琬ិ卐曁櫢Цᴮ㐱籀ࡤ䣤⅊⊴ѩ瞨ᓤP抆偢岚ᠬሸᑇ᡻烼ሕ䋔䘄ੇߠ㟀注濙Ⲥ狗ᱤオ䑴惣ᆫ䊢᭽瘏⎄㱃⦤⪩烳ʡ䯅䃾垰愈቞⌑șಁऄ⃨皁ᝃ❹岩ی੎H⤓ᅥ唭䢥ૡငも㉱磂Ⲧ琗璁䩕⮸䆖ᄺ͘䞁๒ᔈ㾕⹱ⳃ᥋䪮渮䩗撚簩㰴㓫ެ◪᝴⎰׮瓢➘【䔰硖䒄ࢨ愽妺䙲ߊᥴ㛈惱囂㕤䊪摥␫⡖⣒媑⊤㥭ౝ敄㼰䦞❃ᅦ弫儷ⱌ咏䣩凳⎦䑭ฅ௔ㆦٱ梭䝧䊫娼牝㒏⣾ᄾ᥮䙆⎪Ṕ㹈瘰ᧂ䮉暪㴺Ɉ咕罤廷⋖䒥ச᳑坈寱⏃㹤㮵‸ਫ਼ፋ棇ュᔑ۴ॺᗴ⭰旾⯃瑤溮ُ̹㒃棴ㅠ扢䓏�ʔ㟨癑ᦴ琛䄯ᴶ婇咋䤅慙ඒ䠃୦ᐡ娠㑎潃㥤篤⨪㲷㦼棦ㄩ䤩䙬஦ᝄ▿ั勃ኢ妨瞤晚䱻ᣴ攔揖䖄䊖ືָ湱䷙窠‡旮ᡌࢇᤂㇽ∱䖳๜ᅬ㱸稨䦃哦斩欹䙞ᒑ䁋㓋ᖑ䒥੖᪵ቨ亱⃣ヤ喯䌳ⱃ㒛烌�⏭䒻ယᰄ◸䣄΂ᚚ䷱㷪㙞ᑴᱪ礇懾䟣癊ᄌⓨ俱羂㻥Ϋ㬲ੀ᲏壏ㄭ敡䛡爪ာ⃰ᑑ◂ユ㪭嬽晛₂ᣭ刜捳䗠ɡ桞䈸冑߂䄉▬㔾ॷᒜ冀燑絞䛐༚ၼ㟨涑ᤃ煦殪笰㶭䀨刡⚓⋛䔗ࡊ᯸㱠冱㄂糥ᶯᔼ〻屯烵樳拇䞷ഠ斢ᶜଖ榃㹤ឪ⼵槺౭傻ㅁ䍵䟻௮ᤌ㽕⹱㘃澛⦮ἵ尶枨䭿┌瘟猚␾὘⌈楑棃擤⫣嚋㹌⺭磠擃畔堪㌓暔➘巑祃㳦ᒬ祭繑ᤷ例ᔟ硗䅛ƣ房䳍ᶆ⠲ֈ㦯椽乊䟀Ҳ几፱橠亡ᤑḤ瘩爉従笀Ⴗ繋ᢎ磔ৃ扐☐ɁᢹƠĩ簳瓰㬱傿⚮粓炧熊抿䒋࣋࣢⼷㨖⸳箂䔢Ⴑ汿䊊䉚熝䌖߀䮒斠ࡤ岘䓨剅硪摦公ౣ窞६ኰ⚨သᎼㄐ竑⡂ᖃᑮ炱൷≿ȵ攑⍖珇❠༭ੀ㳁ᷨ⸙౯⤊ㅜ抅䓖冻打ޏुဢ➸碩撼堢毂瀬ㅚ∽䓍‶ፅґ偁䎂ⓤ䄀笲䅇杁掣ㅉᯆླྀ狖⊁夀↩ᅻ乄䐁ᄳ䏥⊩焴䙗⹒⒪惉ዜ奟痩᧠ὄ憩ἳ杙夠叨氲䦭࢒橵抲▴䷂䅲⏙㎀瓠⛊呫尵ⱕʛ䔒लዉ惸䲉ᑗ姄畩໴⅄ᩯ჈᥉氫Ⓔ䧅᐀䄤圄༴⎰ư⬲䠘汬⨣搪၂撳䬉ፁٽ૱៴㡼⫩禲ᭇ⬢沺ᥖ㉺撥䥇ዂ▂栉Ṣ䗏㎀掔㷧Ⱬರ琾牺倿㨣揺⚁चῸ㾘碑㞑㝆幪฀祃犔磻㢠厦ठ㞙ႈᏸ䷩ឲᕆ⠮怼祖㉠擄ȉ䀲ର䶲ᗲ㝘廩✂幄Ⅺจ䕘岇₢⦈勐֍Ⴟ䑲ㅗ㾬瓡䯥橨❅╄籛ၺ⤻打䖏૮Ể㬴暩瘳婅㩄㊳║Ş⦞⧬匥❤䭉ᗠᓹ⑚䶳䭇楬䛃ㅂ⪆㊃䥫ጼ◒云ᇪ㗤䚩ࡃ㣇㉨ʾᕓ䁄哅⧇ዏ珪俵ᣊ㩴刄㡳㍆扪ಳ凹જ⤋⦳Ꭶ➌䧂ᛢ⭄纑籲敄ᵪ咰ㇽ債ᒻ⤮ᱲ਼佹ᆌ㜶ႉ磂⇆ㅬ璿䁛剿擑熝ዪ⑼䧆ၜ㟴䊉⎲⇅䕪媲䥄䈧湕⁠畣⚚䫭ᩢ�⺉椲彄㢩ܰ湉傏┊䑴叓✶䦠޺ⴄ緉䋲㧄᭬ޡ䵞ᑣe⺄䁤䜀㘸ᎂ⯔楀⻈旆ન嚻祛⪛唘槓ጧ┖䨵ᙲ⚔庀໳橛嚤᪳ᕍx䉰䧲ၷ➺井᫢⾘䔉Ђ㗅䩬淭嵊牫杭纻勗ʾ乵ፒ㹈䋉औᒣ偧暻ᥞ穼歇榱吗֑ྞ憃䊤瞩៳⛄Ὧ㺼㕏⩡哆ၯ劷⛂䱮ᴚ㹈搹㔃㯄䦭㪷᳿牧咴⨃቉熷ઍṲ⊄妑ࡒ睄♮窵嶥㊜ᒶ弞匶䕻າጂ⬴璉ᱲ㳇癩撼⍟ٴ撣主券晴䪃ᮚ㛤硩²ᇅ浬熶ㅛ䚋夆৴⌗▰䶭ᰚ㌔婼⹒䧅䅪玡፟抔䲮ᧈ劐磠׉Ớ㱼⥉敒浆ᖫ椶元⩷ᓍ⧔㌑╮䦣ᚦ㍬崉呒ມܓᦻ䍒暎❶榭厘曂䯍ᄒ㇔傹嗃⑄捨Ẽ䍘晶೛ᨕ卼擆䣓ᅲ㧬䦉๓৅䃩ซ捜ᚅ၀᥃劧䔌䲞ᜊㄔ怉磃円Ὡฌ͜牱撨夳㵉⛑䵃᳻兤忒ࡲ⒆ᵯ☧灉执⣂ㆼ又枒䩫Ḇ⤔偹勒҄ణᥡ㵟ᙹⲺნ紺朘䶋䕆➔䛆㥓綅佯䆱獆䚝Ⳙ楝㌘枸䠻ᦶ㟌撹繓⯄⵬ڰⵏቨⲦ槬掅Ⓟ䶋栆◬擤㝒峧瓮焴䍒㚖泸䨋㏗殹亍ᛖ⣔廹๓ㅄۭ熰筄㙧瓌ᆵ刴䝶䭛ኲ㚌恹毓䕄睩妼ୖ皎㓭妊㋝抲䣛ῖ⹌縑ѓ篆೩檲䍄暍䳨㥷㎜擃䩽ᬲ␴䱉廳ูৢ劵䝟ࡅ夑᫚∬稽䷋ႆ⊌碹嗓䕄৮⚾歓᩾⓺㤳䏖晆䪇ᴦ⺄炉桳Ԇ䛫㢾᭄癵᳌妼猾ⓩ䦃ᡎ㱔坙塲⮄᧮ᒳ䭝二⓹㧏㊞▨䨉ᨂ⟬糙ᣒᦆ绩涻ᝃ๫㔟ᤡ⎳䟤挛᎖㻬回浓┄偯Ꮌ㭃綠峟姛㎓♅ඳᵮ㻼䎉峒历ᩩ㘄敔樽ᓐ㤰䡪敄࠵ះ峼恡㵒圇㽯縉筟溕ᒱ⦗瘉敃䲥ᘎ▴抹㑒ង෭䂿浞ੰ潴祜獕❻䨝᤾㍜䯙‭⤅ᳮκ睃䙷㒫ㅣ劑攞㊗ᵚ㩬疙ᴒ䞇䏮䞍⧷⪝㳊秓卐晷䵹⣾⦔抉≳洄߮‱䕀皅岣愴琙搷䬷ᙪⲠ昹戓棇簲⺶॑㚀糡姧匜╩䭿ᙞ⛌䔙㴒ሆ嗪䶲彜抖糍㧧爢☯倏ᔲ偄佁㗲䖅燨⚽㽁扳㳐稆ᰯ旗䱧ᤲ俦น㩕琅Ῥ䒼孖㉖洓祰厥染䤠囮ㅼ変斒抇⟯䶿ፒż洉姼㉅杓䫅ᴞ㶜瓙–䅄短޷彅幼ޓ囦玪⒀⩠嬲㨜匉倝ฆく䔵⃋庎ˊᨘ૿曗䫥淖⺢坴ⶓ氵偌ឱ䃑智ೲװ牸⛣䴳ᘆ㔌楉刪嬆全偹㕕ᙱ擾դ㊇搨ⸯፄ⩔匥㿜ⰴ㣑㎷ჀƊ᳤槲ૅ柧䮙ᯤСഥ犲䘶Ố⟥Þ岘甘㦳叽昁䴠冁⫯ॉ噒ཅ᱈弼Ó㺂泮种⠴០⪳ᐁ⢼罺ኒ∆ᡊ纼惐䅣孯֝㏜᜗俀嚞⯢禩䂪ᲆ彫⾻捕ᅨ紌Ĭ୴ឤ⽰失こ㛹ಫఇ८刲㕀檅粹מ㎴染䩳ᴧ䅓ㅙ殃櫅䉍ܻÐ纖泺䘑ቫ暹䯈励‬栥偳洆彬⁸ი⚐䋯᧖ல斴Ⱶᢡ⭼僥含瞄剩熷烇㙤㔌䖿剺ᚨ⷗ዑぬ囙䲒⛥ᝪ皰㐽ૃ烾ᦧ଀̼⨨廖䑂䪥疫澅k䁵ࠬ煥拴㥯ટ掐⫠偶⹼䩩侪嘶䑫غ棃繺崏䖽㍺曃䬕ᓦ㯌嚥惲然籊涶ു庝ʱ䘎㎙旵䪿ᛱ㸲牥稒槄慏㱻⃁ၮ炃Àဲ⟬玀復㊰ⅅ帔々呋㰂׶࡭䓯纝שᔲⵧჩ㕐ፅ䩫Ą嬖呺ッ湵䲾䗟੒✌䢸僶㷂䎥湪䠶祉ᒸݘએ⡺漛甭摟┴宆ⷢ峅⩫㤴楉䔱㓴䩪劳Բ䫰攊⡯䧩⢏㲥㡫ⲅᑏ㔿䟺噾̕◝籘☒䭔叁㌬擅紪䀷楈≻ӗ湽᱗▸䫶ᗝ䧐奮∂栞Ὣ᰷嵍扼嵌桟⌌㨀૗⑦⸸峁㊬乥ණ䊵䑈澵㵖ᦜ括᥇右ᖠ⩔呾⹜ἥ⁲禵啊♰ೝঋಫ姲ፄᑘ⣌寱⃴晅璪紴絊≶❚䦍勾⥵糆ᙣ嘬圾㕼⎅ᱫ䨄ゐᤤⓖ㹦ᓞ֣䩉ᑖ仿᳹㲜䷅ᰜ皴㭋ಾ᳘㦉精斬䪧ᜏ儼哞㋂糙͡栓敏➽ɸ䅰ᵽ斶ᡍឿ狔峱⼂䞩䁪厄睋◬烔冓峐恇䩜ᛌ仟ᚱ㦂癪磂厷捊㑸䳊祪岻敌珿ᚄ⥈塲㈜砙પض糬䁰Ⳃ剼㋓敖ΰ✏䶼嘔ℼ侹呲㌶坏橿ᣗᥪᲾ◵䫫晽䠴傶ㄬ䷙ޫ኷烋橸ⳝ຅⋌攲䅗ᕇ࡜咎≬䬉Ύࡴ☮ⅽ㓄奺ዀᗌ⩃ᓎ⦐孒㺪砅偋䨆୊樥⒮ի⽩ᖷ଍橔⣜怙㿲漵嘪分擊瑱ዏɒ糤䔡ስ朑䤠僎㟲務羫᬴Ṉᥱ坑溈崟֫㊕晴ⵥễ₪涹݊䙷⁉᥼䳋㆝䬖⑵䪼喉Ⳉ嘙Ⲳ笅扪稙彎羶峂㦑㊠ᔠ䭴呡⢂嘵㦲怙僊沶ˏॹ՛ẃ䫴啤⫭撑⩶ᗥ㌒犵牊斵᫪枹䫃╦⫳㦁㊮◥Ⳅ媁ㅔ啵窫䄴ᓎ⬲䋇䕡⫞ᗉ叶◵ⷰ奵⥊硵楪䮄橋↻᭚㦓⫨嗆⬪埧䨻搖㬪涹�ᔵٍ㬰泎妀䴁嗼⭦埙⢘录⺼債㯲綶◭㩶⥓翌䊖㦧⬴ၥ⿪徾㲊呠Ꮚሲヮ嵵੤ᕣ૝ᖿ䯏昹⥺垵☢壵㛋杄廈奻僇疚ⳗ㥰䪋旒గỵ⹪䰦珪䵶囏ᵾ罚ᕸ峎啜䁲吧䦯ᐎ㼜硉䌓ਆթᅲ畎ຉ㋏唳⯃枛䭞渥⡌牕⊊䣷牬ᖰ哘嚁㴅ᤵ㍵╵䪦引ⷪ幕㢊ӵ槍ᕷ擞ኄጘ╲岊唼䰆包㫢䟵痋᝶፬୵坜ⵯᝪ֏卂杌ⴟ欕㠒抵宪ヴ㑊ၶ瓐敨㋻ᗰ⪣ᒆ⸃ᯍⰢ癕ᅓ挶姌桽瓃ᥲʣ㔣ષ⛞䴊媁㛺併磊䋵繉༵ૌ浨೥⦖檰ᑛ⩼凩㮒䩩㮊侄ό㭽⫙涀勤奊⯽喀⬖寑㡚濕拭儷焠䙸໙ㅨ䪠嘁⪭喬Ⰷ᫵ⶺ碅壊⇴੯搿拟ᶜ㪴啼䬊ᛉ䭦坾モ坕ߢ媇㋉榱楅⵨嫳㘊歸方䪔噉⋚妕恳綷勏岷滌ᶉૼ㖱櫻唵⴬婵ₚ媀㼒癴᱊䆿滛ښ㤒᧫⌟᝗⦆婝⩂咙程呶Ⅺ䆰㣙丱扫䓇ਯ圼➴䑝✺䢥冋磶ṉό㢩ŷ㔇䔛殀坌ⳏᆍ⸊劵ᜊ᯴ੈູ೛亗㳿疛⬒暳⽮張⸪僾⾋濵埍㭹竗ᶊᒸ痳⩊⚕⩽ᫌᓢ䨭琋䛷㏈嵽㻍Ͷ峵げ檮ᗜ⹚希㨂暕㇓⢴珊䝷䓀䍺6◤ᬨ㜆ⵃ᥽㪺䐙爋ౕ仌罱⇌㵭㫖᧣ጽ⡀溋ᓦ◵㐵䱊緵䂈佺⇅঄糮ර欫枖⻺匥㿒彵▫⚷�ⱹǏ楧یැᰕᔌ⡡寽〦哹⻲⧴和皲ǔᶚ䜃ᗰ᫏圇⩑偽☂妭Ԋ分Ữⱹᓈ㕲嫆㔿毷坨漞嫦⪊粭场⎆痫撶懔憘ዾฌ᫜㖈況取⑆夥恪ⶅҏ浱磎ڈ✀┸㏰㖇⽁唳⮦䱭ᒺ煗ʋ䆻䳃䵢竪㔱ᫌ㛗⦱幝㣆伕猋峴篍䭶佔⒁狈禪樻呻䤺嫍㽂羞ᚻ㽶㯌ᙽ囉፡᫇商ᮜ曔泋ᦉ⏦吭䲲忷㪌ឹ囏⍣⚪㕟૤㔜⣩噣⩦癭䪺Ӷ嚎祴楄९᫷ԫ⩼㑘⭱弃㝊枭犺㍖堒䞺壗㍴竐斸玅ᒸ⨮壮⨆斥㖻቗矫⭵姅ㅻ暧敄欍携⪟ⱃ⴬椹Nj㚅䆈䣻佀䅷ܼ䷐㉺暓⨁噘᭪䱥猳䙖㵍੄᭑㙤ۓ䷚㎹噼漑孓㡪亵ܻ⤄䁊⃷狊ኰ糊⵰宻摤ⶥ吓Ⱂ念಴䅗੨㥲种䮛ራ෎⨩㚌樑喡㧪沕㲳橴冊❺ॿ╬㋰䨿ᯁ㟲澗涓㕒壍ᆓ檄ᖋ惻Ố奧犱䶲䯸垬沦库⪆僅઻糗㢌ॸ糜㵴ૡ䴠᭎⓾䵐哮㿊浍堒礴ᦊ᫹㗎歲˻ⷓ⯀囤䣵冫㻄嘥浺೴⚋櫱凒ᎌᬈ䵾嫤嚁伭山⎬栞枩☶掌ὶ㻛䮐媰淿ᮽ㑆浞季㈚崵䥻淦窈䫶䳑疏✉ⶔ嬽㗪毄勋≒糭示槴ڊûო㉮⳵㡜帙噖棒峻⁴ᥭ榻ӗ斉侴淂ⵯ㋔娈ၛ㘲ƶ峃⟶䍉ϊઇ涍㙷᳝奬䊏◚ᰄ㔦⿸奱⯔热৺狇杬ⳳᷕփ㤔ᖦ᪗㟿ⱹ喞㰜琕ᆻ繴჉櫴䋏୥朎涜媩㛅仟ᖥ㹦昍届櫖Ⅾ㹿㳟㥳⚶ᗌ㋟㘎⬍傋⬆䖍爊�纊᝿緅祥㴉淧歮㗔洨垛㠮侍偛♖溉癳潀掖泻ⷾ嫋啹⦕怋㦚暑斋䇖禍۳䧇ݤ㛗ⷈସ囶ⳬ䡑‬倽ऊ⢕㕈筽⽧妝璥䖙ቛ咒濩ώ㬖朵寻竗ᤈ㻻淎湧㬜䷥Ꮜ撞樻渧⠖徉暺獗ℍ滲櫔➊໱䷪㪗囩溣嫫㱦漽⛫㣕ᯍᇿ㷜䝯曝䗳氂ᔖ⽓徨ᚔ樍ً乔⾎徶燁ݭ挃ᷨ㫴监漚帞⿦槍⟻庖ʈ绲毽୾༅⸃檑㓙桬屇Ⲫ䞽戨切悏磰烂䮔૷楆䭗㘴Ⰸ庉乵⅚溔䔍᧼病ឃ匏㔹㪔ᚪ瀑ᴹ㔶嗁ⳛ෷㹩狲㏍ᮃ眄ք媔員橚媁⯔孽ዺ໔㕎㼿㓞庇⻍㤽㭮圉湉寧㫆犍ឋ疕㪋৳孚印囉ᶕਮ㛬䲕ᵵ㞬䫽竊圶᫊۹㇊㝳囦帋㭱搽滺䖿丠Ѡ㣵ɐ害୆䰬督#7㩴痍ⱕ僃䪐৽ᯚ瞖⻅㷾㯒๎な⩩^珽椌₈ޤੜ㿚Σ漊痻᷍ս䋀㷟㰞璁∛刯⸾盄悚瀢䈏‪倥岢Ỵ㴿㡑瑝洉埗㟝ౝ䒚΢爍ⓥ䟍སἄ㷐竢䘣潇奯༾暭糛侕樋Զ⟅ེἒ砲䈳㩙睪I䮰睝唄ᮗ擈冺廗ប⻆㷝瘙癊琷囐䮾瓝櫡䖹☏䬈ᡮ⾒度㷉密璦剷四師㛝些彳㟲⣡䙧िộ㵮䄤ጻ濆呧㶴䤽ᷛ溔☊毶㟈澂倳㵨ᢽ瑻榗巶⩾䈀⃁ൔᔏ䓭矗礦ⲩ币毥瑕沷坏⟾曙䈕Ȗ縏毽摑ᯁ䭳㴦篷䇉㝷噧㱞揝ᔚ䨕帎柶勴䊡庹媽䀨窎檷呿⒯ѽ冚眕猌柿籬彤洦ṑ笅瞷泞䁿⅞捘厳ᑉ昈石岢ཾ益榧狅甗潝ᯏ㯞抬䀪Ɂ☉៲௞帼庪緵㯺㝣ⲇ孿⋌ᔝ˕䇱堍戋ᤪ⾕։廒劗癦λ房㢚昕⟚ሔญ濼⛊ڡ绪砷拇瓬枎橿⺞䐝♚或㘋埼翝ⵌ庣㶛ⓟ痗桭椊⼜猭嶄猖9⪽㟍⪍廚帖穷睌ၗ嘠簞䊝Ц磲夡᷹惱穵漐㕋ᴰ略椾勧⾍أ㐧ᓲ倽⻻熰䃼梙围ᄥŭ❠㉠痐⩞樧≊഍嗲䷃ᾛ红Δ܃PẒ䟂⨭㖀丧䪣㠹偒䂊睷ƻỔݤศἰ㺿㞎禍翥簮␿䶍႑ᤢ䇌纂ߔ碨᭰㡀窞瀣瓹搯栿俰෗⭮⼊綏稩發㟰㗠燞簶唦ᐯ๪濲傲愀䈅䓄䂚椥ⴋ⮀纡䮣囔䌔⇉廴㏔惾Ƹ崠兜ඐἐ㜀绒Ꭳ种愮㬦ᚁ఻䡯簾ጀ榜ྀᶓ堰甞䠽翥焬组᝿⌻ᄂ⇗橋ඡ嗹ඦ札ᆃᘣ单గ熍䡛ⓉƱ⇮᪅ܦᡢ䂐Ï㽪ނᚧ焩䅖῱㻄涆↪堽ݬ剜‸㏭䛤ݣӽ牄嬧㡖⭬ヰ䞉呉݊ഀᬷ吰懾耂ᦦጭⳔ♦墁㱞㒆䍬NjF煫ᬃځ懣ᤦ〯堸ʬ㢈扰懝䐖ࢢ⥼ḗÂඐᓣ㡝༯┫矺叅ㄎ൷䏙۩㮜ᩯഢ⠽ጵ忺࿰ၫ(ҕ羒懸̥瀡ඦ̢唦吱硃⾃੩㉃篻䝉ᒊ磨惌篚ಀ櫩娐怴ᳱ摧ⴗ碂Ἱ䒍湼棍⃀犇甖旪ᅨ戱䙣簧碬椿涼⒗撍ᇏㆬǯ䌴䴋䯼㝈䝃媘儣㤿㱘篏儃ᇿᆜ䛙ළ曆Ṉ恱擃⾂⟢⮬滷ᩞ⣽ᇾ䌬䛱慊Ჴ㛼㪴甴ㆂⅥБᯱ池ⲉታ䍕篮࿊ᢆᰂ䷌簶⍦㢱㶩ڄ皯汴ₛ⍊䝐㘂ὔ㰄㧱囃杦廤坄剛傄㙋ᣎp玸ྶ䶀㍰獲泤ڂ䆯֮䙕癕C刘捆䛬෨Წ㰄ㅑ己峃熭㶭犪䙇䤏䢼挰·呔⤷唠汑姣猧᫤䊨ᙗ҆㲞ㆰ㈓振癦∄»䦦猵ࠈҮᬿ䲲沅椎ᇈ␝≑໿欌㏵唘枃曧䎯夸〩撑椘冾挻᫽ဖᤪፘ歱䴃癧峁ᛃࡈ㒗䣺燠咄㎫೏ⵌ㥗㳑䪃內ய㜽甥ᒌ礚偄⍹簮䪎ᵾ᎘皑埭㍦ம勨㹕咚忈盽⎷ኀ✢᷄䝔メ䐣䚋宗‽ᩑⲕᣨ⤋Ї渟໗欜㍻䔾㱔到抡ቀⴸ璀硜ঽ₢॥᷺́ᒸ爱球撂Ⅵ傿戡䊉ӡ椆᧢⦒䔱ᡢ㦤笩帜㧂㕓ᔧ⹞➳ḳ撵燇䜸䴎᪔㏈ᐄ䢃凲斮䂾Ṟ璝䔋ၮፌ⚵㞘拼㇤矈ᜳᛠᎥ暩⁂㣍䔛㢡‵ڳᩥ橸㽨硁傳敇ྤ㌹㜲劜岕⦛дݰ侘╪俅ࡱ繝䅆⾮᎓ᥒ㊋⣱䨓Ꮞ䀳䚷⏴䤈淭⏀禦橭ⰉŜ䲖儘১凎⚞൶怦ᐴ糘搠灹犕儹Ֆ䲟ㄉ犥綫໊߲᫲㎄扉俴檂楯ƍ䲡沐㤓㇧⏨䟀ƖᲜ㌫㫩䄳哓⎯␎婒⒗ᔉईᘞ⪅䬘噐൫㰜䍳Ű䵮炼楟ᲀ牬⫬兼೺佒梂嫴砉᜽抳ᥭ⊽垿䏖ቸ樂叒尜丕毗ᵔ牖䩩槆皗浬橕୚纒冮叩⛚俱䬓僥⮉別罋䪮獎䩝撚╰潓厺䝌住濢㟔箦嗳㛙籖⺼也撓坎㋺⍅᭞䳽᣷嘤纉妥⇝彭溌͚ᙓ殒樇ᐭ⋲畲䢎䳥ࠉ嬣㿆வぉ䍒ῗ杮洄㍃⚱㓴䱵柴碉橭ʺॗㆿわ檛㔋凞揽➲㐳ᨺ㻴牮晓ݵӮֽ᪻㽗椓⧸嗱䙩伖ᯚ㻾⿮歓両䲮ފ㍛ಟ涗໗掃㫿෣Ἤ㯷ㄹ碽ㆇ玖ㄕ⼯⧊䴘ᛨ⦪柹䷮ᭆ㾔怹絓抆㕕ܔ⭛䳀㉲䍴⌳❢瞐桖ㅱ୊䉳㒧㹭炸⍐巕䙹妡稩㬫ᑛ᤿∫㛬䠃▆粷施⭔粖洙ᨖ㕒昶㒛ᵚ㦘稈抽爊౬䒿ṓ的哼槉㎺权䵑Ჾ妔瑙䙓暆磯੯❞ᚈ磼㧛㏱櫹䳳Ẇ㯇㒬囓岇㲔䮹⭝亀┎㨟㏙᩺暷Ệ㭌拙乓⛇⭯㟷䄢䞼ற妰㕾䪚俗὘孯ᾁ䳳㋺㗬㖿祴࿳峰禤嗑⩛丯ᶖㆋ㔴拳ㄻ୭⮻祑ಟ甂秘卷穸㐳⥺㠷⢏ጓ掻ִ垾扙䧍ⴇ᧯禲䩷伣ᨡ䗜抺唳ቆ塭䢼筗ʘ䔂ে獈⚃仭὾㼼甴䐓砇㑮ᆏ罓⊙糿⫯⎂᭝໏᧖㩴捹橉䠷㭕ܖ穙◛繧妺嗷獰ⵠ崊㻌殹堙يᡎ●⃐粁䍸⦲䴾⛼䶟᤾㐜潙眭㈷䅯焌䩻ↂ䵽⪦獏枸⹷ᵞ㻓㟹䰫ᰶ灔௉プ槑Ϳם㍢枪╎ḃ哘猥仳氷 扨䣛ᚅ㣬伍⍏朮䲐崙嬼檥涓䀇坬ၺ⣚ᗅ㪊֢涪嬅䰲ؾ㏷㺒甫㴋⾯㶺⁶付ᴒס占笑ɣ᫄㯼羉晱䜷㔒䱻㙷⍇̝⦯ୈ昡㜀徑㮸৥䕕ᖆ扗塽煟େ儉ᦫ猸⫰晷᧱㱂淹悫䭓ۮ塿ಾ䦂䋹䘙涺ᛰ擛᳒劌矬䅫㔇᥏䶺籷䥄化☏୦㎏ᜧ⭩㹲榉敫㊶ጋ瞾ᣛ㲈約ᒬொᚅ㙰岶ㆂ牲縫柇浌ㆿÜ壖ኄ־䯅媒ⴘ妱㊲㸥喽禶〠ᴿ歖暂甁廾㍾ᜇ㛬復㴌惙专⌆浏}ᅙ纝㌑斯獘❄⻤尖㬢懢秫䀶Ɏ㷩ሮ䊀ֱ̈୘崝ූᧆ偋㡑斝ϧ∗⁽ན䆖ተ᧥䯢孡䱺漾ㄿ卄㘌෇ⅷⅺ✅妊྄拞猺䀱ⱶ瀺㌦㴵忞瞷ཬ⩽ࣚ窂⣢壟䮳ᩔ䵨宩㝲潄幋⚶ӎ㤹䩓咅ድ䲪叽晪༚澆峪椵缍㬪䪴⩨ᕔ沒唊ᧅ᤼圚喨崉㌔檑畫涷㕌祿૙熀⌌喩縖ଫᚪ峵儁≥哫滚㕌ྉ狒毮⌐斥஀朒➤弹㊲㉅䥋恇籭垿瓛⺖ኂ◐⯥Ꮂⱏᢐ庬擆䯋⮶ᳬ湹烜疂ഒ㧀౞坶Ⱳǡӌ桎疀⃷ዏᅹ੷௔ᬛ໇㎰劽Ȧ崜㣪皹羠縶⭔䅉⛖㖒洚䧄号៘⹿ᴥ庺羥嚽擶ⱍઈ狒⧏䫱⨐歼噱⵴潍㏌桅ニ㚷ౖ卼瓐ᇗ䍱㖭⮰窋⹦夋ᥬ旙濋ᛷ໏殉涿ඌᬏ໑氜峂ⳣ䴁㻂竵䛓墳Ꮝ䅈ݽං䵫嘅獞埋Ⱟ滞壜玕熋璆⋎ॿ勒纚䬛嘓玾堓⻹䵝㏂漵䣋唇楴厺䥟䩋嬟㺯妷⭱♇᧼㢫㐕稃嵚㿌㜹᫕▞竹痎ୠ圆ⴡ媝㹤簼珙翷睷ᷯ峜纃ᴋ稊ፇᝎⳞ夘㵂栲幩їῬ榹懘㩙嫨ዶ毊圫᝗ᩆ㮬搭崋猶祎䣺ᇗ㖖ᬛ㘔情嚮⿍ᮍ〾㢵嚋὇ᛎŸ棛㦐妁榻獇✴⿇ᬱ喼紭烃㕦͏牿泐姐猁嘂䥻➘瓈庽㑁㚕砓秷䃌剨য়㖗⌛旦୨㠔湱彳㵦憕知ሶ㓮᡻畹窌⎗樑᭶⛠漌壉ᨪ癕䡓►⑌嚏᧗㎖瓥痧ᮣᏬ洈峓㱆疕䐋䎚ৎ㥾滝凖晲瘙⯁㚣⸕⭃レ摍䉻涆庎纻曛玖䳱㖠宔㘧ⲭ潍㙗㻕橻碇榎⥺䧿ⶖⴅ㗜叚㫸Ⱞ婣㍶粭畓⋖ዬ䳼槜榞ᵶⶽᰕ㘹伆⬹㉦爴擫ᕗ⌵哻瓒殒笟⸅䯞嚰ⷍ㉃げ⯭೻熳憍役干⺖㜇涙家㍈寀㏉⁤្玫罧ຉ㛼ᓃ宎潀渄◝ᚆ⻴岠抡䲘⫘⛡㮌ᨸ⼽宎監๼䩓吪⦯ƽ⒆撍湫媵皒㻿㗡算媡ঝ䐀త墣妧⠀灮䁣殆塌⥹⁏コ溼冐㮨ᐤ₀ᙕ⏤唡ࣩ⿖ឌྋ⏚浮◆ᷤ䷈瘣愳ᴧ㭩੄⎎硁债刾曓ޜ䫯丙ࢴ皍楡宴≮檽殺㦂બ屽ᑙ枓绌ᶦ㯾㒕䚝厓⿌⫂ᴼ‸朊缿冮រ仵ⶏᭅ㚅滀㟒ᡈɽ䩛ᅡ䟉໺㘭ࣣ⻭涢ႜ砉沵塝⧎烅瞬ᶖ㸥㗻姮㞅䬂─⩶砕漆墓㸠Ӥⷻ᎖㯓᷻毕缻㧜⣈৒❼㍛抔㤹ީ䎕筗㲎┧篓瞋㖙箐管癇ࠛ媔ýڤㅣᮗࠡ揼潦䎵┎䢰笺㟀ᆛ屗傾惰⏤唗稌✫⸥䄷⤺㷤篎ᥫ澷幏㾎揵䥻欗爏叼⑆⾉弅㸗ʅ矚⪶೽嵾毝嶛珶ฏ乌䵬憥弐緆懓ဠr岂俟嶰第�沲㣐灵䆿㢹ઝ懤䛡⹐ᴠ濑圣䏀撁㴷㧐ƴ䂇䛾஝毛玨Ⲡ㟿⿐䷫杁唫篷矁爴憀៞筩∛ಡ䠏滥῟㮗㥇綷學娑�ۗ㉩䀝䗓坑㰌㈦䧧汵缉䂗篚熠 Ꭰ烮᪹㰠㦊宇焢戬䄄ǿᑐޭȗ溝ɟ㱡ണ䘧砮䠼䷳㮱ఽ0ሟ㴢ⶏ䄶ᰄඡ盨ఛ簮Ã䡙噛瞦䈏䉇勏ᗹ檐㡌椵ả䐧擄倽怡䂙ᐷ㓋敐ड़ྫᬰ䀡乢ᛴ漆椮摂䵡Ꭿ愗ȑ偆ވ瀴Ὂɰ篙፣沧ó㍃乊U禞䙁䐐Ϣ䅉ď卼୛๐⺦᥉☽ؾᒧ纬᳠㼇ℝ睠溧嫠तඁ⮧Ბ槰哀檇焉䅉ཁ݂ໜ☤㳦䧰㱃矽煙ᤔ扝俞䎾㼆ປⳣ䁕ǐࠂ।ឝ،ᠠ嵋侧⥂瘮橍劜₧墥㐒剈级Ḿ䱧㴥玣䀖咑圳ሓ䠼䞭昒ὤ䂄⵱秡ⵧ∜派砯丯⢵í⏇璌Ěᷴ㾠ñ檐⹧䕅䴾ᑥ㒐ᤏ创⎹䞗嶍恍嘈盎氖䐠⾽㮺噘ጵㆵሟ࡯烬ຑ⃬坠ₑ粊ᫎ໤客漉Ꭳ备瑋檈满槮᷿攠I刃妄૑伿υ#䜸ピ㢶繿༄呸㰑ց绖આ栗柑䈤䘩帽搢悂ӟဒ䣢㢥Bsɇ绨怒岦㘫䤙摒䂖㒩恜䀢䉤簽d㱇Ѯᶫ〢⊙થਝ䉌礒䁑ᶂ䀂Ω洼े䞨಼Ⅰ\"░䫩捼㥇㑮咼怤抙嶿䐬䪖➩䥹ᱢ䀠J熬⧧Ᏽ㳈佉᳠ۄ矩穦ࠠ९঱䕚羭澛伒䐡䑩ᠡ⊊㱬䁑ᕳ制┗獛橀᪘䜻椩砷¥短ᰡ෶洁戚῱ឮ忸姹䒨ٌ⻩ႇ时䅗淚㪖॔ᓳ桦睮㺿㿺窑甛⤫ⴢ笢䶠硈䌬焉洊ޝ刱扬໅䚐⾓☲吮拁∛Ꮶ峰ܠघ⠆琀䨾ׇ礭㔰㺠⡤ᣎᧂ惒წ疹橘灰Ꮐ㉱ᣦݮ䬦扂0壒劻Ἒ㭧ૹ瞒⮇ՅᣨՒ垣洙৭ග⃾奃ሕᡴ矹毠䪣㵉㣫尴垥䊉搴珊㗦ື戯ᮼ約ኹۘ䩨握怦⠣ԁᘪ塡朦ƧᲲԼ羹翊ଇᤰாስ云㴒䳆䱰僉仳ṥ⠗ళඓ䭤㳮簌⭞暘๚姦〹ᒢóἧ⠜笜ᅴᒸ໥䈠哢㺞㎬.玺ࢭᨌီ摅ॡྒྷ摼੡ᦽ㽙㷮納൘௧䓸⹠庡㷼渥戫喬柮婢彝呩䌇ǬHᝐ⿼珡㡜瞚ᦎ⨷䫮㦼罘⪘⌇װ䰭ᡵࠠƳ㣝㣫挄久㱎ₜᆰ庸㪴ఈ 㫁妘恒⠤弎′焪ྫ䃆╏綱әগ後☄䰉ᜪ乴弧␂焪 ྡ䯷౦⼤屠ز烥纠ㅨ煎〡ⓝ玭㈪ৠᑳ៛䥬帹㥒皅拫梷歎婿泛劖漸旫䰝堦【廪个盹翫䪸愈慿櫢ত㬶⪆ⱸ堁『恅㪛༥䕋澤┊㋚檕橻ᗸӬ地傈ːČ⑵楋琐勏㮲䫘⣨ⓕ䔌哭条瘡揵㽛䫚ɫ䮀ⵡ⢾㢢传ԩ嘞䘺埬獰ာ㌡ࢉ潟÷ᛠ䍼䧢㖕Ⴕ嘜ᨮ垳息爀␺社樟⣷ϸٕ䌡疐ᓽ㗿⮩垝⻆巕㶺燘ˌᛷⷯ柰竞ᕎ᪇峠楶⥸偿䞙␿✇ᰎ䓀圯憾掱左⬕Ջ氇垄窾巿擯໸㙴忷䮪暓䮧䚓रพ汲甅瞁⼎㒦焀囖┌欯獣ܡ漤欑෬䯔㓐湂狮ᆄԭ煵噀暵嬯Ṿ඙歿ค㊉呤滦ぃ㳪维Ի彷㒏ᙽ宴䘢䞵搨⁠歒༓ẑゔʠ䤒H劏ӿ؄♧朜䷶Ḩ⡸䆍䆉ةᇸ䱻戤ᰪ䇐ↂ代✂䡊ᰊ㞛眹庐چ煨ᖻ皉⴮穢㧙㈭朄刄傉㝭䢐ᜧ♖煍笄䶨ဨ䳅侦᎖⭺渉碁䒒⮉嶎㿆粥槖ᩗ畹Ꮘ┣Ḷ沵Ჰ梍➨ࢍ嵛㱏㐽燻傑㼑䍪⡞䕒ᬩ塋ᙋ౎滳Ǜ㯿㝻ᢻ㔌ྎ䂿喇╣帰淶X矀㸀將㣅ማ-泉ⲩ俍⢁⋭ງ拏痊䒿ᛅ漋រ稁涁ἤ籡㭰尓㞛㪽ᨕご᝵伓Ἴ䀶└⤓䨇掰Უ㬢ᳪᐣⱅ䮮⃂䀠h‡⏮倭䡒⤹ᒈࣾ劏甎狞ᗛ䆠捙伮ཏ戫弒燯㰆៿倛怜䄴�碛兓䡮梡沣ⲗ\"㷴簄ᝓ瀇幏㹾爇ᖛ䈗⼏洩㿚澘䄛塔㰃㍾爑 穞瓥紫溇㵀Ͼ⿜ᕒἜ緸箧瞥䚿帏妞烝戛簗岙ῼథĐ↤Ϯ೟篸ẫ䝺ℎ硣瑰㗄漏恝篚䄞㼐㷰珸࿷渼廿㡡礝瓄㠧㰎珽傚⾐㐣緺ᩔРῨ㴟㵁炉ᄣ磬屸㚗妃ě漅䗹篻矔Ἧ῰絊੝缛䬯樏֮忟ℝ戓Џࠑྰ憐㴎ҦɃ綶ㄯ␜㩞ᠧᄙળ秵޳僰ἰ忨礼烣楧礗␿ⱜ灝№缓⏥湌ဃᠤ㲏㿱皃箛慢௏ⳌᎵ伯ㆺ瘐偫࿲Ὲ㻨禡羃照簯政乞咘焞爅㸖䟌繦ƨḤ翻ೈର⌠旈ʺ犟攛岎䇳緔㑥ῶᥚ㲹ų殊ᙌ兡ະ檝媗百各横ₙὊ㽈㭉癭ؠ୯䚿祪窛㔜⨖⤾续渉䜘ᶔ篶䕤Ŏ໖短ম഻ഘ羐㎬䨼ʻ㱫䖆ᶕÅ䗟⠌亾䭞碞洐↻㏢疜㔗⎛䙎兙翹ả琶掿㝧碃ᴜ㩉ࣵ䕛捁⍨ၼ碹瀴桅㞪ᙧ佞⡁ڙഎN篨ÿྗᡦ㮬瀫矸伛㞾ᚲ፟紟ἰఈᯩ䡀席Ƣ碮癎漝牏㮎䮊俿⌓娐宬䩌⿐忡㴘卥火攷澬笹妱㔦挛洜䰖偊⿏ᾖ㶳⑈Ⅻ溷摬᩿ᓜ䦘丰ᐪ䰃厙笼庑㴢熲䗫澷浴汾瘻絝ਭ穴⠥⑯⠂彅㽪碥烫犇噤奾ᐿ料垒嘊Ⰷ㥏磿䀩vˤࠫ珐ⓜ㸏煒⤧标嘀毱堞⽮岄劺緵秠ί的䍾㗪䏛ᬟ㘂氓堍⿎弝洊祛㋨匇悗⽿㮲涝翕㜇氐⛖垁瀥ᬦ缭缭቗絏屾棳⎞ᒻ⍶ᰅ㋡穩廾灦羍ṏ౗犏䖭䉅⎝朙丟ڡ㠘漢弳㴶祭畢㡚ڏ⫿䉆㶛嬕ݠ怴␾媯ᾗᢆ罾䋻篐९倡绝几眒氫將栔潥彛㼸֍瞟͗䴨㷖䮽哢伕,戉⟥⿾䢫㽮禕磻涗䎏ə䗟㶝㬓币⯢㟒㓕帪㼊㳍筳瑗式絩஼ᯛ伔⸊篵埨癖式㶀䋔㔾稗睹೿㍠枙弒ᬳ篬づ濝彁䀖積瘛綗眏偞寝囩羦條寱㠃䔶⟦㽎砭磻縯坞硌᧞儞疱癞ᒛ堉ℽ䗐绿ᨋ⦋愗福㊈Ҟ焛僜ᴼ䠃埫⾉䣹㺐㟃牧竷婔♾䘂妘ሪ伢ਮ碕堢䷘糵⍍糧沯搉繟䇱礜⺺㑻泧㆜启开ᣩ⚳篙ᩯ畔⠡㪲嘀挝ɹ塒便㫫⬶㸾粹燇敯䷼硾纪䡠ᨚₖ㈦倍竊㻋溰䓓碇景䰮㥞㚝㔚ⶕ͢栓侩慁䄽ᎊȁࠡ焝➿೨㺟洙瘃኿栗俻炯ॢ綊Ы痧抰㔼圸㯡挚㈘縍ഢ〝侩䥲缜盒䢘ରᅝ㕟煓憡昕䟈៣⌹ᐥ㾒紀仫繷歏簰䋞㲟姴嘘㐿䠂࿽὏戺紑笡ᛷ燊⤚泞告�嶘犧堜灺ޠ㺰綕ᐻ瘠ᖣ䡤營䗼ଜ☟Ⰶ堂⾡Ῡ㻩勭筫癎孏屿櫞瀡价ᳪ⣾㠖瀞䳅ಶ绩筦䁷焏䀦篏妟伛㮿琉浖⮮拗㼒录絃祓爏媗巨澝ⶇ䊟㴗㧖g杶᤭⍪㷨禅粓座̡㚠粦㥢瘭ᨓ߄俇亐!㰿⠗砫啤㿞㾞敫␓唷洰ᾫ烨⽡纺䂧甌ਿ羰ᢟफ़⟙㤙ᨓဃᏀ᠛どῃ糽坯欿䁟盰㤝檇爠崀倐⚇〥佑ˣ罇烉熿捇撟㔝⨜⊚᠊͋ᾰ㼼翳ȳ缇粶ᒿ厯纟焝樜␟˥⿪Άࢣ爉翊㭑׏榿䭂䂞ᒿț搝᠆䑌怂㿩ゕ∓繡皭ཿ䛴稑䖽嗀㰝堟㛶媇䀚縡戻笄盯缿䳟⺞᜝㈠Ⱈ䈉《檗䀖繷想细䁞ǿ䪇ᢎ撡渚䱩᠄瀗≮㾰缜䉻縇癯替奔昑犢嘟ᾋ倆C怆挑绣簪㑏獯煟凟岞簎縛ᰟ砝 㿋㽹繉绤ᕏ焿罟䒊ଟ䘟ᎃԖ甈㗱㿸習匢䀗禄‗惿䭟欞㼞丟А瀚ဓ㿥㿹罆㲯窩ٟ烓䶣㼟Ⱍ琘氛瀝䴶翂罎羇㹎⓿灟狟䓟⨞匜君簖倚࿰㾵တ繷线紏矠攟够἞⨱䊜–縓ⅇ羯㽮े羛穿秞㭿礳穗秿秣稪笟篶Ⅰױ礸ɷ穚㊟箯窛砠Ӫ㤠ޱ㢠׫祗窇穏竗碤ᩀߏ箿㈤穧秷㨫ট祰㫲≓ीࠟ穖Ň竷磯箻禠я笧祏竏檰аѦ剰ԏ穯檰ְӧ㬮䉰հܵ䋰א秷端磿碳祐߿磩
ߐݿ椐֐߃⊗ᨯ窏堯ᮐȨܕ䌨Ԁ㪨ѐ߯简ݐ܀؜⋈݈ޟ夸ߟ穈Ձ㏠܎㋯ᧈ߈ݽ䊈۹Έׯ硨؈ը׃⍸п竨ݫ媸ָ޽⁧礯窎欘ޏ穯䏸ࠁϰ՘҇穻×硊㨤ܸۄ慽∘٣䏤؇笐Ԡ砽⅄Ҙܤѿ筇笠߷箨߫穨Ѡ׃⃤ֿ神㏄ܰګነG禗橴ӧ窄ؠބ߀܄ڠ܈٤Ԁъ㫱⁇秛棴фڰ厔݄࠘ԋ穀�ַ箿篴װտ祔ڀֿ筻砸ث扦Ƌ筟篃揬֧磯ၰ㣄ࠕ禸䃐㫸ع䂤ߓ硬֨ݔԓ竔ࠈъ㦌ژא㧌ш֌ߌܤ穀ͼ؟礨քެԄмլޠҧ秃⏼ܷ懌ָ܈㪺䃼݇娜߆Όأ䌌٘؄ӟØشֳ™ӱɌХ䋢и̜ד㩈㬢Т߬牂ֿ箃祜Ҩ֤Ѣݬդߣ窂ߢԉ⃂ԋ㧢ָ֨㧈Ьۛ笙≨㢢֛竀є֣礈Լ׿㧔ߣ祲ۤ֫史ш֒ٸ۪䰒ђӀܻ筜ٔۜЧ砲Ғڵ篲Ҳҭ䄪шݒ㯂ؿ兊ќ҈քܼ䎢ؼѤߒҼߣ竊ٜ›Ӓ㠪ڎ楊ܪӰҊ޿㦊לдҜֳ↺޼׉䁚ࠍ䂪㭊ڕ勚׊׸ٺۿ㭺٪ۺӐТ䂚ٜΩڪ㢺جۚ޺߀Ň窊؂ފրֳܼۘ⁦ٚҭ䍆ݔ䁓掐䌐䐐䆆ű䉏䇼损Žϟǜ䎩䁮ȼ䄁0䍸䁓捸ؽ㥒�ኻጪɖ嫡㤆琋掗LJŵ�ϫσćȡƚŤďŚ熝¡ʔኚ憉˘ᬃ磨ͰɍĴƚς僿⋙ƨ㰃²㠰̲ϡ憀ƶضqȰ䍨ͰÎࠑ<䁈秠̨Ø䇷�ؽ㪬Ѐ̎ڙ™㣣ላ扖揽䇆㭊Č抈Ô㯃㦈܃恠䈆Ӌɀ䁈Ȍ㮟ͦ䉱ϟĞ֎֙ɦ⎑关怴㦸䊨ه折ňɾچʄ㪾ـHƎހȘǡࠎҴ䉁߲ʘ̴ρٸࣾܟǃ䀠䉞ڪ͞լ㫞јߞ؞Ѥ䌝ȡܞ՞䍀䇱ܡג̒䅿Ћ恡ږጿ̝ᅃၶ԰䏀΁Ϯڐ㩎ހȤŎѾׄ䌖h䃁ԎѩՀư̠䋬䂭䊥X䌖ȴϤ䊘ͰƩӉޮÁؤΉҟωݨň²㣩ߍ̖̀ȹހ̴²㫡۩ـ̰ljژǁ׹љӁ׉䆛Љٙٶ݉φɭ^˅炟Œ̴簙аうʥ䊎ƃ≙Ւï¸寯Ϗ䋣ơ愠  "}
      

    The complete round-trip took 45.8 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-file-analysis)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-analysis.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-file-analysis'
      • id string [optional] You may pass an id to link requests with responses (they get the same id).
      • filetoken string [optional] A unique token to identify the file for subsequent requests. Only use this if you plan to send more queries!
      • filename string [optional] A human-readable name of the file, only for debugging purposes.
      • content string [optional] The content of the file or an R expression (either give this or the filepath).
      • filepath alternatives [optional] The path to the file(s) on the local machine (either give this or the content).
        • . string
        • . array Valid item types:
          • . string
      • cfg boolean [optional] If you want to extract the control flow information of the file.
      • format string [optional] The format of the results, if missing we assume json. Allows only the values: 'json', 'n-quads', 'compact'
    Message schema (response-file-analysis)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-analysis.ts.

    • . alternatives [required] The response to a file analysis request (based on the format field).
      • . object The response in JSON format.
        • type string [required] The type of the message. Allows only the values: 'response-file-analysis'
        • id string [optional] The id of the message, if you passed one in the request.
        • format string [required] The format of the results in json format. Allows only the values: 'json'
        • results object [required] The results of the analysis (one field per step).
        • cfg object [optional] The control flow information of the file, only present if requested.
      • . object The response as n-quads.
        • type string [required] The type of the message. Allows only the values: 'response-file-analysis'
        • id string [optional] The id of the message, if you passed one in the request.
        • format string [required] The format of the results in n-quads format. Allows only the values: 'n-quads'
        • results object [required] The results of the analysis (one field per step). Quads are presented as string.
        • cfg string [optional] The control flow information of the file, only present if requested.
      • . object
        • type string [required] The type of the message. Allows only the values: 'response-file-analysis'
        • id string [optional] The id of the message, if you passed one in the request.
        • format string [required] The format of the results in bson format. Allows only the values: 'bson'
        • results string [required] The results of the analysis (one field per step).
        • cfg string [optional] The control flow information of the file, only present if requested.

  • Slice Message (request-slice)
    View Details. (deprecated) The server slices a file based on the given criteria.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-slice
    
        alt
            Server-->>Client: response-slice
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    We deprecated the slice request in favor of the static-slice Query.

    To slice, you have to send a file analysis request first. The filetoken you assign is of use here as you can re-use it to repeatedly slice the same file. Besides that, you only need to add an array of slicing criteria, using one of the formats described on the terminology wiki page (however, instead of using ;, you can simply pass separate array elements). See the implementation of the request-slice message for more information.

    Additionally, you may pass "noMagicComments": true to disable the automatic selection of elements based on magic comments (see below).

    Example of the request-slice Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.4.0",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details

      Let's assume you want to slice the following script:

      x <- 1
      x + 1

      For this we first request the analysis, using a filetoken of x to slice the file in the next request.

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. response-file-analysis (response)
      Show Details

      See above for the general structure of the response.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":7}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11054-6YtDAIKhH5r0-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11054-6YtDAIKhH5r0-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-11054-6YtDAIKhH5r0-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11054-6YtDAIKhH5r0-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11054-6YtDAIKhH5r0-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-11054-6YtDAIKhH5r0-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11054-6YtDAIKhH5r0-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":131,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11054-6YtDAIKhH5r0-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. request-slice (request)
      Show Details

      Of course, the second slice criterion 2:1 is redundant for the input, as they refer to the same variable. It is only for demonstration purposes.

      {
        "type": "request-slice",
        "id": "2",
        "filetoken": "x",
        "criterion": [
          "2@x",
          "2:1"
        ]
      }
    5. response-slice (response)
      Show Details

      The results field of the response contains two keys of importance:

      • slice: which contains the result of the slicing (e.g., the ids included in the slice in result).
      • reconstruct: contains the reconstructed code, as well as additional meta information. The automatically selected lines correspond to additional filters (e.g., magic comments) which force the unconditiojnal inclusion of certain elements.
      {
        "type": "response-slice",
        "id": "2",
        "results": {
          "slice": {
            "timesHitThreshold": 0,
            "result": [
              3,
              0,
              1,
              2,
              "built-in:<-"
            ],
            "decodedCriteria": [
              {
                "criterion": "2@x",
                "id": 3
              },
              {
                "criterion": "2:1",
                "id": 3
              }
            ],
            ".meta": {
              "timing": 2
            }
          },
          "reconstruct": {
            "code": "x <- 1\nx",
            "linesWithAutoSelected": 0,
            ".meta": {
              "timing": 1
            }
          }
        }
      }

    The complete round-trip took 14.1 ms (including time required to validate the messages, start, and stop the internal mock server).

    The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the filetoken is unknown, flowR will respond with an error.

     

    Magic Comments

    Within a document that is to be sliced, you can use magic comments to influence the slicing process:

    • # flowr@include_next_line will cause the next line to be included, independent of if it is important for the slice.
    • # flowr@include_this_line will cause the current line to be included, independent of if it is important for the slice.
    • # flowr@include_start and # flowr@include_end will cause the lines between them to be included, independent of if they are important for the slice. These magic comments can be nested but should appear on a separate line.

    Message schema (request-slice)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-slice.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-slice'
      • id string [optional] The id of the message, if you passed one in the request.
      • filetoken string [required] The filetoken of the file to slice must be the same as with the analysis request.
      • criterion array [required] The slicing criteria to use. Valid item types:
        • . string
    Message schema (response-slice)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-slice.ts.

    • . object The response to a slice request.
      • type string [required] The type of the message. Allows only the values: 'response-slice'
      • id string [optional] The id of the message, if you passed one in the request.
      • results object [required] The results of the slice (one field per step slicing step).

  • REPL Message (request-repl-execution)
    View Details. Access the read evaluate print loop of flowR.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-repl-execution
    
        alt
            Server-->>Client: error
        else
    
        loop
            Server-->>Client: response-repl-execution
        end
            Server-->>Client: end-repl-execution
    
        end
    
        deactivate  Server
    	
    
    Loading

    [!WARNING] To execute arbitrary R commands with a request, the server has to be started explicitly with --r-session-access. Please be aware that this introduces a security risk.

    The REPL execution message allows to send a REPL command to receive its output. For more on the REPL, see the introduction, or the description below. You only have to pass the command you want to execute in the expression field. Furthermore, you can set the ansi field to true if you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of the id field to link answers with requests as you can theoretically request the execution of multiple scripts at the same time, which then happens in parallel.

    [!WARNING] There is currently no automatic sandboxing or safeguarding against such requests. They simply execute the respective R code on your machine. Please be very careful (and do not use --r-session-access if you are unsure).

    The answer on such a request is different from the other messages as the response-repl-execution message may be sent multiple times. This allows to better handle requests that require more time but already output intermediate results. You can detect the end of the execution by receiving the end-repl-execution message.

    The semantics of the error message are similar to that of the other messages.

    Example of the request-slice Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.4.0",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-repl-execution (request)
      Show Details
      {
        "type": "request-repl-execution",
        "id": "1",
        "expression": ":help"
      }
    3. response-repl-execution (response)
      Show Details

      The stream field (either stdout or stderr) informs you of the output's origin: either the standard output or the standard error channel. After this message follows the end marker.

      Pretty-Printed Result
      If enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:
      R> 1 + 1
      [1] 2
      
      Besides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. 
      There are the following basic commands:
        :controlflow[*]     Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)
        :controlflowbb[*]   Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)
        :dataflow[*]        Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)
        :dataflowsimple[*]  Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)
        :execute            Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)
        :help               Show help information (aliases: :h, :?)
        :lineage            Get the lineage of an R object (alias: :lin)
        :normalize[*]       Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)
        :parse              Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)
        :query[*]           Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)
        :quit               End the repl (aliases: :q, :exit)
        :version            Prints the version of flowR as well as the current version of R
      
      Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.
        :benchmark          Benchmark the static backwards slicer
        :export-quads       Export quads of the normalized AST of a given R code file
        :slicer             Static backwards executable slicer for R
        :stats              Generate usage Statistics for R scripts
        :summarizer         Summarize the results of the benchmark
      
      You can combine commands by separating them with a semicolon ;.
      
      {
        "type": "response-repl-execution",
        "id": "1",
        "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n  :controlflow[*]     Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n  :controlflowbb[*]   Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n  :dataflow[*]        Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n  :dataflowsimple[*]  Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)\n  :execute            Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n  :help               Show help information (aliases: :h, :?)\n  :lineage            Get the lineage of an R object (alias: :lin)\n  :normalize[*]       Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)\n  :parse              Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)\n  :query[*]           Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)\n  :quit               End the repl (aliases: :q, :exit)\n  :version            Prints the version of flowR as well as the current version of R\n\nFurthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.\n  :benchmark          Benchmark the static backwards slicer\n  :export-quads       Export quads of the normalized AST of a given R code file\n  :slicer             Static backwards executable slicer for R\n  :stats              Generate usage Statistics for R scripts\n  :summarizer         Summarize the results of the benchmark\n\nYou can combine commands by separating them with a semicolon ;.\n",
        "stream": "stdout"
      }
    4. end-repl-execution (response)
      Show Details
      {
        "type": "end-repl-execution",
        "id": "1"
      }

    The complete round-trip took 1.4 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-repl-execution)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-repl.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-repl-execution'
      • id string [optional] The id of the message, will be the same for the request.
      • ansi boolean [optional] Should ansi formatting be enabled for the response? Is false by default.
      • expression string [required] The expression to execute.
    Message schema (response-repl-execution)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-repl.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'response-repl-execution'
      • id string [optional] The id of the message, will be the same for the request.
      • stream string [required] The stream the message is from. Allows only the values: 'stdout', 'stderr'
      • result string [required] The output of the execution.
    Message schema (end-repl-execution)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-repl.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'end-repl-execution'
      • id string [optional] The id of the message, will be the same for the request.

  • Query Message (request-query)
    View Details. Query an analysis result for specific information.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-query
    
        alt
            Server-->>Client: response-query
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    To send queries, you have to send an analysis request first. The filetoken you assign is of use here as you can re-use it to repeatedly query the same file. This message provides direct access to flowR's Query API. Please consult the Query API documentation for more information.

    Example of the request-query Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.4.0",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details

      Let's assume you want to query the following script:

      library(ggplot)
      library(dplyr)
      library(readr)
      
      # read data with read_csv
      data <- read_csv('data.csv')
      data2 <- read_csv('data2.csv')
      
      m <- mean(data$x) 
      print(m)
      
      data %>%
      	ggplot(aes(x = x, y = y)) +
      	geom_point()
      	
      plot(data2$x, data2$y)
      points(data2$x, data2$y)
      	
      print(mean(data2$k))

      .

      For this we first request the analysis, using a dummy filetoken of x to slice the file in the next request.

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "library(ggplot)\nlibrary(dplyr)\nlibrary(readr)\n\n# read data with read_csv\ndata <- read_csv('data.csv')\ndata2 <- read_csv('data2.csv')\n\nm <- mean(data$x) \nprint(m)\n\ndata %>%\n\tggplot(aes(x = x, y = y)) +\n\tgeom_point()\n\t\nplot(data2$x, data2$y)\npoints(data2$x, data2$y)\n\t\nprint(mean(data2$k))"
      }
    3. response-file-analysis (response)
      Show Details

      See above for the general structure of the response.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,15,10,0,\"expr\",false,\"library(ggplot)\"],[1,1,1,7,1,3,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[1,1,1,7,3,10,\"expr\",false,\"library\"],[1,8,1,8,2,10,\"'('\",true,\"(\"],[1,9,1,14,4,6,\"SYMBOL\",true,\"ggplot\"],[1,9,1,14,6,10,\"expr\",false,\"ggplot\"],[1,15,1,15,5,10,\"')'\",true,\")\"],[2,1,2,14,23,0,\"expr\",false,\"library(dplyr)\"],[2,1,2,7,14,16,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[2,1,2,7,16,23,\"expr\",false,\"library\"],[2,8,2,8,15,23,\"'('\",true,\"(\"],[2,9,2,13,17,19,\"SYMBOL\",true,\"dplyr\"],[2,9,2,13,19,23,\"expr\",false,\"dplyr\"],[2,14,2,14,18,23,\"')'\",true,\")\"],[3,1,3,14,36,0,\"expr\",false,\"library(readr)\"],[3,1,3,7,27,29,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[3,1,3,7,29,36,\"expr\",false,\"library\"],[3,8,3,8,28,36,\"'('\",true,\"(\"],[3,9,3,13,30,32,\"SYMBOL\",true,\"readr\"],[3,9,3,13,32,36,\"expr\",false,\"readr\"],[3,14,3,14,31,36,\"')'\",true,\")\"],[5,1,5,25,42,-59,\"COMMENT\",true,\"# read data with read_csv\"],[6,1,6,28,59,0,\"expr\",false,\"data <- read_csv('data.csv')\"],[6,1,6,4,45,47,\"SYMBOL\",true,\"data\"],[6,1,6,4,47,59,\"expr\",false,\"data\"],[6,6,6,7,46,59,\"LEFT_ASSIGN\",true,\"<-\"],[6,9,6,28,57,59,\"expr\",false,\"read_csv('data.csv')\"],[6,9,6,16,48,50,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[6,9,6,16,50,57,\"expr\",false,\"read_csv\"],[6,17,6,17,49,57,\"'('\",true,\"(\"],[6,18,6,27,51,53,\"STR_CONST\",true,\"'data.csv'\"],[6,18,6,27,53,57,\"expr\",false,\"'data.csv'\"],[6,28,6,28,52,57,\"')'\",true,\")\"],[7,1,7,30,76,0,\"expr\",false,\"data2 <- read_csv('data2.csv')\"],[7,1,7,5,62,64,\"SYMBOL\",true,\"data2\"],[7,1,7,5,64,76,\"expr\",false,\"data2\"],[7,7,7,8,63,76,\"LEFT_ASSIGN\",true,\"<-\"],[7,10,7,30,74,76,\"expr\",false,\"read_csv('data2.csv')\"],[7,10,7,17,65,67,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[7,10,7,17,67,74,\"expr\",false,\"read_csv\"],[7,18,7,18,66,74,\"'('\",true,\"(\"],[7,19,7,29,68,70,\"STR_CONST\",true,\"'data2.csv'\"],[7,19,7,29,70,74,\"expr\",false,\"'data2.csv'\"],[7,30,7,30,69,74,\"')'\",true,\")\"],[9,1,9,17,98,0,\"expr\",false,\"m <- mean(data$x)\"],[9,1,9,1,81,83,\"SYMBOL\",true,\"m\"],[9,1,9,1,83,98,\"expr\",false,\"m\"],[9,3,9,4,82,98,\"LEFT_ASSIGN\",true,\"<-\"],[9,6,9,17,96,98,\"expr\",false,\"mean(data$x)\"],[9,6,9,9,84,86,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[9,6,9,9,86,96,\"expr\",false,\"mean\"],[9,10,9,10,85,96,\"'('\",true,\"(\"],[9,11,9,16,91,96,\"expr\",false,\"data$x\"],[9,11,9,14,87,89,\"SYMBOL\",true,\"data\"],[9,11,9,14,89,91,\"expr\",false,\"data\"],[9,15,9,15,88,91,\"'$'\",true,\"$\"],[9,16,9,16,90,91,\"SYMBOL\",true,\"x\"],[9,17,9,17,92,96,\"')'\",true,\")\"],[10,1,10,8,110,0,\"expr\",false,\"print(m)\"],[10,1,10,5,101,103,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[10,1,10,5,103,110,\"expr\",false,\"print\"],[10,6,10,6,102,110,\"'('\",true,\"(\"],[10,7,10,7,104,106,\"SYMBOL\",true,\"m\"],[10,7,10,7,106,110,\"expr\",false,\"m\"],[10,8,10,8,105,110,\"')'\",true,\")\"],[12,1,14,20,158,0,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y)) +\\n\\tgeom_point()\"],[12,1,13,33,149,158,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y))\"],[12,1,12,4,116,118,\"SYMBOL\",true,\"data\"],[12,1,12,4,118,149,\"expr\",false,\"data\"],[12,6,12,8,117,149,\"SPECIAL\",true,\"%>%\"],[13,9,13,33,147,149,\"expr\",false,\"ggplot(aes(x = x, y = y))\"],[13,9,13,14,120,122,\"SYMBOL_FUNCTION_CALL\",true,\"ggplot\"],[13,9,13,14,122,147,\"expr\",false,\"ggplot\"],[13,15,13,15,121,147,\"'('\",true,\"(\"],[13,16,13,32,142,147,\"expr\",false,\"aes(x = x, y = y)\"],[13,16,13,18,123,125,\"SYMBOL_FUNCTION_CALL\",true,\"aes\"],[13,16,13,18,125,142,\"expr\",false,\"aes\"],[13,19,13,19,124,142,\"'('\",true,\"(\"],[13,20,13,20,126,142,\"SYMBOL_SUB\",true,\"x\"],[13,22,13,22,127,142,\"EQ_SUB\",true,\"=\"],[13,24,13,24,128,130,\"SYMBOL\",true,\"x\"],[13,24,13,24,130,142,\"expr\",false,\"x\"],[13,25,13,25,129,142,\"','\",true,\",\"],[13,27,13,27,134,142,\"SYMBOL_SUB\",true,\"y\"],[13,29,13,29,135,142,\"EQ_SUB\",true,\"=\"],[13,31,13,31,136,138,\"SYMBOL\",true,\"y\"],[13,31,13,31,138,142,\"expr\",false,\"y\"],[13,32,13,32,137,142,\"')'\",true,\")\"],[13,33,13,33,143,147,\"')'\",true,\")\"],[13,35,13,35,148,158,\"'+'\",true,\"+\"],[14,9,14,20,156,158,\"expr\",false,\"geom_point()\"],[14,9,14,18,151,153,\"SYMBOL_FUNCTION_CALL\",true,\"geom_point\"],[14,9,14,18,153,156,\"expr\",false,\"geom_point\"],[14,19,14,19,152,156,\"'('\",true,\"(\"],[14,20,14,20,154,156,\"')'\",true,\")\"],[16,1,16,22,184,0,\"expr\",false,\"plot(data2$x, data2$y)\"],[16,1,16,4,163,165,\"SYMBOL_FUNCTION_CALL\",true,\"plot\"],[16,1,16,4,165,184,\"expr\",false,\"plot\"],[16,5,16,5,164,184,\"'('\",true,\"(\"],[16,6,16,12,170,184,\"expr\",false,\"data2$x\"],[16,6,16,10,166,168,\"SYMBOL\",true,\"data2\"],[16,6,16,10,168,170,\"expr\",false,\"data2\"],[16,11,16,11,167,170,\"'$'\",true,\"$\"],[16,12,16,12,169,170,\"SYMBOL\",true,\"x\"],[16,13,16,13,171,184,\"','\",true,\",\"],[16,15,16,21,179,184,\"expr\",false,\"data2$y\"],[16,15,16,19,175,177,\"SYMBOL\",true,\"data2\"],[16,15,16,19,177,179,\"expr\",false,\"data2\"],[16,20,16,20,176,179,\"'$'\",true,\"$\"],[16,21,16,21,178,179,\"SYMBOL\",true,\"y\"],[16,22,16,22,180,184,\"')'\",true,\")\"],[17,1,17,24,209,0,\"expr\",false,\"points(data2$x, data2$y)\"],[17,1,17,6,188,190,\"SYMBOL_FUNCTION_CALL\",true,\"points\"],[17,1,17,6,190,209,\"expr\",false,\"points\"],[17,7,17,7,189,209,\"'('\",true,\"(\"],[17,8,17,14,195,209,\"expr\",false,\"data2$x\"],[17,8,17,12,191,193,\"SYMBOL\",true,\"data2\"],[17,8,17,12,193,195,\"expr\",false,\"data2\"],[17,13,17,13,192,195,\"'$'\",true,\"$\"],[17,14,17,14,194,195,\"SYMBOL\",true,\"x\"],[17,15,17,15,196,209,\"','\",true,\",\"],[17,17,17,23,204,209,\"expr\",false,\"data2$y\"],[17,17,17,21,200,202,\"SYMBOL\",true,\"data2\"],[17,17,17,21,202,204,\"expr\",false,\"data2\"],[17,22,17,22,201,204,\"'$'\",true,\"$\"],[17,23,17,23,203,204,\"SYMBOL\",true,\"y\"],[17,24,17,24,205,209,\"')'\",true,\")\"],[19,1,19,20,235,0,\"expr\",false,\"print(mean(data2$k))\"],[19,1,19,5,215,217,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[19,1,19,5,217,235,\"expr\",false,\"print\"],[19,6,19,6,216,235,\"'('\",true,\"(\"],[19,7,19,19,230,235,\"expr\",false,\"mean(data2$k)\"],[19,7,19,10,218,220,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[19,7,19,10,220,230,\"expr\",false,\"mean\"],[19,11,19,11,219,230,\"'('\",true,\"(\"],[19,12,19,18,225,230,\"expr\",false,\"data2$k\"],[19,12,19,16,221,223,\"SYMBOL\",true,\"data2\"],[19,12,19,16,223,225,\"expr\",false,\"data2\"],[19,17,19,17,222,225,\"'$'\",true,\"$\"],[19,18,19,18,224,225,\"SYMBOL\",true,\"k\"],[19,19,19,19,226,230,\"')'\",true,\")\"],[19,20,19,20,231,235,\"')'\",true,\")\"]",".meta":{"timing":4}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[1,9,1,14],"lexeme":"ggplot","value":{"type":"RSymbol","location":[1,9,1,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":1,"parent":2,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":0,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[2,1,2,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[2,1,2,7],"content":"library","lexeme":"library","info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":4,"parent":7,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[2,9,2,13],"lexeme":"dplyr","value":{"type":"RSymbol","location":[2,9,2,13],"content":"dplyr","lexeme":"dplyr","info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":5,"parent":6,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[3,1,3,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[3,1,3,7],"content":"library","lexeme":"library","info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":8,"parent":11,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[3,9,3,13],"lexeme":"readr","value":{"type":"RSymbol","location":[3,9,3,13],"content":"readr","lexeme":"readr","info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":9,"parent":10,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":2,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[6,6,6,7],"lhs":{"type":"RSymbol","location":[6,1,6,4],"content":"data","lexeme":"data","info":{"fullRange":[6,1,6,4],"additionalTokens":[],"id":12,"parent":17,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[6,9,6,16],"lexeme":"read_csv","functionName":{"type":"RSymbol","location":[6,9,6,16],"content":"read_csv","lexeme":"read_csv","info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":13,"parent":16,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[6,18,6,27],"lexeme":"'data.csv'","value":{"type":"RString","location":[6,18,6,27],"content":{"str":"data.csv","quotes":"'"},"lexeme":"'data.csv'","info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":14,"parent":15,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[6,1,6,28],"additionalTokens":[{"type":"RComment","location":[5,1,5,25],"content":" read data with read_csv","lexeme":"# read data with read_csv","info":{"fullRange":[6,1,6,28],"additionalTokens":[]}}],"id":17,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":3,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[7,7,7,8],"lhs":{"type":"RSymbol","location":[7,1,7,5],"content":"data2","lexeme":"data2","info":{"fullRange":[7,1,7,5],"additionalTokens":[],"id":18,"parent":23,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[7,10,7,17],"lexeme":"read_csv","functionName":{"type":"RSymbol","location":[7,10,7,17],"content":"read_csv","lexeme":"read_csv","info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":19,"parent":22,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[7,19,7,29],"lexeme":"'data2.csv'","value":{"type":"RString","location":[7,19,7,29],"content":{"str":"data2.csv","quotes":"'"},"lexeme":"'data2.csv'","info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":20,"parent":21,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":4,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[9,3,9,4],"lhs":{"type":"RSymbol","location":[9,1,9,1],"content":"m","lexeme":"m","info":{"fullRange":[9,1,9,1],"additionalTokens":[],"id":24,"parent":32,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[9,6,9,9],"lexeme":"mean","functionName":{"type":"RSymbol","location":[9,6,9,9],"content":"mean","lexeme":"mean","info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":25,"parent":31,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[9,11,9,16],"lexeme":"data$x","value":{"type":"RAccess","location":[9,15,9,15],"lexeme":"$","accessed":{"type":"RSymbol","location":[9,11,9,14],"content":"data","lexeme":"data","info":{"fullRange":[9,11,9,14],"additionalTokens":[],"id":26,"parent":29,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"operator":"$","access":[{"type":"RArgument","location":[9,16,9,16],"lexeme":"x","value":{"type":"RSymbol","location":[9,16,9,16],"content":"x","lexeme":"x","info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":27,"parent":28,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":5,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[10,1,10,5],"lexeme":"print","functionName":{"type":"RSymbol","location":[10,1,10,5],"content":"print","lexeme":"print","info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":33,"parent":36,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[10,7,10,7],"lexeme":"m","value":{"type":"RSymbol","location":[10,7,10,7],"content":"m","lexeme":"m","info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":34,"parent":35,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":6,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[13,35,13,35],"lhs":{"type":"RFunctionCall","named":true,"infixSpecial":true,"lexeme":"data %>%\n\tggplot(aes(x = x, y = y))","location":[12,6,12,8],"functionName":{"type":"RSymbol","location":[12,6,12,8],"lexeme":"%>%","content":"%>%","info":{"id":37,"parent":52,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[12,1,12,4],"value":{"type":"RSymbol","location":[12,1,12,4],"content":"data","lexeme":"data","info":{"fullRange":[12,1,12,4],"additionalTokens":[],"id":38,"parent":39,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,9,13,14],"value":{"type":"RFunctionCall","named":true,"location":[13,9,13,14],"lexeme":"ggplot","functionName":{"type":"RSymbol","location":[13,9,13,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":40,"parent":50,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[13,16,13,32],"lexeme":"aes(x = x, y = y)","value":{"type":"RFunctionCall","named":true,"location":[13,16,13,18],"lexeme":"aes","functionName":{"type":"RSymbol","location":[13,16,13,18],"content":"aes","lexeme":"aes","info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":41,"parent":48,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[13,20,13,20],"lexeme":"x","name":{"type":"RSymbol","location":[13,20,13,20],"content":"x","lexeme":"x","info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":42,"parent":44,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"value":{"type":"RSymbol","location":[13,24,13,24],"content":"x","lexeme":"x","info":{"fullRange":[13,24,13,24],"additionalTokens":[],"id":43,"parent":44,"role":"arg-value","index":1,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,27,13,27],"lexeme":"y","name":{"type":"RSymbol","location":[13,27,13,27],"content":"y","lexeme":"y","info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":45,"parent":47,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"value":{"type":"RSymbol","location":[13,31,13,31],"content":"y","lexeme":"y","info":{"fullRange":[13,31,13,31],"additionalTokens":[],"id":46,"parent":47,"role":"arg-value","index":1,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","role":"binop-lhs"}},"rhs":{"type":"RFunctionCall","named":true,"location":[14,9,14,18],"lexeme":"geom_point","functionName":{"type":"RSymbol","location":[14,9,14,18],"content":"geom_point","lexeme":"geom_point","info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":53,"parent":54,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":7,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[16,1,16,4],"lexeme":"plot","functionName":{"type":"RSymbol","location":[16,1,16,4],"content":"plot","lexeme":"plot","info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":56,"parent":67,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[16,6,16,12],"lexeme":"data2$x","value":{"type":"RAccess","location":[16,11,16,11],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,6,16,10],"content":"data2","lexeme":"data2","info":{"fullRange":[16,6,16,10],"additionalTokens":[],"id":57,"parent":60,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"operator":"$","access":[{"type":"RArgument","location":[16,12,16,12],"lexeme":"x","value":{"type":"RSymbol","location":[16,12,16,12],"content":"x","lexeme":"x","info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":58,"parent":59,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[16,15,16,21],"lexeme":"data2$y","value":{"type":"RAccess","location":[16,20,16,20],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,15,16,19],"content":"data2","lexeme":"data2","info":{"fullRange":[16,15,16,19],"additionalTokens":[],"id":62,"parent":65,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"operator":"$","access":[{"type":"RArgument","location":[16,21,16,21],"lexeme":"y","value":{"type":"RSymbol","location":[16,21,16,21],"content":"y","lexeme":"y","info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":63,"parent":64,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":8,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[17,1,17,6],"lexeme":"points","functionName":{"type":"RSymbol","location":[17,1,17,6],"content":"points","lexeme":"points","info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":68,"parent":79,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[17,8,17,14],"lexeme":"data2$x","value":{"type":"RAccess","location":[17,13,17,13],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,8,17,12],"content":"data2","lexeme":"data2","info":{"fullRange":[17,8,17,12],"additionalTokens":[],"id":69,"parent":72,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"operator":"$","access":[{"type":"RArgument","location":[17,14,17,14],"lexeme":"x","value":{"type":"RSymbol","location":[17,14,17,14],"content":"x","lexeme":"x","info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":70,"parent":71,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[17,17,17,23],"lexeme":"data2$y","value":{"type":"RAccess","location":[17,22,17,22],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,17,17,21],"content":"data2","lexeme":"data2","info":{"fullRange":[17,17,17,21],"additionalTokens":[],"id":74,"parent":77,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"operator":"$","access":[{"type":"RArgument","location":[17,23,17,23],"lexeme":"y","value":{"type":"RSymbol","location":[17,23,17,23],"content":"y","lexeme":"y","info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":75,"parent":76,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":9,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[19,1,19,5],"lexeme":"print","functionName":{"type":"RSymbol","location":[19,1,19,5],"content":"print","lexeme":"print","info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":80,"parent":89,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[19,7,19,19],"lexeme":"mean(data2$k)","value":{"type":"RFunctionCall","named":true,"location":[19,7,19,10],"lexeme":"mean","functionName":{"type":"RSymbol","location":[19,7,19,10],"content":"mean","lexeme":"mean","info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":81,"parent":87,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"arguments":[{"type":"RArgument","location":[19,12,19,18],"lexeme":"data2$k","value":{"type":"RAccess","location":[19,17,19,17],"lexeme":"$","accessed":{"type":"RSymbol","location":[19,12,19,16],"content":"data2","lexeme":"data2","info":{"fullRange":[19,12,19,16],"additionalTokens":[],"id":82,"parent":85,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"operator":"$","access":[{"type":"RArgument","location":[19,18,19,18],"lexeme":"k","value":{"type":"RSymbol","location":[19,18,19,18],"content":"k","lexeme":"k","info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":83,"parent":84,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-11054-g11ddVhjnG3h-.R","role":"root","index":0}},".meta":{"timing":2}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11054-g11ddVhjnG3h-.R"],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":7}}}}
      
    4. request-query (request)
      Show Details
      {
        "type": "request-query",
        "id": "2",
        "filetoken": "x",
        "query": [
          {
            "type": "compound",
            "query": "call-context",
            "commonArguments": {
              "kind": "visualize",
              "subkind": "text",
              "callTargets": "global"
            },
            "arguments": [
              {
                "callName": "^mean$"
              },
              {
                "callName": "^print$",
                "callTargets": "local"
              }
            ]
          }
        ]
      }
    5. response-query (response)
      Show Details
      {
        "type": "response-query",
        "id": "2",
        "results": {
          "call-context": {
            ".meta": {
              "timing": 1
            },
            "kinds": {
              "visualize": {
                "subkinds": {
                  "text": [
                    {
                      "id": 31,
                      "name": "mean",
                      "calls": [
                        "built-in"
                      ]
                    },
                    {
                      "id": 87,
                      "name": "mean",
                      "calls": [
                        "built-in"
                      ]
                    }
                  ]
                }
              }
            }
          },
          ".meta": {
            "timing": 1
          }
        }
      }

    The complete round-trip took 31.2 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-query)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-query.ts.

    • . object Request a query to be run on the file analysis information.
      • type string [required] The type of the message. Allows only the values: 'request-query'
      • id string [optional] If you give the id, the response will be sent to the client with the same id.
      • filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
      • query array [required] The query to run on the file analysis information. Valid item types:
        • . alternatives Any query
          • . alternatives Supported queries
            • . object Call context query used to find calls in the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'call-context'
              • callName string [required] Regex regarding the function name!
              • callNameExact boolean [optional] Should we automatically add the ^ and $ anchors to the regex to make it an exact match?
              • kind string [optional] The kind of the call, this can be used to group calls together (e.g., linking plot to visualize). Defaults to .
              • subkind string [optional] The subkind of the call, this can be used to uniquely identify the respective call type when grouping the output (e.g., the normalized name, linking ggplot to plot). Defaults to .
              • callTargets string [optional] Call targets the function may have. This defaults to any. Request this specifically to gain all call targets we can resolve. Allows only the values: 'global', 'must-include-global', 'local', 'must-include-local', 'any'
              • ignoreParameterValues boolean [optional] Should we ignore default values for parameters in the results?
              • includeAliases boolean [optional] Consider a case like f <- function_of_interest, do you want uses of f to be included in the results?
              • fileFilter object [optional] Filter that, when set, a node's file attribute must match to be considered
                • fileFilter string [required] Regex that a node's file attribute must match to be considered
                • includeUndefinedFiles boolean [optional] If fileFilter is set, but a nodes file attribute is undefined, should we include it in the results? Defaults to true.
              • linkTo alternatives [optional] Links the current call to the last call of the given kind. This way, you can link a call like points to the latest graphics plot etc.
                • . object
                  • type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
                  • callName string [required] Regex regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression.
                  • ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
                  • cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
                  • attachLinkInfo object [optional] Additional information to attach to the link.
                • . array Valid item types:
                  • . object
                    • type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
                    • callName string [required] Regex regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression.
                    • ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
                    • cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
                    • attachLinkInfo object [optional] Additional information to attach to the link.
            • . object The config query retrieves the current configuration of the flowR instance.
              • type string [required] The type of the query. Allows only the values: 'config'
            • . object The control flow query provides the control flow graph of the analysis, optionally simplified.
              • type string [required] The type of the query. Allows only the values: 'control-flow'
              • config object [optional] Optional configuration for the control flow query.
                • simplificationPasses array The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used. Valid item types:
                  • . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
            • . object The dataflow query simply returns the dataflow graph, there is no need to pass it multiple times!
              • type string [required] The type of the query. Allows only the values: 'dataflow'
            • . object The dataflow-lens query returns a simplified view on the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'dataflow-lens'
            • . object The df-shape query retrieves information on the shape of dataframes
              • type string [required] The type of the query. Allows only the values: 'df-shape'
              • criterion string [optional] The slicing criterion of the node to get the dataframe shape for.
            • . object The id map query retrieves the id map from the normalized AST.
              • type string [required] The type of the query. Allows only the values: 'id-map'
            • . object The normalized AST query simply returns the normalized AST, there is no need to pass it multiple times!
              • type string [required] The type of the query. Allows only the values: 'normalized-ast'
            • . object The cluster query calculates and returns all clusters in the dataflow graph.
              • type string [required] The type of the query. Allows only the values: 'dataflow-cluster'
            • . object Slice query used to slice the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'static-slice'
              • criteria array [required] The slicing criteria to use. Valid item types:
                • . string
              • noReconstruction boolean [optional] Do not reconstruct the slice into readable code.
              • noMagicComments boolean [optional] Should the magic comments (force-including lines within the slice) be ignored?
              • direction string [optional] The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
            • . object Lineage query used to find the lineage of a node in the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'lineage'
              • criterion string [required] The slicing criterion of the node to get the lineage of.
            • . object The dependencies query retrieves and returns the set of all dependencies in the dataflow graph, which includes libraries, sourced files, read data, and written data.
              • type string [required] The type of the query. Allows only the values: 'dependencies'
              • ignoreDefaultFunctions boolean [optional] Should the set of functions that are detected by default be ignored/skipped?
              • libraryFunctions array [optional] The set of library functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
              • sourceFunctions array [optional] The set of source functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
              • readFunctions array [optional] The set of data reading functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
              • writeFunctions array [optional] The set of data writing functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
            • . object The location map query retrieves the location of every id in the ast.
              • type string [required] The type of the query. Allows only the values: 'location-map'
              • ids array [optional] Optional list of ids to filter the results by. Valid item types:
                • . string
            • . object The search query searches the normalized AST and dataflow graph for nodes that match the given search query.
              • type string [required] The type of the query. Allows only the values: 'search'
              • search object [required] The search query to execute.
            • . object Happens-Before tracks whether a always happens before b.
              • type string [required] The type of the query. Allows only the values: 'happens-before'
              • a string [required] The first slicing criterion.
              • b string [required] The second slicing criterion.
            • . object The resolve value query used to get definitions of an identifier
              • type string [required] The type of the query. Allows only the values: 'resolve-value'
              • criteria array [required] The slicing criteria to use. Valid item types:
                • . string
            • . object The project query provides information on the analyzed project.
              • type string [required] The type of the query. Allows only the values: 'project'
            • . object The resolve value query used to get definitions of an identifier
              • type string [required] The type of the query. Allows only the values: 'origin'
              • criterion string [required] The slicing criteria to use
            • . object The linter query lints for the given set of rules and returns the result.
              • type string [required] The type of the query. Allows only the values: 'linter'
              • rules array The rules to lint for. If unset, all rules will be included. Valid item types:
                • . string Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'dataframe-access-validation', 'dead-code'
                • . object
                  • name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'dataframe-access-validation', 'dead-code'
                  • config object
          • . alternatives Virtual queries (used for structure)
            • . object Compound query used to combine queries of the same type
              • type string [required] The type of the query. Allows only the values: 'compound'
              • query string [required] The query to run on the file analysis information.
              • commonArguments object [required] Common arguments for all queries.
              • arguments array [required] Arguments for each query. Valid item types:
                • . object
    Message schema (response-query)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-query.ts.

    • . object The response to a query request.
      • type string [required] Allows only the values: 'response-query'
      • id string [optional] The id of the message, will be the same for the request.
      • results object [required] The results of the query.

  • Lineage Message (request-lineage)
    View Details. (deprecated) Obtain the lineage of a given slicing criterion.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-lineage
    
        alt
            Server-->>Client: response-lineage
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    We deprecated the lineage request in favor of the lineage Query.

    In order to retrieve the lineage of an object, you have to send a file analysis request first. The filetoken you assign is of use here as you can re-use it to repeatedly retrieve the lineage of the same file. Besides that, you will need to add a criterion that specifies the object whose lineage you're interested in.

    Example of the request-query Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.4.0",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. response-file-analysis (response)
      Show Details

      See above for the general structure of the response.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":2}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11054-4Nisdlza1RhQ-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11054-4Nisdlza1RhQ-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-11054-4Nisdlza1RhQ-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11054-4Nisdlza1RhQ-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11054-4Nisdlza1RhQ-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-11054-4Nisdlza1RhQ-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11054-4Nisdlza1RhQ-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":256,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11054-4Nisdlza1RhQ-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. request-lineage (request)
      Show Details
      {
        "type": "request-lineage",
        "id": "2",
        "filetoken": "x",
        "criterion": "2@x"
      }
    5. response-lineage (response)
      Show Details

      The response contains the lineage of the desired object in form of an array of IDs (as the representation of a set).

      {
        "type": "response-lineage",
        "id": "2",
        "lineage": [
          3,
          0,
          1,
          2,
          "built-in:<-"
        ]
      }

    The complete round-trip took 6.6 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-lineage)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-lineage.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-lineage'
      • id string [optional] If you give the id, the response will be sent to the client with the same id.
      • filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
      • criterion string [required] The criterion to start the lineage from.
    Message schema (response-lineage)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-lineage.ts.

    • . object
      • type string [required] Allows only the values: 'response-lineage'
      • id string [optional] The id of the message, will be the same for the request.
      • lineage array [required] The lineage of the given criterion. Valid item types:
        • . string

📡 Ways of Connecting

If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.

  1. Using Netcat
    Without Websocket

    Suppose, you want to launch the server using a docker container. Then, start the server by (forwarding the internal default port):

    docker run -p1042:1042 -it --rm eagleoutice/flowr --server

    Now, using a tool like netcat to connect:

    nc 127.0.0.1 1042

    Within the started session, type the following message (as a single line) and press enter to see the response:

    {"type":"request-file-analysis","content":"x <- 1","id":"1"}
  2. Using Python
    Without Websocket

    In Python, a similar process would look like this. After starting the server as with using netcat, you can use the following script to connect:

    import socket
    
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect(('127.0.0.1', 1042))
        print(s.recv(4096))  # for the hello message
    
        s.send(b'{"type":"request-file-analysis","content":"x <- 1","id":"1"}\n')
    
        print(s.recv(65536))  # for the response (please use a more sophisticated mechanism)

💻 Using the REPL

Note

To execute arbitrary R commands with a repl request, flowR has to be started explicitly with --r-session-access. Please be aware that this introduces a security risk and note that this relies on the r-shell engine.

Although primarily meant for users to explore, there is nothing which forbids simply calling flowR as a subprocess to use standard-in, -output, and -error for communication (although you can access the REPL using the server as well, with the REPL Request message).

The read-eval-print loop (REPL) works relatively simple. You can submit an expression (using enter), which is interpreted as an R expression by default but interpreted as a command if it starts with a colon (:). The best command to get started with the REPL is :help. Besides, you can leave the REPL either with the command :quit or by pressing CTRL+C twice.

Available Commands

We currently offer the following commands (this with a [*] suffix are available with and without the star):

Command Description
:quit End the repl (aliases: :q, :exit)
:execute Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r)
:controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)
:controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)
:dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)
:normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)
:dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)
:lineage Get the lineage of an R object (alias: :lin)
:parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)
:version Prints the version of flowR as well as the current version of R
:query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)
:help Show help information (aliases: :h, :?)

Example: Retrieving the Dataflow Graph

To retrieve a URL to the mermaid diagram of the dataflow of a given expression, use :dataflow* (or :dataflow to get the mermaid code in the cli):

$ docker run -it --rm eagleoutice/flowr # or npm run flowr 
flowR repl using flowR v2.4.0, R v4.5.0 (r-shell engine)
R> :dataflow* y <- 1 + x
Output
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgYnVpbHQtaW46Xy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfLSBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAzIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46X1xuICAgIGxpbmtTdHlsZSAyIHN0cm9rZTpncmF5O1xuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCAzXG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDRcbiAgICA0IC0tPnxcImFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=

Retrieve the dataflow graph of the expression y <- 1 + x. It looks like this:

flowchart LR
    1{{"`#91;RNumber#93; 1
      (1)
      *1.6*`"}}
    2(["`#91;RSymbol#93; x
      (2)
      *1.10*`"])
    3[["`#91;RBinaryOp#93; #43;
      (3)
      *1.6-10*
    (1, 2)`"]]
    built-in:_["`Built-In:
#43;`"]
    style built-in:_ stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
    0["`#91;RSymbol#93; y
      (0)
      *1.1*`"]
    4[["`#91;RBinaryOp#93; #60;#45;
      (4)
      *1.1-10*
    (0, 3)`"]]
    built-in:_-["`Built-In:
#60;#45;`"]
    style built-in:_- stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
    3 -->|"reads, argument"| 1
    3 -->|"reads, argument"| 2
    3 -.->|"reads, calls"| built-in:_
    linkStyle 2 stroke:gray;
    0 -->|"defined-by"| 3
    0 -->|"defined-by"| 4
    4 -->|"argument"| 3
    4 -->|"returns, argument"| 0
    4 -.->|"reads, calls"| built-in:_-
    linkStyle 7 stroke:gray;
Loading
R Code of the Dataflow Graph

The analysis required 1.8 ms (including parse and normalize, using the r-shell engine) within the generation environment. We encountered no unknown side effects during the analysis.

y <- 1 + x

For the slicing with :slicer, you have access to the same magic comments as with the slice request.

Example: Interfacing with the File System

Many commands that allow for an R-expression (like :dataflow*) allow for a file as well if the argument starts with file://. If you are working from the root directory of the flowR repository, the following gives you the parsed AST of the example file using the :parse command:

$ docker run -it --rm eagleoutice/flowr # or npm run flowr 
flowR repl using flowR v2.4.0, R v4.5.0 (r-shell engine)
R> :parse file://test/testfiles/example.R
Output
exprlist
├ expr
│ ├ expr
│ │ ╰ SYMBOL "sum" (1:1─3)
│ ├ LEFT_ASSIGN "<-" (1:5─6)
│ ╰ expr
│   ╰ NUM_CONST "0" (1:8)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "product" (2:1─7)
│ ├ LEFT_ASSIGN "<-" (2:9─10)
│ ╰ expr
│   ╰ NUM_CONST "1" (2:12)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "w" (3:1)
│ ├ LEFT_ASSIGN "<-" (3:3─4)
│ ╰ expr
│   ╰ NUM_CONST "7" (3:6)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "N" (4:1)
│ ├ LEFT_ASSIGN "<-" (4:3─4)
│ ╰ expr
│   ╰ NUM_CONST "10" (4:6─7)
├ expr
│ ├ FOR "for" (6:1─3)
│ ├ forcond
│ │ ├ ( "(" (6:5)
│ │ ├ SYMBOL "i" (6:6)
│ │ ├ IN "in" (6:8─9)
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ NUM_CONST "1" (6:11)
│ │ │ ├ : ":" (6:12)
│ │ │ ╰ expr
│ │ │   ├ ( "(" (6:13)
│ │ │   ├ expr
│ │ │   │ ├ expr
│ │ │   │ │ ╰ SYMBOL "N" (6:14)
│ │ │   │ ├ - "-" (6:15)
│ │ │   │ ╰ expr
│ │ │   │   ╰ NUM_CONST "1" (6:16)
│ │ │   ╰ ) ")" (6:17)
│ │ ╰ ) ")" (6:18)
│ ╰ expr
│   ├ { "{" (6:20)
│   ├ expr
│   │ ├ expr
│   │ │ ╰ SYMBOL "sum" (7:3─5)
│   │ ├ LEFT_ASSIGN "<-" (7:7─8)
│   │ ╰ expr
│   │   ├ expr
│   │   │ ├ expr
│   │   │ │ ╰ SYMBOL "sum" (7:10─12)
│   │   │ ├ + "+" (7:14)
│   │   │ ╰ expr
│   │   │   ╰ SYMBOL "i" (7:16)
│   │   ├ + "+" (7:18)
│   │   ╰ expr
│   │     ╰ SYMBOL "w" (7:20)
│   ├ expr
│   │ ├ expr
│   │ │ ╰ SYMBOL "product" (8:3─9)
│   │ ├ LEFT_ASSIGN "<-" (8:11─12)
│   │ ╰ expr
│   │   ├ expr
│   │   │ ╰ SYMBOL "product" (8:14─20)
│   │   ├ * "*" (8:22)
│   │   ╰ expr
│   │     ╰ SYMBOL "i" (8:24)
│   ╰ } "}" (9:1)
├ expr
│ ├ expr
│ │ ╰ SYMBOL_FUNCTION_CALL "cat" (11:1─3)
│ ├ ( "(" (11:4)
│ ├ expr
│ │ ╰ STR_CONST "\"Sum:\"" (11:5─10)
│ ├ , "," (11:11)
│ ├ expr
│ │ ╰ SYMBOL "sum" (11:13─15)
│ ├ , "," (11:16)
│ ├ expr
│ │ ╰ STR_CONST "\"\\n\"" (11:18─21)
│ ╰ ) ")" (11:22)
╰ expr
  ├ expr
  │ ╰ SYMBOL_FUNCTION_CALL "cat" (12:1─3)
  ├ ( "(" (12:4)
  ├ expr
  │ ╰ STR_CONST "\"Product:\"" (12:5─14)
  ├ , "," (12:15)
  ├ expr
  │ ╰ SYMBOL "product" (12:17─23)
  ├ , "," (12:24)
  ├ expr
  │ ╰ STR_CONST "\"\\n\"" (12:26─29)
  ╰ ) ")" (12:30)

Retrieve the parsed AST of the example file.

File Content
sum <- 0
product <- 1
w <- 7
N <- 10

for (i in 1:(N-1)) {
  sum <- sum + i + w
  product <- product * i
}

cat("Sum:", sum, "\n")
cat("Product:", product, "\n")

As flowR directly transforms this AST the output focuses on being human-readable instead of being machine-readable.

⚙️ Configuring FlowR

When running flowR, you may want to specify some behaviors with a dedicated configuration file. By default, flowR looks for a file named flowr.json in the current working directory (or any higher directory). You can also specify a different file with --config-file or pass the configuration inline using --config-json. To inspect the current configuration, you can run flowr with the --verbose flag, or use the config Query. Within the REPL this works by running the following:

:query @config

The following summarizes the configuration options:

  • ignoreSourceCalls: If set to true, flowR will ignore source calls when analyzing the code, i.e., ignoring the inclusion of other files.
  • semantics: allows to configure the way flowR handles R, although we currently only support semantics/environment/overwriteBuiltIns. You may use this to overwrite flowR's handling of built-in function and even completely clear the preset definitions shipped with flowR. See Configure BuiltIn Semantics for more information.
  • solver: allows to configure how flowR resolves variables and their values (currently we support: disabled, alias, builtin), as well as if pointer analysis should be active.
  • engines: allows to configure the engines used by flowR to interact with R code. See the Engines wiki page for more information.
  • defaultEngine: allows to specify the default engine to use for interacting with R code. If not set, an arbitrary engine from the specified list will be used.
  • abstractInterpretation: allows to configure how flowR performs abstract interpretation, although we currently only support data frame shape inference through abstract interpretation.

So you can configure flowR by adding a file like the following:

Example Configuration File
{
  "ignoreSourceCalls": true,
  "semantics": {
    "environment": {
      "overwriteBuiltIns": {
        "definitions": [
          {
            "type": "function",
            "names": [
              "foo"
            ],
            "processor": "builtin:assignment",
            "config": {}
          }
        ]
      }
    }
  },
  "engines": [
    {
      "type": "r-shell"
    }
  ],
  "solver": {
    "variables": "alias",
    "evalStrings": true,
    "pointerTracking": true,
    "resolveSource": {
      "dropPaths": "no",
      "ignoreCapitalization": true,
      "inferWorkingDirectory": "active-script",
      "searchPath": []
    },
    "slicer": {
      "threshold": 50
    }
  },
  "abstractInterpretation": {
    "dataFrame": {
      "maxColNames": 20,
      "wideningThreshold": 4,
      "readLoadedData": {
        "readExternalFiles": true,
        "maxReadLines": 1000000
      }
    }
  }
}
Configure Built-In Semantics

semantics/environment/overwriteBuiltins accepts two keys:

  • loadDefaults (boolean, initially true): If set to true, the default built-in definitions are loaded before applying the custom definitions. Setting this flag to false explicitly disables the loading of the default definitions.

  • definitions (array, initially empty): Allows to overwrite or define new built-in elements. Each object within must have a type which is one of the below. Furthermore, they may define a string array of names which specifies the identifiers to bind the definitions to. You may use assumePrimitive to specify whether flowR should assume that this is a primitive non-library definition (so you probably just do not want to specify the key).

    Type Description Example
    constant Additionally allows for a value this should resolve to. { type: 'constant', names: ['NULL', 'NA'], value: null }
    function Is a rather flexible way to define and bind built-in functions. For the time, we do not have extensive documentation to cover all the cases, so please either consult the sources with the default-builtin-config.ts or open a new issue. { type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }
    replacement A comfortable way to specify replacement functions like $<- or names<-. suffixes describes the... suffixes to attach automatically. { type: 'replacement', suffixes: ['<-', '<<-'], names: ['[', '[['] }
Full Configuration-File Schema
  • . object The configuration file format for flowR.
    • ignoreSourceCalls boolean [optional] Whether source calls should be ignored, causing {@link processSourceCall}'s behavior to be skipped.
    • semantics object Configure language semantics and how flowR handles them.
      • environment object [optional] Semantics regarding how to handle the R environment.
        • overwriteBuiltIns object [optional] Do you want to overwrite (parts) of the builtin definition?
          • loadDefaults boolean [optional] Should the default configuration still be loaded?
          • definitions array [optional] The definitions to load/overwrite. Valid item types:
            • . object
    • engines array The engine or set of engines to use for interacting with R code. An empty array means all available engines will be used. Valid item types:
      • . alternatives
        • . object The configuration for the tree sitter engine.
          • type string [required] Use the tree sitter engine. Allows only the values: 'tree-sitter'
          • wasmPath string [optional] The path to the tree-sitter-r WASM binary to use. If this is undefined, this uses the default path.
          • treeSitterWasmPath string [optional] The path to the tree-sitter WASM binary to use. If this is undefined, this uses the default path.
          • lax boolean [optional] Whether to use the lax parser for parsing R code (allowing for syntax errors). If this is undefined, the strict parser will be used.
        • . object The configuration for the R shell engine.
          • type string [required] Use the R shell engine. Allows only the values: 'r-shell'
          • rPath string [optional] The path to the R executable to use. If this is undefined, this uses the default path.
    • defaultEngine string [optional] The default engine to use for interacting with R code. If this is undefined, an arbitrary engine from the specified list will be used. Allows only the values: 'tree-sitter', 'r-shell'
    • solver object How to resolve constants, constraints, cells, ...
      • variables string How to resolve variables and their values. Allows only the values: 'disabled', 'alias', 'builtin'
      • evalStrings boolean Should we include eval(parse(text="...")) calls in the dataflow graph?
      • pointerTracking alternatives Whether to track pointers in the dataflow graph, if not, the graph will be over-approximated wrt. containers and accesses.
        • . boolean
        • . object
          • maxIndexCount number [required] The maximum number of indices tracked per object with the pointer analysis.
      • resolveSource object [optional] If lax source calls are active, flowR searches for sourced files much more freely, based on the configurations you give it. This option is only in effect if ignoreSourceCalls is set to false.
        • dropPaths string Allow to drop the first or all parts of the sourced path, if it is relative. Allows only the values: 'no', 'once', 'all'
        • ignoreCapitalization boolean Search for filenames matching in the lowercase.
        • inferWorkingDirectory string Try to infer the working directory from the main or any script to analyze. Allows only the values: 'no', 'main-script', 'active-script', 'any-script'
        • searchPath array Additionally search in these paths. Valid item types:
          • . string
        • repeatedSourceLimit number [optional] How often the same file can be sourced within a single run? Please be aware: in case of cyclic sources this may not reach a fixpoint so give this a sensible limit.
        • applyReplacements array Provide name replacements for loaded files Valid item types:
          • . object
      • slicer object [optional] The configuration for the slicer.
        • threshold number [optional] The maximum number of iterations to perform on a single function call during slicing.
    • abstractInterpretation object The configuration options for abstract interpretation.
      • dataFrame object The configuration of the shape inference for data frames.
        • maxColNames number The maximum number of columns names to infer for data frames before over-approximating the column names to top.
        • wideningThreshold number The threshold for the number of visitations of a node at which widening should be performed to ensure the termination of the fixpoint iteration.
        • readLoadedData object Configuration options for reading data frame shapes from loaded external data files, such as CSV files.
          • readExternalFiles boolean Whether data frame shapes should be extracted from loaded external files, such as CSV files.
          • maxReadLines number The maximum number of lines to read when extracting data frame shapes from loaded files, such as CSV files.

⚒️ Writing Code

flowR can be used as a module and offers several main classes and interfaces that are interesting for extension writers (see the Visual Studio Code extension or the core wiki page for more information).

Using the RShell to Interact with R

The RShell class allows interfacing with the R ecosystem installed on the host system. Please have a look at flowR's engines for more information on alterantives (for example, the TreeSitterExecutor).

Important

Each RShell controls a new instance of the R interpreter, make sure to call RShell::close() when you are done.

You can start a new "session" simply by constructing a new object with new RShell().

However, there are several options that may be of interest (e.g., to automatically revive the shell in case of errors or to control the name location of the R process on the system).

With a shell object (let's call it shell), you can execute R code by using RShell::sendCommand, for example shell.sendCommand("1 + 1"). However, this does not return anything, so if you want to collect the output of your command, use RShell::sendCommandWithOutput instead.

Besides that, the command tryToInjectHomeLibPath may be of interest, as it enables all libraries available on the host system.

The Pipeline Executor

Once, in the beginning, flowR was meant to produce a dataflow graph merely to provide program slices. However, with continuous updates, the dataflow graph repeatedly proves to be the more interesting part. With this, we restructured flowR's originally hardcoded pipeline to be far more flexible. Now, it can be theoretically extended or replaced with arbitrary steps, optional steps, and what we call 'decorations' of these steps. In short, if you still "just want to slice" you can do it like this with the PipelineExecutor:

const slicer = new PipelineExecutor(DEFAULT_SLICING_PIPELINE, {
  parser:    new RShell(),
  request:   requestFromInput('x <- 1\nx + 1'),
  criterion: ['2@x']
})
const slice = await slicer.allRemainingSteps()
// console.log(slice.reconstruct.code)
More Information

If you compare this, with what you would have done with the old (and removed) SteppingSlicer, this essentially just requires you to replace the SteppingSlicer with the PipelineExecutor and to pass the DEFAULT_SLICING_PIPELINE as the first argument. The PipelineExecutor...

  1. Provides structures to investigate the results of all intermediate steps
  2. Can be executed step-by-step
  3. Can repeat steps (e.g., to calculate multiple slices on the same input)

See the in-code documentation for more information.

Generate Statistics

Adding a New Feature to Extract

In this example, we construct a new feature to extract, with the name "example". Whenever this name appears, you may substitute this with whatever name fits your feature best (as long as the name is unique).

  1. Create a new file in src/statistics/features/supported
    Create the file example.ts, and add its export to the index.ts file in the same directory (if not done automatically).

  2. Create the basic structure
    To get a better feel of what a feature must have, let's look at the basic structure (of course, due to TypeScript syntax, there are other ways to achieve the same goal):

    const initialExampleInfo = {
        /* whatever start value is good for you */
        someCounter: 0
    }
    
    export type ExampleInfo = Writable<typeof initialExampleInfo>
    
    export const example: Feature<ExampleInfo> = {
     name:        'Example Feature',
     description: 'A longer example description',
    
     process(existing: ExampleInfo, input: FeatureProcessorInput): ExampleInfo {
       /* perform analysis on the input */
       return existing
     },
    
     initialValue: initialExampleInfo
    }

    The initialExampleInfo type holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resulting ExampleInfo type holds the structure of the data that is to be counted. Due to the vast amount of data processed, information like the name and location of a function call is not stored here, but instead written to disk (see below).

    Every new feature must be of the Feature<Info> type, with Info referring to a FeatureInfo (like ExampleInfo in this example). Next to a name and a description, each Feature must provide:

    • a processor that extracts the information from the input, adding it to the existing information.
    • a function returning the initial value of the information (in this case, initialExampleInfo).
  3. Add it to the feature-mapping
    Now, in the feature.ts file in src/statistics/features, add your feature to the ALL_FEATURES object.

Now, we want to extract something. For the example feature created in the previous steps, we choose to count the amount of COMMENT tokens. So we define a corresponding XPath query:

const commentQuery: Query = xpath.parse('//COMMENT')

Within our feature's process function, running the query is as simple as:

const comments = commentQuery.select({ node: input.parsedRAst })

Now we could do a lot of further processing, but for simplicity, we only record every comment found this way:

appendStatisticsFile(example.name, 'comments', comments, input.filepath)

We use example.name to avoid duplication with the name that we’ve assigned to the feature. It corresponds to the name of the folder in the statistics output. 'comments' refers to a freely chosen (but unique) name, that will be used as the name for the output file within the folder. The comments variable holds the result of the query, which is an array of nodes. Finally, we pass the filepath of the file that was analyzed (if known), so that it can be added to the statistics file (as additional information).

Clone this wiki locally