Skip to content

Interface

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

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-09-01, 11:25:58 UTC presenting an overview of flowR's interfaces (v2.4.7, 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.7",
        "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.7",
          "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-9529-xWAuMqlBJRIX-.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-9529-xWAuMqlBJRIX-.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-9529-xWAuMqlBJRIX-.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-9529-xWAuMqlBJRIX-.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-9529-xWAuMqlBJRIX-.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-9529-xWAuMqlBJRIX-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9529-xWAuMqlBJRIX-.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-9529-xWAuMqlBJRIX-.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":5}}}}
      

    The complete round-trip took 18.2 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.7",
          "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-9529-7kM3vOeZhx5T-.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.7%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%2D9529%2D7kM3vOeZhx5T%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%3A200%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A259%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A153%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09"
      }

    The complete round-trip took 8.2 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.7",
          "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":3}},"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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-9529-aVJP2zZHHle8-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-9529-aVJP2zZHHle8-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.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-9529-aVJP2zZHHle8-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-9529-aVJP2zZHHle8-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-9529-aVJP2zZHHle8-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-9529-aVJP2zZHHle8-.R","role":"root","index":0}},".meta":{"timing":0}},"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":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"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":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"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-9529-aVJP2zZHHle8-.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":3}}}}
      

    The complete round-trip took 9.7 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.7",
          "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.0 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.7",
          "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䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ᫰气፾䥓ѣ⤀㐽ᩢɀᐲᲵ䎴䭌ذ綞卒佢ᡨ㄂侶䧴䜉䮂疲䀾䂁拠ᏹ籀ř֟ଜဠᰩ✠ñ╴㠠ໃ䗐搸ᡥ䓅ࠠ撹ᐫ疥τ畻ᯁ桨៉悓ẉ䶐ↁ▫⦎ⵋ㖅▋㹧ʹ⎌浻㮅沛㇏洧ĢᰭՁ䱇ᔀ䋐ⴊ搷ᠼ屠⬎崰ᔵ崥╃⒧㼈㳐؎㵯̃㴏␌糿ࠍ綟䀈Π區෭੬㇣ᰥŕ⪆ᴙՁ厉ፂ䳯Ȱ懴暽匰෦だ݅Ǜ㨣ࢀɫ⊰඲ɠ㴅厽ᭅ䁤㚀憓Ⓚ੷ᨲⴙᦁⳋඃЄㄠ治இ౨瞁▛㘡⏧ፊ䄔椬旗㼷屠Ȉ捓⢺Ꮟ⸏㲿Ⰾ糟ဇ簠倶૷ƈፇ㔅䆱⌆听キ喕☢ͭ₉䱍ᗅ�᷄敀沊琳⏡場㰾̙⪴ౣ㢉සᐷත㫦ᦳ⺶獓Ƌᬰ擎㩘硱䏂瘻⴮愨䪨䩹恛ᩱ䫒戤凈庼⥚奲Ƹ紈巠歵捗ⅻ屚楼㷤敹ኊ䲿Ⰴ却卜嬱ʃ㐸孚ᱏ͎嘢䋢稹୐䱳䈮繑᡾牼啲夷汷ℇ焞槰ظ䴇ᵸ硓㫺冰⬘䱜ᴁ䢰䟤啵ᎊ沰樴獼剥ᧄౌ墅劔洷占Ƴ䔥䦶ì櫞埌䋤昌掼獼䚁猹ឱᓀ⾵㉠የ஢嘢睩䑺Â嘻଑磩椉焾筨穾≹删ޒ槿䮘伀፥炾⩅昄䟄嵷ጺ抲氙圵⋙睻榚惀᪕Ọ̉㾋㬙ℿ⛻࢙篣䜸ᶃ瑐交偑⭅媓᝱嚐坠坹䳇ୄᑁ筹⅜湏䔩㫶⒪眹珰㏁øπǽ䋑䃅᷋᝾ᒴ厠氶䱔᫜劏ᓑ囶Ⲻ灩Τ玌䡶☱ᢦ污繃ᛟ㠀瀧င儖䫬㑟䯰契䂆৆㈻玠㰌⪟澹⿹ⴰඹ圡熎Ꮃ兆†㝎Ր㝡Ⴕ擩ڳɩઐ⤾ኽ⠠檃ʠᩁ䳀Y㒷?݊䜥ݗㅳ戼⎄公㓸Ƞ攷↔῀⁻笰㈪Ὢ⃠ᢡ䳠沁㪿啉ᄠѰ䖀中爣჌♧ƹ䳃ᢵ䧟䦩撇H䕂⣲䐱恁Ⴞ࿢ㄸ⍦垱䑳Ⴠ撯⃣ྱ愨光ஃ⩓䆐ㄠ㒇ƈ䐢㽏௱⠳ƹ䘸䙄抴㛦⯕䑤ᓅᐰ䏑䀰爂᪢剆⋂㷦ᒂ❄晆惿ค⡫㋺ሡ祅ዔ㱆݌䜄榬哫ࡩ咺ᄹጃ前掬⏤᪁◈別ᓀ䪞ࢦदᤳ兛匰ᢇ抔䂠ᡡ䑽ٰ⪲ᆨᤂ‹拰⏅䚝♀᳨Ⳋ䤠⊷煖⡓኷㌶⒇₍┄坬⣓䥩榷憁˲⭍剖㭇䚍朔煯㥳㚄悺㤷ᄲ畆獬⨄Ṩ ΐ断㛦フ䢱㞹楑ᔫ䙹⠯j䀡剖ౠ嘸䊠⩡匉䯹╖淪┶₈朢牊㒹䤖斳؞ܫ歋኱⊄j㇁ी择掠汻䘘填㑸䩒ᒷ纛娢嗨糳খ灲绲ྃ㒱䪼ℴ奶撢戣䪰ą瑼ᑸ唅糀䯨⃣։䊪吔欝೙噸兏渪*䴫㲶வ㍆屺哤䏍⋮⼅㵳䖼ޫۈ䰚⑴乶ʚ䕊嬗⢹ݾէ䤋ૉ䩵ⷵ⥤旦埉櫞☕͸ᗦ尻⛔ᯪ䉷ⶉ䗦硈]㲎煅⾥坹奉壂ᗝ᫙㝶禞堚䃊᪳⮠㍹ᒭ儺䃚犂⋗䅠Ȳ⮓哶筯㴍䬽⛳痍堊LJ᫛⟕が砖擉人Ⰱ/朽櫼早塚ፏ㬇◕禛㘦僋朎桍ဪ㴻屻࠯㰍㏷楳吾劋圃汱㭾෺峻ᧁ㯓㏔澊皆 ᛈ渝ᣵㅓအ㴐㿛৖寇㵶ღ墆晎ǫ湽し㴸㵳ᓇ筬⌮䝲࿪婨⚷⪽⟲ᴴ㗊棐ߐ挕ឈเो弚᪣竺ㇼ㸪/䲦㒑ீ瓥ӹ甡欸盀椃ჷ祯慇࿌✰࡯䆀䌩攍৾ᱠ൙ፌ㛺沖❘慬䊯ಱ溾溰3ਫ਼練㗇⫇⚌猯ᣯᝩ嘍曙῭单䃮㑧ᇉ暰絮波啶䨽况ᰰِГ弆碋枏⟮㌴⾹响槀宣㸰Äⳙ厧帚榇ᙼ癎೬佾䉿ưɋ罐ᶥ㮷惋ᚯᝎ⣻确繻↸䲋曘揾庛▃晷⼕㬊⾌烸㗛⺋㭖ୂ㤆ᚋᙆ磍笂疵枹ᨒ侻滙㗕㩖஁坉኎䋻⶞䝸䳌忻䗕ᐝ㼶殌⭓ഌ⥆泴吏帚峫Ⱒ殨ᒗ⢉筓Ὥ峵濑䷺㽿平ᵙ䴀傈㍪㛞扌甄ᱽ䆾ⶡ忣ⓓ敓⨮᚞࿡㸠C住໳眃䉟緄㻛神⥤獷ᯝ⪩笽怮ᵤȲᨯ墅烝匶㮯ഐ榩歖焀ᾳ淹n㪇ᇓ⠔痮䚮丹殣ᔭდ䠋㏹孫亓៛䠗㴈柪栾┪屚᫘搅㼷喓⑲疩ᒬ㷁琗㻪伃姛㦕㧣䶚嬢甝㜜潥晅巻䮢啁䂃̬粝㝚㰏缇伽斎܊Ყ䂚叇溯⭞幚䷉Ȗ์煜䥒㱛屿琏Ὁ甙伦緓程⣌捲㠠华◜⯃歫㌑⾁綿䚅潅ໜᔧ屬殛窐⺌ᱧ纵碖圕Ỳ柝篣㰣厝柡㤿羾扻㵮ㅚ㼑௝弙ፓ喙䶺绹嘖ῄ玿জ受癜唖羢䝇ᶕ碓丞喇珞₂䀗灼濱紉丟̓㫲砡吶灟嘀埖㸝倫绗琇㸚⫠ƿ猾↛啼ƐȠ癛緾ÿ狃㓺⿯織灠繃I溱烇ئ⁎㺤珠喸㤠悹烟㭹ὤ䄥熫ዹ濫⻭狠ᔤ䯹縶㊀喸性๰ɠ歺߽仪甀搤桒盛甠师㡋䈍瑱㢥Լਰ̬㾛၆ຜ໹Ყ墨↨珀珚⟩糊ರ榪瑂ເჄ☣旾昴ॳᔃ㞤慝㋣ग़㑇Ƣ瓐熥瑑nฺ᯹垥䢞═䨧䱇⚾༐䶦峣⸱照㥨ɛ⑌୫Ѧ䯮Ú䉊ྥᑉ⻻፞㱧痽↖ठ紧㑅庑ഀɥ⁆ዉ࿨漃㇫䨴䅄ᬠ叹⅔睈敥ごᄵ㌰嵥⩊ᇻᑴᕀ⩊刀劤Հ㔺凩ཱུ⽧穋ἃ盨䐙Ᾰㅎસ硈ᴮ⼄ࡇહ晁凨犈橛ᙍ刊噸泤太䣘Ӏå⿦ና࿸䫥䧧ᅸŘ䇦㙘燛൘以⤿悧ୠ淦Ṍ熛瓋᳥Ṇ焳ጘ符ಱᇜస柘ňᅅ㄰磦⫯滚战咦಴络卿ဘ㟥焳Ꮴ㖃幔⇈睤獚੍ন䫓㜐䤧໘ᐤ瀘仱≤䥄䈢䙂ॺࢸ擁⥔䦘䳄䕧⥊暰дൄᙈḶ㔄媂ㅒগ堄䵄奔扂䤄䃁区煜䨿㛨䕚熀䷀噧楒嘪䦐竄⇵婸䃴ఢべ焴䵑Ỉ畏⦢䵴帋ൗ⨚䶤凇㕊楶㍴ᙀɠ楯咔珆楞憁షᯆゥ慞䣌ᖸ疫␹熔䪹͊A䤔䫄᱉紁䲬壇籰䨱倈沤性⥺䚠С㿽Ⲅ䥤懆ဠ⤉䳬皆≉⧢ഔ嫧䩰姺䙌媂䭀䅊㛌䚄ᶤ奶㑌簘炲ᇒ䧈䱫孓ⲽ䭔䲆┯妉䀼䷄୍᤽佶⪅ㄮㄹ猀⢄瓰妓䪔ᒁ⍛ž䧰媄坁㨃乼滧杊ᡓ䮬䣧㭘ळᑌ䨆ݓ㧣䭬嘅睎祩䤬䴄䡂ᨇ癤樧獐姏䥄㗰㉄ᇋ໷ᘣ㽙梏䦐䠵ష祶㊠㌰䱌祧ࢹశ场禵䲐水屉׮༥Ձ✳㳙䴜合烅䢘⭌䚧⍆祸ɂ䤴ᭇ♴Ⱜ䪁坞׈䱱ὤ皽㦭ਢ暂壍㤩伂喹ఴ⢵ڔᤤ㽏愶〲傶䡙䇄⳨䜆僒ㅳ⒲䆘棜▪⸲䦛䅹ऒ䑴⯃烌▉㋲䋃皽䖠⢀暂ೇ◘䥲䆵攨旎䜥ܡ㿻慬⿬掴రሟ伯⦴⹓ᢎⰨ疷㙯旺╟᫂ᔭ⹎Ⳁ桴੓断爴癅⋟⸡⻟ɴ䷭皥乾Łㄭ䀮揬Ặᙉ㦉䣪䐡㋇ᗂ䦪壧䵕༉⥾ॵ䕡祸䉊浵猻幕⻪嵴⋅⚭⮊湴擀؇ࢄ嘡㫔啎਺壋ヘ啌䝄㜦㻨न⦂䓵⛅ּⰙᙂ⛅塎஌⫶ᛐ戛憿⌆ㇸ䗃煒罶⫷է⡬姵盜㕫矺婻仜喔䨼攵盜㧃眥ᭁ圫姂⿪䖸㻇᧝⬒䧵潯瘕䪛સ䇊晬狄ƣᡃ啚㊦䱕ᛌ旾䑔㑗Ⓣᗧ൦扖摂䡜Ꮺ潅勺墘栦汶⫊姘漢䕗㯬䣗⻹ྙᇇ斋ᇆ礇槔绀⪢繕敚缌氜医䅂姫⨜痰㇍ड़浏㨶㧇夽炶䥔⫉疹䃴೔䗑⊪湢瘴歋疪ය猶䱯凭䢆䃵㣃ⴻ⹖硉䀽Í஦彄ⷀ涊䧖礇䷛冏〠ᖤ分ḕʎ泋嬀ݎ妌㵥୓ญ徎⮉䒣凩烈筷᪂☠璫玒匄峕ᤎݸ᪔撽ԕ⹑਴Ꮱ牪㻚硓廜㔫䞙㏨彅䥣枑䍓匁猏⁅㫭勨䅡䀦偃ᘠ槍㎾㊿☠笎᪳㩩˽宎੷㬻峽簩❿ጧ叽㼏ʣ�⥍珬⣔箻ⲕྫ庢箳屦㓕⽵䶇ઘࠢ䏄㫅壂済牚᰾偍撊ᾎ穼ᆝ㭣᭦㳳༙ⶉ杪䳠ޝ痢⽶Ꮺ⌝泮ஈ竲昝簍ឤh⋨⢤㮍᯵┈怽ĝ嬝嚝䚌䃴燀㫱Ө⃨۠㶮䰷㮃篻厎䰿瞊ᴕᛝÐ玾ߡ☸㏧ì◨㊝⌋ᅢ㯯兣燮償୊ᦍ縋侉䕩۠搽Ὡ㮶嗣搹ݧ൸㖆៥怩ᣍ嚶ㄹፌܘ㲭椹㡢䟡≩栠ᠷᅈㅒᔺ炚䟿圵犲棺䙼ႃ甿˓婻ݹ഼⢹䘬ƃ崻ᎀ巌㮃Ӭ㤔狾櫽֑惮䴤᭣奈熒ᩧ廝涱䡺Ⰽ䌩䤹⢈⠐㕹䢻溄♁昳瘻䵱劁ᩥ叉⓰䟹ֆ秥㘶㪆唝ᵖ擼ㄫ寶㹠晬ŪϜ㸀剒䀧ܠႦ焌ЉῘ㙣ἠ㖛࿨ì嗁➵୞怎泗⛣䛭〠ᬾᯢ㷭憼灑ᩒ᧤ئ栻âො〗洧⤟䝓ֻ璋ソ斠ゥᐪℵ䂞帉೫䎯咓灷⡁杆㦃匷᳤曆㐃ᦻⴂ枑䧘羴㳦會ד䳡泾杊掓⎿๿李㭑஽ം⚕墠猕崑᰾㽓➾⳯ॾ㬫瞾⩇枆⯓綼௄᠞スⱺ˻沀ȫ⮼‡ᛁ㠖᡿Ⳳ昶䂫㱣㴅ᙉફ澸挋崩㹙ች᳻淐⩫ㆹ䓇៑㵓挬きទ䵫㠢૧晶淓瑼嗏ᝎ㹙᥹烘ᖔ˫湸䲲坩㍅牻䋵᙮♋ᑸ䫷曅㞚㕾拰䞭㞫欶⡒囡㾹䭿⬟᛺䯋磡ଃ嘹㢋咕嫩圚㻊ཿ᫬搠ۅ㘌ఱ╬Ǘ㘛䰪皆䣗◡㋌橗᭟嗔ⴜ漕⇙痠俊䕗㻗慠澇㏦ᚂ断ⱦ燷奪㌷ⱆ熷ᖏ䷁า柃姗䧼淅䂰懒⨚ਸ਼湗䭐繤Ⱳ繖ẉᗄ滃凗⧜↦潶渌ᄫⷖ眦杬揔添ڊ礷熡涺ⷖ潶㷐㗞澴媗ϝ宕⪎獗怡ഛ㣊煥䰮眧㠸᪥楢䠸㚜瑸ⵗV伡⁒䲦⦪伏ᄊ㕖岚伿ఝ㶪ஏ≲Ꮡ䈮狥慪₈尣拵暐Ձ㞌&⇊№Ŕḙ⑁碣婱J㋯⥇ࠤ弢ⲁ总柕k潾罷㟕v倂巇悙䐷湴縗㕕緦伞礣翓幀᳒Ю◩ϭ⎡種䡫ϯဿ䴮碔ᆼ῁愡惎庈t≚䇟勂祩穊㹐㐢ᴱ歰㟜槒῾抯࿓抺ᷞ羘ῗ⦦䴞翱ࡂ揠ἡ糝Ვ␃ᄑ昮炗㵩ḱ惂䉔琉ễ㫤۪Ṃ⶙篧䷒⩛汞獐㚒]ᵴ烮ಒ㐕冹擂᚞揋―ய㚑Ȿἒᾮ檰瑤ᾎ穛ᦑ擬嵚⸠硴㸑⠅殐⑱䤂抉桎ᵛ厡⋞籏璜㏯᨞癎沑揤岥爯⦔␧ể埮֝⋏ⴅ璘Ε㌦àùቄ☑幭殑䔉ⰒἛ䝯咗⯺᰹燏応氆ổ狯ₔ䯍⧹澯㶞⤹岴㑲䉚㯉崬梷䟿ᯠ徉硎俒ᑌ⠸᧨愡⑁ᐦ㉈妿䑈䅲ɓΧ憒秋ˑ櫯䆇滍罯啑實ẹ沉暖殤嶡樎嶟㎡ṟ匛掻㰐⥰䨡ᡍ攋ⵞ圿礗㯊屝曏⿢篗岝檯徖㸣ȝ怿䚭瑙נᐿ婮߰幣懏῔毆ᷟĿ㮝㎴㸽浏䞘គ㾽梎ḍℲ㷟䎰ᢜ⯤Ʋ౯┘寪ᵝ棡㳊箸ϝ琎冧⟿思憤ঢ枰㱁ο㛦௚ἓ玏紓஠ṃ澏ᶚើ心樘⬜ᐉ㹈叿抖笨慐ᝏᢞ֠缙浾媔寧崑⭿亭⠝㺶ࠎജ㟠㶻涾ᜑ灋㾓曾䚗㟘㹪ޏ熜瞱㳅洿ᖊ࿀籆㳟庝潱炋㷦昳笁竷秒纛ゥ屧捿㖞⧕彣盿ㄝఘ㰷総䤑Ϸ㽀᱾俣⻉ᛈ撋专‘ׁΘ婦က耆⿽జ⌅籷拏瞙ྪ㱣篞儑௞㸇猃༔ឮ強樯☖ᄍ犘㶘尝珶ⷿ榞倦࿒འ֞䬖౯羏柧渝⮨⹑礋柏ⵝ廤⟱伳㲡疇嶾ഘဏ⯖㺱㦍恏ᄜ䤗淵གྷ巽熼᠞⠚Ⰳ䂐⛶Ⴐ☟⅝䠆㨥㼹ᐠཇ䠡⪚瘃➷漀߳椠䪝䄓⟬ཬ累爇䝞缘嬎㿁㻢窯承☣ᖂ၂弱᳨෫尴ᵣ唪徳瑲ۗ欆┢簑׺澕崛犫䞡噘。ῗຢ֫斠嘠爩㡰愌㣳i噮䜛婊゘㺠՝拀澜尯⡛㝾Χ睠Ⲟ瓙䑅るᙶޗ䏸஁⃗ᡓ涕⣷ݪ࿡欥⠻ぶ㻊јᲠ䏝ᨫ灒缡Ϗ爰⼔悦ᔦᐨ櫞߄ᶮᜩ⏢樹⁈ᆌ㉷䘠Ფ懏䢓偮ᤏ景ኢᄨ灑³簧矯姡㐤帋偻幰䢴ឰ䅣署ࣸ像ժଈ㡊㟐㥮狕Ѥ嬬ᨢ⦅ᔯ⯹㞘ʛ癟坞ڥ倇࡫䅍Մៀ敹挭౜㥭䌦ഓ䐜㸈ȵ຤攖恭昰畢帐⁊ჄЍ琿䧁⌚ሽ毘缚چʐ穘䉕㱔⍵ rߩ⼷懞ట忮䔦㰂寍ⅷߴᇀ屼⬪忱焗ͱ栘⠁尥Ҁ䑤䆏ぐ่⿢␩榽ऒˆए䚁⺙䄿ゕ懇窆ઠ緢㨫ⱍ債瑑੤㯾匰焺䒕䒢䍗Ⱡ懢ߵᢥ䣾疑ဟ垞ၦ昴㾬ẮӀថ缣ᒭ䉂㼽㥀傹亱㓺㷭ᒛ缞篏ۨ亍Ꮠ妬ᢅ⌡ஏ侱ɥ氿ᢗŮ݌ᳰ䱂㠕⎣⤒ʤ㝔⦱ᦱ⠈䒝㻞ࡸᐰ椐皫ᱟ䣢⍎ไ∱䍥ℼ㑣懆䞴䮈梣璬‰ᤊ糾抿䕱㫹唴澡䁜䔢Ꮘ咝₨穟⤁⎂ਔ⊱擙⤴碅ⰱ䔦ᝈ䓩㦫ٚ扙ɽর╬ዥ㔰偢㈛篚ᝐ僂ㄭ屈梬戮疈㭑㯰⬻ᑲ༊傖ၠ䷃᤭਴壅㵲ఐ㓑ਧ⬼傄↾䑌ᤨ叜抬時⤇䐁ℨⱰ凥Ҍᱪ燶䘐䎮ℂ墨妻㣪揙☤㝱䧤匰沃Ⅽ䗮ዸ嚂炯棵㤀搗ੌ⚄Ა燩౤皒㯊䴘岃媪呍棝␋৘㴑瓦⼱䂚憗办ី垂ㅇő磍房࿔⥂ⱛἺ᱾ᅖѼ᝸媢枪ⱈҤ䏥နぼ⑄₽䯆䚐▏⋨̠㮯㉃䍤#癢㞱ῧ༴⒉焠▁᭘丳玫慉簺ጨ便ʄ⹄悼سd妦ࡄ忸䞬♀⣮ɩ౸ⲱ入墵㱢熅碩᥿₳⦱䀱桷扜㚬╢գ咰㲉㄃䓴Ჸ考⒬௾ᄍϸ乨⫊ᵄ㔡㒐ㄵ猉ῤ在Ӑ枣⒦索঩৩‸沷劄⠦◁ᡈ䘳䱩䥂磙በ仄㬲笉㲻㊞ㆪኙጄ朂䌆䩎彂ⳙଠ᥉充粴䲚ৱԥ᪄瑂纬奂乄剻熐啉擄᳁ᢑ゚䋙ᄈ箲ፆᘺ䉊台̜⫑穇䒻Ⱡ⥙ⒹṨ瀲測䩋&勀ʊ㩉䡇檹⪄ロ⑅ῷ㩂㺗旦㒬勺䧌】䃇㪻ኙ䨒⒑᥈㓳䓷㱎㒥⳾栋勎ᱣ䬨␹㇉氅撔䧳⺨ㅈ撵叄䯪㟱屆સᝁ榌䌽Ṿۄᝫ㵊瓓㘒煡Ƞ狣悽回㌝㰝ᠬ痳浮ⵋ唛劚䴪⿉䗦䆴㸠᧦ኝ቗ᡒ⣭絍ങ⇪ᖺ⬹ສ煂䊘∞♩ᘈ䣂Ⅿⵌᓖ挚琚㬹亪冰〣⫔晫侫Ł〡╕䴂䷟ຸ㈹Ꮷಳٺ槎ۖ᎘惙ʦ䀷匸卙आ㓜刁摃⩢਀壆hᢀ⵬ṓᒩጊຼ㯱噄⦿٦慒杋ᷤ兝竬⩓杍⇕痛䴉㹩䶼琥妃䙍ᅘ挲糩之⃡㏏ည☁殄矆碐ㆀʛᶯ㹌⿲渮ⴀ㌩搮⸠ᖇ璿㚁䧹╩ᴌ妳⻨⥌⅐牦䩂⩢攄኷㑣塕䌄朘揂ㅄ杁瑮㍺伆⦉庅溷ພ⥯⚡᪮Ɠ姩㡶岼ᆷ曑ð翛㓋墮⩤壗ႈຳ羖Ңೲ猽低⭹ឆ嘸亊ᱽ旗᯼穭䆨佇岮狨㐈㉾ⅆុឹ⪔Ⓑᄌ淳僨坑璫Ꮛ佉ɐ嬚垵㺪禘稛桠扅䇯擵䅫犜伖൹ໄ䦹噹᧸┋ᑌ篒癥当壴獬⇤䓹ᦳ࡯᱆ᆴ▁栢䒓㹪䝘䲭㈭ঞ㭹Ԇ㚵䀸֦擉䒢缳အႧ᳭᏿ຮ䠦㚄ᚱ应㦽⛧ᱜ粓⏨⃅烼௥䴺㤖䨷▹滐׊䞀凾㴁ᆥ恐䴓䋒䩁㒹㓥恶↓楯惆ར砒㱩⭥䊤匄ྎ⿙䮅勡ᅴ稝暏ጼ眫ත㽞̞୅ֱ⏙燨㑷準᱾㦸ᣢ庒ፀ䷡栴䷸⸜ⳙ渄䡹⹾稁⑳䟂楳癍䱷䩕煐ᚱ㮄т垠䉜䇊晠姢吒ぉ烄㲳⋴Ⳙ姥⼴屁煫䗝䘐䪘ᑠ〠晰ᡗદᇤๅҵ垿ಏ䘊枢ᴜ恫⑎ӟ㳡㦂⾩㞚⦘▱挪◥ᘦব䍝㋒⯷杦㤎ラ₥⠷㉰঒䗜᠄宂䯳ᦐ㓞䳾䯊⬘⪐㘢唩汎ᤦȬ勨リ⒥೟̜⊙䰾㋥堵ɰ⩡╯挙慒哪㍈♽㋁䩦⯫咘᪻庼琦§扊ຠㆡ̣೐犳勳ݠᔅǠ⹽恜䖤᠘媸筫䭊坋動䭒盙㳜宷湾㦅攮検器෪❎捐ે䯊⧤匥㝅฼㷆⹐坜勲唂浌Ń劵䫞⫺ㄵ䑩⡳纂Þ㥂引㹜瀐ナᣆ଴ↄҵ瀷澹䦃称ᗜ庪䟪㙊卜削⬿狫䑥匳奺▟৽搮֜綍孇狒㓖௷䮹ₙ⸇ࡴ奾▸囒夁ъ⧪狕慥⯤⽖㞚Ᵽ㹄垿夺垜➌獪繈㋓Ԁ剴Ⰱ㖅男啶F啦ٺ嶊泥♥༫⫽拲攀ǵ̡當ㅭ榪ᔄ弒泋὏䫉籷⮜珵⡦⃶㌄碹≛截嗄浤凋彀᝚⫁亵㝅欴㚲আめ⪖ӊ慘�罆ዦƃ୅㝙㫆ᑯ㻁㖂啔兊䊪屉竉䫟⩹⸶㊂˷㍲匹㖙圣٤炋䯬߱欄⬭ⶉㆵᙇ᥶䶙啬⊖帺䨒㷏㫃䥽䯆Ⳉŀ὚杹汜疝善媪愊⛈拟櫦櫖䩽▕މ睰嵯⊴䋲ᐬ瘒ෑỆ䪤樭⭽⦩嗇䦺冈疹䄎ચ瓥៊䵅ೄ䪒眑㉙᯷楰ᶑ唯❖ᥬ伊堠ᬳ䪮瑑䮛ર⩣⍱▉䑐㕾噄擋廋⋈㬚橧⫥⬠䑗ၼཌഩ━婜⵫从沰䚣ƅ㟵⫕឵ൻ䪌ᦏ旛ᣘ夺ᒊࣩ䜝双↣㴆籱⴨抩ช傑崠ᕁ岍⻟笕欠毃㈕ⱖ㌯捷ต惘ⵆ悻㊉箪䠴悈⎣ュ䔰惲厏ᕟ呠堚劊䩋囕᪰᩟䳳ⶰ浕擼卹不員张Á䪣⧄媤ᮝ昅൩੡ჰ纞䷕埁咆滒矁姅望ᮐ棓῭㭕峰⍵სࠊू纫擏⧉曨嫇α㚅呇筺ᎍഢ斺奆䠠よ◚ᚫᮒ殱㥦அᘃ䝍妾埬啊䆻庍潓ڠ歅Ջ㌾Ө᫳㺻汏䔶喢屻ࠣ㗂嫎㋈楥⼕纄ό䭽⵸Ε儦䪸掊妤䤬磓⾋⸵๥㫷ᄦ僓㔕屼彻⦈෇㴀ᮜ浧᪍旔孳匾测㝤忨ᠨ䁊㿩⼠㏼垓ㅕଷ፻畯丏晎ᖖ移掊⹬看ᨡ狤ᨠⴆᘋ捬ⓩ箝卢ϱ䊌种ۭ殧⹓ㆭ⿔绲ޘ犠監嬴ε䑂爴͇⃂ּǭ硶䱦怪ᶈ瑠Ʈ澕燎⇚嫷䫤棫㏅ᇖ糇䝺⤤皃吶瑤㔏⏞伞᎑漄Ἵ≹姺䞍᷀痽啶䑚ᢊ䏒噎㩙漼䑽ẗᇾ枍ᵱ́☚絲䴈Ꮦ⻪ᩲ淝⧹⬴櫴᝽甂矃哎傭嬌⯋ԯе檨ᬤ䶈౸玕䣦皻寮䋫瞌ᧃ⺽寢዗㨠ᜫ痲㝫嶲盃呝ᰡ懫䷖唌㭍澇㯽徖図煾䶜疙偎揺ಎ௏ༀ種棓ѽ礔ኲᝮწ申冖翻猏㏍Ớ㩓槳㚵焖淿杰ෝ╝嬾些樈⟑仪笓澍㕝❢㧷䞎㵖癵夾榚烯់⼆笻欷⟝䉢㷵ࡎ㵒睘❎抨จᯚ憒婰槍㰽༗棶ṳ巕璯嶁ớ縉⿊昩篽歗㙍க㟽㞒ⵤ撍囎䳋刌⿐⺝穽氏㦝殖߶⽑䁼䤏屺䂚⌏忑绶筰棽㺝ॕ⧲⨾ᶏ畘曞筚=㣺戱㭂檏㶽࠮࿱憊嵣暿儎垛⤇�桵箣ॠ烽癔䏧䞶ᴫ㓹孏෺䘋㟎㼑ᮦ洣⩭氮ね⾉ප࿖姽㧙ハ篁㜚ߏ↠深急搆i⠰݇泯ଣ〬珬໏筨᳇㲣瀠夠惦刲ཾ䭁ᢀ枒ዮ↙۸ᡄ⎣娧搈㞲㹬窻濡窝ȸ䟄䆪㬅⬰煣⧙睇ჵ湋熶厗ᖧ䨿㕕⇰Јༀ熡帯㑓�䐌ܰ㱁憧寈罇࠻سᐐ惕䢊⑨愜娙䦽摼墛殉⤦䂧ح炀⣾⴯‾㞻Ɛ์劺戦㈋庢ᆨ䩢 䡃㈖㢀⤒嵧瓤㷏✧฼㥱ᇈͳ瀰揣倗䧴ᮈ䌿栘㑃ᖦ义愴㻅㰰䔈檝煴嗼篙⎊ඐ㕱暦㔹梕ᆱ᭖潷㮍␯䩣椊̱ᔛ⣑爋撈Ꮴ̐⵩͸硭笭栿ࣳ䏵ཐᜁ擦䈼㒔欆䜷૸熨燩⹞㹬搰Pۈʧ༼䒗笈䜦ᶯ境䪬硔䤍␎හ㞎畻㌺撊唷䟠匤滚䦹⤫劽▱䊪ഩ䅓紽ᒃ熰̖ᡯ姣徬♙㞠ፅ璨㒁䠓瑏䊗▍䬁ᡤ掲㡮
