Skip to content

Interface

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

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-05-11, 07:31:27 UTC presenting an overview of flowR's interfaces (v2.2.12, using R v4.4.3). 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.2.12",
        "r": "4.4.3",
        "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.2.12",
          "r": "4.4.3",
          "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-7802-T8o0H3xIxnIT-.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-7802-T8o0H3xIxnIT-.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-7802-T8o0H3xIxnIT-.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-7802-T8o0H3xIxnIT-.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-7802-T8o0H3xIxnIT-.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-7802-T8o0H3xIxnIT-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7802-T8o0H3xIxnIT-.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-7802-T8o0H3xIxnIT-.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":1}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":1}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":4}}}}
      

    The complete round-trip took 16.9 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.2.12",
          "r": "4.4.3",
          "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-7802-IGjgQSXuYtIo-.R\"}}"
      }

    The complete round-trip took 1.4 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.2.12",
          "r": "4.4.3",
          "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-condition","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-name","25-exit",24,"24-before-value",23,"24-exit",26,29,"29-name","29-exit",28,"28-before-value",27,"28-exit","30-exit","31-head","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["15-condition"],"end":["15-exit"]}],["15-condition",{"id":"15-condition","kind":"condition","type":"mid","root":15}],["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","exit":["31-exit"],"mid":["31-head"]}],[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":["25-name"],"end":["25-exit"]}],["25-name",{"id":"25-name","kind":"name","type":"mid","root":25}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":["24-before-value"],"end":["24-exit"]}],["24-before-value",{"id":"24-before-value","kind":"before-value","type":"mid","root":24}],[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":["29-name"],"end":["29-exit"]}],["29-name",{"id":"29-name","kind":"name","type":"mid","root":29}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":["28-before-value"],"end":["28-exit"]}],["28-before-value",{"id":"28-before-value","kind":"before-value","type":"mid","root":28}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-head",{"id":"31-head","type":"mid","root":31,"kind":"head"}],["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}]]],["15-condition",[["2-exit",{"label":0}]]],[8,[["15-condition",{"label":1,"when":"TRUE","caused":15}]]],[14,[["15-condition",{"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}]]],["25-name",[[22,{"label":0}]]],["24-before-value",[[24,{"label":0}]]],[23,[["24-before-value",{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[["25-name",{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],["29-name",[[26,{"label":0}]]],["28-before-value",[[28,{"label":0}]]],[27,[["28-before-value",{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[["29-name",{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],["31-head",[[16,{"label":0}]]],[30,[["31-head",{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[["19-exit",{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]]}},"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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-7802-2DKntIZDfDsm-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-7802-2DKntIZDfDsm-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.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-7802-2DKntIZDfDsm-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-7802-2DKntIZDfDsm-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-7802-2DKntIZDfDsm-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-7802-2DKntIZDfDsm-.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":true}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-7802-2DKntIZDfDsm-.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":1}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":1}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":1}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":1}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":1}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":1}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":1}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":1}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":1}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":1}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":65}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":1}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":2}}}}
      

    The complete round-trip took 9.2 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.2.12",
          "r": "4.4.3",
          "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/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"}}
      

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

    Retrieve the Output in a Compacted Form

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

    Requesting Compacted Results

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

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

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "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尓ࠍ侓⪐䭃ឈǏ穝嵻⛲  ","results":"ᯡࠣ䄬Ԁ朥ᢠ⹲⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠᥶N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫ೉ҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨㾠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ౤䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥ௔う᧡㉕ࡉ᳎ᨨ漡╁Ř⵬ో੅ⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ᫰气፾䥓ѣ⤀㐽᷅ᥰ⒒⬮⥌堸∕絬敝ҁუ䕞ⵇ⨋卍䗶┠㴡䎫Ư吐䙠YᒟᡦŲ�=⻄㺀⺟䅪⑀愶ᕉ,䊕竢䇲㫍䷰瑄௴灙佔曘ა勥哗ᚵ嫒動彆䅬凖㛍巒癝壷皣䂡ฦ䊰暡Ф仐⬡仌庒䁀㦐勋䃔℄㎔઴䚲ປ䄒愇䴑ἓ嬕弗䨕㼏吖统怔Ŭ䁗ᩉᣧڐਤ櫉䲓爴嵪℄╕Ố↣⤺⭬⁗ೡ<䨦眈ف䀩પ⃶⠩�卮㪌䬡ࣹ䆥暲快ㅈ⾳ᘵ䫑嚰㹦ိ䧑㚑傮瘴埖惄㲐凚㒦㉻侭湀ᾗ冹䑩ষ䜓帯䘓㸿䰑纟䀫ㄼ⃋冲夰⺊䃦ࣺ坴恠㓴ڹ䋲婰۳婬䰭䛎䅔㰻š䅀⾱⥡䑗ڱ婗Ƒ壷ⲃᥑ槎㍐ᘳ⸬䩧␢ᙅ屋ⅱ㌮浇Ⴇ䘘⥌瀽䕋┹ㄢ⡹ℎᓔ⪐㇓应⹨㧈৙㞩満棊ẂⳈ䦵㩩喒㻌⤾▭盀ኈ䅓㏃䉐┊您㑌巀ɏ⇱✻粽ሌ◪奎ᆝ妔ພᰈ曟㗈ͬ㡧⍀涒煬䞮漜㢖䏢㘻ਅ㉪啒㛏䤭⥩આ䡗ᦁ卮楴㝭Ě✴ᥬ士Æ╻⭶ↂ㊖⇪㥎⍗㦬叨䩰߬奀ঀա⬡㯤甬䔸㛑淴眨┤☊ᇉ⒪㍨᠍⃹⁻新摺ॅ㱸弐橮嗒⻈⦭㴏㆜粨玹巌炽㯉檚倫匝天ᐜ偞㷏↿☁無斢罊䌩搥ᔲ敞䭨损䬳怌暳䖲੭⾼倾㜷护䦋ኍ犝專᧰䂌ǰĎ慸恲仵䯏੪⧠㘳☺ൾ⦧洘榋ᙵ㡄䇦䗖硋ጨ䱹㙀穿Ϳ尐㬝䠒⢛䖈ᬔ䘈Ⲹ恓ӳ᤭秠Ḑᕟ矬堄嚨˭⮿㥗ᇫ⢳ဠ᮷ʸᯀ䠪犄䍩䅄䥘ᒯ࠮吠㕑䅠┰晰<䍋䁷䓨凢䏮傓ܾᄂᭅઃ⛠ဦ⣚ு索˿墣ၱ穲ء䐬愠レペ䗵ᒱĤ㡥のܒ㺰嘡゠⠊冸䫩忡䐴㎡ᑥ჈楢࣠Ⴐ传ᅑɂͷ䧤⦰側䟀熬⤁ٱᒯ㈊᧡㡑Ô㎠瑾䜘搪ᣬ枱伽爖ᅽ㙂Ⴥᓀ䈣䘠厨䣴ັ夵৆ᘃ晁ኲ㌳ゟ䜒ᑁ奘೬粼䤢攢げቬ⳦၅❸籩ⓑཀྵ㜳ᄾᎳ䩂ᄪ⍥၉⒤擅甊䢩㤿⧙ᣳ䵚⁠ీ扎䍈ᕭࣤຑဪ熈᧲畚Ꮼ⺄ᙵ⒠ᅨԋሹⰫ妫ႂ㕐㧦㮆္杄屩䳐䖉ᖾ椻ᖲፙ⊾⿥ຉ孒⺬䩏伩栵㧹ჲ佁琘‡綾る㙓׌撫㳎䢉桷囪俙籴-ᇐ戥ヤᐢ劕ᝬ廪⧖湲‵ડ㛇⺗➸瑈䌇ㆥ幧Վ᢫ᥙ୆․卒ࢲ♍兘ǥ㱰╤啤Ⓝჩ䀇嶥斬桌猉倁᠍Ⴎᢅ績௶㶵㚍ᙀ⋉�⣥慭䖮⑋Ӝ䈬౶䰤啟໌ᤀ⤅攲縬倠呬勊櫍䯼㍴᪓嗂佋狣ⷥ丯䕆屪͜⩮㍓㵵ᒢ䟯ᤇ⢅䏢畼⫋ⳃቝ⚴ᩢ㔚绋犟⹕ᅶ㗁冋懓巅㛶㶄摆䍈]⊉㊤⵭䶾䶳፺姗䨭⁵඀㜪槏᫘ӕ䥢浱型晆娹•ঋ㥗歧⟜䷨件氕໰ൡ徻㷟嫐ẕޙ㝈䔈㊠ࠄ仗⢍姵唧僛淐⫛㡖䖁㘖熋ọ檍攰㵮帋䭖ે㵵厌坈揌䛝⮍᳴嶙叻㟝㩃㉔涕ᔞ沋䚻হ+恣䏲䵓屛ࠩߵ孕㆐ൾ欋Ȃ泣冶ⵯ広ᢜ㮰楶劋囁剎漓ଽ䩛嘈堦㢒穷㐮၉᜶挽ᜈ᦭䐫挬倠籈㵚璔䜰ᑯ佰࿑瞉ێᬭ㾴绲㤚り⠅⭁䓷癖窼ࡌᶃ繷᏷偻ઈ宴硉礔㓼纹৪ᾝ晹縎密ʘ⚸怮ទ倁妻庫᫠㝕㐈〶೐∌祵፱痁紼⁰塓余洼デ岏杓ᙏट೹爸㊠Ն昍ẓᏰ槙㜶េ᠄朔紘ಠㅿ☋᫵拓䮧䞶咍紋❮଄枅卹ᗹᭋፖ工嗷䶍☤梎㔖⹚獸㦺ἳ൹ጳ㱖Ẕ垷㳎䴒⾲䋼؈峻᳙⑳㸶涀埰筍盯ⷑ彾稕岵䳢㬴䱖傎嚪甌ᦆフ戬ḃ潣埜揞峖₉ᚴ粷㻣涝暸᪑嚻ࣛ⎓㻇愌皬挎㣵浟ᱝ嘔ᮧٿ ए䮿㴷夞ྒྷ⼭ሀώ䠠Ꮤ㿧㠣䞸絮儶ҭฌ㾄Ⱪ窾搚㱔䊛䎩ㅷ䤒⧹憽㜄䰫杝双㪨⸬呔䓯຅亁息娄崎ಿᶵ怋ɒ䰄睮䬚⹦朆ᗣ儎ᣚ扪⌾䢑筱㱏唄潼䕼ᇺ幽楚㾌㧗㈇坺匏✓⛉أస㌃旟⦿㰗⺕獄纇擘”犾⓴㺉笑檍 嚐ጩ牨䨎溩枽図幪᪘栗㢉紕咺㇉ᰠ⢷᳽᳾ṩ妘埰籧�྄睾ન⿴痝紣᝖ใ罪硛欘༢㏾縁帽籞紙ᒯ翪⹢粹樗䑽缧籜䤹櫝昗琩欛ဟ帇崕䃻猿檛㸹⎱໚罣朙峓秿抔澳癮㠈绗戠ଣᚻ暷䀭⍗ȑ彎㎒ 䂏竿孜Ή坠֟䷼ℍନנᠣᤇ瞘ğ媬儋ᭋ碛儣碢õ妠㲵㼆ౄߗ䅽ᠴᑳ筚͜᠆䄟禊䎰ؠ⽅嬕岝砅⭺з娣ኊ悲窃䬼倬䃶娯䕝笃惗㡐㕽㰃來筛塢䐴ჾډ䈠м侙㣼䅣㐊ᄛ㮨㜢攊傹֊䝢೉᲍犀ټ㎎殔㪠嶩堾坪嬶僣ᘼ缻䧸⿉䰈⨧⌙ӣ⠶ㄈ姏ֱ渳箌ᢈ⼜簉ჩ℘⿣氾卐䖉ƴ柫咜傘⋽ȵ啸䔷᥽縸㍌礀⍽擂䤘䗯奥㤴㜷يરᒢ⑖ň㴢ൂ⣒䑴㍝崅䢻ڋ䛃攻儊䜒囃᪅Ъ₊ዃ吰榎䜔㻂戌愂樬ⷃፎᢦ⡚᩽ᐵ烩ᣬ⫣༂࣌Ɍ⇢嫈変䓒઱㠩⁞䒕奤㌻壅䑯䫌䜷夕䑔崃᪃᤟Ќ㴭㜲㣱䚋刃᜹ᥧ䑀❸रᄅҀⰃ椿୆ܤ∝伀㉗䝈埼㫪㼡⧏堝᠏棩䨂᫐似ҶӢ⊃䩄䓃⁒官⒥䝼ஜ〜ܾㅼ⠂℡䌸潴✶咲ҿ䢲▴ⲳ᪉a⎲⺂䞍ஆ◆Բሲө⊒㲲璸䂞╒⁰榡㣖⓷嵭粱㢠☝䡂㲵⮉⒂㳤䪰ギ概Ͱ〩䆛䝥僴᪵唎█┽檹唍➢㳤窺㓭ᨪຐ㪼ᜣ˺⊲䂰唂棺㲉ʶ瓭᧊ର䅇㔕ᮚ㟲亹儌䖳䁒桬哤Ʀ⋑᪍噭Ꮗ俲ʋೈϦ⡓犴㓩ⅆ╓ʹ䳾䑒䁰᪵咈`ᰜ櫨┘✲ㄡ禽呂撶⭩⦺°敟૓ְ発摦㧒㖶䲈䓘㽒 䉚摪⢜⨳w㧠ΐڸ泩⌖⍹掾㓪撮⿒櫧䲱擬㵜尠䴁斂ᖒ亥ಚ晔⾼堯䴍柎⺒䞽壕敦ᦒ㺴▄攬を䤰榜攆⊒䴾╇擾⭒ᄰ᎗昂ᜓ爲ᳺ݆㴜炵₪栆〪⒦㪕ڄ㫢޹䲐᝚ࠫ涰ˤᙡⰽ౬ㄛ朜⇄倡䊷旡㚨硷᳼ᓎٓᎩ幒暡㴬ᒮ⌜᠏卐㑲搪ឆ㚪ೃ椕剱㺃檎拽曪ㆣ䆺糒㤑≓䉰敃ʪ዁搲⽮្㉭批ዚݩ⾪戶䳩斀Ṫ剱ಭᙉ㍭䢯ᑥ⋚٫ኰ፝ᑊஈ箻̚ᔔᦡ穾㋡⚹⃫墲炮Ο巢塵⣩䣙⇲疼勠䑖な俥猐䙼崬䅽泻ல೫䬎犤⚂⵱દ䤈ᑔ㋪⬹䱨呅㝼徽㾘堅ଓ䯠⑌⇐Ǹ禤㋁昈⒓祱b圵⁲䥲ᣊ⚋当ᕽ⫩⪾⋊⯢櫜掗䏊䕺檸呶㧋㵲⫿ᓡ㦃㲵䁡哵≓፹ᕖᕵ▱撧愗夜⏫䩆汌⁍◐瑺䫟䢍ㆊ≿ᬝ吸⦫␊⪧晬岫❲ᬄ喭⫍ᝳἨ柽㆜ㆰ竓垁㊄坷⫪ⓚ㍼坵䫍⪯䆴沪尡撡⮪ʌ۲杽㻊㽾╨㔙䀊൏ڻ䘺રحጞ呜㔻棽嬑嚆Ƽ棴勤㟜㬺尳沪⌐下⭾ㆊ扳㨻彾䳣摳㷓䳽潒₎⭴㸋䛊妓⺒島⃃ǁ⪻ㅾㄨᕡ▭°ኢᖫ≒㋳ࣂᚃ㩌᪤⌚㝚ㆻ᦬囲ᗮ㍻ᘶ挊暣┣ा竕堋㮻䗃梶撩㓺ೆ�Ǵㅻኋ㛚䛋⩺噴皨柛↴%ゴ⳥䇖☊㈖夅䷓⹡泪䡷⋬ᵬ亪翗ೆ犀Ѫ䓕敟攤⡮碔敠⚉澯ଁᣟ度楺䣖ွ㱙潾᪥Ꮯ䗊⠪庘䯖㻤湱㆗墷ᵬ䦄⃀怣⣩䬠ዷ᧼娈㌠க䵽嵄䔎䢗䥯巍氾焕杌㴣椎椤屁䄚嘶䖄៍娶ⷚ熈埝ᵄ㝳✖㓦㡇䂠њ揌唭៾䝃嵋疊歲摨嬼紱䭞戕ᥝẉ䘢纕ॗ巯歼ᬖ乘媀Ԟ姱毅⨟浏Р䡥䡱ޖ北僩梀ᢡ巔䟅廀᲼ᰯ᷐Ψơ爮㷘冸ᐖ尔篟๘ᡡ珚ࢎ㥺䧄͉䌴砼浞唯㿙爄品篅傑䍽཈緗࿜痪ᕄᬣ᷒緎槺眮傂ᶒ⮁暸#⮠⊀㮚䱄㑬ឌ坡஄ㄹ┸㋞Ꮐ�⹦億擴㯡䴻僣⯩⏃സ䙱䝔㸍ᛢ癶䞴☍଺䍿ش㖅ᬸᡅ䜇ᔃ䬻ॵ䟬≁猉⥪㫌唡愿⦼箌⢝䵂粔䟟ᾌ羯壿䚖娳癧㙴⛡渳฾᭥参㐃㯏籺ز㐭伋䘾㰘Ἕ棓之ル尖㹤ᙬŪϜ㸀剒䀧ܠႡ烼ʙ៘㙣ἰ㖛࿨棪嗉☪ㄹ纾⨲籂墝΄卤⟏晓丣厚䉷࣠洣〸⇗丞ⷃ̿礶㳓ậ㙖㵮⩰ᒠ⭙ᗯ幓妎䴏й⻀㎼礂Ŏ㘠Ꮋ寜昸৓ᖾ挦爞ⴓ涻䙎杓ذ綼᳹ᶎ㾓䅬ˬ暎ᖓ⠾䗙㴎㨫޹朳暶㌓㖾煛昱㨓敦紌攞㚑灼ੴ᙮㦮灼䳧岑㝓㡸紊柆䲫㱧ዮ杶染κ喬�㚣♾䌙晼ᶢ㙾崇ᚡ㩫แ勲ᚦ⁋瑻勯曑㱺ṹ䌀卅㻫嬵桁ᝲ㵭䐧䫷ខ㿫呸匜ド㜠慸刦ឞル拱⫰ᛰ㲋偸㋒䀵㞣⩎䗅坵㰅䞽欎塌毋絿ଆ崍㊋䂸ে埭㌁#⥺棇硙፠濺澶୑嘌㎊痷⋙䗣⺋䱖廑亻䥆濶⅚嗂⹞㱖㹝井ⶌ獷ᥡ姈涜湖۟秆柺洦坖ዀ潍㣆牲◼湚擗占縴ⰶ皶⚏▪湪°嗝疻䰖缶⸱࡚澗⛷ኆᶼ汴纤據渘揖窶௖疤澲媗䧝庡ᢎ絖㍌恏㡢燻䦻㞋吸᪥⥢䢔㞜摸ᵗN举㩒䲥⦺伏Ԋ൚岆伿ᰜᣢ䄏≲Ꮡ䈠璥抪㯈尫抽暐Ձ垌&≊㤖Œ䷍Ⰾ痩傰吨˽ᄗ䠏匔ỵ㝖ڦ㷈~欗⋓㷈ʔ悵嵖Ϭ⍞盆濘槯滔栖濧綽爡斱䂘ᑰṞ睴悕Иს揨䝝䎬Ḫ㆜䳛㨦⯏ᨠ攳་⾣✄劘⏜䕅₮䒕咋濔沮矑⎧漑⚯⿟店浔旇忟瑤࣑怮䂞⽮ᱡ獱㲝ϸἶ兮㊕庬妊姯㥲炣㊯ᬇ庝燹渵᜗矟̎ 滆䚐揳ᵍᳯ⤹㐖ό毉㚗嚛‑燯ᬇ环㑚ᡆ篕䮿◠ʪ姙ᥟḅ禫樼ⱍἥ柆窐ᐷ澥纮⚚㎐塹涮Ი䯊ὅ拐粛搡Ṋ㝏ᮬ拔༵翏᪀怸;੥坚ᰑ庎ḽ斞⎿㬉窮㖛⏣῵気ඛ緸峕慎岞δ徕浏擅᯴䐪ⴧ䞑ᯒԿ⹮Dz缫眆溏媐宰弑⣠ˀぇᆤʱችഐ匶㼰儥⒄昮ᾥ昊嘪懋ἤ俜宣ῴ涏ಖ㏡单櫮ₔ䮾ẕ懯ʘ罧痮⼚ㄽⅬ૒ㅷ׵ⅈ3皎䆓吇廟ᬵ澓o徝橑㾖㸣#栿䚭琥נ᰾婩ްƥ溮ῐ毆᳥耗宒䠖巃爮ᤕ⬲㶳筻礐䂗碒̯֜兒℁精ᖙ⟊彳渎ᾕ篊ᵓ耏Đ愤悓氿っ査㐓疏̞封㹃殏䤓㎩㱡毎䒨㯰杋甏ϕ喕㱩既ᆤ恌彼桞ᦗ㜧幵承⾜璝㱓瓐羒枳㼣糾崙㞯ͻ稾疗㠘㽥燿⌜矖徑淿匜ⵐ粧溓易琎窯ὺ巻ᜰ濉崡㘒洟ᰤ㉟嬑ុ㻣杞冔毇㿥籿䘟宯㺃標丘匕཭◞吐䄄ႏ፩戚堓ଛ庞䱸循缙⏞侓埈㽴斎㸜㐛㱃牰К毽巹紿⦖„㮏ߣ毡徿Ằ漞క,屰稠䰔➪斦ᐟᰖ⮪㲗皯䚾㤚ช♂㻌窻戯❝崐柯㽺尥牟坞缘ఈᾫ廣祿悗ผౣ翩罡▟玟䑞Ɖ䀍㮼㩔୚฿᜝,击䜸綉矇䰡䋀‼俛Ề秇愯⚝簑䏢ᝁ㱯畸唡琚刂⿕繌ࡰ᧟ᨭ㐷㿥愽⇵ӣ䁬ᤥ專㍖織ݵ无皜䠫石㜡ʖ爰⒞搢㸄縢䄱䤸᦮᪀⥕၄絩䡹ჩ䁎攦ᜏa繜ܿ枿⨝娪࿯㝬ͧ璅䳡࣫ⰹ半烉⃖œ㠝梀ё⡑⅕瞻䕡◙吸䂄⸻㭑暟ຣ⼓桇垂棢ਨ㪊Ợ㈹䝗Ӄ憊ೀ㠰⹖⿱8Ēས僁杠岅⁶幠ڥ斿ᱣ㰩㡟䃶ᴫ烟䏎⦘䐺瓙℥Դᔭୌ㴬呙捅摼ᜅDz樳⺆ᢈў⠠᭰瑢ฮ灎཭̲ஐ㴡༦㨵䁬廉䍬ᄹᓢጩ孳繋嶣㒽䩲䎦∸篜憜硔ᮏڢऩ௵僔ʫ睸㷾紧〹䱝境㢛⚐䍈払⠠%֜┭籀ࣜΆન㻡⮦戳㢜℮竘ᄐ悢⤬硕烊妡༰㟾ڲ儽⿜笂䈢ሰ瑸డ扔छ巈ࢤ㯞✧ဵ傜ᇩҀᇐ垢᯴ቁݍ沎⁄⩡嬲ԡ溩ǧߩ戎⃕僒ቖ悲⋉灸㵡ᡥ砿䛊慯ٿ歨牃⺵牒䂶ⴅੀぞ瘂㤿ⷃ㸢ㆦˈ耝䒫䱔䤋䌯甴㧁煥⤾灴兏ׄ᧎⛃犯≒㉋⊵ෑʞၧ氊キ湗ቚ᷈䃃㪪੒ࢤρઈ┡፥嘶㒉㺺珚ហ娬憮旿䈩絵ࢽ宱ڰ挱璛㺢䜏搈探䬫屟ὠ捅ई㳱̦┨䲘ㅖ䝈䡸咂純甩椋䰴ೌ≞ᓥ㰏咙ᇫ߼᜷ɂ㒫晍焒挥njひ櫧洳ᤦↂ䃶ተ䄃⊦癌ࢫ䌕ત⃱罦⤲沕ᇯҦᕞ㙣Ϋ≑ܤ掷഼⿑縱㇤᱾ᆲㄎᒸ劢疯告㣦捓த⺑卦猸屹ᰧ䔶ᛘ皭ᖭ⣫๸戻煘Ⲑ弸㱿ᒖޚᙨ䚃ォ㑒磀描ଈ㍼俧ⴰ粒䐰▎ሠ⠃㮨塓䎓਀伜㓐揦吻璔燮Цᰤ亃጗㙊嘴ᐏ઄⭴≅䬴ྡྷॼ䛚ᗊԳ⡯ԽҸ䍐䭜〩捦炾梞ॗ䕟୤焲溕ὥ䠦¿య䦠儛һⱷ凉䠞᯿㨂䁫௤Үዠ䢁呩簧Ҽ岬®䋞ገ夣ྰ⨽ⓚ፩䂂㡱䚧セ᲌䦘✨᧐熈ᘅ楇䓧奆⋒⍰噤晭愳ᜉ炉ᨁ㔲െ㥔̧ጔ䰫屩竦估ɸ全穜Ụ禲璬殫擷፷ू㏩ᜋ㲸犟Ԍ䔯❿㗭䥫5ᓑᏡజ⇑⃅ലઋㄫ䑉᙮㩳ᥨ穷䣴刹♌᪤拡甦牱婪孵ᔠ⵳栤停㣈籯ં⽉᱆䲶ઊ∙䖀Ӵ䭳ၭ䕓斉䎦䶢㣎ɦ紋䯔楹⑮Ꮄ恲剩ㅀ唙掣๊⨘⧅槈ᯌ槒夅橜ⅴ没戼塢℄ྮ坎狛຾⽙愽⒁Ẹ狳䅪⑊礙ቌ佫䌉⏄亹䮡榷⚝ᎍ⹼⡀䀼墇⏼䫲⣎翅ྨډ䑗⚗槴緳㜩ⵉ瓙Ꮲ䦴⸉τƴٷ椦Ƃຬ呒罫⍞⠮䒆俦⛂梅樷㪂愯⠅᢬妳絨癘坵恩䪾尹ኆ䰽A⚊䟞῎Ł〥ፒ烩ᐁ䲚≱㻅ᄱ㑾˼曷ⱸ䬝拭឴㰥؊䡎䋒ᓠद఻⥚䞅ᅄ湳ᓩ畍僽ɥ䠺⍺妄喳એ঳ᅋᝌ擲媣㷮絓劰瓖㧰殄樾噠⥽▋ኄ仓ࢮ䩔Ⳓ㣠ϖℚ☺▴ᓏ姘笴⠝✁狨㛭买猀ն㏱➆憱♠奴攫ᯌ染端ᎪᲱ剭䢤䍙塅ᴰ瘭ㄌ旦ሄ擨秩笼厄搜侮⑱᧤嘽䲐姉撖᩼䆒ᆲ㝓б䲆⁔ှ絋㙌⫕暽携τ恝㩅獒㢷㌳件㑉ᔄࢻジ爣旉ᑜ癬ǯ睛岥猗嘐亢֚䐎庌廘㫧ე䛒䭯ཌྷ泩牝亾㋱渆㞹⾥秄穋持ᙅ懯⩚縸⒃䣎⹙犇⮼㊍㦌╯᧤擁矮᭖擬▿䶢㢤㧢焸䉺⚨ʠ匜刃ᗯ㽈撪⋟上⠙ෆ┭Š؈㏀喨涩အႰ峗搃ੋ䤦猆恶纃ঐ昺ᅜ慳歭㵔㶂੝埁♂㧢⌤義ⅉ䈗Ⰴ瀂߫དྷ䌃珈ⴢ㚥ᜓᡱ䅲嫢ក卒ʢ㷮ཆ沦䥄⵾㺉寇䡰亏ը៛ᛸ瀒堣䣗峙擔⸾㌼潛䰵⊈᧹摚΀氓篮㭂䊺玻๡㔙ശ㌦ᯉ䗞и劭⬑て́哢疀䎑⬢Դ憿ſ冿擸囂关Ɋ㼻拕熜ⷥ䁴䢵䬲㰴⁐ȶ⠸ಫጱ戡ዄ䮗佑ㅥ䍆ɸ䆐╇柈媢窴楌ⓔፍᑪ⣩⦲ⳛ槬ࡤժ娙捲䤓୩烚拌揟䯑⣅瞧⩵ᖮ槃扔垬䆠缬中䁵⅛Ɇゅ憶䙴榗նᔤ囲涫Ջӏ䥌岦⦄҅ቡ䙴暈磋៌噒䃪൒嵙栬į䑴ᴠ挢خᥡ敇◆ຠ৪Χ᳛䂉䭌⹱㗅௤ᙺ।⧃榅斒禘㝋峌犫䫖⡐ࠅ⎶湰♠ᖯᐬ喩㸫ᩬ塙≟᷁⪙⫙еᬿᥨ╔᚜希噽࣊ˑી㐩瑀㖥㷧哢搡ᕐᔞႄ媂⽋䳍猔⨤⳥⨘剶 摶㨆ᅒ塪如Ϩม糮㋕⌅㗉丶⥿晪䘙᠐匔䍋ኧ狓੍᳠ᜥㅉ㺙ⶸ㺶႗ࣄ峂႒䫉⫑沫றⷩ㔵婴ੱ祪ᨄ及嘠㋋䘬⫔櫛䗆ᅒᒘᕴ䨹怭唦ʊ廴羪䩈罏ዔ⨭⣥⣵㊐ᵷ珆喈ᨚ喷ᗋ䔷继䫢ੁጭふ㠵嵲䖔䧌⟜帊埓伂䛆攔ᠲ唌ṵ᠈మඑ㥼ᩐκ璊摉擋үⰕ⬵㤹擵简ⶔ嘈㎆彊喜今潘ύ⪱⠩㓕㵴撷▘啞喑ῤ翋矷盘᫆╆⣹㋀Ң紊ᶇ㄃嗖嬺滋燍ⵙ瓪櫳亀අ冴杵Ẵ畓喩⥨̓坖港㫟૩䮽⏕׷⦿⹹稄倾孺瑹埌䵊೵⩵ႝ⭵沵⥾疇㔩垖峚嵓俉浌壊⃉׭㣥猰þ╺॑咶峤惒痩⃉㋌Š椱㙜䁖悰䎈硐墴᪦䆠勑㫘竨ᯚ䰁ⶉ究筹ᑆ൝ᐧᩦ廳籀ǒ猢⣍׼䌭⩠棵␽ී嘁嬌檪廊ᇊ嬘ᬸ溠᦭㛢磆䇕ග㓑僪:⦡储ۘ⩠櫄ɭ๶壶絼㔨杇ᇲ尻ᦧ্䢙ᬇჳ㉭ᑔ締ᔺ䤴䅩咤戠�䀠⢅⃠濂∭䕗杼卬්㑪另离ډ廉ڷᭌ毳⁁絡⑸ㅧᤱ哩帆攁牉㻕櫖᪯䤃⋕媅⫠Ͱⷞ㑦⬶懀㺍⽕⎋㉪૧ǹ᱕禹噤ⷂ嘱叺眻ᦠ旛ཡ▪比ᕦ捖⁵粟ᅹᖥ宆樋皏㓑㋇᪪殓㵬櫕䬿䓚㲹垠咂璻ࠢ痃⠾媊流㭵盵⃴乣䷭㜱喠⃻䎉㋆⪡娴∻㹵䂄ᵉ⭲嚋㖠剖䕊㚎૕狎歘桋ⵙⷕ嫽粸ӻ㠞启ᙁ倧杅⾂⨤景䜍ᨰ綠厞浔嘽唶廒ᶪ㷖盷寔滛」棁⪼ℷူᥚ԰ഀᮌ᝭䁰㯡梠ሽ∉୶᭩申㕰徶砊喅䏛䢘㬱歛✄沕䇱䩢ᵰ盡ᡮ籛块Ꮨ仗媒椵㏵⿔᮵䝼ᷴ痮╮叁᪃㏁ໍ㑪ഇ⩀ⶊ䋻䎝ⶈ琱哚瑻䗅珟仔౅淶姪暔⇽䄡媝㒹寮䋚㔌὎伒橑欷㍼ᖗ‡೎币⣬乮宔ڦ䝗土ᬓ⽑᣽眉怦㝮渀㜶呎縻ᆊ毛盆㪑楗㛽粕㕭㞉帒垳厨ћ┊ዎ劸㬁氯Ⓗ⒗淽㎃帏㖶娖毛ഏ௜Ề竃桻㑊ᔖ⏿瞆㶴甇咚登欈ᷓ竃孑湯✽ग痳佨ḅ瑣差䏺Ԍ柏伛Х桏◅࿗௰枅疄瀧孾玚匌㟔䖊竡梯⩀喖ή㉃㶃瓗婜泫爈矑Ỏ笢咿⽽嚗៸㞟Ԅ疷䲀୅ଈ寘ک窑櫿➝㖕寷ᾂ畨枋幪✛繆῕㻣窏澑噽Თ㳻侓絩㒿孞䠋栉卍滒竡榟⼝耗忶᎐㳄筣兹ᦻ礒姟ⓝ安橏㰝௷汲D΀แ吾⠧ᡇ䫏嵳㢁⤦㿍氬潯佤ᆔڠᐗ㠣䴔䁅ὖ΀ง九〗佻ͫ⸀ÒΡ䟔ⰹ庯ᥐ恮盙䅢渭࡝瑩Δ砻晡匢ᐹが澊߳痀渣眔ၘ惬渐⦐ㅗ⨄䨹䷴續毎㇤ͣ縮匸უł೙ⲏ᭜ሹ䁊⇮ͯ激敭槖ૻ㉖䏂㢈㵑ᒩ㠼磂夳屨ⷻㇽ㴯ј柙ͦൠᪿധ昼翌立ܭ⧐淣ࣨ≖ኡ㘛哤㏁瀢笒࢞ὃ㲳癐稡஘㠾୦崩皫尞曘瘻⃡憷ր䓢Ợ筵䝎羜⏔Ҡᒱ挣ؽ⒟懩ݒ᪗㶭㳖牔佫戵ท值䥧䀹㡴䡌ᬩ甯⋒Ư梥⣫湕ဈ㐁梦縺傔戆䜈ᤨ檍キ厺ᣯ幰▘拸㴰禰〭⠾ޖᾐ懽ᒗᒩᤗ䌩禨㚱䁦昺撞Ʀܼ桰羰ί孄磭媱䊪ը↴┨烝燣ᗇ栰甃撮籐棼挹ൻ掑沦眾墅㫗䙞ᲇၲ澮慜溬暰ă⹞矦⢺⥫ᜂءᯈ禡䮭ᩖӫ⏙㟳僞刧梾㨨䴠珩᧦䛺ቡٔ垄֟檄婖氊帼ʆ㈀❸ྸ炳䖮᫸䵷ോ嗲㈍჆檶|㺣⃥ᰘ督ᱬ౗䔃⏼䷠ᑩ癧琏㒑㻩⭺㒚䍳媑⤪͘縐Ċ㈺㣧㬕䟶凹♎ᾴ琳䕮祝ͳⵋಖΈ滆ẳ๴ٜ撈⊎岝寗嵕ᓢ⍆䵬㺑泦岼媚⇢穁ᴨ楕Ꮥ嵚⻛㊱俗ᒴ梀ᆤ㳏⨘权ј晝掬䔣ᔔ搕๰㠹笢㲹䢌绨✍ᲅ奓䓬㵊ⴌ㎐▃䟡穻喾⢛樊䜲ᰔ敃ᳬ䱔೰⏴嘶㘹䃆ᶬ繏䇲嬋᭰既俦夠䧘絃䴽჆孇㢿᪄ড়曍ᡌ狣斯䍛泶᳃乏ᇑ䃺殼亀慱╔䁨᯾㼅睕!猺示㊑历朹㚜∔䠇Ḭ拣▮浒峽櫧亾㉇๭⾼ẇ㪣むຐ慹㫵ᇻ糴玹倚㧩宆瞸皝竧栙ṛ⏑剠罖ޤ妻信㵡斆☥惡䧅ⷰ帢猓癯㍓㳵挫๎㴥堋᠋Ꮋ؂ᖬ݁䗢ᘧ䟻⋣㌳༁㍙䂇恼Ҝৎ枷ᨌ晍㚘ǰ愥ܜ❖厥濆垺ʕ姻書婴眃滮惕⬰㺣嗟䩐冐䜫濟囒碧刲纡ᅌ㥖ጁఙ䲦㇥吆屾ᚭ☟㍗ᥒ獬䤧塐ⵘ綶⻐㺙䚆䱻᪅䘑៎Ჲ瑓乌擜ⵍ䮤ຩ慠喷ᖽ偢ᆻួȪ憫据㓗䋼厓䱩㶉擻ټ禒ᒰ嚼ᵙ䬭操䓷\"橱Æොޫ羾䖳Ѭ埒奝䬳羮᳕䳴⯙䳥㱥彇⑻撒Ḭ囲⩊絝糌᫕䫥䌟囕㣤ᑡ縤慾廍⠪孩⯋Ọ㓚ℙ⯓乵㬅汷植⪉ơ圱棄ᯋ挪Շ᫰毮૸䝕壼䑦峣㗞痛ĺ瓳㇏᳛勢琚ⵎ㼵榛ᬁ涋㘍᭺峺澋瓎㋚␸挸㛕㔕獆ḿ⚚㧇ᛠ妒梫双䣒⽹୯懭㜕䉻⽺ड痔䩅ᷪ扙䟖嫝ܞ毭亩づ䅆❸㺆嗠㜊孇຋Ҍ滙䫢᮰浤ٸᩍザಝٙ垩屍廫⿎໓笑気伤ㆭ枛㍽㖒䶨ᄑ孩ⶻⷂ৞溫㩐0ᷕ歷㳸⨠⸊㙠廜缳լ᧙泹歐ⱽ㽵慷Ꭱஅ㼅嚥婶羻㶖৒Ა殔⻕㷍勶╾䪌嗰ᚔ嵦穻⡍᧚┇◨ซ㇘仗⫼斟⸏㥺帀祣៎㋚盬溂漻ㅍ䗆ၿ㆖ⷺ噚ᡶ浅侏噚᪒䒓⶧㴍晷ᩤ丷Ե篽孩⹛㙢䗖૥珢⹥㹕欷፾喆槙㚡奃㗋ᔌᏐ䛙෥淚㩽䲗䧼垀䂬㔚墉຋ግ毘䛶䰘⹫㻹䂖þ㎚淆瞋庠ኳ䷭篟໫㮤淘橹ኖ儧྆フ㍞弶礻༏緖狡䬥涃㰭歷叻Γᗭ眩姌懛䦱曟洁孞䱥㳥嵖曼䆉✜皣孴縭囏答᎝笷㣱㮍恢ᄭ殑涭捻嫮椋఍㯙㛬毝滟㸰盳旼羍緪᪍峪浦⩁ҡ绺═ả㸍暖柽ᮊⷫ県滞猻意㇚欂ސᱛィ秫ぞ沅縈ຑ枡橀俧㿚䇪ᰈ‟㖣侖檊䄁Ϊ༨㫁暼㈾墟✻尛湧㞣磘䟽侕䨙矔寁珛明ϝ䈍簊㐨珣埗汜繞⏻珶巚秳㇢⢐瓦䠉汙㊣矶桘䤊㖱㩏歾棛䳍㒒㷃簆Ὲ犧ᜯ甁䁐ⷬ埈ᧁ罧焽។㇫嶠ὐ碝䎮᳿夌ྊ盂ļㆋ䜽剼ਝ寧湖㟃浖ٟ㤏ᷘ坷姡綛瀼䂒৿䠁᷍㍒᳷⁍⑴Ᏹ窵ש礧后岘廵ⰟⰠ犃剮晛ⓇᏪ⃗姉惇㪼秝塤憴Ḍ፝弒≙箁㷟㛪㽦熧⮏㲔᛫➅洯㱓唰㬬᎑嫜俆㩉璋ᎍ岗樃ᬣᶘ瓡䫶䏋⛅嗬埆㺉纭㸼䃼ᨘ໢᷵卭䋯╝果厵佊㦱斧㛎ӶȃⰋⅬ繾༐㍙㴓㊽཮㸖穋ி窐䧭筌澌缓絯ᄎ̐䷽ଜ橎㾝㧌→燬➫Ἔ糓翯剜̍ዸ⼜㶥簷㸍䧕姺ᝢẔ犓梯淽甑ஹ㟛尹涇囍㔠绣東Ͳ紝檮Ỿ抯Ᏹ慮䴙梷ૌ珗竿柳⽼窫䓙䳛礕䯠亀΀ੀ洮⟚ᘘ垑࿒緳墯杞猉௾⺟櫉漛猽䖐⤍ᝲ崴㣫䥪㴫攌儕獑ṙ災⾼窓稂垄屴狋䷮᭿欏揣〒఩扷綾䳺竬垱ṑ㴳姮ⓜ嬂淋亍䀅獷ㆾồࣶ宖激ѭ滁づ疇௸禠㨨⟋⣿䈀㛩垷ֺ罋濎穹猘揠溠㥩煗䣽ણ෨᠚潆牻慗䦳آᡲ㝐屎䜻ባ⮛礇堁⿬縓䓶绚徙ெཉ㿦燗᫼䆕ⷠ瞤溪炋漬槞抎Ⰲ⹍㻭楷峾ၟ䷩╢ᢦ瓛息▫攝㯙丮娕暗㒍枙燿ឫ崤穜㟛෻殄箴᭹塔ؑ㞭犔⫕᳿෢珛䞏㏚嬀ᮥ溦㳪缗᯽䣲己᯷幞牛媁䩺䌟嚭垠窝緗⹾徟瘗㜴屜㸧璒⃙㉼四໲涕溋䳔➚⬗坰㼝㌧垏䫘缗寔䨽䫑璯䠉⚙␮害湑ij瘾䛽戜殷漗㮝港喼ᄙ欕ཫ⾱罕烷ᗚ冏Ꭺច㪃獗巿䷘␜砒೸㎭悾繞憒尃暤穳殗⒍䔒揤侸ῑ碛栎價⨝䎧ㆯ汆患⌣绹ứ侗㟝㒑坯⊞伃➬ฺ澝穯㔅曑㐟渌ᷙ簮嶮⚛攇柵ỻ崅缯噞愔␓佟㛕㠇䞾噼Ԓ泷甋㢠檷〈䔜⨜ᜪ就症桿眹䨑ហඉ㶫灇皿䮑䀾➥㼶籷羾㿿ᾞ䏩࿩㤃筏䋌䚔⯯࿔庵紻煾卜➃߮噵妍捛ᓟᾝА⾲㰾瞻溿ᄉ⮗䞡㜩峡ᬷ磟䧚櫬瀕伕篃罾碟厁栁㩦繃环䳎ᜐ刏ྛ㳈疳吗ᮤ娏Ꮃ峮磋皧㓝ܑ䯴佹㳙犗瞱兣礂矷媙峞㊛Ḇℜ搀澺㹙緇棾⒚斒紖࿞繓抳彞∕㯩❹廽瀯晾傿ؓᖬ♡㵧磯ᡮ㹕毪Ᾰ緢㳗䚎皛縃㠇㫺᧳砿Ѯ繛揥Ὦ⬊炲壏乜椞俿ྲ箍砏⃟缙尉ὠ納瓛羮崖∉侠俣㢡熋⛜㞑岈待㻆火槎᳞枝倂㽺᥄滏䟜஖ᑄ徍㽕砛䙮挚殝⒊滳烽罿஘缞叱Ἤḣ緗絾慞ᰐ瀔侍縉仧吀䡦⽝ፊⲹ哽佤⼛ಅ倍滶簞曏歽⸚堒㭾綱搏漿伟ࠈ矄利Ƈ䧋㓅搖櫮⯆縳烏䗟ञᚖ⤇↳糑恙䅠琐個᥌碮ᢿ亟☙䐕៘㹙祇祿㊜Ṑ⿩㽿溰撿榟䘟䶎䯏瑪ಏ揟糞Ⱀᰚ㾡絙焗緆䨚疏怒劓缿涐眞囖⿫ẓ耗耏畾Ṛ琘῱织糄േ䨜᠕怟࿥े礩ᶱ⊧䶞㾤䯴䙟生☝娞實䀗㵃縀亞䠞娪羽翯秤ጟ䙃ⵄ倃⛐῟㷿倞¤̺暀㈂㻵侹彡绋紋箓燐揿堟〡弥'匡摀㿧῕ݝ♩緰ܛ獳暿土ᄞ䮜憚‑㏥䁁⢺îຌ䓧穲Џ怠㎟Հਝ礙昕羂忾Ꮖ㾇曹綗称੫橠⎠繾娜᭘懔㽃摪㿟ô纡㴐ՠ೷⋏䎟̞ᄢ⸛Щ㛆Ⱨ德ᭌ㺑峹慇癰ឯ吠呮嗜㠘А䠳䣾忌ĕƨ奉簇癐ቭ尟ພ乡┱倖堹偆⿚㝦ŵ㴬㣐࿟斿姂ኞ㬣ࠥⰪᜣそ忋⼴溇簢Ҷ盟愠㱠殡ⷝЧ堫㖁᧺䈸彙ȑ紺祫瓐ዯ᨟⣰㒼㐦刨怂翾䞣䃩滖㳤؈ࢨᛟ䩀䞡⠝大刯宍恝翅羝縴˨݈獟擃強⵺妜叚ਮ〹㧠䁨罂ļᴺфఈᷡ忠䣮₢⌦䈭怴⡋傋Ãᚅ̲ۤഹ愽䩹↞ᆣ渚䔠堉䡊်愆绸Ȣ篫眨ᕐⷠ嬡妣ᬤⰓ䀅塂Ϊ₺䅏緈ۚ爏暰┟㴡ⴢ廘琫йᡇᯄ₾䇱Ўڗ痫槙伀䕡ޢ㐚倪搱翺栭ཻ䆧簡܄ඈᤀ㷀廡㞣篘䨬簼㡞灵⃓ȅ͡ڭψፒༀ壎ᓡ䃱ⴣ☧糶භ᥇纘䎜ᅠڌ۸ࢰ梡硣ᴧ帪∰翫炙Ⴂ⇴䏯䀬વ澨㊰慁琁渘瘖␱䁜徤彄渢䊖ٵ疩擓䶯㓡ӌ择ԩంᑓ⿗䃆缒䊫㩊ྏ椋唳ۡൣ䛙爩戂硂ゝფ⇰Ϸ笔໴ᓈⅅ㻎㹢ᇙ倒㮎ᡃ偫䂣䄿ʹܼුᜟ䧻㮞㠩灒ԩ㏩瑜㯎僦Ἒ䐍פ璔ᣨ㷠況ὢ᪡㴫䀋瑒炈瞏↔綉Ր࢔შ㣰楡烢ত㤨呮濿ϓ欨ↈΨ㥀猴ᶗ嫟⋞扭ሦఫ❃濧ᢘ㭶⫅Րжࢦ氨⩀ൄ㞝ₘ䳱砂汑ᢓ䄀慉䏫Ӡೌᒿ叐䃡仢嚤唩娼ᑚ⾬ᄜ䆡䌉݆੔៸⓰瑡ಽ暧ᜨ稱Ⱘ㵜S纉硗չ獬掇䚐劁ợ玤య瘽၊ၖ烐»䈦Ѿ೼Ỉ‰娞箢嶤┭ጂ௰灬愔憯䉙߾഼ሣ䅰恡磢旚䔨〷ѐ碄僷慮䋣ҵᖏ愻幀寁ᡃ䤦栓唏ో羽價慧䋅מ঴ᔤ㚠私〜瞦←჉㝮塦Ⴧ愨嵛㧽炢ᒐ␐塄㠝Ⴒ挭涊汐䒞絛䄬⍨䓽燏擏䆐媁汃⤦墨爺扑ѥ႐⇊ȵ扰ਲᥘ△ⅎ၃嶥䂮ชొ䑯ࣞṺ紶ܱऀᶨ㵃ㅁ䄢地瑅℺Ʌ硼䣴懨䏩⊣扢拄ⓨ坤䮄碢䟱る෮㟍畫ᆐnj䑐䗲ፄ㽨䔱祃澥䧧⍤਩撒䣺懾⋌䚀䇒ᆄ⟨允ģ㳈ـ㤽ᗶ₱ヸ㼂㵫݊㎰撄⯨呱ヂ婲努渢੊撊粕㲛ᱤ䔮抪Ꮄ⎰ᇮ罢急縕核㑃࣯҅ᅯ怢䙙੊ኙၲᵱ⢠൦⽇璅੗恶傐儡㓘悕ฅ״ⶨ䦁㰝啥キ唷橊䠠棙擭⍚䗤傒Ὶ予䮱柣摤ሔ愿ᛥᑻ塉冓⋤入ೢ෴⢨獱巃ͧ抮റ牔㑿㘽共ᔪ᡽යᐄ⢙⵪㭂牰皨㬢T咖䄐Ħ䌇յ൚ᛔⲈ深柃楥纨䀩ǹ咒碛ᄓ⊜䚣ङ氤⃀娱奃湦ಮ㨵㵪ᒄᢠㅶ≱䞍਒᧾Ւॢ曂壥م䔵⿸璞ĉ⅟⏮䚃໓䣈Ἰ嗱犂ᘃ捀挵㉄睞倨%㥽㭭஑ČᓎᏡ国敦帬唾ɛ璁㮕ᒝ⋰ₓ൦ᤄㆸ棑窃๧థ孤㥼౵䢹㈙⦗Ӡ㔐攀⦈穾ᗂ⍦䦪ଳ牑ⱼ壭凚掅䖒⊶ᔰ᰼㦘㐁狦Ძᬷ箨璝伳儨捀䜝૒ᶌ⋸䇑枂月涩ᬵ湾璛彨ਧ∭Ý઼ៈ㸈傁㢃᫤֭ᤃ噊撗壑㇌礀̣પᧈ勸摚亃⽧ḩٍܻ撘㢧ㄪ⊽䙙੮ᜌ㽘朐ᎂ柑堢牮ό咉㤒焤戧簌ฌኘ㆐繦哃䘡䮩嘸孲屫㤃㈍⊜䜛䕇䫞ʛ⭑⣃㷦で眱槨ᱠガ熚⎶䚓燮፴Ⲹ喱戃⏦掬⼵ᄽ㻖䭠摜瑀ਦ⇎᳟合网娂杦ڲ漾ವ仑磧㻖ᄌ箯哞Ꮬ⋈弑͂屧ኬա⫴粘歊到׷䁛ģ擤㿍㚆ဂ▋↨Ḻ牚㲍㼧熨換毟ഞ῎䈤放稉ℒ✃䂸婌䑦墹燀ጽ䚽aᡉƠᰩٰ塇姇࿋䅌拄䣖䅐拇䝀䤡ჼ㮨吐Ȳᆳ⡨㊪ᐡɩ↚प঍䞻癆᫔へ暀☳刂Ղ点匾䉾Ӧ॥愨⒝㟼ᥜ⠤天乂ᑆᾬ䨯慃㦪䣹৶䢗Ꭻ઱౽ᴠ㩔⢡Ⲥ但砄兙⏊䔕঺ቪ䞯୊Ꭰ㑘嚑ᐲ剅䁮㮣兄眾䓍›ᏙЩ嘐ⶂ╤䄀紲็坄掣兘客▀Ẻ≂䕸጑ᴻ䟤璒哬⫥柖䤾噞࿙䒵☵䐍ᨤ䣌ల㌐厩⸡๧㱩∉Ⳮ崪ⓛ二䅹牖τ敤໵ⷡᴲ⦠ᴢ䀫䥙塚ょ⩼挚禨䲩ᇤⳐ䖩㐲堢㉭䄭䥌剰礪䤥Ꮂ⛔䥉Ꮂ⏄繩⛵ṅ㉬⨣搥咕〧䪉⒔⒬俊Ṓ㇈䀩媲䡅≯Ⴓ॔碃ᙉ䧼䂆⠉Ҋያᶄ棩๠孅媫㉌⥅䊼℆悾痫䞈䫩᯲㔄嫀ᮕ嗧晩猱穝Ҟ磴৙搙挼䢔Β㴄宑瓴὇☲ԋ㥟ܬ㾒㢟ዪ⟠೨⟉吴彚•Ⴤ澭猷㹞ಋ擙燭዁➢侞戉ᔴ䱉ࢤ䍆婮碼㸽䡚〡爙≝揤䴀ѭ䱆ⅉ㈂䑆愩Ⴞᅉ㊄䒵䦭挐ኲ佅ၪ⍸ˡ嫢ⵆ剪ҿ䕔樨慃䥹ዘěၧ⿒⊄摉䅳ᰣիರ㥅䊄Ă䄧揕䑘凱ᑊヒ㓉ㅲᣄ╪䪺ᕃ抑∶⨝ቔ㩼䷥ᐲ㽴煶檲⮘ᙯ㄰䩊▧䭥⥀勒➘䥕ᳵ塼ỉށᵆᐭ沸牉Ⲅ攁䤻ኢ㰋஥ᔒⱘ瑩Ⓝᙇ幩窺᥋檉د⦞勛䐪䩕Ⴒ㢤ၜ㕡ᄋ㵯䚶║᩠炄槼ሾⒸ䳮ᰢ↴䢉⚲䫇浪ұ䵌牪㓈楅刳⒰䓭ጠՔ义䝂ణ䖓ረ扖૛ソ७卩̭⇭ᯐ㒤絉ڳೆ⡫ں楓婫㔎䦭去▕◵ᖲ┎ર㕲婅੩亵ᄮ㪖哣৴叇Ѻ䨺ᛢ⭸䜩㭳ⵆ杫ᨯᵞ玿愇঻䁷⛬䱙Ꭸ㥴擉啳ౡ健⚸牅⪄㴪℗匰♺俖ᒪㄘ熉嚲俇曕㺱啇穭甇樗刻◔䮮ᐌⷐ搪⹲悄掫㺵嵟₀甉ै勎ⓐ垉ြ㲔䰹瑓₇⹫↷䥀檂璾䥇᎐旚䶵᝼㤐戹僳䢆࣬粼⍀㉦಼ᨅገ暡䧑ᬂ⻤撉䍳䩇笅ㆳ൙Ɀ䥵ㄱጶ⟴䱪ᑹ丄唹乓禓㣬䚰͜⚍䒾ᦪተ暴䱩ጠჄ煉檨僇剪咶乛䲎㓞楢㏍➽㗽ᴦ㟄奩൓璆僪⦲൮᪃䤃ᨙᲳ◶亯ǦⰬ妉ⳳ⒄ᄪ細啐晴ᔇᨖ㋬晉伓ὺ㪔歩榲翇䬔㦼୎窙⼠槆ᐓ␮䱍ᩆ㰔掱烓ᒣ罩沾ൟᲒⴖ庡㏌攱䲃Ẹᛗ⿑╸䚄独㪿え扻棧䧱㉄⛥䤳Ც⅌癩㢢▆糯粸歙䙫䓕খ፷⑞䷱ᷦ㏌尹⊂ࢅ拭喷嵆♯ⲫ椸㉸柕䩝὆ⵔ涹嫲她㫮碿獟౯㔑↢㋍⟙こ᤼⻌拹᫳旅⦯栂敉㚔洎⤩᎚晙休᯶⩌庉⫓䊇ⓕ媽͂癸泪楓㍚极体ᒖ㱴甹Ჲᾅ⻭榾孅㶠ឋ㙥㌜服乭ῖ└䊹濓℅歭晥䭜宠ᔏ䤫㊢▼䯙᯦⮥ㆩ廲瓅瓨涸䧦玣洄㦠向Ĝ俧˪┼偉插ॊ絫Ꮄ❋嚐ⴊ㨗ይ␳瓋Ὼ㜌䷉佒榄ᇭ⎱䍎亁᳸楷勋▲䢫ᮄ⃌憔粒ॅ׭㦷晞粃┘姣㐁摫些ኖぼ䙹䲼䥪໮䎴৩ຕ㓛ᦺ猚旻໽ᄼ㕷㛹勲ᬅ粬ⷆ᝝᪉岪㤬㎙♲䬋ᎎ⊴等䦒ࣇ㎬线㭏牼⃻㥮猵柵䭉ᘎ㈝ᖹ❒圆㻮斲݇⹤䢱ॲ⎉◴倛ᕃ䟗Ξ⽓䈇⓪޾ག乳㓅ㅽ卻☀㞍ᖲ㵜凪䴓伇Ṯ䮱⍈婼峜禉䀫攛住ᾨಔ根惒棄⃮缳佈ᚏ咦禥犣❌䰻ᘚ⹼継ⱳ⁘⇩㞺᥍庋Ⳏᦳ㋻撧伋ᙞ⿜箙㌳Ḅ櫮瞽͂㚚䔑秩犷旸丿ᜮ㓅Ӏ笲咤᝭⦰क़㉦┽祌㔕曐䠻὞㷼戙傹䠆ᱩ箵彑摡䒪㦋獙枳䢿ᴞ㺼婙䩴䴇⻩㎿南๲ͥ禍㏴⒟伻ᐡⶬ潙恲ᜄ濫澰積丫ᓧ秇猅⒦ओᗖ⹼瞩Ы䨇偏㢹㵍⹶⒳纵猼栀⬽ᢡⲬ箹㞓洆婪ၼ᪵ᚅ˩榰ુ⑀ⲓᎆ⌢䫹拣綇敯ၺ䃘๮⒬Քୣ攐⻠兮㡌挥ɓআ絩へ杍ⱺ沯楒犦条丰塁⼜碥䄪澄棨⎴竽ἤ粦ᦇቔᗸ撰偆㸔䇙ᐪ䜅旮桹樭垧ᔓ㤾狪┈⣐唞Ⱒ伹ȫ∶⟮�佘䆏泌㧑玊竤䭹ᓚ㒜殥ଓ渵硉㡶捍慴瓠租叧晙䲨嵞⒢容ឳ㈴៮庵ᕅ㺐⊸䗨ϑ◣䧓Ẳ㻼禹Ც焵◬⊸䣒繷河᧞ኺ斴⤩ᅮ㠔䠥਒㔴⁉侳୕了河װ㐊ᙃ䨗ự⮼根漳沇ᱍ瑿畕䅼⤝㨇猎摰⩷ᝆ⟼䃥㺓㠴䝭ᬷ 䪵烧ᥭ刭Ɍⴟᎆ尜忹ᤪ☆旮䆲壁ㆇ粂㧮厓柬⭸兮⇴毉Ƴ禆⃬ᖲ畏ٵࡲ娋厣䑵䨟ᶮ‼䩎ₒ眵嵫䊌ࣂ熝抣T縙是䴕ᘱ⭜䮦徲ᴄ㏯㡴ᣐ䱨抮ץ௦ᙳ䢭ᨩ㮼啙ᑫ₄倓౉␸恈џढ़⏀暂⵬ඩ㜲捥ᯒ耆Ǯ㄀Ⓠ႖瀼◻瑐昲ⶡ濄Ҳ檥羳礵ᡉ斿䣃慬㴍䕽牪᠐⮨᧩㡂䌹ᲪⲴ汏᡻k↙䳻Բ䫙ᝨ⩐姡㗂呉楫ᨷᏩ妼哟䩰ጞ▅ቤ᠏䢤䶁㨢嬉䤓䑆n牿ᓁॷ̝◜ਮ晣䮨ᤞ⌲接戫дᵎ皿僚Ṽ勱䖌牍ᘀ⺔咑⸢矅⡫愶㕎⤇ᵖ冃䲣槻玊ᛪⱐ刉◂幙右碢ཬ䙼ࣜᦇ咦䕌䬂࠙䢓ᴁ↬暅剫䀄燨剴惻䅦㊭㧼እᔅ䷬娦⛂䩅㪪䂄絋晶磎ẜླྀǩ୵␦⸔僎ᗒ䉚盫圅ॊ㉽彺੦⋦禍勀朼䲄孩⻔䬙ᡫ㗧扎ុ擑ॶጞ斳䮂ᛊⰌ兙を怞䠼倵䌠ᨠ羷㺭拱㥌劗᠅揰嗆⛄䯥ⶪ暴癋䡴㳗㦟↋╓㎯ᘎ⨰咞⩂玥簒᮴ဨᑲ睘ᩥ糤┿䭲ᑞⱫᬙ㪜棅᠒㔆╌⦹೚㦎磂祥௏ᕄⲧᙉ⏂欅⡊榵㉈噱坎祖㋬ᕚ玶曚⥔弉㸲䈵㹫㼆曫涴歄奾ଛև匯◞ⷴ募Ṓ崉⧪Ѷ㝯ぼ䃁⥼㋟ԩ䯗昡⠿Ṇ㦪栵ొ樵㔠ቮ擄▍ሸᗗ挀四佔壉⛲奩兊ᶷ痧橴勆䕤䳩太狣ᑘ⡷ᔹ㸬焵秪康睩楲坔Ɵ䋛ल狠嗉Ⲣ厲㫪庵癋痤䣈⹾㍎料㋥ᦊ⬋政䱼兙㚼垵㗪Ⓑ㽉䥻糌ㅱ䬀ᗷ珜吥⹯ሙ≊嵅瓪敇糮ர㳂契㌘啩狄埢䨪坞⑊粵⿒呵曫᮱ӗᖊ⫴禕玝ⓥ⯤呤㹢奵罊璶ˈ瞰ⵏ禈⫄◹㏧ᙥ⸨尶㳊澅䕒构烎畴筞敼ኮᖒ⫘嚴⪻ᐎ⛬毹㢓喴⹮㡽᫝㆟೗◱䨬噕⧪多⻒咹㒫歵斯婳:ℤ粳绛⬄ᇵ⶿ჵ㭊䣵䝂ݵ盎➹㫎ⅇ䬋祺⯿ᔿ䷲庵ご䧵櫒杴J䲴竔敽紏問卒昧亹᭮⎄䎅⼪䈙ݫ়櫕९၎啙ᐝ攲䶠姹⤪歉㹲哅൉劸⋉㕰櫇ᕭ⪌柣Ⳑ塵㾢忙䞒ȅ͎摻煚煳㳱旨毲♜⽦凚⌒枥Ṫ⭷介ƻ⛂兲䳠◓૤ᚬ丵慞㡌录NJ标ᛈ絹磃亀嬖嗞厥㯺⢚僥㓁ຩᐝ佶壌㍺㓆ᦟ糑㗔ஔ圤ⱶ媅㻲梅未⠛⃎⭳卉䵵狣ᗋ⭖ޡ⻎᷍⫺紥䵳⫆㫍噵ᕑ浰嫄֮⯭囓⸝ግ㎊珕᫊᥄奬㭾㭈ቫ媷嗬猻ម⵹ᬉZ忕౓幆㫉ླ担啭አ嗺⮈垏䤮岍㌼櫕ᆋẴⷉ♽ⓘ䦍⫵秫匯⟧⸲嫩㟤䪹䒊⩴ᓈ妺ۙ䶈嫪☚䭬枭⤄好㘺槩᫫扷繩發㫉写ኯ䕭残圗ⵢ叽㴲禕ۓ梄泌使๞嵹媶㖿⮋囡䴾卝⮒䞉窑嬳เ侴浚焿㫒┥䬧唶⽾寝㥜伕上笲䃯➰棛㶍嫙疊欫ᑇ䥘咹⠪呠Ⰻअ䃌ݻ櫇ቦ㫓昆創唱⻦刍㆚棵澊⿴泫᝸ཙ㐤糈෎歨ᑄ⧦再☦灥旁皶噌ᱵ歄羺۔�檓囦⸡冕㔂稭ᾓᡔ๎惷૗ᙷ┉痔㍊─氡僝⍺囅਺䷊寋⡸畒晹᫉╽櫟哸⧌嬣㚒簵›ౕ䃩ྲྀ狇ቯ㋐ᖝଅ垐⨁僮㠚曥压矶࿌㽺᫃㕸ۮ൓૫搷⩼嗶⧔倕㋓槧翊捾盞䍰站䗀ᰘ囟⫱吅㲦併⤻窶⻭ݺ磌ඐ罪ᦕ㈸晽䴱地㊊悙㾪滅⯉஼䫋煠擭ᨚᯔ文⠡岃㇚刕ƒ䱔ͱ㽻燘᎙挃⥳檣呄乾夃㌒抭礒ⶴ抎⽻磙ᎌ笒ฌ櫈㚓ⷁ夳㝚歕慪ᓶ⣌呹㱋䶉䊼姒毋咲䷎响⹦咥⌻撆ҍ᣸懋⵺䛕ֶ⯫喴䪉倳ズ堹㚻⅗佉᭽从䍴✅൤橢搵⥇Ჭゆ悙᭓඄泎僰磌卷⚳෱᭦和派嗓′䞕᤺悵狖ᱴ⫒ㅿۢ䗒⨰㙴槫᫃⋦皥淊焆穏੹僕፹ᔕ█毌祧䳦必㚆䕭簻焄纍䝰❗䑌Őᖮ厒ᙉ䦥埝㽒篥治ᖥⅯ䋴㧉䎚䫹ᦿ欌㞑⫥匽ℶ碕炊䢅櫮㾾㇅⒀̓ᕶ᮹ᚏ䳉⿭㚶䷭Ὺ奷Ɗࣿ㽛亅┾䕡Ꮜ喜毅楅㍚櫹人搷ۉ˽煕斜⛮ⷘဳ啠浮墽➆惍箺⃔卋ᥳᗜ䎝ଆ䶊㎋哑⾉傁〶祭㰺䉔ᣫ煾◟⥦糠礿狦噙䭕儃⾶嬥䇋㫗嗉瓻㛌㖒㳫ⶃ㉙㑄䵵婓㦆䳹䵻ፕ翎䳱ৗ㍼暼䷾婷᠄澕呅ぜ䨞帊亴俈擰凗Ν圝䴤ᩯ哻⻘䥋ㄔ䣭Ⓤ捗珈䳴磂㲁䚽ⶡ容㑚槭吕㣚媕瓓罶嗩瞻畈⹠圡⣠武◶氶圻⚆巍ࠋ䇔秌囶䄾孻ᝩ㕭婵朖棇ᢍ㽸叅⥓ⷔ΋䫽槉ᮅ嫇䵦尝ᛜ氯ᓺ㍖啕宪✶玏卼磟歠團ෳ将㙸氉冃㦖滕᩻堇痉拴ୈ繱嫍ⶫ⬫㕮毹忛␒琕଺俗僋⳸槎禞狵涧䭺㚞涵寛∖枍㉊侷潎㳱緄祺磝䖳ஶ᝼梽叛⺒怽ᑺ俷絮ѽ⽂乹嚯⵹嫝㛆⼙ᨙ㘴尽㯺�Ί⇺楃ވ㚷疄㪧᝴⨣ᗶ⨔耍ћ䒕扯孷淅絽໗ⶄ剻垒榎僫㍊槵拺㏕副㝵ᣈ኉䳐ᕀ㫟㒮⭽婕㱮紽Ļ࢕ᤎ䧷緅䍮ⒹḌ㰋ᑯ亸卾◲不z๵஋櫰痓➅㳬ר珧嘣⩟ᮃ⵶䈙䯻堅ⶉ槶拖殞令涯婌砕⾊嬇♴礭決嚕畍坷减᭦ᴞⶤ㨸砑濽僦Ⲷ杉絪ၕ͍纳哇枃ଆᴦ䮄痼毽吧㙎报攓榖矩恷ᝍ㹷Ⳝ崤宼㞔එ宷Ⱒ勍嬲樄ታ浳ϐ疂䅭渙寗㜥殳壧㟢峥嫚ᢅ᭯㗶变卷༊䶥㨻嚥樣塇⑄俥ㅺे姍ƹ㣖喃䳉巁ጘ枤䷝埇㼖䭽⤊奆月憾寘甼㽘1+⦨搎⭌䵐⻽ؠأ眏痿ễ㞆屩惻㮮皽沚䢗➎廽ゑ㦡ᥲ␤ެ睩℣⃼ဩ燝格ڗ➮絵矋Ε厲緺篝瞆厏嶐ƞ矀߻囉ሾ瑝唠編弉練ޱྙ滌䷭䩡睃檧媯∾塝ǡक戏揸䫛筥㉰㵈箼䐣殚峱㧮䶦犚㤖⨉擭䟚ཬ妀㔂帓䡵⿿◨㉗⦾儁椔ᎈ盶乻供Ἂ惆⎋ܫ渇她塾岁㘴ᒦ⎓䘵⟟嵡笄ⴽ䗅睎煲ᛏ㖾敁ⳍ橐শ≮ὸ⽳偾Қ笉嘜湔儇㡺偍͚䰺ญ毸吿⾀剻㷦簍矴渷忘၈ढ़䥛䔑昊䜁矙ថ⬀㷊窝矛沫ᚣ෾搴�㍁帊⦉ᡸὬ㼞㵶箉甫殯廅孺ઝ呝㙃؋䷎䏮⵶㼅媽䃐篹桍哗⢮悝ⶤ洗㐉ᗆ࿇澅㺬統窝睳䌵᭏ⶾ掝㦳囗ٌ対淉⍭䎁㷍箯⒋梏囃ݎ烝ᴛ熗傁篸⿗殜䛖浮㬥甧殇噧䁙झᠳᨔ縈烉毷ὺ绨恝㷻盢ⴏ孟㯞犝㚛气্࣌㿛㽺碱絋ᨋ媏桿嶟㿾卍殚༹〈孫塢㾝细ઌ筎ᓠⴕ孾߾砝䍪朔㇈寶盀罪弒緺稠ෟ欟垲❴䡬៲ྔ硐⁝寁罿໇絖෋˒Š㪙ᤡ挍ᦱᠮ་䘢ߦ椡࣏㶀⦐໖ـㄉᡤ倣ڋඔ䰉׾䂄皥ǂʹၨ೓⋠㕔Ƌᬣ樧爰堾⨪㙅➩™Α粨ู盈⁧↡獽㌛ᙫ砸ⶎ႔ݪ䢱ͼܤഹ睆䧠犡椝怛檃ᐼ桟繗㽬狻䴡窸ಖᗰ㑠熞朆㌦ȯη䁑傈䃬扲⁣㕙砕勐フ䇡睺㧛椇䫯偘珙㝬䇦咒ٗ嗃ℐ㇠炡䂣眦中垴刹缫㳔↾㈩竛瞠᭏伭౾拺࣠焮⭐dž壻㗐⇡䛈ڡ璸ᦫ⮰扟㤺抧䃄ᰥ௾㊤傥⇠䋭尬໡Ⱗ卯⺞啸ᪧ๰⍅㑝曥愭⇨湢ቻ͘ᥓⷰ枧⋴伦怄㪊㗲䯞❫⇆õ䂚࿯ے澅᪁笰↦紮瓄ⱟ៉⊕晡䍼吒ൔᱟ凸䮁䛣㧨ܬ剮箠儡䳖歓䐌䌵砏⩥妯⠍◣咧擸ḿ䞩繒໐猌禰ᔟ䖠Θ㏐悚剣䶐弬縻乨Ҍᠢ㢾熱䆼䔃ਾᄨ扜洣ⷻ慗愎䡘⢌ㅔᇂ火ᬾ䞢᭤㖴㇨囀汊狷᪭扛碙⽽懊堤䟡擉ୄ㶨紐䌠㐀擇܀圵ੑ䁍ᇈ䄔䟎โ檌啀㒱捃ᩦ崐夿旫้䤏ሁ屆掯䃓࿤㔴㑱元宧Წ儹礹ᒐ岙ᔂ燽拌䛛矷唨粸穄Ҧ怬䤽䩒咛拈漄ᙱ⍵࿴溊᩽௺㊑㍦劬㤹硻咑撅冥⎶䙭䔎⏤㙟㜸圠籊䘔簿濷炙ࣳ㣬㈎䞃䝚᫄㪠ᥘ䢃ⵦ㺭ᐋ䆅ੌᣳ⤈掺涵๙ฅန↱侱ⓦ䃥ⴸ䝴敝㑵䣔搝牉൥෬㕨浩㦘擨㲢⎗磵䏃࣢碫紻Ꮻಆᩅ剷㧈熃校㖯㫖⼳Ⲍ壻ㆳㆢ䜒䛚ἄ㭨绑䮭匓䵤笸੓撇ᝨ爎⢻⦄ொ᫒ᜡᥰ㔃㫚炬ᬈ≞ᢘ愄㇎⍞␇໒Ҫ䔊⡆⍃⧧㮭଻䠊㩶㤂ⲳ掣䞪眮ᨾᆘ慱掞䉠⛥㐼噟岇撄纠巾ݷ൨ᢸ㦗⤸氃⬚ǫ᪩塓᤹咞瀢㴈桨↪Π࿴⾈缚၆⒡䂹樫悴⠴঩八䜗ࠜ椠㜣ㆡ䜃学凘Ⴘ䅜䊚Ԍ㣰ᐘ䄰乡ᩂ㷸焑杰⢠樀曏੕岊䔀债ፚ䆄㕯欸㘘綑獣屇宮᜾ㅒ氹╶呩挫䞗ฑᣱ峴㠞ዥ䈂㹤Ⓙ䵰寗➏䇲緞䞟൹ল㬼㕩䣃଩祱⨺䥕㉚哛ࡎη䙩䜎䤢㧄惩䋃㵆婮崢笼澳⥒㣊⁖♦ಌ⾂ツ笩圳㽧凤Ჽ䜿㊑桅㎆冰�䁩椘㓋࿩䳣只汯㖈煘翇ԛ䧧ሞ♡勧ப㇉㾤ᎃ໧ↄ璼►䪖चਓ㷥穼䵂Ẫ㳄捉䦃嫧涯઻ᙒ糚纒妏૦Ɯ噵Ḁ恊ۉ碃䕆լ䪲絷⪋䆣⧖⸍⟊䵄桩ᢴ灉硅汛焇窼ᥞ慉喗䒱叢㬚亥Უ围箜糃ヒ䠇攻㉘◈㤎拙叉ᐙ༝⻟᥈粦侃㹦抭䠉╽⒙䤋ᇩΙ⟟ဘẅ᭽㾉歃伺敆溿牞⇐䣩⚷卋⚪甹ᷦ厶⸉緳㩽㄄粊ҹ溣䕗ᛀ㎠ߒ传ᷪ㸈秉害毆㎆䆿˷檁椮⻈֌ᯥ㯵ᰦ◎Ⲵ橓⫇ᵭ᪽㥗墕坤挌㐈机䲹歩妑㋄婓ໆᣭ滏❰ಎ䮘⬚㐏☦畉ᶊ㖞⺹朠牧ᆗ妾妰ಛ垍燾嵋慦䴎伺㉇㜑奓๚ឯ䢉捑䚄卬姲㐇⛁倃‘㬬熦糓᪺哬窺秺䍕⇇廀卟嫎㜹䷶㱌烼䏭㔪䛮則≗瓐泮姫㏐櫪ᔫ᳹吂ㇹ獓௚坭妽ൿ㲃䵷姝厬⚀倕噚㏤椑幓糆レ㶼ヴຓ否姨琊䃴甦ᣳ尽⦹拓倦ᆭ䎺墳৞᳤妽㶼枚䶃ᣆ㕤፹湓湻ໆ஽䭚皃ཬ分䑡᯳ʷᵆ㘻⽙翥嬆ᕯ反䄠➥玾姡厷᫢哗ᡘ廼擹熥嚋其宺珣ᢋ哯㧖珃曠噭Ἆ噲㊉禓ƚӮ圍൷Ẕ⎌禹叇ᩀ㏏᥉坜祙嘳儇௭⮽坲废原撱厀⩨価ᩢ㊤犈䴓㱇⑬ࢾ彖䊌ኈ䓨㍉柁䰿ᵶ㘦⌙夳䉇⡬㧎罐纂䓰暺ፐǭ൛῔㽜煞媓懲୔⁽⽒Ɯ植ᨓ掮朶使䬖㈼猉歓甆㚗㟯⃕ૈ繯妩瘍፜䲴漒㮄挥朳ဇ懭䣋ი碈㓣೺ఖ曉㐮⽶㔌糊厓ਸ਼兯⁼䍾Ǐ浧ؔ⸌៵䷉洼ゼ慄䢫䠷ब甼ὓ᭜⌝㦳吜緯䶍ᷞ㳔瞙缭䰶ⵯへ⳼媞̎様㨙毰⽪殽អ略冣⸶呎㑾ٸ㵏̒㊲痘ᛅ亾滿ᬗП㽞ڇํ㼋戦ڙ糦৷玛柴⾐寋ሙ⧥䞫㈇๥ɸ⣜ƕ䌍秶ଲ៕๷ᴞ㎆㩅簫ℷ䁌ⶻ埁㷁㎊☆穆᜹㗀ᣱ㌢氬晫⮆䣴䂍存Ὥ玐㫲䮅บᑴ嵉᲌玥湫缶栴橽➇㚊㓹ᓢ䬻昬⶟⠴幌筅漽ʦ祌硻㝲皗甁֠㌩ᐍྒ梡㟲燁忣⤷`㱫䃖ᯌ䪃凂௹晽ྈṉ㣣㍙䳫檚獍找僞௉䴏槀搄ᨠ⵿ᩂ㉳㴅礳䀇界ټ㓜㪚猏秩克欝柡῞㆒瀙媽ះ峕庽泔埚⣭刉ଳઞ佌尚㳼竬矞䤱࿒偿❵֘察㧮ᕀ寂埢庭戲歋⩋琂䆷㱬㵘㪓㋭㪹ః䘮乂娵呃✵克㯆惎煺ボ沔壺⨔䮌歒䲲徵忋⽂卋敚⚅᥻Ųᆖ紘䘟䭗ߍ๧⸥㘦㙥䨓߇掬㞹狝榜⫠燛䯛ٵ丼姫ᩊ氮媥処檖≾哐䥚ጟᘖ⎹䙁圻䫵㉬愹奉撷濕呏䍝庉ഓᗴ嵄㬸㑺嶙ㄣ૵垽櫡塂憏粴琢䡋嗙Ⱋᚡ⿤姫ሊ毵䏋öྯ~፝⚑唍秐歝⟝⼲ᡙㆂ綆纓❵籏恺䛙檈厛ᘎ產䯹ⳤ嵮㺂罅烅泷⍍㥻Ⳛ䶖ⴆ㘃丞Șⴊ嵺㖘綉匕䓷ᗎቹὙở熃㗃⮑晽⺾ᳵ㻲珕痋䦦䯬♎ۜ㖇⾇喰殆嚒⑺州㾊竕䟳㇆ᛴ泯嫟ƞഗᖪ⭪៘㟨寄㗔杕簓շ燏䳮勑斃㬑ᘎ⮞曽ⱝᵝ㌺瀵僋㽷઄掻湕妄⬉瘁ଷ埙㗾對㐘窥之௶姭彻⧴禑紆᧛玷暎Ⳝ妽㋬炅䇋㉳翎⹺杝΋狩㗤欼៫ⵐ櫍㽰穪泫壷㻎ᕽヸ䎉嫪嘆姘㟻ⷌ塺㵊煱簋瞆篍呎棜涘䵲刑殅ᐃ仿᧹㚦捊䘻⯶妮⣾罼㦌⬚旼玄㝤ⵡ嫽㘦淹嘫粶磅㝻䣛农㋶ᦲ௥晨⾎并㽒琕燉祖牎᡺奱妙磣疻ᦟᙸ滝⠥㡊掭纋ᝊ峭ⱎ⍸⒚஌丕殬ᝏ⸹念ン⸶檻ṗ檌剽盖憍曢丝珛垬湉䨽㢚梕瑍䉗懍佹⇝喏⛸㫹歂标⾹䥎㞦纖䇭⃖嫯䩿෱䶛嫢▌毢㙋䶁壑㚲フ塋婶╭掻烑喁䫼㬂学垌渊幅哲慄悫૖姭櫾מ⇒㌉ฉ䰁㚼㞡墙㿉⦅縻㢣⭏囔⇜㍛㗀淴ᨄ㝤濡儻㩲⅍⓻彀※ި㓇䈢⸬ᖬḸశ浖ɻ㨂纎䰓⽦濮ᓻ䛒⍵㜕╥嬲碤樽尉Ⲗ欵缨㽘ᯉ㹒旡嵳替䗜歸ǎ汮別ⷚ偞ೣ瀭梂耇ㄭë㜗䖽寞ᝈ⾙姠Ⱆ洣ۂ俗と࠰໎ὺ༐番嬭䝫旣嶍⥿ᜡ⃩䄘缀㪺緝ା≕㝸႟㛜స氧㛂砽劻⹅ᤏ燿ϓ㤷໶᷏᫂挈对ῇ㏃䭍瘋沍ഏᦨ◎枎䛬搤尰᧭榉姙௮悽僊؆ℏ燅੧枓㎢戩㭹喗⧍夎㆓⡆᳛⏖䶠㿵曖ង⡒帓寊盆䖋妇䞤ૅ㻛ᶗ㞍෺敕熐⺫᷃ᯯ㝬䇷㼩䛽䇛▘㢐梾♧⊌㾟幛⏎瞄仞哗㾆揽䯛繆ᆳ緸缸ྉ漆࠽㶽槈⎼楄᠏᯾қə弍櫵篝⮟滳偨符䂣淧孯ゾ翡˥൩߰珿࿊尳ɞ㸔箩癍溫孇へ佝皛⤖夨䯽埑供帾㷕䬌ᤅ圷壺䏣ൽ伋⬖፰寺矗暿延シРI坑䟿呪厦E皕᱄㣊息尴䙞殂⎀殸ຠ埻宫૰㉟淇峸Ū⌓晒የᶝ湌䐗嗕埼䜎殾檩維尐煗沄ӳ䶴垝䙠縗㻉⿹ᷓ棵缅淍㠦Ƿ䁋妯㵱ἰရᰗ煙㟽繈羔恓縇㠠ສ》䊠綉ἰᙀ砡瓍຿䂘䄌漞°ޢ䓠ᷠ 翮ԣ淚栮ἁ灜䟿愢ᡚ�䎽柴抰㰮ᢆ᜝捠渖楡矽䦃㸯ᤍナܼ璮䨢切⇡泓㪤娮㙢䁜ゞ᝻䇽שᢷ⑎⡒䉁أತ㸹㦋ሾ䡥᪤ċ偦Ϗ≸ຐᶀΰ糈ţ凣佶刼ᑘ䢔⤳メ䏸ⱻ畷ʖ掬ಱ䂪˥液ǩⱞ࿼琲ポ䐛ᛩ癪瞡׸⾁猼㆔ᵈ窺㱟偭䏵∃ᘿޣ淩㘤㺛嫇ा塧䨗染⟾ᇭ涬ద偖Ĝ←ǽ⟤ປ፳ᡧਹ壂㙱ᑌ㳂4᣼洑ဘ䂟Ӕ⦱缚१㙈焸䨴渢㯞ม⏄*Ê慴㿝㎒ᇃ暸倡搉婞⥥⬣出ٰ¸燆૛༏濱瞬敀ጮ瀡䱞⨡ㄎ缜滐䂱䁗䇙x࣫ࢃ澢▮ೃ硧࿆夗攽ķჭ䃯䃠ʒೀၺ⑐睁䗀㙛⃯愵ㇺ掲䋸VῈ⋸绤ᵜ㳀綯ܿ碦Კ场燤㊗䜬倠³⺁粗㜮燮揧䝐.Ἶ栂eဃ惄ᾮೀ ୼斤耑暾㛧ޮ笿Ş㲝㺤\\Ꮱⓐ俿懗得㠈㬬ᕸ嚨玲婁投枲⓼嬒䒄侵䘲㹞̀࡝浇寢⿻綸簅ॴℬ⵫刅泫षǼ嶈ᖝ掎ށ⍡代ᱯ攗䧼犎✢佀㭾灱ƾ米⎝ሱ咼枲痃ᔐ⤴吙➺ぢ䂴ᄪఅϵ暠㠡ߠ罓ἠ儊崿䢋⠡昜䁒䌫ݍ㷬㹧櫡㪿畟᬴ਠ琡੆ᢈᣒ惘⃣ඓϳ䫘⫐庾Հ窚剰䲧卓ᑖОḑ埤࠻ᥒ㵳瑯㓤䍜੣ഞ厊炒磨✼䌦㳆噠瑁ओ擮乢ᦵ祯䒴㰼�kຜ捉̬炀ɓ䥀⣯䚾㌤⚔ٚ≊㏌䉩伋᳓ᆐ䡀ͳ毎囮㫃呅箯㘻᧧≃❻皕Ḋ㤖ᢉ睨Ĵ໮ᆳ䝘㊬်☩↉栐炀ũ挠ࡹ窤❬癀提ॢ恬ⴇ䜥ၛ⟣伽ᲆB䝙溒ᴇ⧯䊀杝㬍ᴕ☷㎹ㆺ↛Ẵ⠌畑憓戔旮ᖑ坝᚛㴹ᜮ珁朦倗ῂ㳜焹–䍈 摠⿎ァ㾧๾ர⼨ⷯ㘽┥稬簲泜〢ᔀ⼇Ꭱ㸢瘥戫䐠⡎᾿栢ᒧ̆\"௮㡵习ʡ㵢秆 ࿙ఋ䲴⽐征㦢瞥縫户禮⸡⫡冗Ღ䗣ᑊ᠃瓘弙⒢紥殝氷䙎䑾幟ኣ挍̵௮᠇伅垱㫜禳ᣔಷࣨ੼狦য嬮ⶖⰵᝢ伦悉㮼仅潌ᕲጢ榿疸噡偓◮崣᠚痬屒䇀ૠӁ㖷协擁泛乧㌕⌮዗㰘坨䫙㸃ឹ浐⠤柠ⶡ㔦沑Ḱ䓇䮳ు⸰ူ‸昢ᩝ嚱⬥࠲⋝ㅘ㌻昃湵梞⿱別㴂ड़ᗲᱷᛠ兾簶斖㶣⍸い埁禪巻䉪簅翫穷痡㉺䫟恌⬊咻䩷⼅㨌得嘪䧙始嫄ॡ฾㼎䝆箥嘑剎坭༙⬕㾐猁൜⺁㦋捼ᕘɚ⸠⓱㱹堞ѹЇ幻㻾榋傢曹珓䙟䘬᰻㰲⯍堈侻獍䀏學ㄋ涼ٰ墡ٳ䱞禚猥氄撫⧎巊播俕永⻷住佽㟸ཉఠ伫䠰䁚ငἉ٠愈᠞☄拱㝽⻛䯨ᒬฝ毒㴇⻍䊉ןተ䬰᱗䉘渔́㛬笇㗥ၝ堆⻗ẝ㴀ต抰⿷䓳ᨼǚ判܃抈ᰄ㟗獁嵳㮠㍒ဢ㹉吁兿籫⯮救䷯≾᧏〓῝㪸类஋䙌嗴አ䘓癯乯呑㐦㝇恙崧宆祍拸瞘ŵ搾ᗾྠ圞ืᯔ恜漈ῃ㧦瓛ݶଌ㣹ճ㞥盡᪥ⷿᨵ㞮ಇ໚牎̴ⶳ熈⮎䍽⹂䝓ࢲミ⯩⃆㟀㇠㠤嬕ᯟ㹀俈㚽㽟媗箨樑搱⃅俫Ṷ㸮燨ᯐ◬兡⫠烘爪ᐠ$䈠Ŝ甠沠ᚰᅤ䂯畞㼿㜯⦉怸̋俰樬繀̎㔾浞纐甈ḏ撎㋛⋣岕Ẃ珠ᛨ⹧㠡凾揚溟༉ᷪ㯔矡㡓強㶚䔉彛溗抩碣㬤⮗羊惐篹疖焧ᰧ㤼炔ᡛ疗烮⶯䏝粩༙巰᣶睻矻彇㺎痽犾ྗ̠⏾簰侕峘緹劏㜧瀃䖺⛴白暛瀇ᎀ梠䏘準ⴉ㷽㰛眭潷峗㥉Ց殛林͡巽Ⳃ⁢Ἂ緫ᙳ眾漾㇅ᇏᜫᓛ翗㷯ᗼῘ⾜缒ᨋ箨睭潟巧㨦ᇽ枛怗㸎^₞㔪↯ϰზ⊤Ḹƿ㷘ባ欛窤樏ぞ璧侚༅縑⠴ཱ濷嶟㯀琝欧窗尿宠㢦ĝ伛䐃�⒙滊࠭᩶猡湟ᆠ栿㮼罛䄐漁Ѝ㯦ཋ潰㳐罡碽箛檗氾侓矞औ㼜⏺礅⁸䄸ƍ✿⿃烧吓琮噰䲝沏㜒㉅䟍咸煥®◑糩樬䎯෈ᒠಚ夘儏玦㯷཮ᾜଘ羑窃摲ࢯ㈏烈砈ק愑⤤潊✑䞌℆僿嬈晑漧怯繐挼ᒂಓ๟癔剹ṗ泄秺䆺埡ᙯᷴᓱ檯滋嵴后⟅ࠞ᧪㱍ઊ፳淸৑䈨⦬ឭ㊛䶲ᐎ৆俑䚛䖀⍴䓉渠Ɨ䠠̾嶕⪐㐠㏭壪俾Ọ催耉獞ႇ峷ை犾䚝䴙癘冩緑佣ἅ喿役篦㷇䯤㖿䭞嶮Ῐ氻㐜䊇೥䣕¼礔暓筰◯彉㭝彆崑㨀琜栅ࡵ׮㲼繼䦓硡甛枾幝ᆐᅠᐶ琕㘿侫焆㳼ℴ穔ᬹ⣀䠀粼祜䌖℆௤栟佶⧥ὺʥ碫眶я兡棝瑱㡩␠徥が₣Ὓā摎瓋ἷ䅀䉿䓞䦛紖揠䔥័ᱤ徫Ⴒ箎ⵍ悷朠♾䎈榟㾪䨲䰏㈗ᜭ္㼷掉瞳漺㚐百泝禚穫昌ܠẟᝁ燧椪竦㽋答䣏⪾㭱ᖛ䬞䚡Ⰰ剭⿬㗕䀛䈅绫歷䌩坼竝㙖ゴ䘎䯵䪓⽸㕍㼊禵皳⋷懏㱿ໟᗨᠯᄨ㛏䔲䊺怗劚缌ڃ缇梄㝿ई㶞ᠥ瘚搋ᰃ⾞忣㰦纵粋窤㽏Ɩ缐䎜✛☖ߝ៴潰Ʈ幍哵皻棷彏⵿坒涟✕淳ᰑ堝⾲待㹶硍筋歲↷ਮʂ㖟圚⸋⟙㟢潍復Ღ禍筻慄擰⓿┗僤欟渕寠ᾖ濒幧㶖繕牛矗窉們婬⥙ܘ壎敒⠕⾂录㽎結᧙䎗紏⭆⸱疫☩庋䰋᠑稧徂佒秅疋捗喴㏾䟜妚屖䆶簕៶⾙䤾㴐㎝疛泗喴㞾氰α编⚶扖硘ࣇ广⛕⏙穋櫌ဿた࿞䄜ٽ౥̋坪哃幆栱≣短ࡹ孔⠠᪰樆㎓橙堶ྻ㪣૵㹬秺侧笯导ឿ晁䤜ሑ凟߶⬼ῷᤈ糱秹焧絁न穞ᒟ⛇㈜搓☨〱擺䇘⌟妪糂ྯ䆄䅟䢝犰ᅪ᐀⟭砨擲㻕Ω秤䅨ᙎ㗬渀⪞㾛㜓㸙⟮⟡⒊㺪㽙⁜֨Ế敚䍟䚜㔛༕㊺ఱ倌㸚畬糹竊➇砯佚䝞悞垙ሖᘊ栅࢈ἡ敜縺ֺ䂇瘨ۄ㧡⏿Ԛ寈㐝䋕Ϟ⡡弢厥縫箇灏䑿ຕڟ唞㨘ఝ⠘࿕潸疲紉窷⶷瘇ο䃞捒⩕☗&皽晪䘹㿼綅籋繷篃㭷䍞䖜旵墪ᐋ浙䰑積㻺繵繥珕Ϗ䖡㧩㶞அⲖ洎ⶖM❿⢱Ἄ㧢缹瓴ⷀ潁幰䵜戡缙␑௱忆佗ᫍ糳੗碏夝⷟ᶽ焀皡ᰜ簶琉怉䆆籛޻窶୳勿ᤏⱝ䖝渑礒㧫䊋䟻㸥㹬䚛矗恎⇈䏟㷂炥⚓ᰞ汃堥徆悴㳽罤缗搃䛿ய掿噟帑Ⓕ矴濟忇㸡籽竨֗搿䜗⭉依㕛Ჟ㰎㕂簷忩帺∗䌻翗燐㱟揟झ⢣Ḙࠕᘮ咋弸纖匳筻狄⦿䯴粞Ԟޞ䖬⠄倇澣怗ཆ米秈倗溏澰䯞生初帐椆㹔‌擲翭᳘ⁿ཈ο窇棑ଜ怡琐ࢫ砟ῃ彻癮絳繧穏稘⋿ঞݽ䤥㐗暬瀔徧⠪罍翓籵ౘ囿募ඞᤱ稜ʓ簟䡅ᾣô繱糫翇祏涯澘㦟䴜仜㰞堞⿨⚇౵峂忋翗笋塧掎椟伟拧ᐛ堓瀗忣㾈羸㺣繂缿繤ᅁ沞翞␘⠟倚濤㿡㒙纽继箶宿煟功勐⨝♛氕砀濳塿㽆纓紷磏瘿硟拺ᬟ稟䐟恙မ⿱䰔ᣢἋ缕䂏睡槟窟土挝㐘㐖ᘌ㿯㿱罣罫縯穐യ硡償爟枂⠙夭 忿䡬羋濓簢绿糟穌᤟ȟ籂㯦ဘ渆牍羯徺罽罂㡧瑏椿䣟娟䜟栟簙圱耎愪ㆋ罽⡠Û罱྄䐰Ç缷㽒㾍㾗㼣罯罃罙缳缥缹㰨 ª硧彻ࢁ玎pð侓ࡌ¸缦硝罿得羝㾘ú㾏罄ÿ羃ᅾ猢Ñ✺ÀĜí罫㞚½缤㡂¯㼲Ć罒ô㽤Ôྂᝦ¢罭昡Õ羞ࡇ呅㽊网絑úĚ㒖Øē弬罾ą弢ᑉáµᄵ±ß傝灀缣嵍Û㽢¸×罞术羙ö羃罞ą³咍ĂᑫÝÆ੮�㽹㶛Ë㾝×㽣ě枃º㽃㾀㼿羔✲䦓㽧㵨恶㽛Ď㼩÷弢䑠䃋¹£á㽃ò³¤ªēËᑟè䄊絇ûà粆ܼð彤JݶÍ㽷¸䄗Ø䃯ÓÅËᑜ䂫罩ᡪ䃕牒݆Ù㕜䄜䂷缡㽴置¹缤䄏êĔ❦䃊䃪݌䃀­މ݊ႌ䂶㞓ࡡ䃳⡆䄈â䃶䃸䃎Ę䄒î䃄䂽咑䄔恵ú愵䄁䂭­䂣�䃑綍䂹㾑很䂹䄂䃙䃲䃒䃳罋ᒝ䃕䃥婋䂭Ñތð䃢㽑劖⁡䁩䄔yÔ罣缥䃦眿Ăល䄉É㪁݀ğ䃽䃐䃋㩀⃗䂯䃖䃏䂾ä䄒䂽吰ℋ䃰吨₭Ï䜱䂾兔⃨Ą羈䄀睙ò䃥«䂽呬₨撂ℏ䝰⃇䄅ࡔ⃨₼⃿䡜₿㾓䄄Ă桊⃾䂡ᢆ⃭ᢈ➔⃂ᄮ⃌ℚ缺₧睚₥Ø⃢⃑⾎₨摱₸➒⃮㽩ᠮℊ⃢䃼⃯䄎Ö罿䂢ᐹ₶₻䡵℆䡾㱎࠾࡞ࡌ恊ᢈї䱊तࡡ偷䠭⠺ၣ䡌ႜ࠻ࡾ㱌Ċ坆⁁爿㊁ₔ嬵枂幓㱎炄瀪側瀹やぬ瀶䀰�慄⹦灟偱炟Ɑၧ̓弹�y偂䁏•⨷琷ၑތる䜢�ₔ᱌+⃢恒ဢࢌ�t愞ဣ䠦མ��䡺じ♳㱩灱䁯瀰瞜悭Ɩታ㰽㝀㽯ႅά�䡚亃彪㰨ࠣ℅ၤࠥ/灏灒梒ၗ灞悢࡯ႄ撞᪖㱰⡷佯㼬籯E\\惌�稡⑳㲚䝯_%惬怬惆瀿�愂䀭惢倣᝚悿炂栠ࢅ‹䱶惥࢖惽㽮悡惺䡏傁愞惍栶〧惱惖⁾⢖悲ݖ惊Ἠ㈬㉋⃏‬lဤ悮݄愌`䂄惊悵ၾ悑ࢌ惼惴䡾恒�࠹䡝ᡥ⡧ࡾ恄䞋℉��ჴჺ₌惠䀼ᄗ灘䡙愉<您დ⁔Ⴢᄉ�䂋䞙惘Ⴤ�b䂌愕惚ᄆ灦჻࢕ᠯ〢ᄔᄋ⃻ゔ恱偟䊈店灢ࡋ༡ჶؤ悐堭怨瑖჆₉瀢₟ₙ灘灸᱀  "}
      

    The complete round-trip took 48.2 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.2.12",
          "r": "4.4.3",
          "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-7802-J6B9J402Xfrm-.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-7802-J6B9J402Xfrm-.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-7802-J6B9J402Xfrm-.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-7802-J6B9J402Xfrm-.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-7802-J6B9J402Xfrm-.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-7802-J6B9J402Xfrm-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7802-J6B9J402Xfrm-.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-7802-J6B9J402Xfrm-.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":1}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":1}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. request-slice (request)
      Show Details

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

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

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

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

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

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

     

    Magic Comments

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

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

    Message schema (request-slice)

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

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

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

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

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

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

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

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

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

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

    Example of the request-slice Message

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

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

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "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'), 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'), 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.6 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.2.12",
          "r": "4.4.3",
          "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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.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-7802-H7vG4IMBcUG3-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-7802-H7vG4IMBcUG3-.R","role":"root","index":0}},".meta":{"timing":1}},"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":[]}],"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":[]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-7802-H7vG4IMBcUG3-.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":[]}]]]},"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":1}]]],[7,[[5,{"types":64}],["built-in:library",{"types":1}]]],[11,[[9,{"types":64}],["built-in:library",{"types":1}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":1}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":1}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":1}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":1}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":1}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":1}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":1}]]],[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":1}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":1}]]],[54,[["built-in:geom_point",{"types":1}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":1}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":1}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":1}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":1}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":1}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":1}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":1}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":1}]]],[89,[[87,{"types":73}],["built-in:print",{"types":1}]]]]},"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 26.0 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-query)

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

    • . object Request a query to be run on the file analysis information.
      • type string [required] The type of the message. Allows only the values: 'request-query'
      • id string [optional] If you give the id, the response will be sent to the client with the same id.
      • filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
      • query array [required] The query to run on the file analysis information. Valid item types:
        • . alternatives Any query
          • . alternatives Supported queries
            • . object Call context query used to find calls in the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'call-context'
              • callName string [required] Regex regarding the function name!
              • callNameExact boolean [optional] Should we automatically add the ^ and $ anchors to the regex to make it an exact match?
              • kind string [optional] The kind of the call, this can be used to group calls together (e.g., linking plot to visualize). Defaults to .
              • subkind string [optional] The subkind of the call, this can be used to uniquely identify the respective call type when grouping the output (e.g., the normalized name, linking ggplot to plot). Defaults to .
              • callTargets string [optional] Call targets the function may have. This defaults to any. Request this specifically to gain all call targets we can resolve. Allows only the values: 'global', 'must-include-global', 'local', 'must-include-local', 'any'
              • ignoreParameterValues boolean [optional] Should we ignore default values for parameters in the results?
              • includeAliases boolean [optional] Consider a case like f <- function_of_interest, do you want uses of f to be included in the results?
              • fileFilter object [optional] Filter that, when set, a node's file attribute must match to be considered
                • fileFilter string [required] Regex that a node's file attribute must match to be considered
                • includeUndefinedFiles boolean [optional] If fileFilter is set, but a nodes file attribute is undefined, should we include it in the results? Defaults to true.
              • linkTo alternatives [optional] Links the current call to the last call of the given kind. This way, you can link a call like points to the latest graphics plot etc.
                • . object
                  • type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
                  • callName string [required] Regex regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression.
                  • ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
                  • cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
                  • attachLinkInfo object [optional] Additional information to attach to the link.
                • . array Valid item types:
                  • . object
                    • type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
                    • callName string [required] Regex regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression.
                    • ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
                    • cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
                    • attachLinkInfo object [optional] Additional information to attach to the link.
            • . object The config query retrieves the current configuration of the flowR instance.
              • type string [required] The type of the query. Allows only the values: 'config'
            • . object The 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 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?
            • . 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'
            • . 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
          • . 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.2.12",
          "r": "4.4.3",
          "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":1}},"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-7802-m1LUzXjiAJgz-.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-7802-m1LUzXjiAJgz-.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-7802-m1LUzXjiAJgz-.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-7802-m1LUzXjiAJgz-.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-7802-m1LUzXjiAJgz-.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-7802-m1LUzXjiAJgz-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7802-m1LUzXjiAJgz-.R","role":"root","index":0}},".meta":{"timing":1}},"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-7802-m1LUzXjiAJgz-.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":1}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":1}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. request-lineage (request)
      Show Details
      {
        "type": "request-lineage",
        "id": "2",
        "filetoken": "x",
        "criterion": "2@x"
      }
    5. response-lineage (response)
      Show Details

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

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

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


    Message schema (request-lineage)

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

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

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

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

📡 Ways of Connecting

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

  1. Using Netcat
    Without Websocket

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

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

    Now, using a tool like netcat to connect:

    nc 127.0.0.1 1042

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

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

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

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

💻 Using the REPL

Note

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

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

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

Available Commands

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

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

Example: Retrieving the Dataflow Graph

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

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

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"| built-in:_
    linkStyle 2 stroke:gray;
    0 -->|"defined-by"| 3
    0 -->|"defined-by"| 4
    4 -->|"argument"| 3
    4 -->|"returns, argument"| 0
    4 -.->|"reads"| built-in:_-
    linkStyle 7 stroke:gray;
Loading
R Code of the Dataflow Graph

The analysis required 1.6 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.2.12, R v4.4.3 (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.

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
    }
  }
}
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.

⚒️ 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).