䛁⌤呲㴈㒵后偈㇘䟱᱘澣掯ㅕᣩ紹༢㺞嫫㒺劄䧩䵉ᣲ䄉ባ噞㝠㵏毄寶䃧㬿⢁ᇑ䚮ᥨ掳厯勴椞ጨ斪㇉ᛆ媲z䦣ℕ᥈瘣ᑬ⩟夈捬ג㳉尣Ჿ䂛䧒穡Ὁó㟖㇨槛ɞ檡䵩簠咠窈樖ނ᭤捣୮展㓾䏥矗垩侧ப窇榾䏽ᨭᙢᨲ⯍⓯浩会㋁翇犸Ბ⧫❸ॴ罣⼯啙೥㚩䰷⸥আ䷩䲦p恃ʙ㏳櫮〉礎丏෪㉑俧挿㊚槵⠏⽘捳⡫歛Ⳣ㉵侍Ԫ歺㤂⢄囑杬᭬滣೮孑䔛㍁俴㭞䆆㶺ᚌө朆眼娑礯ᒃ䝋Ⴙ᭲㴘缇♊⊘榶柞ᾼ楳峮㭟䳹捻呖刜分潪ᣯ㨇晁抴䭨Ҡᘎᔎ紡瑛ञ堇⬕墆夓曭ᮌ欓㪬煞ഗ䌯乎’嶅z篬匘᝟Ἔ斦΀怺ࣨ㧍唳妥仧㎸底䨀柏ᴬ珣㯮⇸瞁◘ⲣ枪狋⒠憆䘈ᖬˡ䉳ה䰫皣Ꮊ砱㘥昆㦼䆆樔䘾注瞳䥣壑䋓୶㌐㵩咷厹ƛ䖶⟓Ṃ羫⻮ۺ崌வラ㋦卜௨㽵䗊ሣ矢榳ìᕔഒ⍄ⵎ㙮嫆橽嗌↣ᚸ㍂㓜粨ื勶຅猗⢅柧䲼څ懓឴巜櫫篬泑繻䯾斴刵焤搮䢗᪊⚨પ燓䌗᭟጗䮸䲖㩥䍦Ÿ冎ㆬ㶃ப礆䣎⑖曙඙೥㴈๧䁼㊓昃ᛓᵒ瀃Ꭿ糝洀⮺瞂⩵煶Ĺ㖗䑩ᜀҺ䩀ᓣ㞦㵰喜㖕㊲潷眅䦂嗴❓ὔ柫嫍獖ೡ䎥俉㠆僶㵺᡹槔墐䜊撋Ꮤ㛒䦓ࡱИܥᚚ᪎ⶏ㖣噜墺溓≎糟磠䮠䵧居礫妉ᶒ䢝困ᭉ➋䊔⤪笇⯽Ɑ橤ᅌύ綛墓坭ᡲ曋ⱬ潗᫪玭⹱㔜⁗᷶Ξ༅嚡寘澤࿎䤭㣲弈漩๵圶䙼䶜מᚎ奲殍筬䓝䎒欸溴嵢䈻ᓾध溅嚽ᠦ熻坮燝ྲ⭆⽭ㄭ婷䮿ᆐ⻸㝅Ě榻⒏㫔曣᯽ⶶཛ㍖ዺ櫱৪殅ᤆ立⺎勑㋭ഭ⺅ㄉ惘ὼ䮚ᬱ㙲⧶稨熏ەᰢ偟祟凶䗚ὺ㝾崸í夦氃ṍ⻓ᬄᮄⲅ㿭噶烾⶚淳㛏桬䫻ᎎ淑瞔෫⿎ᩈ᧷剹ޟ夐盦實狋ʎ磔匑ᰕ⻉㌭䟗˼䞙㣐盾姆焠࿎䏖㫱孱¸㧙噗䭾រ⧕娵忦猋䕏⻗⫴ᮜ涿夕䟷旻䧌帓܆瑎歨⧠情㾉㯽⾗㛨ᷖ泼叺巢ឋ庖枻䭏嗞眆宾氯㢹澗⃷㶙㗡皷娚故㘍䷛ڱ比汏㏽眗盺禓䶴圷᪢纋歍᫞⤧死潠ອも㟼⾐緢發㝖纍⩄㻚绱筵⵭㪝禷柾䎃⸒㛄湺氛㶍∥缁㰃伏㮽狶䨹䞝䷑眽墾箻喌ö盳㰉啝㷵簮ⲋ䄂或ᩓ孨㿡ᝏ䆇伟ㇿ濧㔍樮\\㞁痌࿨㳮淛滎䏑廴⁊᫱έ羖⥈焊䷪຋弦敻娼ゟ⇳痸ᴐ熒术圻箙㗾ဉ帮篋柧◓懾᱃涴㜽䂯䫻ᾖ痼⚀娪熭夾咓ሂ䞘爷㴘捙☾焝䎦㨀㴂焧ി䟘ሖ䝄泬㙭玗٘夓㨃๴㴑画焽扷ഁ癐ḣ㠳䆛埌▉ϐ㛔䀞杧桌ᛟ処䯨溤糣䕫䥚䄆ą༹惩浧፬ᷕ৿箞ⱗ㉃佇湙愛ᐏ໒㤧䶧儏㻑໫ࠝ䛴炣椖๞℉掸乼㡠擇ؽࢗ炃➘ῴ禽矷׼Ä公书㳞݇偏犐崛⟩溳㧾崗槾疜㏋ᐿ幺文㘼瘹䧶枳ṋ㰝䳯՝㮆㷬໤㫖畐ত劒嬍࠷ḷ㕿㽶㇈τ瘑正殘櫛ᚿ⚑˲㭥Ἴ穃噺ύ崒玠⼫墂宇㙉᪞凥殮ὤ碓究㽚甔珏㛡䀉碋᷂溞⼮碹ᷨ㵸ᛪ癞㔒௶俁㬙椇ᔍ�⨎氈嶌岫䙚ᓛㄛ⊸宿毠禋㩿碕ס❤廢牫洗䁟礙䰐ྐྵ㱎歰格㙟䲧殢嵮㮫䑏⃾▀琖⾙幉淧溿㫖ᗷ䝴彊砃䮖壄攔㡳叡㷩礛▍妟⼑᠓ᱏ噫冗᫟ě⯖຀΀ੀᬭⲓ㗽埥౪矋倗Ӽ➈殮⹭㨟Ᵽ䂎涚棺柟〚琱憗㴭摓Ꮠ渥ᦕ檇楾㺙痼垐届炫濶ᴬ崒᮱✨㼊绷悾⧜瘉玞乤笻兗燞侓䮳伞㷭憠㗎䣹⸖歝ᶪ�呡╠ℰ瘁⼃柍歛⛾產淫ᜤ帺筕燏⹘ⴛ䯦ྨ㲍秗ఢ⺟会}庣漁⚎⥈䙬ᠨ悱ᎍ敬↌䤬帑Ᏹ希缋嶖Ϛ笈㯳⼵㱽玗ᗾ⺔帙矁巐曛炙䣹烿ᰔ末㥞晷ዽ嗖⸏柟瘚皻叔௚䐰夛倀涡斧刂ࡑਛ来岚炛䊎῟䌂宰Ύ⻍炋џ⳼嬖⬔爲㦳稾⾫䊗宯侫㺣瓗潽䡒㍺༦䄁糦悏竿ሓ߰滳ڒ砓䙾统⏾ྰ䀎猍戏ᵚ✞ު䩸缡殲ᛕ羜⭮㟽ⶵ夛䴇俘ᬕ篢῿㹃挃䒾䔘歵᠞昞糤㢖噛⨏则㞱᦭昗㣼攞䈂㟣嶺秇恏ᒠខ⏥湄寉櫯๏䔗ጄ倛 燧䰾犝皉㗱㟌磉汫䌌僖绳̿湓㈙擣皟ඊ⯝Ḩ禓梯⏼続␈寡㱾炷憖ⰺᠮ໋๲縛⋛⢭废䘞཰㵥筇䱾⒘ᤛ喬弁棉泏⒖ⴚƴ⮹᳅竧䑿禚侐城ᾬ祝曏司⬛⯠垏楸皌潕媛ẗ㮤矸纋烯塟㤕緳ត桴翷曯杞傶㮾溌站撁⠡᜙Ḏ枮㸎祝娮榊ᨘ簄湱㻙熏৿㏟䕹杇㿍皗嬯䏸樗涽濖礻瞏愼༛௩⿛⼛㕫巗䍚ଔ䎱⿶㷑瑏夎猖揫濑᱿㪽拮ᓾⴗϊṭ槼竏㏚㌙䨒 㹝焧捿⎛渚ㇶ弮稃矧ᒟ䂖䟵⾟嵏዗祟㫝樊⠇Ủ翻抏㛝༓欑稀ᵏᲷ嵆疘琋㟬㺉粫溿岝浘柡ῢ乼牏牿Ⓓ䊄➴䬩᭄箿傝㈞ߧ➢考畗楾ጝⴅ㷕㻁ῒ嫏䝿硑ญ堚緫縷潞䶙搋䧁ᜀ絷担䎟䪕◾弹ḷ㍳礏巜渊搇㺇㧛磿㲽䈓⇤ᾠᶒ皋䟞ᮟḙ⫱澚㦗溗檼㒬巺㺹ᾼ常㧜ඝᰛ࿷帹祷矷ᄌ搔倘ܩ继秳㕿⟡Ⴌ帿昹㰫悛㺫ఝᇦ‒糇磏峮䖟䨃柭睋筃婧⩽ఖ濿䟂摓旕筓亡ⶏ嘄纼簇糿孮⸙᯸䍝縯穕佢ҥ砕㘖؇耝抧佯᠚戗怚岯皏媞溛⺀䎕罷簼焟☼䰰῾殓㷏纟䯷᠚吘㠊຤䀗溧⮝⠜忥罓㷯綟埶玛 佳坻䀛桮ฟ௶椌㘘世瀊俩翜坁㻟症簟畊ⰠⰋ־晥䰛ⅇ太ᐳ痟㼦㲈ύʀ೿朋娏῞▜ᐘ怭䀀ῧt桜ǧ編҉ݠᦠ㠟೚悤嬸䢔㈅≺㿍♮༉ؐհ煡椟墠線᠜Ύ堪〺࡫悠缮Ǭʷ砯牱斟䆾ಡ㰜侘‖㤀濯࿛潈⓫縄ڟ现᪃䖹᠞䰜䔪ိ怆G澢彂Ŋε秈ऐ⟀␟も㠣ᒠ耕样翹珀཮媐μܯ燻暀㰇㪞䬢ࠛ倗㠶၉恴畉Ĭ砭嬹⁐ၟ䱀眎悝癚氐䀿⿻恾罥嚞۫͢だᤰⵀ䌡习瓪搪ត䢧ၢ䂾㼑˜خ異ᱷ嵠䄞沢ᬘ珖倅⡄ႊ漩䉁糐є൛欏䭯ೆᵝ砚砮⠸䡑忛伴䅍ώ秔ཨჟ䬏፡آᐤ〯⨃Ǻ㿄惦仦˗窘ఀẀ⒠䚞℣⠦栭怽໫⁼╭䆴ΰٶヰᎃ勧ೡ⎣㹘㰬ြ塗偹⃆縣Ϭ㧣獉ⵟ开䄮䎢И皐䐺ᡍ㞥情Ǔ᷎Ѹ཈ᖀ㐀䗮䂣̧樭ਡ忣灴ₐⅧ簶аਘጫ嗯ὡ縜䕨ࠖ䈴懤ࡺᄂ༕̆ࠈ൘፠✰ᴡ⌢ㄥ熗4塇傉℟䇗ɱހ௸ᆠ㜟໡ᱣ殠☭刽ᡖ箧ᰭ䄤䏍ʠไ᥋䓠嶞ኣᲚ⤯琽⑗ょ჉僻ΌҒའ႐⾤ⳡ孼⦠㻂娦䰫י畫̄Ѕ֘⊠೸ැ㋁澣崦縨刺塗恨僧⸪䋕ՊཞȨ㓰曁浣䝈⭕䨲㿸䏋歆䇙Σ禛瑈ᜰⲰ䇁䅢䚤Ĩశ瑘とႠ慱籆ۆ痨ẻ佰孮ѣ冘渮ਲᙵxㄊǸͳ㡐ຽ泰ⵐ眡䴽緘ଗค䡁ᏀႵ纹汅ٜಔ᠀䙰扲ȝ〳淄䈵ⱁ節漢湥˝ݦঋ摈㤰粁䫢᪠悁氻ⱛ࡭睠Ŗ煰׶ईᑗ兠绁曣㦥ᄮ␲㑐⍄儕∕̄㪃㏤ᝀ㉧Ἦ䳣ⳛ┑昿⟯ᡵ箖懫䏋ˎ੬ợ䖐粮ᐢЙ᥅᠁㛠Ổ羓憱䌩㧞炼ᬸⷐ毘昜㞤䄩帺䱁友ᄞ慚㇇碛痜ᶸ㾿מģᐛ嘨ဇ籈ᢇ焙滏ȹ燇明传ᧀ氱〡灥圫省屐Ҙ羀ᇄ͠䓡࣌ܤ㪻㹊樝ࡧ悮㈶ᑅ䁹㽌᳓Ήࠞୢᙟ偫☱㖢冹┮娢ᡔ⢚Ě䇳屽٢ंἈ㘰伡⣣㋘挭㘵᱗㢁パ溾紣ؾ༂᱐↠猰暣㉤傫昉_䁰ጰᆬ⋟磑඲ቤ㧀瑄橃㔚梫嶍罯桩僰␬䐁ቘன₭䌐簖੃⠦ⲭ椺ῷ㿄焜愣ɱ壑ඒፄ㳯!嘢㙥䀖爿ⱉ篃ル䈄䊝߱๔ቄ㓯ࡁ卝䃓摂ዬ޾ᗘ✼廄䊢䞚౤ᤘ㡨悊崩掱抯煦㙯ࠩ崩پ⏨䚌㗪ᜠὈ䌨Ճ㼙⸬ᨺੈ撁┲内⍣神䆦䰴Lj乱ᛃ䪤尨富橏ᑧ⤛ᅛ糀ם痊ᥑỈ潱ᮬ⍧㜣㔷䩕㸪帾᪌䈻㏵຺ᇨȮཁ坼籥漨ᨅ屉摮焁免⌶䜎䷴㓈廱⏨湓檯搵吳呠㵣儶᳉}ఊᓄ▀䵱⩢畤媯ᴴ䏦ቕ棗决⋌䐥狣䢔㼈䉡櫂⩥ガ岂⩚ㄸᢾ䔕⊐䉽ࡻⶔ㨸䁑ţ⥥Ү㤾⤮ಋ䔣兰捐ባঊ᯼䲨昁墂僤ᶤ㓌᱁墇億刃䍖䗅०ጔ⽈湑炂㣥ম紿緺,故㳷⎷䁙fᕴ⑈灑كᖃ妩㌿♏ᑧᣱ䫸挒䚗䒬䛬㻈䓑ᆨấኯ䈰ቅ墏儇兛⏥䕹摴ୌⷃ㓑疃侲亭㴲無氱⸸຿∭䑠݋䋔㪿ㅡ溂䣧ᖫ䘺噔呹溝₆报䑛ൖ᧜౸楱挡曳๲ይ㩋汦⩌廏ᵚڮဂᾘ㊸牑淃ኡ綮笰ᒬ㑫⤟ㅞ扝䕤ҧ๾ഘ⿑竂⧤缂猼੆汳棛ㅱ打䜛勮᜼⽈暑㔂䧦害挽㉘呣ᣘä捋嬧ప჌ⱘ䃞宂侤஭圳婸ᢼᢣ₌㒆⍽ࣴ⺼◈愑ૃ☧ⶬश湝ᑧ㣜元扑䜯ྖ៌⟈熠㘡㇥▯㔼幖ᱼ壞ⅶ抓䑯௮Ỽ⬠㗱珸⯧炫冂ᩃ㱿䞋冞焑狏䇬䛜⽈瘑䰱㟤䌗礱Ꮹ屸烥ㄯ䉃䐫㑞ὴ㈘琑ឃ㬤澬䢫塦㉙厗⑪秠✚┾Ῠ㲘勑縂古ڰ䁎璡ᤴҢ纀ഩ孲ㄿ挢➘䩱㸃㳥䊪㼭䅕ʁᬧᐰ׷䁛�摴㗪㤩䨳姥灯䂰ⅈ㒄傓☴ኴ節㗁ᦝચぜ様㱄灪㘹繜ᲄ礊ㅯ怸Ȑ䡬䙂⹢᣼粩瓛熪兆ᅙ䴶磥䈄挤⛗ࡡቂ⬈಩ᜨ੆疧ʪᐯ䉲庝ॲᐘⓈ䦎ᐤ⦤䫑䥠䙄揠♭ㅊ晞䔆㒦ዔⒸ于ᇔⵤ䖩紂堠ᱮ但⥻抛ɵ擎拪瀮Ʀ䔰ᅰ沺佬ņ粓杮䀤ቸ┝凜⋓ӱಒᕬ㉘嘠䜈尢ɬᗬो⡈┓∁ጧᩤ䭛䴲㙄幩ש夂≮㜇ॾ䞪傡嚾灊➖狉Ḽ幈䥚ႝ狤㾫ᢱ䉃扡碬欕ቋɔ䩢ᩴ埄朠纳皥פ䒰抭䡃Ṧ悂䶈䅚厺ựᲄ欪痝㷫ᬧ☡畢汷⃰熎Ꮼ⟽㐰ᔹ冄䏀斲໢噭䲸᥃ቪ正䥳ቮ❮坉Ẓㅰཀ∕喢ṱ╉फ़牱棇䨑ቖ⒧ེ᧘㷤滩啂傲幮爮祀摞梾䉠刾⒒ԥኔ㦱ǩ䚣䶣㷵⼳ᡎં漤⥭樑ȧઌ梴㮘䂩າ瑥㩬₳楜牤擴⦊䇱⚏༥ᱪ㖥⥉䑳帙慯⸁ၔⁱ↚⦬ϳʨੱᜨ㷄盩亳罄䆬ʵ╒犃ᓎĥሥ♬䨵៼㙰僩⛼婡ൣ弼䕜犅┃焌䇳Н⁩Ộ⽨物瀂槹剪䪴啖⪒笺䇚劅Ⓤ䴡᥊㴄圠径ԉⅮ㲱ड़檇k⦯Ꮑ⟰䣆᠒ヨ斩ᵲ盄ᵮ媶Ֆ悄⒫⤹䤽❜䷙Ⴄএᗩᦲュ堪䪲奜᪓哵ज़ዽ⚘䩅ሺ㋄璉㇡ⳑ⍮Ჳ൘᪉⣗䧬抱⟬䧇Ī㓈䂑売磄ನ䚈╌㉽攀⦙卯䘳䉍᭺㿤䋉ڳ䑀ȃ⨡䝥犓㓞䧍刧ϖ䧑ᛊ㔨䛉ǂ㸧ᡨ窼䵅婩Ѿ楐[⟆䬍᱒⟔䉉໳姅∠〧㗬䠯棐䜕叮⛎䵄ϵ�抱䂂㳦祫猶Ⴒቮ甕榇ባ➾亊侫Ⴤ撨啁dž睆㊾㥌眣甏⧫⍿䑙瞞ᗒ㠄粉૲ᩅ䝬撶絃牯੪⥁卿►ҝጪ㋓Έ筲LJᢣ₩浄᪟哜稴䄰擘䬅ᰚ➴䊉溲嗇ძ䆺䍝٨唜᤮到普白ᅒ⤄嶑⑓╦⣬㏭⍃ٯ甔መ厯☰䧷˪㋘昉婒䭇棨䪷䍛䙣健廉劢㠶䯉ᩊ⡬暉㓲᳅嚨Ŀ剗⏜❴䥩判晔ำἔ⣥੉⎳卅䜦⺴⥛ኃ㓻⨀㍄⌴䧩ቺㆬ俩晓旅璔⦿捊ቾ䳳᧤㍒✹䲍ᅦ➬䂾ᠠ獇㼨玢敍暚擯榁㲑⚸伅ዦ✬斉璲⇅棩禵捂犄擨奎㍎⑎䰍፦㩌竾ӓ叇筪粽絜晼䳘亷沟䕉乫኎劔按ᬲ悇ᓩ▴⭑ᚒ瓼榄㌪䗨䣂ჺ⛌榉⃓ᚄᓫ斳㍚嚅၂ᧅ㌂⣶䲋᜶╬撹婁⯚㳮⮡卌᪚す㙄戢䖳එᖦ㡌耉歒憇ᓨ䦵午㙴Ⲳ⦺㏎❓ᖥጚ⣬庹矲䦆瓩䒳䥀癹䳹ᦺ厤♍䯝ᐲ㤌吹⣒䞄䉨ᶼ嵒劊Ⲿ噩㉾摵亽ᭌ㾔敱布ె壭຿䭃登㓏奱㎡敮䮛ᴖ⇄槹柳揅穭ᶽፑተ甅ᄠ珽┣产ሦⰼ䙙❳綇䫩ζ筀晹Ⳣ娘珞撅䦻ᦦ⋬粹峓嫇狫冺筓ⲏ哱⦘牁擆◝᝚䀗᥉敘ᯇパ縵ᕍ੷᳆妓㉺杳产溮⿄罙౲备䗬玹ᝊ噭㒩㨙剦摌仍ᄒⅼ晉Ӎ壇ᑭ䶹❇ᙴᾎ⹫㊚曋䦷ᅪㆼ䢉峲欅᭫䎼ᥑ嚁ᳰ楖猱柊䢒ᱚ㮐孹Γᕇ淮疾睓嚙ೖ㥶玩摣䷋ᵼ⶞ᓉ埓洤ᮩู䭜皓峍凎牣暝倝敎㺔粙⡂曇䋮劽㯸檆墟ẻ劍憭䯵ኊぼ仙䢝ⓙゐ᮱孚⪒哌程㏳摷俵ᦎ⢼梙ⓒ甇Ꮼួ䭘庀㽲祌医曮䭯ἶ◜猉嗲Ǧ睮玺呐媖瓺槣獻摽佱ᖖ㲜儙௲㸆䪬ྼ㥲㹼岧䨂劲朆䣿ᚖ⥄璙ᒳ㈄嗭ᔽ彁暁峃祂˒ଛ䲓ំ㮜汙Ⱃ㞇࿩綶ṏ癷磫大猬擽䤩Პ㯌䏹Ჲᰅ⫫Ⓥ䥖梌棅㦃狭搠⮩ሚ⪌少犒䲅寨ࠎⷶ�攐ׅ፠暻䧭Ს⠢継孓㞄ⷭ害罃亍ᓉ禛狕⚫䧓ᾡ㜢䨙爫䜅楯㎱Ý癣ⓚ՛玱晝ࡅဦⱼ烩䘪⠆⩫偼嵃�系㦜਷摛䰽ᔎ┼䡹㘪㚆щ畭歊Ⅽ˾禳ጸ᛿䡋᧡㈜氩栒䉄柫㾴❓䆗Ⳛᥜ୏暿䰠呆囼溉ᔪ攅婭䁽ὕ䆌糓㥕劔ᗀⱐ忁➌粥ᩲ᣻吅宾⽁੻䋵⨆ਢ枋䮠崟䀴樉煓殙㱍㰀㕀䑸泐䗐Ҕ昍䧠勞↜劥爪व睭硵坂习⌈Ň刨㍽䫩ἱⵐ㼥䨪焴䉯侳㵙憉⢴᧌単շบḫü敥ࠒ椶㥬塼⃕繭᲻᤭௯斗ಘᬦ⇴怙̪ᆇ⩪㞺獈ㅳ˱Ռୱ晆䧓ᡑ⧄疙䮲溅が呻䃉ⅲ挊դ૤ᑍ䫰垰⇴䔥滓⬶ࡊ䎾ᝇ沍峪䨖㍴ᜀ䦕᠚⫬囥厫䜵㡈㒲ⵀ㺒㣘D喰䕈⵽ႈᘂ站Ӄ෤恊斵ヒㆎಣ㤿੾ᒟ䏍ᮾ㲜查な場卬ධ〸㚗䣚䔹卶柢⽸兑㱢䶥勃ゴ兎吹ࣝ亊䴍奐㌯摯䱨彊㛢櫙ᒫ弴婭䐱ミ熋⋭؍ਭ枻䳄唶㦲䅥௳㰶圔刬〴ȭ⒧伊㏮⒀ุⷩ㞲婅㾢洶䡈᮴ᓕᠨ劧穱㏅ᚐ灒੉㿌拾֪Ḵ毫⩼Ⴠ窂ᤜঠ䭢断䳴寁⍲僥岒з㱎枳杋晳᳓☁૥ᔣ௴允Ⳝ伹梫渴俫冲瓔Ʊ኷؋㴴ᖲ⹻ᐉ┢巅⏲ᢵ㙏ឿデ全⋃֪㐬ᒀൈ剞㛄䃅ჳㆴ奋౿橃㆕拦▱Ꮃ្⺰儁㭒繀๪ش⃨䨠⃜䪜㌞╲঒ᑞ䣀庑㜴獹⪒笆ỐᮼⳘ婺拥秞᷋ᗌ⥴峮㣌烥䅒㶶ይ♰穜⥣ዩ▃㍾撵䢐幾⊒拥ɒⒶ狁ⱷ᳎ᥰ㋼燶૖ᕌ⥬办⎒亅㤫岆ᕉ牰罪冄䄕☛䮙ᔾ⾅᭹が僙۪★䒒㩺㳐祷糉敒䪵ᙞ⬈匩⇄墀͠တⵍྶፏ湷狢属ଜ曔䰐冱′䢅䳫洆É繸佃໗狯◉珰ᒴ坜嗠⥢敪㐒泇լ广烂ֆ拈ᖀੰ啞⢬塥ⓒ罥犪ևᙋ穹⋍奶勿夬ቿ暮⿷ዪ㞂琅䮲ᜇ㭏箸嵔祕ଉ昑獩撡⧄嘥◂窅囒ѷ絊煾流乩઩ᘔ狐ᓖⵢ危❜潙巒宠Ὤ㑸ዄ䢐䫚◂⩥村⵲徨ሬ焵䍲ٷ哏㹹拋⡉ቅ؅獌啲⢞⦌⻒瘅嶓㞵㋲㩿泊၍䫙䖭͜囤⤟Ꮂ⛼剥披繷㷫޽䯷熍ወ秚⬻ᚗ䡒唆⏼䎥簪綄ى熹狝⦅擴喔⪿摑⣰囙㱪䅹ೊ䚷勍悯罅֐勷斜䪠祒⠠噵ℒ獩筋᭄瓏≿䋌㥽攊問䮊囒⮊儙㒄宵䚣帇ⳉ垽潓ᕺ䌌嗎厺堉⼔奅㪔捱࡫፶ᯫ⾷峇㠧⪳Օ劊嚪⨼墚㖒䏅䱫ص囋䩾泗᩾檾啌劁朑⨃Ⴎ✪砵穫㥴嫏䡾寡ກ⫩䥯㈬ណ⽌奵㟂䂉㎪䴴擭澵ૅ斂˯⦿⬎ᘌ⩼墼♒屪Ĩ䦄〮䡢峗⦄ૻ嗅⏁噣⾌咭≢ॵዪŷ⣈慹竨䚅檱ᕭ⩓ᑃ⵩⊥㹊䲵把ᣴ䋊恶祓㺐ᓸ㘟㐁呭⧭᭭ℊ浕卫稅⯫╹ᥝ䵥↏啨珦ᒮ⧚壭⃌睕溤汵㧌枱ㆴ楻䲤◴዗◽⤹ᥖ㱜楑࣋㽴োॴ⛆ㅲࣼ◪喚埍皶啭⛔嗎ᗊཅ෎൱㣎᪖഑啭䨻⚻⼋ᮺ⫷❅䲋⊆ፌ⍳䛓㞹嫧ᕥ琀᚞犿方ⷺ䳵ᕊ䦷緊恻್奲䋰疤੖唊⿆喍♊傕噊擴⏋ᙻ᳁橱櫄妵૳啧⮡ᣥぺ痕䂊Ԋ㏊湷᳍ᶁ持䦹檴ᙴ䱎垭㇊䃕淊㜴ᩬ᝹睁嶛⬅╥䰏♡低嵥Ⅺ喕庋༅卋⭷勏ᶛ糣ᕅ䬻呅⾎婝◚峅之ᆆ㧍⩽⥗晴ˏ榟ୂ启⺪垙⃲䌕⽋珵ᩨ䛌䫝斒狙痁ୗ᝷⵾孽↺儕ोߵ嵉垼峓䖇ೃ痜㌉唇⯎垵㳜䐕ᰋ湶㣪㱵㢩ᚊ瓿畹毴ᖭⱆ呍䀚巤䕩嶅䂋池㢩煵ଇ㖵䬇曱ⵞ嫍㴚沕ซࡖ⏉ᾸὋ妞竩䦽氀㚒ᆅᏽ㍪潁璫磶傉ù㻀噸竒㖔㉫吸⣺எㆦ䟕⯪延ɋ犼ࣄ᪓܎夻⅙ᕢ⭠ԭ㨂埥栊㥶忊፱䁟䎒ࢳ礲᭡ᐨ濞圩⏬扅愓ᆶ哬⽴囚㙪嬆Դ᯵唫⾞僃㮚曹烲篴⣏㩲䳀㖛ળ痝橤᠗⻱塝⹚兙氋ཷ࿉湵䃔掂峅ඒ樼㗼⹡嗃㻲䘕笻ᑷNj୼燗㥪瓎★⬟垤湺勣㜪痵ㄻ⁕⊏⵵䇑᎔竼ණ㵮吰湅䙖⌊喭浫姶䒏磾䇒㕣櫑㘉᭑暷⼻᪒│䍩唺≗�棵⇛ক撰樮઺㔸検埲√䖕᪻㷥檊屰槀ᎌኦᨗ୚㜔榾嵲♺嵹⑫ᆷ痌ú᫟卽䛂䴲⮆㚟Ⲉ῍㎪叕ါ羴Ⓩ害營䵿䛔෎⫦暳⥒奕⥊䦭ṓ᭔㲍䵴❗㎎✚ᖷ୍噰栩坦┆幅禋杕㵊ᎰⓏ妄撿䶓ᬾ㟭亙哓⃌翭喻ٔ⛭㣻㻘熙䜘⧾ᰎ㖅Ⱕ屎㶚凭䣫皆ọ⊶ۂ䖉拞僖䯊㝫䰂ଠ䀶䗕⁺͔䆉拸◕楳㪢⸆䫁㙼䵳ᰓ∶棶㶺㙔ຎ˺䗞ⵣ᜖斔㈹㜙⯨刲㼦园ឋ場֊佷⫎䪣䫶ඹଦ䗃䭀吵╆洶伺⋔牯僱⋃ֆ糔䪝᪾㖲椅岥ㅅਙ畺ᕖ勎瓷楃ᕫᜁ斌媕㐣Ⱇၵ㗆䍩Ὂ淵哎⬧䃂㵽䪩ⴭ⫯噺汹寋⏒珍⊪仕⩳⓰敝禃窭ᕫ氜新槎嘋┶痍ो䙷庋䛾㋀慺峛姖牳㔄楁嫔⾺歍惫ݖ掍ᙵ杕᭩純清ᨬᙴ䧟ᵥ㳖䢍ᢺ坵终瞾◁劜㚽㕲叨喜檤ᣮᰦ悭:㗗䢎䛿竗涀劮淰ᰅᔮ濘䤋⒚楱⮻㋴溍竱⛍ڛ嬓ⶻ⬁嘆栽屝∔寭曻♶⃬糴䋐慭ⴓ⻜傉呜俽媍㆖璕᠋Ք綈疿᷆㯍媧׷嫰‾栿⸭㓬碕絒㷕⎍曾旟ᮞ㊱涯ਬᛎ䪽啓㥦嘉愋䓕䭩广⷇殀໪㘍䪀瓾櫆倡⸦働л⑶孌惶㷟᎝✏⸙寑呇ⵙ埋㴮犕යࡶ罈♺䏇㎉ໍⷄ媐盎泃吥≂服㎺咖悉䋽⋙㺆磬ᵠᨶ㓦毃嘳㴶䎥๛⅔厈囹䧀湨伊浼㰆㞊淃呀㉄䒽ⱋ崴ईᛱ䕑╪㪬攉樨東湥忻⹮纕⣒⢄㪎಻Ễ殑仍瘀㰋᝙⪣徻㋄洕ᆺ暖矋勹᥆ռ哑ᵌ剼瓟༭娥㉖柍⿺囕礍㳵⏛䮅暶ᶅ娾ᖸ泍帷◦䖽❋渄။燻㣚ឝ伙旁ᯑ咄楣塣㗊䨵೺底Ӊ秲䇏宕仞ᶉ㭑搽⠠崕⌆箵䅻坖ψ䥼⇗᝶䬜州ᬜ盩濹᤹⚦犽猓⫕完呻瓍枞㫈斿ፓ㙪涩坻㹎庽ቒLJ䍎⧻毐᥿ᜃᦧ㊢垉沣幗ⷎ焕כ涴翪恺嵆ඍ岽巨機㜙櫺妛㽖绽न炔⇋⍶௏劌曳ᴪ殶畹浻忪⿼䫭橺ຕ㗊恹䵟㕲䋏市嬟⢭淍囝㝮嫽勃㾕⋫ϸゾ㾼(䀥呿ʗᆶ⚸ؾ喎㢚㆕墊摶捋4灈㵨稬Ã棚䂯㨾汝桉㦣奲␠ޥི帣⁼ሑ熳格ޯ⩮前ᗚ㻴㾲叺⟜佦ਲ㵔篹疊⛇圠ᚾ稠唡ᷪ㨋珰ް⾊Ἁⵃ厅㛓欇偘౾䗴憛紖؉珶柜咅ấ㵬秥瘁⼝噁婾䣝狃猖稏珽ᙣ甽坌爵⭚榺ঽ檷䱘⛝㢺➕䑔寺㟚塂嚵᢮篍皬䲗压䲁ශ㢴䎧咎䁹凟㍫⻾ᷡⲝ疛滸☿㠗೨䞚亡㡆捁䒺䦬㻵഑笵喥⢯ዝ⃎炝悚竨不䟼呄䠢㺴౞笓瓇湗嗈⯗ၰ䄓㔷獄㯰㰲彣滘巬笷૷渜伍⡦஝笚㤐縋⼮狱ᾗ㻇ᘭ篝嘌䧯广⟞桶ᴍ㘔ࠊ矲㟈盐佬䶮箇癕傇剫❮兽儚㐕ᛴ瘫㙽彯廥綢㷃甛濇Ί⥾⏝␚䎔ᬍჼ棓箑溵渋篫疿浠嘵儞䪬桒籂ḋ俱䯑[绅紨婦噓沛哿⒞䴎減䆫䀏濶翇澝՞癐ᴽ畠ᴓ怏㦚悝ᳺ㠗㘋忳ᷮë䉸α䂣學䞟壓ޛ㴝ᾛ䝩痄࿾懛ᆙ⑜̈́ك璻湀㲾᪞禝䳲俄怹篸悒Ţƨ海窮睎浠㳿□瓩ὲ倔不ざ沭١ấۂہ皰ὧ堮㾰ң₺敋⬥㈩ႇല䈙偿Ⳉ∪Һ乀畡殀暝ᨬ佖෱痓Ὢȟᴿ攴ృ殬߀緪ྩᴍ是栔塑傚惨䆽ζܜ箈ᣐ㳈ᥘ䉾定掖;座ろ⃷䈗窛䤄༈ᮐ㋀握埶ယ㖕玅љれ⟁䈏䥼ڃ唐ᣍ䜰珡䠣ԧ椭∺炶䪻ჰ盲⃫㗭瑻倨㯀溂Ⅳ仠羗䄐柼毄愋⻔䍎ݜྴᦻ⌏⦒㹣暦䔮䢲樱缹㳗⇜ધ㮬ྐᵐ㣘䉐ὣ嚧檨䇅ಳͶ熠ᮈ㑍䇋笟潖儧‡焝㽔猯㙗䏎墑䑆䩆î篢Ӡ炐ߐ穀扣䤓̬刾ౙ⬰烨ↂ♢ᣎ๹⋓֐暗಩ᛡ䔬ϴ㱑㇪㔵⇭㦼ۮ౾淟壘币珣棌লĿ伫䴧㄄�ґᐢ┲枘㓖⩡䳍⦪炬愿๬䒃ኄ䭙ࢋ䅾฀㓤㦈₁浣↧甭糵扞ᢝ㖩ᆤ碴ቑ楉Ⳕ嚶ඤ堠⩦ࢮ☊䱷⒁䤘父⎁䄘敿ಬ૏㣸怑湧ⅵί⟴䂂歶㻕緀扺䗉៨䀽㱪ὃ⥦䳥㔡煹䧚瑢処⍎珺ᝊẲ厽䍱卑䘠柣٫ᗤṏᒎ凖㱱-ഘᨧ噈羸統捧窮଄³㒔棽凄燧悭䕊Ὴገ畱䲙畧溭洹᜵䓉椂磺᤾ᕆ㔧䪊᷌₲㧃嬺∗䔻⬱ಎ㲌ㆬ⑩戫卛⑔㩴㥑柃縓庬媯♗璊ၚ㇄燋䤵ຟ滚ᡸ捑䤥湼▭㠤機䕲备v㧶ᇎ䛀լ㨣ȏ⋣侊ጕ唽ၸ沋矗㤚六䚳䖒䒆ᵩ嬈愃ࠡ痥后⭽務ჿ懴䎗偧ෳ෬㩘玱泃校䃄枔⣽᷋挪熨摜䇷බᢴ典箑嬃緍F┽⹛岄磲㢻⏭䟏๦᱋唗⺑痃ؠ窯派㹖枧⣧ᑕ哲؏䚵ච䳈఑塮橫ඔ縸቞㢈䤟㚋⎿䟩ͨឬ㰘権彰⚂㸚亱繕⥅㱞燆ᖯⳏ䟯燵旌≱瘳⚃儮㜹䩛婇罩憺䍡笊ས᫔㉤粞䶃׃㤬ᬿ㩒␿༬ᨲࢂ䄂ዽࢭ᠔⦩䬳ᵠ尲䔠煗㩎礈冧挰♺䐾؂㛤恩坈ⅇね㮔䥟抐ⓩ涋冟䝹͡ᢇ亾ᷦ儳秂ⵦ咸ŗ䲇⡇໖捲嫕瑼Ნ㯄縩惀͆ⶣ䅊湑㊟礚䨋ጢ䢳䔟掘寨碘䃀㝻羕ఽœ᲌擸䦹熾✠⛙᳞Ἀ棢ٴ綦溯䒿Ֆ傝Ԏ㫌໷∺䬸▪㮸楉䑳ᶝ౬熩坫咹壤ⵧⁿߢ啮Ḙび䀁申媃奮䤺ӥق哳ᣨ⎿⦻෵Ḣ冟⭖徕ᅧᑯ㐏ᥗ䩑唃໐捍⏚乁Ỡ㏘淿㮳ࠃͭ圻䕟৓ӱ燽揇䛦䳭ὦ婴⥹ު挠᫔僊ⵛ攥㔐䨖厶䝘㘱毕棁䎉杵㗆ݬƲ᧲沀⬹ສ方㬝栕᫺㡨檩滳僳㝯ጏ畐媚⪋凯絵⩰咚ᯚ㘤戉乥Ⳛ▴纸᫰Ã椇ધ⎆䞁㙍炦㰈缱䔳篆ᵬƼ䵳ڐ㝍ں祈暼癍煴㤝㬹屓搦࣬皺⍑዗೦᜕幊䙊㓗⎂䞗㊹嬣০ᩕઽ祒⪖㣱ᧇ后⤿睉泉፬洉檭緆爺຿拼᥇䴚槳叟✜価ᣇ಩㧆潓旆灵ֹᵒ媍甉ㆳ׵⫋౭ῗ兗⾉勓ႇ╶喸哴䊞䅭漜Ꮒ暹候ᢶ㻮㽹箅孛确㣎୙媊ച潻㎊杪九὏ᤌ硎箵䞇ᱶ⣨瞅⿙╵勩嗾晪ဪ᫥ᡴ槎籓㿇࣭䶸ݔ奇泡䜄姑曅唻ᶥ埍⣹幓㛆Ӯ䒺䝔❂洘ᛴጤ䅑俍珲㻄砆瑓䭇o櫊⑜⪛ޟ槌珱㍫䱙ᡢ㼌燀冓цᕕᖻ巵嚙㾒懦緋ٹ乷⵶㦌懚滓毛˭慎䭟暎瞊䴑獂曳䵎梮㡬盙孭瓡叮㚾◵ẓ泡䌌㕅縑珂瘖㍨祼娽Ọࡠ瞾嘬຃⺈㦰ᐁ曥䳷ᤶ⒡㓊爓㚙⟭ຽ཰纗㳳伕廗➳侽Ὴ㲌站撓將嚷Ẻ㣽纑֔抺禿曮埙⺚㗼狮侓₪⳯䯪Ú⧃紉称௚氄倂Ђ㻤晩圳榻狴Ⓖ惕኉⓳娆㏕月搰嶂㣄朥垵↢੯ぼ煞纏ᣬ4掼毶礆ᶾ㺛⓹磓7狷塾ß䲓㳠ʫ㐈⪤⻇ᦡ㬷⢞簫嬇壴玻孺ᆍԝ窺厯欒䴅Ḟ㏧䀙毘㇒⩎⪽qዛ⌃׃啋朹㑊橑㛂普专䴷嚶౻㭛亚挜姓受䜎盾ᤁ㖧㵥䌓Ḷ墴ᩮ㣖篊ၕ燖㗞䛟伣ἱ㚯ㄱ偅ᙳ䃯{᷁͞窐䗎痎嬓䴊瘩ㇸ毱兕Ջ㉏䟈۳䵚洀䗕却笑̠⦨㩖〹拳㲷澭䱹凱㆝䚑◳㷙䈒⽟᥉㭲縑槅㞆忬決ⓚ㊛䌅䘙㕖ហⲏ᳋垣♙傓挷ǭᗷ㓗㟙波־᥃ᝧ櫸尹㛍ҙ粓↶ˮᙽ೜㊔㝥凬猾ᝣ❬庴㑲濼仫̆ौ䮹❖䊜匊续䭽ា㛇ᵆ㒒拆亃㯛汍䙽硛溑㳣ⓞ஖嬚␨怉㣗巙搫䚣ᷭ噼ϵಃ⋵■猣杶㔜帾㸒皥愫⨶౎Ὲ僕䆚├ᖷ௼㯬Ⲣ尣᝼昵攫稷㉬湼⋔↚䋱囂接ᘯ亘嵕偅㧉䁝建≭簻睟㗚壳༒⯣Ꮹ䴄崾啿䉤ᐌᄷ╴㥾㜂↔泶旍珜埛㯴娊汊紤宍䪲ᣯᙾ䫚䖚❥▬Ⰼஜⷞᷔ㪬掹垫ᕷຬឯ瓗囎㔐樞帒櫯ഭ᭞㐑⡱䍓Ⰶ屎⩼拑୏⬎旒⬥㊭⾭ᵔ夂瀅憓ᕷ糎㩽˔❛挐✅⭏䟡俚岞崂樅䛫㩶摏冼ۑ֍欟喥䭍ᝂ瘔䮉㠪暵盳ஶ廎䍩瓑禘㉿◖涨᛹似崡䞺洅卝ា孎獺⌌䆀嬊ᝀ浝ⷋ΀䟭㔈ʰᶋ⋶⬭⑽ᛓ⽁嫳㗈歕圻⽞槵㥳㷵⦫〆狭禹佒඘ଛ䗫䯀娴㚸差㱚晹䴕孷秎ᵹ䵜涎˧۩䰎⮷⷗棍㗚敜堫》反捸᫗冐笝䗵殲៷⾦塝㊩㿠ഋ᮶珎ົ㝛⶙Ԝ㗒痯噝⵺婵ㇺ朩暋滶痎䵊獚憒嬍᧡⎳䛣倃ι㪺竵伹䁗㧭㦾㫙喒ഋ嗟⭆䛭෪怟囚粡宋䮳㋏x捜疌崑䖶獐⛧⿾ᬭ㶦犄焻㕒ᒔ૪凐熐䛬喦ᰈ㙷眶嶍㥚橵医ἶ璌⪈዗ֈ⓽滾ᯘ埫俚泎㣬瀙䔋㓷ેᢽ䋔ᎎր丄⮗␄㓂ⰽ㠒斌痩᧷⒎楹ᛙᶏ⎒䶬殈柏⿉廭㯛㳜俳箇潬㽼⫟嶑偤▪歱᜛⼜幝㵣㰵暻ᓷ撌瓺䳞֘̉ㆾᬡ᝿ⱹ彝㙠挾勋孖擶ᕨٝ䗆卲䗩獪ី澗ᣝ㖦維呻糇㋬檽᩽䚋紎᧷ᬹ柼淆寃ቬ矵歋㻷積ùᗗ஖ˢ⸀寶㞶⛥帡㿂瓲砋憷濎˾䡛ᗝ̃ⷆ琋㴺溺⽾㚚梕夓䓶摯Ի佝㺊朚׾孃坷䷵堻㾂潹挋斷㯎⳸䧙䖖果渄嶫㛻䶪楳㔆狚囻䇖哌粸嫞ᎊ۷痝宇垲痸岻㢒缅檻㘷䱍᛹ᷝ㎑㟛斣ᮭ˞ⳬ䊾㥦※ᤓ⿖ⶎ䉼嚹箉㉼䴿孠皴機࿉⡤ཀ䅫浆㐻䇹瓉ޓ圲㘋絙㟔渫㗀漮槐ᑛ୔焎䞢ញ䞊䝕▝檕ᕒ琎坋ㅂ桍䲣彙┎皵༢嵣网䉼ܚⵯ䶡眘㐕Ɑ宫䟖䀐᧸㏍夫伈唳媆泛⭲㐷ㅚ倍千屒⌎筲ワ䁸捬摈䣫尰䉓嫣低澹䭛ఆ洍໸珛䮐戢嶰竴㝬⃋屷㸶䧸䟳剶粈⋴ᬱ罭朊Ḍᨶ瞽䚌ᥗ㤭ੲ⠬㾔绬嵶㯖垘槓旖ᰙ硝洓嫸䠎義ఊ࢖䶢綯㻋䞐䐵嶴㭞眯䞧墇䤾會Მ㲖篏䃶⟛᩾Ἀ㶼仾睏⾔僯㞊絴⪛䤗猑䔃晑ಫ┐໷⓿䵫泹᪯㤦筽暀徙嘌䷫ᓈ澂䉭㸂筘₋ⳗ⛁ܕ㏍⎛❡希ഥ埚ᮙ㛣㷊笣瘨狹ᣓ࿾瞚┛⭐殢ち橫ᾇ廱ᘥ筫眧涙ᾘ涾煍擀㘖ᐌ培㍢磝㻼綿ʫ睆⨖ୗマझ稛戗ᛍ⳻⿓㾐绹縎౶〠qই㿖㶢第K沊㡨牵䔟スḝ令䛡ㅤ夥�笥■摳⬹Ⅺ⊓枸渡罝淤倮‾澊狓ǡ桃が㮰ླ孠㬲ⶠร柤䐯堼熆႐➟୞႕炛期ᔸ哀犊樣䙠൙峨ࡘ搯Ąⲽϲ刼༉恓ហ࿊琉繀ⱡ㰿桝悘愆ȑ偢ނࠤᴨ㴀珡柽Ἃ࣡栣⤹傘㺦籘爁‬༺ƨ㡬Ł泱⪧ᐅਾ㟳㵄ղɱ䎡昹ࡔỹߠ珁籂⦧ᴶㅁິ峉励嬐ْࢉ劵焰䆐璊ᢼ֧☮獈塝ᠦ愉簧䏲ࡾཱམ㤨緆⸌௥☧ᥗ≙Ǘ搲䡝絕恽夃ψ㙺䜱既٧Კ亡䘱撕侔᫭嶥㒙๰㄄㻧޽੪ੲ犯吳䔗碗0ᇮ届䠗派ٔ㹇勇ࡾ孧〗Ґ翾ᇪ嶸㠦偖\"⃈䁟埝䌠ʅᨐᵄ仢ݤ⢬厢笳ᙱ᜘䆆ᾮ↸硧ট㴀的欽绦ಜ爬ㇻ㥩䟱Ⴤ፽厸皲㄃垢㖮☫朤呤傝㇫穖wབῠ۸畘ᲃ媲㶯牀๘岛㤚弧䄯䞗ྯ礜䀂⠥∠⭑ᠽ¼熑磥夔ㇳ揽䝨儯冂䇥恑粐ᦜ㡮埳ᅞ慠⣩⼶灊滤爚ᰩpॶጳ绛缰⇙廥-⓴䨊♛椄交㊠ۧŐ䵘柆㩯弶ቝ碬䤖ⶺ⏱ࠍ磢ɦþВנᑄ䙯╨՟ʧ愺䦨厹ᓠռ䍖ܸ約ᥠ␴ᢀṡ潣ઔᆯ䉐厱❪秐ƪ㣨䅉磢ژ祠㊽敘ठ唕ฦ厷ц信†łዩ㔏癖叉➚亀˪㡝䁄ᦊ㗇өᚿ䅠 ቅ䘉曳䯼䥯㪼性檔甀ᴨ?✩䣝ᷟ䃟㌮稢῝౰怰朩㟕࿏䉅≖㲎❒㓆㦐®ṓ檇⨖榀㍞ᄼ໷ˠἢ窩ᴩΰම䧛䇸ᓰ壃ᖿ᢯榩碶娕㏌冭优枱玱ў罳ምሱ欆仂皑洞⾔流簊ㄅ⅋攪ͅǕ暠㠡ߠビἥ焔嵟䠫⣡䐢䎢䄫঳㩌ྫྷ৮厽஭亗刹㔣ుహ㇌≀ռ稟㤓嚇㯰枿䝃ẚ剧೒㍃ᐥ˕ᰩ埤;ɒdzხᘂ潘♡紎䲯䆒砢⚼䏾㤬㵿⨔ᬀ㿮剂ÞᎢ⒴㰼�\"串惉ʜ炀ؓ䆝㺆↾䃛๞̟ದ⅐ᜠ⻐忉䔪ਖ਼沓䙤㾑監Ყ捇ᴚȆ琉柉探䊽ٺ䡀ಓ催ُ㛁廦ࠡጩ⼻ం㡐ń熠֢絢ᗆㆤㇹ磂ぇ䆐㮢䡄琊᝟㡈彃│繙Ꭻ泈ő汼悓㆔匸䗷壍ႄ⿪፩㳰緥瞚ἷ⫙ɾკ庫㎼◶玹柔⹓͍ⅲ猁᫫硈 撖⺩す㹇๾ர༨兎焽┥稩簬泜ゅ哮⿧ፙ㿒甅旫䐠㝏䙿栢ᒥ猆/䰎㤓体ə㰪疆 ࿒⯂ⳉ⽢徥㤒电篫澷幯瀢⫠斞Უᘘᑔ埴䳪峩▒缅稣枷峎煽ൟᒡ⬈⌺⯲坪⽒㝅㵲筣჋劸曎檁廢斠ጠ癆⚡埽ㇴት䄺猁ʋ䎴㒢塄曘劜䃮㗾嵬䆏よːɷ䫕紓橘ා掰㛞⣣擜弈ㆩ嬛⿞ᕡ㭬ඡᐐ஀ⵡኾ↤喪㬗ᨖ摛堟਄ᆌ㌡௾拽Ῐ柎ⶢ廜䆜㬜瘅氋圳惁၀↚糾曀灗⿏乯縄㶜រ෬䩛垟⺁倣㣼ٿᘻ旂䟎ᕪ⺺ȉ⮳㗭䎾半㇑嶊₴ޱ浾兗ዮᚳ䎶毡柔䷢㱒炏⸣毇䁸㳻ዌ͗篏櫀姟俒搩㼚Ϭ䵕棙忤㦍䄋ᦖ㲀懡寡滙⒐娹㕏ᰝ岋䕙嶑朥֨ႅᡃ楖䓐ᗘ䙥᪹ⷹᙶ洂澥嵒Զ粕筻䑷漅ᆣ爅㤢࠼ሒ偙柹㐽ğ扜䞚ᕻ勗ኙ掳淟⮗ឭ瘶။ぺ⇢╋枖疾㽄緌䅸䋿ણ殝̀済䯃㞼m屲͖竺⋻庰⮎Ⲡ淚Კ䰧淽㊜䥢ᡳ庛㭉᜖\"ዉ吀瓼ᛱ枒㸯兗挀瞉䅣彠㶭䷍甶㌠潁͘㭂杌ᨮ穁㮺ᄔ丳ፗ㯮罞犉ኧ牛♁ᬣ狮Ԃ䠸寔䇂⼇㍦枞ϋࡻ橌ⳉ寡Ꮫⲥ漄㕜箪柿䙐ṗᾺ网喛梊圆䌩䘱掑ឳû厘╏⢪ంߚ䇙竐ҷ淮ᙿ狝太智ಒௗ杆惱ǹȤ眠ᴆ⣀㖀ᅼ㤥ਠ\"℠Ἶ㪠㙠獋ᛄ㪶ᧁ箻哼ི玂ᮀᾨਧ癇琎晼棛亜㤤⡂ఛ矈⼿崐ڞ緸ป䠗兎忾翟羘Ȉᝐ߸ཏ⤧ᦰ碡煡惠㞀漎坯ই戫∞Љ䯩᝛佮䃀緞紙疑䐗ᐾᲠ炛๗䈚ǡߟ矏澨㱝敁獣碆堯☿尾梞婬㼒␈傋┃丰㻐竞禣望娯渾ᡞ碙㾛䈄剈䐁ཤḭ°繦䢡๧䲧ି尼暁╀Ⳃ᭓ޫ砆⾰㼜䔁璥筧奰崿籟忘ᤙ儈搈䞳ဂỬ㷸砶૫ᡇ十樾㍓撙䰶ਁ䁒䞬䑴⽏彘窞笃紧䞯徰籞忘ओ爖搿䞠༡ὃ灨粩獁棇眧犥᣾尩伣ㆾėᐤ佮ἔ䂐竱笙杧穯㴾奞㿛๘∟揰߀倓粬è㭉疳ʰᙀ䘡歳⥖⨬ᨑ熸✫ݽᢦ㲬籄繓溇笤兠榰᚜䴒䩹㐊橹例Ẑᾘม燓疇棯䇭筝㚟ⵦ㚺Ć⛆捛ᾩ㩇∌㙲忑宬䮾泦⺙䥭ᨎ㤓柖䜗Ᾱࠡ慪⸓欇䝎怿㽞ݖ紜㵷ൟ椁捇員㳜礰磭ؕ⑏㚬ნ↬ِ২娏⦧爈揬ὢ籖䉈ဘ穑屆棜仳㚝洊Є�➊笧ᷠم籼⨷滯撉Ӝത匚漃ጿ㎪⽓灩㸘瓠纠Ʒ纗⩄᳝㦞碙䘈䈃ぞ⽹⌰Ḓ綰䎃୒ᛀ慿ឈ▞樬ᘚ䰕栄㔅Յ㿪竍䭋橷歏ⴃ⦳▙䄀ᐾ⯦ឺ⾬椕㺊粅瞄䠝䧏百ⶼ᫅ਨ縦姷猋⃶徍㸜禣法ὂ㷏⧁ໝ⑱拥㘑∍埗礉
vˤɫ珐ᢼ栾墒⤥ୄค᯸㠞⾦廑㹦簭秠ᡗ嚄僿෩絀ܞΥᰒ浸瀞廃㽣壏㋆ᅗ扛罙⽞処᜔箨⌥㟷絗∓㸝據稾᪳㖏竾ヲᮘ⬟稙൓㟡ᫍ彇ᓗ峭秳⇗䂘㳾䧜官ᢳǫ尜戃਍幽㺖耍硌犗澏ᴌᏟ䣲䢼Ḝ݁ᴣqᆶ櫘剷䳻箚ᜏ滠卜֚㞗ḃ㯡矼⿡䔗㳖ݝ犖姗用˿ݼ瓣引?丐甅哯忹倂儝焉ᔗ瞏≹䯝掜⬘暠࠘爠ᾋ庎皀䈢眎耜⨏㵩⨗呞἞⸖ࠄྫྷ澕开紞篍睔ȗ瀷⋿⟝ㄜȑ渘߾ྸ悿徵⭖翣縧纔䠘䣇‗ᮝ㱼㊺㰉㞗濇怈糼᳝狧窯䙳ᦰ৥匡㙓丝ᰕጾ῅⊃㰩粃缛妊Ⴟ㹞槝焺ࣩᐄ⠙碑⼤䁤劄湵統瓗房⫩櫟䃂樞Ի㰼ѡᾈ㌊冩缻慇烯溅㊴窝䛇ي㦈㣉昃—絅巹筼⃂籑नᵨ⾓㦚懬氪[倍㳿૫㰦᎓纪㹡亖潟㺝ㆉ婂℧喧俵筱㾢紹έ缻村᱿ᣞ⳰匛稕㌤ᠺ㊍⁼ᇈᴗ㱠ַ絒⹿ɞ㏞ᧄᘓ䰆簫䊒彺䆪缉磄ଷࢶ㜐۟仝ᤞ⍤氐ఌ倚忠幜ሾˤ௏㎽⽿绞⶟䔞⍧د堐廷㪣㹆籙⊻翇爤泿⍞۝Ě挖ᰆ䐱保㨫㻪ᖠ下硂产噗ᷟ玡呝ᓡ吂纡濐j㰑⦭緻秞埏獿秞ࡢ杄̔尐䟪濻弽㿰᧝磥捗戏懬䖬塆笝縓ᦙ砉⿷彟㾦㈝絡ု簿昦ᦱ֟᷁䶔垮࿼氀㿍㻪粌羧畍岒቟⦍䊼ࣙ䄍䀨䗲乶椞俦ᱥ㼜笁皨ⷀὁ湱ᶣຑ䨟⏨㎢㾫仪⥓竓o漿晭皟᫃䫁ᐞ㸴☙ῃ⡴總䃳耒ݯ症瞯䚟䱾䵚䰚唃倇纭➤耜爊䘇痺¨‷䆟盢ᶠ⺙䐾俻⠘坘Ź羮⁷狥竤˟㦟᠌♣ᰝ栈倃〵㾄翵翆ȷ痏祌ᣟ⼿ɟᇂ尚㔋倀㈹礆翃᳤䐏࣏盢㋟ᵯ┟稘㰙⠓⿨怄墺冕籫翷砿禿亖䔞㼝២䰝⓰῰䀀䓤罣縓纠灏燿咟㽀⼞搟ఞ砑䵆㿄耘啋翯孄ʿ窳⌘祠娜䫣尞လ䘁䀊㿥羿䄋筏綳祏澘從嘟ᕴ㠓9㨋価羉缝縶秳ɟ絟泔土稜␘ᠤ砚ῶ⁷㾹 繫㯏簏熫炂娞搟Ᵽᔙ巵瘈羱柚廊㼿繴᳿濌̟儮؞␜砛⠔忻忞耞ُ絤䋟瑟樔ሟသ东丟岎耂䀎倃ᘉʫ耊‍䀉㬫䀉儏䀌怄》⠎怀栏堃耄;怀傈5䀀䀀4〥 縇䶥⨁0㌥;㈣2怅瀀䀷堌媦⨊䀻わ䀿者䶯䀳䀳䐄岠怽㠄堃倇㔊堏搤怊‿<老怎々䘅‽‿䕤့‵售噈怽Ёơ်怼ဎ怰ഏ㠎瀀而᠆‷怸䀼媩漬ြ啩倶္倹ဿ庍ေ⼧ 栋倉怲‷:᠆倱‼䚧倵耊矁္䀴ުӍ怯值儊ㄪ纊䀆ἤ‶堄倻8耍堆㘫瀂ഁ瀵倴索࠶ဲ࠺瀿䰉࠻ွ個㠊〸倵匁瀂倻怳瀂而࠼瀾7〿ک䠳᠆笩㪦倆䀉䧀⠷者瀰䠶瀄䠼值砍瀈࠾䠿堂⠹瀴夈㪨‍ʬ根 ⠹翀格〳㠎䀭瀵总瀳怹〶䠿怺耎Ṧ栴瀊࠱ギᠵ䠽ᙩ怯。㿉య』‎⠸怀ᠱ〳ဌᠾ倳〸堲栱࿇ᠲ栵濏堾栽矄㠱ᠻ࠲瀂堷䀍怾堶怅〹怍堺㠳ᠷ堳 幨儅࠿∀儊ᐠ‿笧栾〿瀱堻⠲ᠲഉ砹ᠳ匢жဲо破ϩо㠳䀉㠽=㠿砻㠹堽〸暣п儅砸瀿‮㜁⠀〥й歬ऋ་∭砲ခ怸䠹梡堄䐾‿㠸暨␻䐺б㌧␴㔥䐴搾䰬0㢃䐼搲␿ံည堹⠷瀲䠴ᠸе堻␹搶搰搰㊦ᐼ␵䐰焂瀱栱㠎Ὣㄍ搿࠶␱⠱␼䠽⠽␰ြᝤ吽䠸佫吸ㄎ搨ᠮ搹䧋ᐴ砼堺吷搾吵⠺怇 ဍ吵坤吱ᐸત琶ှ㔏䐱㝮琻й>⠲䈇砸ᐰн䈄п堅琲炪ఱ㔂㐹翎琼吻栻琻礯琹吵吺ᠾ⤭ష吶䬪䰵㌡甁琰ཥ䰽琸‷ఴ缀䰻㐷㠰琺䜫䰲炮ⰹ甉ర吺ㄥ䰳఺瀇琸䐰఼䐼ᐺ䐵䘇ⰶ䰽夡水椥琨ᴪ㜈涂䜩愭愫愥䰩⌠沢禪ᅀ䄦ᨪ礪唡ᰨ㤫䈯䄥ㄩ枪續䜄搫湫癬ᐧ२攂侥渪中⨮丫ᘦ䘭丢栢%࠭帣ϩ䨨Ḫḧ疥刨⢇栃ိ․娤⠥琢╯㺪爠焋䘡唀‬␮䎨䅧椡ศ帩瀭‣簰ሠ㤮爇,ီ大⸨ⰨᰩḪᠯ䀢Ȱᩫᛮ婢㞨嶢਩唬吩ᦩ倯备猇䀀管Įᰲ刨䄠倡縠䈼匥∦縢∰℥爡ಠ卬枥ᤏ傤态侩瀤倨䈹䰬ᤃȴ䀧䔉瀧瀦戶Ƚ礠ȳ瀠ℭ䀬⠧戵ࡁ␢䈳縧㴠ĩ䈺ᐭ䈶礋䈽?䈵縩ഫ稩∺∲刱द昮刽∶搥攩㸪㞠戲౤䙮٨尵琡䀣䈮簴ㄉ簽䀨ࠥ簶∺别氦ᄬሼȶ䤫氦‬ħឆ䬪ਯㄫ氨⠯तȽဣါ爸䔏Ȳਾ縠਽ဤ倡唊爸爻␩ਲሴ਺戶爴䀬 爳戰父㐤爾䨵爽夡瘮ਾ䨴尻㘮䰥ᨥ硫⯮ἃ栢氦⨹რ䰪଩尦ڣ䨽䐧䐯亇Ḫ张丧Τ  "}
      

    The complete round-trip took 49.1 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.7",
          "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-9529-kW32FKPOo8gP-.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-9529-kW32FKPOo8gP-.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-9529-kW32FKPOo8gP-.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-9529-kW32FKPOo8gP-.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-9529-kW32FKPOo8gP-.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-9529-kW32FKPOo8gP-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9529-kW32FKPOo8gP-.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-9529-kW32FKPOo8gP-.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":1}}}}
      
    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 13.7 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
      • direction string The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
    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.7",
          "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.3 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.7",
          "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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-9529-mMCLMQPZ6QWA-.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-9529-mMCLMQPZ6QWA-.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 30.3 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 and optionally also updates it.
              • type string [required] The type of the query. Allows only the values: 'config'
              • update object [optional] An optional partial configuration to update the current configuration with before returning it. Only the provided fields will be updated, all other fields will remain unchanged.
            • . 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', 'useless-loop'
                • . 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', 'useless-loop'
                  • 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.7",
          "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-9529-xe3BBBshclu5-.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-9529-xe3BBBshclu5-.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-9529-xe3BBBshclu5-.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-9529-xe3BBBshclu5-.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-9529-xe3BBBshclu5-.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-9529-xe3BBBshclu5-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9529-xe3BBBshclu5-.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-9529-xe3BBBshclu5-.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":1}}}}
      
    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 9.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.

Note

If you develop flowR, you may want to launch the repl using the npm run main-dev command, this way, you get a non-minified version of flowR with debug information and hot-reloading of source files.

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.7, 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 4.5 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.7, 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