-
Notifications
You must be signed in to change notification settings - Fork 10
Interface
This document was generated from 'src/documentation/wiki-interface.ts' on 2025-12-03, 13:12:31 UTC presenting an overview of flowR's interface (v2.7.0, using R v4.5.0). Please do not edit this file/wiki page directly.
Although far from being as detailed as the in-depth explanation of flowR, this wiki page explains how to interface with flowR in more detail. In general, command line arguments and other options provide short descriptions on hover over.
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.
LoadingsequenceDiagram autonumber participant Client participant Server Client-->Server: connects Server->>Client: helloAfter launching flowR, for example, with
docker run -it --rm eagleoutice/flowr --server(🐳️), simply connecting should present you with ahellomessage, 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.7.0", "r": "4.5.0", "engine": "r-shell" } }There are currently a few messages that you can send after the hello message. If you want to slice a piece of R code you first have to send an analysis request, so that you can send one or multiple slice requests afterward. Requests for the REPL are independent of that.
Message schema (
hello)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-hello.ts.-
. object [required]
- type string [required] The type of the hello message. Allows only the values: 'hello'
- id any [forbidden] The id of the message is always undefined (as it is the initial message and not requested).
- clientName string [required] A unique name that is assigned to each client. It has no semantic meaning and is only used/useful for debugging.
-
versions object [required]
- flowr string [required] The version of the flowr server running in semver format.
- r string [required] The version of the underlying R shell running in semver format.
- engine string [required] The parser backend that is used to parse the R code.
-
. object [required]
-
Analysis Message (
request-file-analysis)View Details. The server builds the dataflow graph for a given input file (or a set of files).
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-file-analysis alt Server-->>Client: response-file-analysis else Server-->>Client: error end deactivate ServerThe 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 query 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 thefiletokenfield. This will save the server a lot of memory allocation.Furthermore, the request must contain either a
contentfield to directly pass the file's content or afilepathfield which contains the path to the file (this path must be accessible for the server to be useful). If you add theidfield, the answer will use the sameidso 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-analysisMessageNote: 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.0", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
Let's 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" } -
response-file-analysis(response)Show Details
The
resultsfield of the response effectively contains three keys of importance:-
parse: which contains 1:1 the parse result in CSV format that we received from theRShell(i.e., the AST produced by the parser of the R interpreter). -
normalize: which contains the normalized AST, including ids (see theinfofield and the Normalized AST wiki page). -
dataflow: especially important is thegraphfield 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":{"files":[{"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\"]","filePath":"/tmp/tmp-8223-1Pliz16a2pvO-.R"}],".meta":{"timing":2}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8223-1Pliz16a2pvO-.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-8223-1Pliz16a2pvO-.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-8223-1Pliz16a2pvO-.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-8223-1Pliz16a2pvO-.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-8223-1Pliz16a2pvO-.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-8223-1Pliz16a2pvO-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8223-1Pliz16a2pvO-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8223-1Pliz16a2pvO-.R"}],"info":{"id":7}},".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":3458,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"vdef","id":0}],[2,{"tag":"fcall","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":"fcall","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]],"_unknownSideEffects":[]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}} -
The complete round-trip took 7.8 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.0", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filename": "sample.R", "content": "x <-" } -
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\":\"text\",\"content\":\"x <-\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.7.0%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22text%22%2C%22content%22%3A%22x%20%3C%2D%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A128%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A221%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A182%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A104%3A19%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A192%3A25%29%0A%20%20%20%20at%20async%20FlowrAnalyzerCache.runTapeUntil%20%28%3C%3E%2Fsrc%2Fproject%2Fcache%2Fflowr%2Danalyzer%2Dcache.ts%3A89%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.sendFileAnalysisResponse%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A163%3A52%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09" }
The complete round-trip took 8.7 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: trueto 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.0", "r": "4.5.0", "engine": "r-shell" } } -
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 } -
response-file-analysis(response)Show Details
The response looks basically the same as a response sent without the
cfgflag. However, additionally it contains acfgfield. If you are interested in a visual representation of the control flow graph, see the visualization with mermaid.As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"files":[{"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,\"}\"]","filePath":"/tmp/tmp-8223-YAvVa72IX8f2-.R"}],".meta":{"timing":4}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8223-YAvVa72IX8f2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8223-YAvVa72IX8f2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.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-8223-YAvVa72IX8f2-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8223-YAvVa72IX8f2-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8223-YAvVa72IX8f2-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8223-YAvVa72IX8f2-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8223-YAvVa72IX8f2-.R"}],"info":{"id":33}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":3595,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"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":"fcall","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"vdef","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"fcall","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"fcall","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":"vdef","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"fcall","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"fcall","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"fcall","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":"vdef","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"fcall","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":"fcall","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":"fcall","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"fcall","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":"fcall","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],"cfgQuick":{"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["32-exit"],"entryPoints":[32]},".meta":{"timing":1}}}}
The complete round-trip took 13.1 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.0", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "n-quads", "cfg": true } -
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> \"vdef\" <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> \"fcall\" <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> \"fcall\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/nodeId> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/nodeId> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/origin> \"builtin:default\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"returns\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"built-in:<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
The complete round-trip took 8.7 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.0", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "compact", "cfg": true } -
response-file-analysis(response)Show Details
Please note, that the base message format is still JSON. Only the individual results are printed as binary objects.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾⩬ᰡ暁∠ᰠ䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭埋ℜঋ殍ᯕ獺䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰 ","results":"ᯡࠣ䄬Ԁ朥ᢠڀ■㚑䤦檲ⲐŒ≎ĸó⻀ᬵǸ吠拀ຨ㠠禥Ꮚᐰᨀ㢦瀠‣怫₱⧠ᝪ劭⨡䲂ƴŔƄ¤Ȅ�Ƞ峀˙憮牲凃㮓✾㸢䉧溔㤦⫋㗈L⨠ጳ౬怪ဣࠠ吡稠䄽ຠበเβ嫹籡㉮唦㴵᱀૦ᗨˈâ፼仂晀吮㥳䰚呕睎⽟аⱊᔁ甥⏈兕ਦᬧ䲛敔Ⲱͳ敫玱畖Դ㎿Ⲏ㔊瀍吮❔ٕ垤柺㹃㻲䒦椾†犍倅㦩嬻䛈声←厯⩔ⵖ䏁᭸崹䰸㥍憅䱩玭ᯄ偬ₔଠH₶\"晠ȉᘠ᛬φᥒ#䄰䕔ᥖ\"䩳ⓘ-㊠æ࠱䉉䠠㨠।\"綴ဴ彫䅌࠲ਤ声空#堡晨Ѿ⾵⡀Ềߒ䈉愺\"硁䠰ȣɹ᪰ዠʙ䁮䠦ⵅ₶䀪朡獩ᶣ慠℅弎㯝役͍䓦氬ڤ嬕㌺܊ብ䪆ౢ䄀㵬㨉笝ᥱ俎䃝ጸѨ慍㆖嶻懈ჅⓈ慉᱂㕹⚔⾝ဢ᩺ᢆ痑▇旤ᕢ煊⌌狦ⱇ抆枧ˊ撎ࢿ品ᚯ┣むᠹ∨㕛కॱ̱䑔ᷗ圩५ぶⰯ㡅≀汘ڡ毑坔䆶̀揞哔怬䐌㡙埵䐯ɡ~囡嫁啣ᇆЕ䲳ႅ゛ᔅ岬Єː匴ዔ厵⚸ဌẫ㎌珇㐹瑏㛽㯂Ġᐡ珴䞩獜឵灔㞥➃暣犜⾻焜徾؝翕ȣ▾偬儨ܢ纴ぴ�ࡾ噣篂ٳ桻埴䚠ৢ႗硻ᄄ峏᠄䋈圵ዌ偵暲㛍㤭䜼瀴M⮨ດ窠⩡䩪璄塗ࠓƐⱡ⽝䄡㚴ԝ䑊↡᤺䩠⥽ठば⣅嚹ְ寗Ǽ纥ⱒʓ啝柅盝ⱦ䏁矃皜珌䴜竗瑳䬪థ僣ᚖๅ㢍ᑂຑຒ撋䳂ṭః䙤櫲搮Ꭲ秅䆱בぴ暶刽屭㏌倣㊍暳ᶢ猙݆䘌ಀ癭❨眽Ꮤ皂瞎Y獒甪禗垇క⃨ѝ䞣⨳䶈䯡罭ċ劗⣡濏》࢟盰䎐ᧉ᪄盳傌ྣ⭪໓⍥䫣ᓴ㚻ೌ檓⒙ஒ咇䷂曆䦛榝ࣰ杤ᱵ⬂㱿࿋⠼ᤲ㞤ᑸ⣷⻬㶜䡼ܨ磢うᮗ৲ぬ䟲ࡴᩒᓹ䬺㔀ெ癬汃ᒛ仂庇Ḓ⦢⬼䅨⭲憈«璴⽔ㅸΪ滧幫᭙坫ᦖⷪডⴇ䕴Պ䥨۹ᖕ⭁⧽⦦ዳ⪷糢戸独佦牿⡳売Gѐ潕暆更泖ക宻䴂梗洙ᥓ䩶崸籖殔筱メ⑉嘝粖㦕ᶑ㣦䫯烏ࠨ每掍⁝䶎䳽嶇䭷䬢䓹άᇁ孺�⪭撵ំѫᎎ㯲沗㑤缶償璁ժ却᫂ㇵ⯫ъ戡ʠⶠǼẦ愕ၱⴸ؊ೃ䀴Ȫ㋢ᓱ䳍٢壍ᤪ㉟炉Ⰱ哌㟂㑴ЍᚻП»灿劇ᄪ㨳≴䭣〩侠ᚼ䌀ܤ⛕؎ᅁ㭵㝔摎䄈▵橼栠ℌᏒᑂ厺ᦃࣔȬ㵪哠樠⊦惀ᕨፈȞሤ桚߱獭⻊፬㢌ጢⱎ⫤ểࣄ٤哊唔䶈庯ƐУ樹䆸ӥマீ㖈ሚ䉡⤣㧬㋤摞剀➮礑ಱ❡ଇ䭼ဤⷂ⢱でࠞࠣҬ䢺䦪䐰ṕႜ㤉廟䐨截ұಢଳ䤱ៈ兘厂⌡⒂D䘢⒴䪉㘱⅕Ḳ祘刪╠㱤̄५僄݉ဨৢሲ絎匒㒅त䓔籪८䰔岤姕滣ᱛⶊ㝄᩶斬僯㣼䕨撯咋䩄倹ᇦʅ⛬桨ᴚ䲉䮵癗ន䵕叺⎅䡙撜痪֏䨉ಿᦧἒ坎Þⅲᑁ☢榆丑Ꮕᥓᰲ⽟劮⌅ᅦʢ䫭紕䣔撹姘圡䣍᎖㍇㊄ᙂ䕏拘⡥ஸຑ⊫╉槱⨆ㅤᗜ恍㊾E㢴䂟ቪ嵙ဥ㮢䆚☌噭㲡䢵䭫ઢ哫䍟䭉ᨠ⁘ア緫⋧䨱ṿ姸弓ֳ⯕㜇ᚐ嗔煎焎㍶尶叓㵈樶✴╦噇㧋峳䤠䒣ᒕ㫌吕⫅暋噢翌۫笸⤟ᷤ凈ᮽ㰴⍻敆櫏㣤䘭乺෯ᯫᅛ⧰ᱢ㘚啉㫙⹕泻瘑ર昧↳㔴䍥畫⛨䯍ۼ䵀ࡪ亥ᓫ⯖᭥㛆喋㫤Ƚⵙ奒秐櫧㈷戬㛔䄋≽ᓻᗔ園䯗樠㭬䉂奋㖦噏ຣ栮泮䁶⬸ᓋᗯᕁ‡倥㬀วആ孲·嘪寞⨺№綆㭖叁ᰳ溹湾洫圓㑅㨘䴢澆䯾橤㼇涝㕎綥ਛⓃᱧ〗ඊ㬚䲤Ốᵝ糱洭ᱦ埞ܰ椴ὦŞ䰉⣫ӣ㬭䍂敧㿆䰟ㄣए吠ᔩ༾夿伍沩䅝⍗刈璅ظ洯ᤋ㬻稩ᬃ˰榢㰊㒨⟠挵䱔皼䦤ẳ摚䍬㜚燍䛫⣭哥เ㚽窠ϱ榱ῳṒ珦㭦暎♌挭Ⳳ䶶枻娈Ჩ甠ࡪ猰㛻懔ᘺ⩍㴉䱞Ⲽ㈔ᦃÜ厄ࢶↀ朰絠Г⋾䷥幾ᗄ应ᥞ㐉㣆妛䑊睌礑Ⱙ䒹Lj嘳ᣖ㸊㢡粕✀橭⫯䷅䊼旒氋㱝揦兗㻀ƙ㎄址泌礜溛庴始凘䀿噻⮓㫆粖圄ⱍ䪠犮巳◞㶰儷➄&擭܆漙浻滫㯓ᖧ㎖樠ྱ㞂笍幠ṵ䛿冱峓ᷕ䎅娮䶘模矵⑀ᾕ綾⏐㩣柙ࠞ㴯嚝矘崿战睃翽Ḗ婝䯔ݝ㠖瞁矜欿擴Ἅ繙:㲻檛簐屒刬修抽崒漺佛ⷧ弧哘杘糮忘⸮柏؏吠⤢峃礿䗤ɷᆟ✰煎ᦗ༢於㘌忹䛜⮺♷㏑痷⬏ᘵ泾㘒⾋徽毉㧣湇㠆瑯Ⴣ潓␠ᘟྻ祝ላ㴳ṟ瞾睯༜⾽滍䮘㿓燘߿㡷絨ྜ簿▘ག╝甤㽾棜揇㶛㶟⮞窾⺓祾綗ࡻ弨柋娋嬟㰙痏刘彽摻浗濝ᙋ刯仙佝㿾༉皫箎㯿劯凛⯱縕砠®ᖚ哞搌⻖榼懫῏洛昕硿㠨忩֡斮幮䇝⨝䵏樛ᘭ籏眙Ὓ瘛㠌繋感羶ሙ ۬⍠徻棏檮㖕忟糐䆮櫑㷓紑欞【䂀˝朒瀩㘶ট效⮱䳷沞䰫攴Φ揎夕澾ː῞ṒϽఊ͡䀭䃧ඡ䆗ຽȸᄞ栮掫屿朎ဥゃɈ㸭箸ҫࡸ☪枣⑤ᚠㄬၣᲃ朖⿲䡬䎰ᤲ┮剏呥Ơ坠⅀絉模㳔梖䏸ᑡ礩ឹ㔬ጠ矝䱌Ꭰ彲㹝ᇈ⏁甒࿃㸌愁✮䉛淡ᆀ碉ᓌᵪỗ碊儌ᗮ眵橙綔၎ब⁄⋜ᅞ渓䁯Ђ၁燷䒏喍ਬ梩ޮϲᄠ䢄䟘粿撱綒纶≟揦ભ竔ᒨุ焩痍␀ཱ夬⒄嶜᠈⚫ة秌ᛎ⺯呢簸ἠ࣡撐粏摑㕠⑩⏺Ჱᆇ偸熦ᥱ㘐䱭Ϣᚴ䢈拼ᛎ孤塒䊪᧞ᠭᒉ㶖᳁庫旉援ᛑᠤ⾴fጁ㴩寅Ύኜά㾶粆ᙱḩ屽抶Ṛᾭⲁ⑀Ñگ姐ር䜑ฮၢ䊘ḩ㾬䊼⠵ူ͠欁氓侳Ҭ䕑ྪ炌揇涩呩⡣▱Ꭹ彵Å僪䚩䑯ⵉᵩᜑ冴㴑ቡ⿰㊐⣲ᤪ篊Ր๔ᩪ宸拵柩ఠੳ漑⎬粉㵥ṉ玩熼台ᶑѓ樺p〭⪚厑ᵉ籪籼揕ᇉⁱ厝沨㵡匒憉⭭㒔搕孯䉻施ᰊᛤv捑ា檇˹Ꮱ彩᪄▝Ἁ䭠ᨥxඉṐ窄㌝ᴩ㌩㏌㋃ڶ⚏屝ᄰ森᫆㐃᪁⨓၎㍳ᢠ峬౿夥ሡ➮ⲙ㉅ၾ⡯晧⋨ཡ⪕㎝櫈⯦暚≉⺞嫫㟋ኁቌ皋㏛᧹彲䂺ķ敂૨択䊘楙槨⁝刧ᢹ⿴物ᢠ෨⁏啀܈旪窜玭㗣景䈩ᙠ叮珏ᰎ毩♱狋Ṛ߯Ẍȭ᠈埮ᚋ犱ᾚ⥡ਬČ⭙䞭甈瀙䁋㺑拫⸥JŶ玀夥᪩䀴出◹䡳晊ત䔥ᥫᛆ૰屹籎憏喝䐴椯ⅻ敨唠牉刣ቌ⩉其猸喉彵㩟獝◊䝰冄◸媊⽶熍ఝᡙ㽣熇௭⌉幉↟刌㙉↔ᒎ⏥ڷㆂ䩝䑅Өᚗॴ娒畊湮䮡ⰴ祊䨧叄᱀敌⁛୬噈⧠楣㍏᷅ᑎ妙䮫ᖅ烫ᥴ熬勥㆗䬌写၏䭿ⵥ㭯楪岅嶮冖∾ᝩど↔⫰ࡱ圑㉽吵䓈刬⭄勅Ⳏ塒⬛揄呪㺈ୁ┠拉憃劀奵拨啲ঝ柈⃠䃐ం囎⛌娫⬛ᚵ態ɚ嗵凬䊠欺勘孍ᕾ⎦噕⫏兿免ᘔ拯䶇䫶ᶀ⽢㐦揉岮やᕶ廕㶬涗⮪ⵌ稥樖嚑₯妾橖導ᱠ昫ࣖ屉㳗嶅䌾咕䎭疉歾妸ᙯ橸䅩⹎剤檖園℧كፁኁÍឤᭌࣩ⇏ΐ᪬囑嵣㶄͡嬱璌晄ɞ啉⿌㚗彉⯉汾㆑咈捊Ú僅ʠ䔅渳毖ា癉卤ĉ僭ᯮ䎗䏿嚎§᪐欅ᑋ㎀宗ཱྀƏ印嫑就䦌獬橒巤冊䮃禉ᆛ᪵ⴘ୍㸴凕嬑哎ᶚ⬚僥ⶍ樯⋩垶㶈㵚威⚎穯ය儍粏嚌᪀徍斂}帍䶍Ҏ寝怅庋ᛋ媱夲伭竕冰䧩ᦏ妬㬔巭㚮啫ᴳ姩ⷯ❦㋫�氄㮑珧⚞崌ᶒ㨽᭕䋩松㫗ᑽ氃ㅾ兼⾽柨⊝㨵媍光㞋䩻征ᵠ奣䍻媕㼎ᙿ㭒ᶵ䋌㝹⫾⒵ᓎ㊑嬩儅疨ᖄᡃ僲⨍犍Ⰳ剉嫋㭬᭣勮ᅢ澒笰ۉᆟக嚝ᄎ䅫ᵍᨊᾉ徔ȏᱠ捨潾Ⳡԝ缊᎘ǿ帙砍竐㆝ਉ㣎涌␟匪ဏ侈ڰᢝ䠿庆᪠㴕ṓ>᭫劕倊ۍ墣敬ᒸҰ䧵本寅㉇嫁㰻¤ክ娕䵌美ڬ侣ᾉ儑Ĉ㟙䭣㨬e〧岁܇ᓽ㞳+ٸ滣㐤焘ܢ巤總ヰ䙤㸙Ļョܡ᱒渢䧘筆園┹ᧅ箐勮甸愅㔒揃徒䄣၀^砾㍯ಬ㮈⯆潯嘚䬹ᣯ娼㓸㷮䡺熂巣၍⤄ⓠ܃ᑄ椊㫟Ⰳ浲⾆ٯ᠃締桤Ĵ⦈撣㾓竬㔍捳ਬ✂㸝ᬹ➙㯘䊳⃣┑勗Ꮃ墿䔏崠堣伻㕡糤⒡ᐹᮉ歪㐍窽窸焹ƅ暾壭✇噃ⲱ㔑㋺㺉畨┙➠㏶浡⁞♚㕣稍ഞ✯嵓徐&䊡㱢凐㙤冇䭑䧒癋␡歓盽会媓倩゛⁹ㄆ眲㦠䶄搠杜㦿㓼攆翼籡ᓟ➭䆤秄瑰悻ፕ槗乸ၪ宻税䮧瘃戂僺㏹∛ᖔ狺穓挥࿘䓦䅮ⲷ伺夶㚪ᇞ㜚ጷ䗟ㅂ㔷ॐ⼒哶℃☋䖤ᐲ涂ぢ簢ຢ毧⭐楺ⷮᲦ僒-⣠ແ偋ŝ℈တ瀫ࡑ侔ㅭᆭ㑴ੑ䂐⺮㲏ᇇ㎧ⳓ皶⾆ృՅ㇀灗ⴷ礶�ⱟ䤨㰢〴Ϥਥ憢扪㍰䃶䛙㒷抐ⲡ焧⠳䦶䵶ᠠ滍敚痥㻀〳ഊ文ㄹ瘍⽚睶䛭怫⼺澸曚┰浺源㛝扛ⱚ於绝痍晆恗溵疠洚柌娿疷ⷜ⽷䇘㗰溺注ᇘⷈ澆ٖ‧孖䧘㻚滆笃槑嘂⼐牄〢淠漹ቖ⛗㨲滊ៗ囓坻⿺曗張渂暖杗㼁ᄹ溆绬珔䷜洦梗䗑奕汶撗㇖ᷲ祎捖宿帗ⷌⳡᏙ嗨⪾纗磿䷭濮�瀫㷪潶瓝ⷐ侮嘖䷘⤽ƾ淗惘䀿浾斖㷖ⷞ淾掗ₜḇ㪮繖忈ϗ濢磵炕縁䠠൷筣ᡡ燋儈搿垍㪯廽喎瞌婘㡣椉狢䝈㩥紏侍犳廝欌ऎ璘ᕍ旍䄉箄㦇ጾ࿋寠壣䍌⪁୬㸣绎夞㤌㰽撿㤖ݜུᘎ暀➋౨Ⴞᢉ᪾焝䰘㴃墏━篒㥃琍䭧➴㿣㤈ⴖ䠀ۂ䄤ᤇ搖㲥擆䬲怺ᐊ⤦ᰆ朵尢█ᕒ彔❏㦆̖瀅爱։́䀼䀬⧰ᆰɕ悵棛⇒涷滸‸˹ᜳ4棅琀㤦潙栍䣬Рᆡ㭛ୋ䕿㟝杰ԓ瞿㞗柂䠓琉▋ᝤ䄫住䌀⭱㤵䟁硾䐴ቾⴥᝣ杫䆁㌇ᝮ䏫慳䩚块䱞桦㮁ೞ匡㐡啎θ㽑燈㜞堂亦嵼ᬒ䡞㬵䭼̛╡㤅毂䌗䬱㰵烌挀㝇∻承ጋℳ㤋䂓✍溓㵏㻽㜗⍴㨃 䚯㥍䄥䚾ᦖᅡ枬Й༢瞍㰫䙽㬌ថႛ彿ἕ璞䁫䣼㼕ល✛晿伦㞺䟫妉戎ୀ祜摟潒࿈⮠୶ᴁ剴粇坵幑༲幧嗾刖矽㣧潽⺑㯧棿䜍៤罫奟ဢ佌率稲箰偷卞緻䁐Ȯၨⳃ⽺罢ɝ紒矲將坌؏䭢纫䣞ⷭ砘笻柾☚矲簛峝㽷⼩㩻狝咓『羌掮⬂熞翦坞嬎䅈縁ቊⰻᔑϴ㫴斁呺却㉠ഺ䘟䞑ᚧ嶼砾憱み稝ဆ粫烞挚澂硇埾ḗ矙㦗䩦Й㞮ᣰ䚩䑰禟嫳刔ᰋ䶿ḯ凟ਚ怴咯䰣␖έ䞯横ⰩὉ篠㱿Ŏ¹縪㚜演澙糧憜弍瑖缷緝ਜ忄纗糼硝≰ҏ俗砐罕ුռ娑Z䝋箟妓彜繗碞簊ὑ礋焞ᐙῚၼ├㐋Ó紆漁㟟⹘稶ⱗ㬝Ԕ䷧瞍絋痿䑸Ⱈ欈㻜Ǜ䧌⅘⼠甗篢捫⃰ྦྷ䌼㰚䐋柃縴䍟桟ਕ罴緟皿堞䂣耋俀ĥ穻摿☓寢É㱋疻䫞ᆂ倵➳䙸ؐᾁ㲁籲䏸ŭᲹ㑠ᆦω㞲Ἐџ掿̜బ㷩䂵綑猠㓞ޘ㌄瞬Dž煨ቀ俕稬窱ରȈ᠂ᰤ砱䂒挆ڕ⦀稢䈔᯾羂㰠冡怦䘁偻ƅ箈᧠祝〫稬惪ⓠ⟐✡ⷩȱぴ¢Ӏᴠᖢ᠓ึႧ͙犐㹡漘␌₋终ưᙟ⠜樒俦㽺̴䷡ᔤ㰼⾷䄲窏氀琢尨ђѤ䋢䅁⢥樂ễ䂑ݗ慀滤嘬㡎№巎爏䢡缘怇ྶ⅃礄ᥠ窝吪柮䃅ɪ૧䫾ᘤ⨱忄ń箅揟ᒡ瑖徖䍺䣐糣ⰾᴡ慎㠷䞠罢✖ᑐ⾗ϑ甐㸎漥㐵ᮭ∞ڷ䊐俔漨⾭㡂Ⲗ物怂⾦搽柊⇷㫘ᶐ楣㜯ᑞ烪䍶ৰ㛁匐ག泇帽尜ᾁ᠁侥㛧炲⳾♢࿈㑤IJྥ憽㯰ὐ猜焵䃈≘ຘ㙾㪥ᗊ䒗傦ײᲛⅨ〦㢾ᡪₔΌᨆ亦扂摵ቴ䂒ᅨ㿭䤫瑌ὂ䋭牿啡剥堉偵Ⅿߌᯀ妉㲫㉀⣟䴔呞䥱繦㤷ኺ抐ぃ⇂ֵ㪪ィᶁ⌡ࡄⱱ䘙>Ѳ憰䓌ᥨ糃クᡵ㡃⊯犔㽱㷩ʩ垥䩘媚ᮠ䩢暯俪焜糡౸㘎牦洵忝兏ٳ戈疭߶穅捕䘆㏰ᒰ琤〄䱪ㆁҺᾨ棂Ư械捷猬㶡ࣤ昏箹㔉䑘ᢝփ焕窻䀿ⅳ༄⟌㫤稵䱷㻠䔲ᨨ䋣䰭ٙ揊ಬ㪱匓ᬹⲂᄭጮ፸痤շ竧«糽ā䗑༙紳䱨ᅡ䖖ᛀ栢㚫癎⣲揘న⪑润䜸䀼燢᭤ᡲᤀ恀瑃ख氺❜↑尙ᜰₙ凪ᕈ冂㸮湃ヒ榏़ㄮ燳㼱ᲁ⑲҆ᩀ穄ㄖѾᢀ㌁㳤渰Ⲛ䆻䟞ᔠ䄂斩㎨ҿ抉眽ᴩG٥ႅ燢㬬漁㲀瞬䩼焅扛ർ⒱㮦渁⑩ㆿ䗁ᱤ䘲嚔䊯ӝ䌪⅘㈩⎦Ⅱ扲↫䒪ᤘ溂ᚫ䅛壢掛ⶁᷤ椱斮梼▎⏤丳湆打ᢏ⅘䣟䥩㑦撺沓䈍䗬᧸唲Ⴉ兜ᤞ捄䯰ㆱ奆࿎剪䦌✬䣞⪳ද妶擾ᐏဂⅡ䅇Ἷ劕冦▎Ფ䦲旄㥑僣搜䥐㆜䘓炽ި仦傥ቤ姢ྭ㥅㢩⋪ഒ㰡煄愵౫ᱱ║Ḗᯨᥨ⥚獀卮㟪㟱ᝄ就≢⥶䔖ᢤ揢㹯克稰召䰪㽉⚹〷㉵爟嫀ᧄ弳⚯ᅗ⓪ፅໂ㥉⫄⒳⩯̍⚅⣳㥫ื䁶䷆䩊⯉Ň抿䱨䤨▙ኴ徣Ϊ繖㓍擆䡬⠲䬪嬦䆀⑅⌠Dz乭ᅖᒲ劚䭊㸩෦嚸⤻✑濔䣀ޭ繁ष卯ู᧤任⑈㪈ऱ⟄⋣㑭⽯ᵆᔂ劔䰬✉旅溰凵⑊ዮ⃫㵓Ө⦱䰚㫩眳༶!䅼Ⓚ╘幓㴯䵎ᓲ劶佼ⲱㅄẾ媊爳ᲀ䍭瓩䡂䥃⊯Ծ 婪ࢶ圱瀺ᇓᱠ㑳ࢃᅁ㓒㎤䣆㩱ާ憴᪂ᨌ䫓ᥘ㽒捯妧䳈ę䬚㷤㚙欵瑣Ḻ旭ᶸ烓坯ፕ磊㍅䲚㚹ḫ喲疼ㅺ敒᱒᭝ग刬砭∑䨑䆾㮄ᶵʖ䥐┩䱓ᓬ啘沺㎗䗹正涵傯嫖撧ᜌ䑝熢䨰∨ïĢ㎹ⱘ彀枼㤩柛ᐨ染湫畀擘㏁⩩㚙厳䥘㧉晀似䦓凬堶ᴌŵᓶ♙摂㌠㑏㉺⚇ᡨ结⋬洜狉ൖ⑸⌆殼溉㤭是ᐞ┃倧勼ᓎ㈯杴ᘠഇ紸媇㨝⓪ᏼ䨳Ǯ焭栩猹䫾⍢磣Ł晰勛㮮䋘㫀掠ୄ硫十䶢㯹ㆅ弽⚏㨋擗䪜橓䱫㲤紝狑传ኰ弙ⲅ璗礴䌟Ꮜ琳淪䍀洅牅䵾㟩禛羼㇌ㆧ䖠̢瀒అ磽У犨卾₳侰橅祹朲Ꮌ割⯫婊˷硰⮠ؙⳄ㮆↊奀̡ᢼ㘁Ꮺᵐ೨⤈⪶බ↷䅾䤤ᑵᾔ習䥕䊦ઝ刱㑨ᕻ٪ⱒ㸹䎦ֵ⃭ቍᘿ㔄網➾㯉倵ុ乱֔❫Ꮱ㲫削⣁ग勾◱ㅥ夵᪼ၻ㻍ᨒᲟผ᱉ፊ瓕એ䬎⾥䠷ڳ恵䔶᜔漂䈝䠭⫧奔俥ゆֻ䅨擞Ḣ洳䙭㣏梁摈⨋ๅ倄ᑣȣ㇍ⓗ沲瘫⠥Ӊ礜ଲ丁⽙戴扶…┪旋䉲湳ဤ⢱䊠㏇䱡婆㨅q癸╾摤凂䐫Վ棟崚䬢ᑑ⟦溶祃Ʉ灓䟹⃫䅈当䌆䯓䯩㑩漄㩰瑾窃ᐥ᯲䍨⮧烳粳䊄⧹ڲ㙿兪䖚摘嫲愫浊棁㋏椖ⶱ㣒䮷ᑼ䅫ヿб摉弒⪠狲㉛䲑㉅⍄㼹榀←砸嚬䨥罎杤Ɍij䱞㠁䡱〪ք抭ᗗᎲ眪㍉ⵀ勓䫲䷍䊴倲慽⺦ᖀ垺⽨㉠〠檹ᠽ䪖查サ摹广㆘┾⠄姂瑫㽋အ䠢⪩⤗䖅剷ᥱ╵㧇珂ᤒ划⬔䏻䫪⫏䦉⚵妷᱿ᖆ搪傛◓熤峠慍Šᝐ䅣殹あ嗪嗀届௩狖䫂⨙㴅⥴₴ె嗺图⤯ۊ⫏叾ᢞⵣ䣄Ҡв㌬䁳NJ徊䏒殦္櫟惽⤰ࡵ⸶窴䖌ᦔ唺奊羓ᄔ立⮝ⶕ㷵濩⍳吷啮囷Ἲ䂊嗮勄猙Ⰱ刾͵ᦎ★▪努絋䛌䛞ᠢ欳⫍⟒焷屩㑃㹍ܬ嚲䒣є炰䭆⡥㡕ዷᅶൢᤵ嘚王唕㽒ሱ檈⡱【缷ືἺ㖹ᜲ害䗍嵗洑⭱⪚Ⱄ槷於妀ᖱᄎ卢截♒䨫ᤲ⮯⬠ᔕ䋴筽ڍ祦擘僪眰៊廚犿牯⫬已壃挦㵥縸ƞ妀ᨋ䓭歝狃䭥」㔅狴⍻䟟疠㑖挦䥭䎕仙䋳◀⑽⡹ၗ⥳憉㔣啫ᑚ厅ࢍᓀ縢ᮒ侑垁ᛶ祹剜Ʊ姺䓪癎㋞正⢣㱕ⷴᔍ⎜◷⢑娜漣ᄑ组㋜妘漝㬕ᗶᅴ掚疅囑埼皰ȫ營䄌Ƞ濜䳵ᕵᨩ䠷凪㖊嫆䢻௯櫄狣⬧⪣⬒ൖԥ厗狦㖉尫㻁疯ᇊ㳇䭽ዓⴭ旴瓼㦍ᕌ㐹囦䣑ᡦ姌㫪ੁん㐙℃䅾䅤䆡㞉埊䮻墋㧗ۣᯤㅎㅕጤഠ㐲ᘨⒶ磪㡎盔⛾櫷⼶㽭棔㳷瑂ⶼ㗋䑶栓▏䘣ᬫ緪泐Ė圆畱祤⸀㘅劌搓喉䫐磖寍侑ᅍ佻ὧⱘ樢㔑䏶琠ڧ痌ᚦ嫠溃㧍̆䯬䂅條⎈湤婷ӱ᥍㭖≮宕僃垭娦嘺䶎糝有㎍䉕۰㐦減㛰❡Չ❫樫㛼檖梛㗰波᳹䮓䶳㑩厦䭺剬◞/宾櫛㕍悕ỳↂⷸ䒶ג䏫㚍㷁劈㫫֧㾅ᵶ呹䍨㖟㕥倮泺ڡ䏈ᡔ㫗ᙧ⣨䊖䱶壂粠ᑿ楮悜疈揄⫃嫆楛㽍㏗㢣❼埓導⡳⥈凓ࣨ䢙泬㏉恕⥰杶ᷙ㝓宮徳䖋新⼀剌ℴၰ៖⣰ᝢ嵪矅喲矻憍緂⼏ቹ沞㪒椫嗷嶘甭ሻ壎䴫燨⍹⼞㩴嚁Յ↗Ჿ⍰㗗啘奆槻寁溿挗⨽ᔙ┭]؇稭塁�䈋朽䭑漳㝽㗄ѻᮘ㶺ቧ屮力䈉磘㈴4⟔ๆㅣሥȭ巷䝅溚ဧ柘⌭㪷⫷⊍䚗ㇽ᭢㶅冇儈⦛昉䯇䙆窓淦ⳝ̖㾱澉㴶⨗嗾䇺㈉旎紞䪲ゝㅠ緅ὦ倴䢷嗾䟨╵ߜ㩹窷渿ⱽ夕䟰絾⇏僵ㆅ簏ቭㅕ穄⎮䖝湨៷佹紻癑婞縊ወᗌ䁳稿呟⬝㌔濿ᾓ㶒᧠潚उ⯁剞窟氟ㇽ嬴䗰掊畞旧徜䔚烱ោǖ箭☠綦怔桷澝႙甗历匪⦍⿄廬ߛ棏Ⱓ炇ᷴ丗痬姚歛䒠ႋȂڝ汶⺣∯停惠綌൧冦望ᐸ滒ۇ笗椀殒య⟵置㶤࿏剪炦昈Ὲ܀એ⬡䦔書澓̲ന㫁䨔⠍⢆绩ߔᶟ㙣⚷摞兾䵪勮ᒧ䤡條∆篤ᴟ⭣朖㑃〡猇盖嬱ᾛ㢖终⫀澣ᨯ屒楇䎏瑘㠱偍瘹柆༖沨玣冕濽Ė綯砘㉾䱧嘸䒅໕學ၟ僝翹ǰ澷涄സ㯆殻瘋䂌婜䟒ᬧ▢ⲭ䑣↟ٷᎆ優淛ࠧ咟晸䘦ཨ㢁ሥ怎ₘ繿祬ၰ崜㾍埆ȑ穨⭖㋰گ䎹䲌⦮Џो䂰Ⲁ战⫮功䯃䲧भ䡥ij砬㍠僧嬉ሊݝ澸签坉也埆⋄㑹⽨෧洸旰マ簧瓸戺砙穗䡯繓Դ㣶博笊䯉ഛ䝽㇘緲₲ᩜ⌎篐婡䐧༼璅燱䋖Ἰ➃纯爿夌憧㞫岑徧䊇浜➡㛃⋪槰ታ挹ق㜑潧㤪偐ㆬ♧桨戝Ꭽ⒴Ԍ晤俚〉٦Ⓤ怴᱀㨃ᆥࠆᢛ捔丌㸑噻⼊糟爅ڳᔄ澳汶祖Ḫ櫯䁡ɪ盀㖉壆۶ᨸℳ慭ᅚᔄ憈䱪㱑噆䲹抅䧵❹䵮締⢾ぞ⮐ԉ罆㹧䊈⧲αᤘ皳瑬繓垖፲㚛匉佫㚼奤ᨛ敇̔ð㿈『妔㎟⣌䀈祆ᬼ力ㆿ⟥ᰟ忳⎬ⵔഁ㥱䳦㉙㰪ָ瘹䎇ⵀϮ乓⣬⭒⻐嵚䳆㿉埆䚽沄槌杅ᡰ擣ᥭ䱔㌴䈽✸澇㗳ⱷ捆絼ᨋғᅔ᭙瓯⌳Ӗ㘑宆暺濗㬫䭠۳厔婖峿㳽২叙寇㪼છ冱⟉Ṕ纓䊧孜ラ⏆ප㋮⦀ⴰⅧ㧃砭Իҵ砣Ὑ㍞獳䴾㢉䨆玾䱁㧣䟭Ḑ潓㡤慢紘ↀ䛥⚨瑔Ⲇגേᤔ簓⩮杚䓹猧吥漦⁻ᚨỸ᠔垢绕匦䜡ᰠ㗏䲱㥘㑆巌ᒀ禪☭ᥢ攳侯罞㴂獜忎咲〠册䘐䏘婂摉֯⧸归揄仙ᘙ毧榻ક妶ᜠ婼砫ᗮ䯠ጙ捻䥉㖑䕛ం娷ୁ孅仓䌮棚䴝ல⺾㳥䘷ᢻ䦛֥䣲摙㮸泙䖲ዉ㤥র⎻珈廤熼ᦒ笞䑏噘泬玬⼚㪉沶汿緖⨍檼媠ᯫЦ༹猃哱ⲇ异㛀䇧摜ঠ䩦ハ㕋彍畝ᴑ珈ⵑ㝩皆塿ㆀ榲堸瑓෯䫕䫲ቖƴ漅耍㘦哯◵䟤孬篳⥏僟┗ά俩䕌畹筩嗕寧煅➃俭ბዧ⭆⸵㆙照ᆍᒜㆱ嵯㝤⛄㲀櫫㻈ޅ㢙哷䶻↔明堂ᨐ狫绍㼵䂜䷜䦪⪃ᤆ㘶嶇㗚ᚻḜ愋姎壛欉毅⸏澕熅ᨶࣷ澖䊆ᣫҵ溦Ǖ⋽ැ䰪㤕䁶ᦾ䦌斦♮奊籋欘Ǖᤑ㉀浬㛰幇䃸别හ暓ஊ棫槍罚竨Ⰿ⹃㷹牗㣹汀䧕䕤䉵ᅴ⠱˾䬝䲔瀂勘⍖ོᦉ瘜嚢堢猫䧓㳷瓌汓ちㅚ瀧厝䷜冈Ⴖ缵ᵃሡࡒ緗ⲵ孍禚窠⮘䥱ᛲఒ睋Ῥ秙䳬䰜溥㎮剗䭽⮞ⷥ㚝儶拻敮ᜆ庒⁹⾍缭ᾤ玟旜圢塖渻Ọᇖᮆ濳ㄍ毗䖶㮑涹㠉廴൳⫖嗙叴Ᵽ㼉仗䡾ᦘ䷟✆帘滝毭ᛘ⭬㭳₧㮽䐱懿拎秆㜇⯫ѻግ巛団涕㑵䃖绺இ䄪眗ἶ纻䬍䡉焅奤↞寨⋾瞌݊瞳婆昋㔍廛盩尞洇㽭愖糧枖㷂浫᷆畻瘸境SⅮ滏㐸▥䶉ᷝ垾塊粛劎⟘嫱◼₫㛝漗稺ⷛ㸕睗崎狩⽢ⷖᬊ寯滟㞭奇㖟㘃瞢婖治䜏㏞㮛箬䚟㞝絖´官㈱㚶穛窏悟埞筙ⲯ㠝潗ۿᦘ渓眿⸀啻搿坛玂�Ṽ㢵縯瓺Ԩᠪ啿污缵⨿ⴧ廷箂ⴟ㡭䘮建ᶛ懗㮠㣞抧稼惓⇦㪰‐絣搖⯼儀␆䍖叁祀ؾқⳳ崩氹㼍廗ỽ䎓䎪ڠ㪾槛Č䒘戔ĝ䲕嫍岮剛ⷕⷠⷴ冱拧捤嫜䴋淈睽窖ƾ⺌疶㡥廑櫻猿床䚽寊温㟽任繞⦋ⶮ䘯帞椛䰿㷜㬗ߺᲠ禝灮⡛㞟િ㲿岄⮛⠿劚䈎欱㻃綖㡚林䎱㞿嬑獇ᱧ椹漁暊∇㍃畯ㇾྐ緜亼㢾癇尾矷戒ℕḇ㲳坮滉唐帑ထ⤪⍇憿䧴ᬾ滷㢕䅮婟㔆ᛮ书㡾沇㌿槒ઉ簨Ḥ璮櫗歙খ搜㠌㺦珋ᦿᲓ䳿⮿⼈痳䨙䬾ऊ玭仴少灛䡌ᴅ姩ߊ淞㳦⍯㥜㤄珶俅ᾯ❧ᨍ䥼稃͊浜缙瓖䍝᾿ჱ俁㣯䰇㘾⊑戌枇洴瞣䣖̻ᔅᎸ⻲㣉毰ඎ憜绡ᜳᶓ㒓䳶⟼ĕ朡㴡糇敇熑DZ䞔巂ၫ林䥈◶ఖ〕e懧榼䧙◻➈岔牍坎䖻㋄⯌恙㴎烱絥忙ᜋ兖Ṉ罹懮卞ᴟ䰌༆㨵憇Ⰼᖕ䘂咊⍚᧽傻◾⇈ᐚ㞭㨅沷唌�嗵ᜠ忤秳䗏䭟柖⛼劕㠻㥻猎埐嫓ߺ淀瓳俯櫟䎐Ⰺ⸽㾕潷槉ඕ僔Ӑ忬㖘⅛䊜Ꮴ⾺㸙甛ჿ涜⨙寱屺宓岎㇜瞆猘㮐ỻ㮇窍ங㘊堄峺簻翯〻ܕⶪ澽㣍烗¾㶔ᮃ㞛ᵊ翅䅗㳛⬂䯻⹓㿍歗狼溔昞ᖴ䋄甫瀱䤆㯪潴㰅悗嫾ᑚ෨砘埮紋紏᷹䀥�䈎ᦱ瞗緽॒◪䝕瀖獻俖䏛ಝ㮢⬗㶄粗㯿ྜྷ怢⸏Ồ毯盿㼁␐㹭濗櫽秘᷽㝗忂眛彃ٟଜߖ⍶㿥℗俼插㸏垁‚縓匏៙䔄篕㱣昗㵼䅕ؔݽ満֠᭸䡄吐ྨك獞䶏皝缟睶嶯ㆧ圮墚⒕囐༑㱶暯剝疔⏩ნ㺗㵥ᤀᎥ瞝寡յ帳瑯侘϶庖㦻堿添․⟤枎㪳禛䞽䥸᧙࿑㹓㴾ⱜ㈊尋⺠硳欓㗿ᔓ叾埛廡粰⬲㠹哔寗什㲂⒣礍羚䏪㞡彎疛嬿䲽䷝縗ὡ㬕淯ᩗ洟⛑紑仢男桲冹䨅ḆῬ耓疗╟֚囼⽑㽚疷䉾㯛⸦痝ẚ柖惏䓞䟟绪⾸㷅籛疾Ӎᘙ殣斖䶡畻⪔ᄟ✀ר㵆縇䀾暟䨕៥Ẋ磫総ᬚᾔ䅴⋟㍃䓾璞眕喵⼷㣝狏噟⬚ϰ澒瀊࣫吿曘渆Ў孄簺湷挌༙氄ᯄ庹粷彾喘ต㞼Ώ幛捯䇍ԙଌទⲜ歗嶮⚘⸎⠈侶绛笯縮㪚篰䞯崣羇歧嘤䟆␐㿳歋綧精亜⫯ߕ㽣犾淮⤙㔳帐㾁㫧甗欍Ⰵ濟㹹纷淿磉搗双㼫䀑䙧瀇⟋緯㠓㻩篷俿ᩛ嬐㟲㾲ׇ潷⺟▐嗯ངˢ獋淨ʘగနັ㾧瀇ᗟ缓⃮圦岈俯煅㝚〛媻罣䓾伖㸞άᲈ綶曎嚛⸟ỻ眿㬱筯䬭宔⯫ᯊ涨䗻絞玜縉侫幹硗涿ᯜȒᗸ睻䀂垏盝᷿㯦怎㥊㆜Ξ䏲濌罾獏䜿瓼ࠕ渳磧樷欶ؑ煩澩澕瓧䅟⼚䪚〖ἡ浾损斜ⱹ䟿㏸籷縿娿ஜᐚᾠ彍ᨫ纻疒瀆ὅ䶩綏塎攘砖ྩ㹺㽭懟ᱏ岚圜㎥仗篿伎篜挘ῃ溇糯祧㲟䬗埪ᝑ縷瓿亾烞俶栉纑㱃熱ඎ嘜㲫獗䏞ᾞ栜矼耕翯瀏瘟䩙搝ឧ綿矧䈟⠙ሀ⿇瘢䄳窡䉼耓羯忊㝀漝㶩篓甗漝䀠怞杽⻋䜤9滥ɂ䑭ҎⰠ᭔ㄶ梠㑰᫆؝㷘琑 䟡嶼❻游ΰ؊癀ᡓ妱㫀刘勸䶓悌祲䂈孺ᨹ㒈夀ໟ枠⩿㸞䃝ફ栮倽幪䂖ሳʻ敧犴疜潠㡠瘡䚝㬛ᆗ怸⧨澢条Į㳒㮤ᔰẳ吁Հ㖍ᴛ⨕㴏ၞᾊ繞㵃秷玗曟厠漘稢㨧粂⠶停悄⚑狃碍塹⛰Ὲᢷ㢡➝ሦ☔က恽᥋Ů͖禦㒐ọ勻⪡则䶳劧挃刡悝ð䈕䃵夠ณ拧廟➡䜜尥吮䐱㨶ၴ癈䄡⃢ۤศᦒᬱۆṵ⠥௷䠰ᖦ叝ᅝŝ㱽竿焌映⏿ദ劢Ԧ焴搶偌傁₲䴔ʶ㫮ᔈṓ䗠嘞䴘樬庀嫫⮠ᾙūᵌگ愹枰❨⺡溢㸥甥样桇Ꮮ䃺纙綊ҬධᙐⳠ绀▣檨瘬ⰲ䈦る场Ŏ㷔Ҽநႀ㶀烡揔嬤ᨫᠱ㡅偽䂫䆙̇婝➸抆娘嘪吳㿵㾰罋ᛆ˴֜ଵ瀀㺠塁ຢ樥洢ག၆ࡸ剘⇫͆㠬່ᠨ⥀焞漣␒愯ȱ峾ᄈ↜Ѕ笫生晧壀而礢⬚怔吻䁊ₛÚ䇑絘宐ఇ浨㊀绎㵤⒦椔ሰ╻ၬ⃩幺˒߲Ǩ䠀挞熝䀥紒帀摁羨Ⴐ䇜䏲ؘᡈ㡰滾匤㴤䐔䐶偗㎨❃ẞ崞۲ྐ။䠰宮Ɫ睛㸐䈵呚珟彻Ȍ䎽ᇨ㌀嫡↣獺温ᐍ塍⁰彾ǖ䋽ࣺଔీ␀牠罣ਦ䔩〺䑀䃣㼎䐎ฬឫ寰岁穽岥刯指ᡀ⢊ℙ⇉䉌ڦࢰ᳟亰䞡ร䤦攩爴ᑆၾ惣挒ɳ҈ᅠ⍐榁ு粧䔓籇ⱌၨ僽ⅈ㸕ېᒈ⌰灁卢⦦ᔮᄉⱓᡰ₻Ⅷ屷ç⏌ۘോᦖ䨨儥瞐丵)硋炉慮䏞磚࣮橑冰层秣ૂ✩⸽灳睥懫䌽⤱㞰ኟ媯㕁䃣ឥဖ∶㯼¢懲䋜ޜ♰ឫ䘟⥁潣㞦怓搱呺⏚グ䇿峷جཤᡸ㌰封咣䁥༯總摚φ僁Ŵ㱠䗂ಬἏ宐䩡䑂岙ᘐ嘾籞䯈烺懃磣Οᑤワ㯾ν⸥猬ᨼϷ塩僨ᆤ≥τ柸ᛀ㒨犁嵝撤ぷ丼䉂ᢝჭ䇱䌿䩶হ䎤㕀䛄㲣嵙⏔ķ槪砣✺ⅽ䏈䑹琂Ḡ♐員纼㉥夯ा⇾爤ᇩǔ䛩ಜ᷸⚨砱㻣瑦璫⩤岻梖䣜䆷䊔䓹ᴏ䞨琁䕃甤ҭ愲旰㡯Ⱛ戏絵ߨເⱃḠັ㽂怠ʯ夶灀㾯ᆔ⌆Ᏸਪሴⶰ汱䵃䪧次椲䱛䑳炨兏䊫ࠖ೬Ḉ㕈疱⩜䠘漨ᔺ摇ᢅࣘ㼁⊬䚅ࢢᴴⵠ缾䞥檪爳ᡛ䯝催䈗䊕祱࣊Ⴤⷰ励坂ଧ㴨䐷籒ᑋ⤆撉⌬䞕ఘ濤⦰嶁峃ᅡ缩㮂䁄寂ᵃ扱ȶ䖭ྲᨠ㧨稱拢䇹示婌ᶭ儉幚⎮䚥ഊᚻ䍈囱ᥣ⚦享㈼㩍ᬨ⚐䣮䞵ࣚᥴ⬈氁ᆁ樒⫖ᄍ穜楗祵₶െᦲᠡ䞌Q㠠䃦瑡㴿濭瑤棬皗̿䥲ۊԬ㬨孊撃å䑦̿穅ಔ烳䇫≑䙣௦Ổ⯈曱Ể奐䌼㷰炶牢ㇴ扬৳ನ䖟Ϸឞ᭨哥娭偽塷⽮愦≖䕪चᖴⅮ㭑絡䳤緄㌺ᙓ䱮ᣠㆨ䍉Ѓଦᝬ㙸挡䶕䰦猭㴲@ⲙᤍ内ⳉ䕋༶ᯌℬ᳑榃୧ᴐጱل䱼ᣒㆳ⎚䙳౹Ⴘ燑┙ト〃区ሹⱵ㵵ㆅ⎁䒋ੇ桌㫈忀垂壊暂匶癑汲䕂䇀掺౮᮸盞☝櫦┭笵噚璐墴㈁搕䟇মᤌ⠤ٰ扬哦玨✇๗灪Ⴇሉ⏾䓇ചြ⃘琠峽ީ榬癖愭ㅴ掻䖥╊Ⳙ磱⮂ࣥ⚪㩦湓睆ぐ員扱䟗ಖἏӐР暙⽚ᖪ咨丣佑㣑ℱ綽֡ኄ㏭Ǒ愰௦㎩䬿Ṛ㲃墻�椽Ⰷ०ᒜ⚺Ზ炌庚禮眿晙Ვ墪ㄣ拯䜿ଡ଼侌⪸稑ᐃ䃑⦯瞥債ɉ磠ㅟ戳灻ਖᢰ㉈䗮欂⣦k缶繒ɿ絀ॿ拓䗠®ⅸ䢑勡䢨㈅湌ᒅ壭ㄯ揕䗇దᕂ䋹㶑㐲䡆ᶯṏ繒ಅҸㄲ䈲Ը๔Ḣㆵᕑᨳ㓤塨䂠䅐ಛ临Ï捻䜃Ϣ㌘匡┼憦澭ጷ䅏屭壇煼ሤ⛟ῢつ揑稨ࠒ≄夋Ṋ䲒䓑࣊ጵ㡿烂ᶢ㴈䠩س㑥ᡮ焧♓⊖䓽熰揬┤䘑榾孁Ĵఘ⡸ࣇ㔰乛汲㣰拂䘚ʑᶥᄝ㶩扈⠈叔䢄ॅ折儘䅱粬■䵖渂⑄戔⚜䃳䘳¨丰垧ࢩɈⲲ⛳剾ᩂ✤憩㰝Ṅ䱫殁䥃亸㎔䧩Ᏽ珇懷䅲㚤硩䌢祅綨漱ت剶犎5ᎋপ♍抢㧃୩Ἁ啅⸨渲燼珔ⓝ愍ኝ厔仅䡲௰ᕩఙፇņ¾煒ኞⓁ䧼₆⠐⋼䋒㟼ⓩẳ卄䙭璺幕ґ䃁ㅂ慖␢僼沒Ⓠප䢃漒炆ဥၞ炷ᓓ䑎⒧盙ᮒ㼄坑䰳䚛瑬✿ⅎ劅㣣䦡Ҿ╼䰜⦐壺⧹Åɡ㲹犈ᓵ娫炾珋湢䚐槎ڰ汓Ф䌸䕑垸ᮁ৷捫䔄侹ᰒ㼤檑㦨ࣄ䤒⊼ੁ匹ᔓ怴可՜䬺䶈ಞЀ㗬橣磲㘼祾䩰敻䡪ᒿώУ⧼✘䅉ᾲᬥ繯笴河䩫ゎ⦩憙⛒䫅ᆪㅴⓉ♲㋆ᓷ䊿ᕓᡃ傄䃖䁂䁜䫰ᔒ㵴摑绉普ળ㡘䩵㤑⦊刽:䫜Ҋ㰴旉൳ۇ䳅⪵䀡⩱儧ẙ䅰ᬐ䷵Ὂ↴䋞⟠䀉摨િ䕀抁ᒱ⦆吞⑺䦕ᰊ㜄㿉佲筤濠䪶畖᩻乭ᆩ厎⇔ຈᤒ⟴坉粣殣ᨭҲ幝㡺礚䥾ፃ♣ࢅẺ⧀䕡炤槆獯ᐵ歴惕ᔜ⡨ႍώͱỪ┢ᎉ⼌⣑孩梽員侷壚ऱኩ♨䲞ᣈ䯔䮉晐檨⬨亳测汍䔌㉯Ꭴ@协⤊▸橩Ṥ䯄〡⺹商橫䨢楕粫⠌䲁ᓒ㇔糉旲᫂睮檸学㪙甍榷勷➼侵ᢪ➴䭉禃䴻兩㪲絚⩻甃⧣勣⚮䡁ᩪ㨔祉埲浪纺͇穨ࢇ⥶ው煞ᬙ佴簹ం翆橨Ƶ屄䩠ᔛ⦰捰摡䮣ᇊ㔬氹ṝᘺᑣ縧䰿ả䃎椪ၳ灱䵹ᐺ∐墩尳矦ê憶ⵄ䙭ഒᥐň栁䤃ᙦ㿴改扒勃㔤㍥䵅檐䲽ት䒨䭶ᜂ⓴毁烲拄㞲㲱ፕⵚ儵ᨛ嵄敞䦕Ἇ៨ᘉ孲抆ҧ卑窎擃槜⍥侃ᯆ⫐㺹緳檇敩妻琮暒檆≻劗┉رզ⼔䞹絠庅䳭ļ㵘抉瓯榰扏┰㏴ဆ⛔侹䯳ẅ䀖屫ⵘ䊗䳈楙劲搥䥢ᆆㅬ喹敓姆ᕫ▽ᙾⴔ৺㏫┬偷昦☇މে䫮䆶ᛡ䙧⤏䨟卭⛑何Ꮆヌ寉↚⡁喵ᕙ䩬ತ妮㍁✢亥ឦレ珩ᇒࢆͪ撻ፈ㪚ಶ妸㋺斾䧳᱖✄棹䑒օ೬⯩ᭈ䚀沮姗ᇑ◒䶆㝌捉䏒梇⸨⦺歂Ⳳ妪叮朑䣍᭪␕ỹ㯓ೆ㣨ি悼㙳沯妔㉎栔䭙戕䑌涉忓岆器㦿孔䚍㥅㈩⯡䮫ሬ㏄䥡摒᫄ᇯ綼ⵒ暉㓻妐獱昙䴷槖✼甩㲒㹦竪⪶絓徦瓯ᇄ狚擗ᆻᡚ⛄旹䷣ƻ㋮ⶶ策嚟ⳕი䊧ݳ䯋ᦀಙ᮹⇓宅囩㦼䭋㙳ṩ姆㈯⛌ནᔄ㌼䅩僒ᎇ䮱ᒱ㧤㌱⚣䢵⾬瑙涓榆Წ崷⥺牧䛾䲣ᚎ㾬䔹噉⾄䣭ᦾ᭑岦姎ጆ晓䠹ᐮ㪛㬹枒範潫㋀块溕瓸㥟㊍枑䯔世❔秙璒䆅≮箽䝔Ṿ岫㤡牡斧价ᇎ㲴犉㕠⛤獳̸ནṧ咴楑獒杽䩳⒬嚙㤲⬄⯬ួ佖ພ唗⤡劓敔㙧Ꭶ㇜岉挓㌅㋪掾⽁庅㴘榀ࡱ朁䷏ᚙ͜䵉㒒䢆䷯抡Ὂ⺟愒爐挶擽住ᢪ⚜疙ᘓ䔆懬殶佑ຎ㲯槴㏗暗䩗᷾㹼缙㶒棧簭捁枨㳒姢紇▒ዋᚪ㒼攉廳ࠄ⮮ᾲ㝃噢強稓包▟䯟㠜焹䔒堄矩㞱ṹ糗礫玹攗䡷ሡ稙㱣ံ䁍䎵ᔢ籨䴆礰䳉柪你夊匢琥弃అ䯨⮷䃍㠡˾ᦄƉ乃ჾ⍔䕡燒琵⭨悻克ʀ咰樒㊹曘煟㺢䤩ᔓ㰷ᡍ䎴ʽ㥂எ▨⡗⢢氥Ḫ⮅䡴თ䙤䌈⦂ஈᓒ冥᪘㶔撑園⻇䥶㦶祐䅤䔂Ռ爵搸Ⲧᒁ㞬䖥掋࣭⡾潈庄粥玥栗乐勦㓢尥ࡳਸ਼䛩ྰὀ縯䋷חᏼᖯ俥ց⧼祉⬫㐄യࢹ烎ↇ糬⥱⟹䳗ᒱ⚴冥打磘⡏ල䣋⚔䊾煆ਲ៧住ឱ婥⃣᪇䗇宴筂ᆗ哨㧱斤䰉ᆮ␜䥥砪㧇≎垻⣅ᆋ䴁䤆ఀ旴ⲟᒘ䢜涥嗔Ե澨碲ⵞⅡ೫םଟ曬⬸唊⛂渙䜓ᇸ栶㡶杆ᩮ桯纝卜砮䬙ᝆ㧌嗹⼪㌶嵫窳壀僃泵䘞叶ដ့ጁ䘥粫掄ᱎ㱺嚩冁㓠奅獮ᙄⱷሱ㼢繥ʒ漶Ŏ呰磌甉۪௦枥䯍Ự⊂履⦫䜇婏㦹㵊Ⅱ᳸☊੶䡋抪㚠枉叒ކ煈硴䓍六ᜤ祙发ⶕᑩ㤴汙填渶㙎␠擟慩እ䧳ଞᓒ⪏ᵩ⮲䞙オ厅ぎ㎈Ὂ㹠勖╃厞ᓂ⤴垦₼扉巓悷ሢ䪪Ⱙ媨⤑妪䬀͊⪳ሌ♬絙ᚫ㈆ᙬ䩾ፙဲ劯∡੮昺⹔呠吹ຒ約痮纳㓖乧擝⇡劺柭䥘山㲲猙歫䫅㧩恵㝟ਭᴚ祈㍡ᘪⶼᛞᒂ篥䵫梋ᵌㆴᕘ煷ˡ䤦䬶ᙦ⻄埾汙籽㪫甡堤愯ॹ惇䦹䭷Άⷬ噉⌬䟅ݼଆ唁ਤ妏ೊ斸ₓᕘ㇟ዸſᕅ♫准業ᙰ孜妏ܮ䕍䮉ᙲ付忹㏒瀥ᳳ㜶癉殴筜㥵抸䖒⌱្娉⿒捉槪᬴৪乹㣆䃈猁散ம枦ⵛ凂嵙䎫漄Ǭ␈⁏ϒ狣易ધᗚ䳨徎㼷અ♫ྷ午≼捔䦉㳓ԥ䨥ᑰ⡇ጙ㲢䴥箒亇߮牴擘փ䋚福䮒▶⼀堑㰪捅恫䚆泭ѽ䓍橶峏娕ᕣ䫟ὦ㤒笥坪ἆǬⳔ亚ଊ┽䫨圱䢄嬙☲摅Ὺ䂶㹌ẽ磋庇猏Ց㋫楞⣤坥╒椅櫫භ㣪䡹ཏ䖎㋘☙匸坫亂咞㖪姥⳪㖵᱕ॽⵛ共㋙ᔢ⪤᠒⬼с㷫缱㭨楴枭矋˯䨘⪮ᗚ⡬嘎⦒庵䵋叄я穿佺敢瓾禺ତ嚁⤅ⴆ㴲碵㨓Է才䅴䳍斄ᤔ◵犌ᖂ⾴凙㐪撙䕲ࡶ㳍䑾糁㥹ኲᖤ䩀啷䣈嘵⾲樵֝切孍ⱹ䫖㥿ᤙ昂䪛ᙾⵂ嚾㥜䘙ϫ㝃⏯塴䋝斔ዷᘀ⩜嘁⦔媅オ稅禼挥ɋ榸ૂ冝⫕ᘉ⮎≲Ƽ䄵ⷴ䃵⣫䯋㉨灿溑૾旄牦垱坕⫊澥㖍纆幍ⶻ㥆㺔⫙旑⨪圙Ⳓ塎㡂瑉嘓嵷囊ᵱ彛㦃ᓙ啹⬵╽ⷪ哦㨪瞅㷊ॶ⇭嵴勆畴䐭ר姹ܶ⪌哩⛢沵繊嶷嵊㵳ᫍ⪆䊠㗕䨩栝堭⌊䙵Г坵僈⍷㫎䫉啨籚㥾⣊岭⸊剕⠫㐷惨䍻竑䆁᪸㖰櫖嘅⧺匥ㅒ绵紫⓷Ӎ絵۞䵣㊲攷⮎≛䶒唖◼捵壪፵凊ᅱ䛎₍㔅㥉⪓♞䫂工ㄬ洵ᷳ労⧏嵺畭ᬇ唰䪅咍仏ᵥ㒜䐅ɴ⼰痯挀Ҩ䬉啥Ⰵ☋⧶坹㭺濤俋亄⟬べ僓㕯姭⫯ᐰஊ僰⽴巕ณ嘴㷌䖿⦞咽㨞櫀呋⸦响㐺嵕䝡⦵㙸敇繣粽ᔼ匲囧ⱒ忺ㇿਅړ仴搯眾ᵑᶝ粻ᖅ⭁敇Ⲓ峙ₒ䰠ઓ㨴⁌╽䕑楱䪸斮歯ᛔ⺲堑⨌喕秊㢷ᅯ玿棔ㆆ眲㔺南㣃Ⰶ勵◺棡㞊清篊տ͛㮶媻㗎⯢ڛ『健⍚咁⤳姴嵭佳盉ƗᲳ㕋⮝嚗⫾壩㝂創凋ᦋ䛈⽰滂⦍ㆯ䭹ុ⥢彉㘲兕㳫䭤ᗯ彶⛑䵼嫴㖣歓坏ⷿⳝЕṪ瑷翏牿绉䦂ᒰณ檽喿ⱊ妭⯔砭㘓擅�Ž⫔噣疙牚囹伡弝ₚ挕㑂沇ŷDŽ疚ᦨ᭢囌⢛ᑕ㗒湅繲巯❵DŽඑ嬟积㍻嗚佛ᜭ♔䴵亊㜶彈䃿⻏⥧ዟᔽ䭘圃Ⱅẹ㎦夜爳ࣶ櫮䣿懁䎀䛥旪毮ᕪ䮱噃㕦䎉别⠃䍃䙤擊⩚㉀疼௱呾⦡审㭦䒄ᓨԇ璉棵ನ⚁窽㨈埨淴向㨦僕㌺ࡷ⯬㣽操䶗檵ᖳ䪓▀毁峱⾄殭☻♖⇪჻㋍皍摒ෛ橽ⓛʄ墳㧦桭ᙋ柷ᒎ⓽⽅氶⋃☊䩭ᜋⷩ凉熭垊ɧ㽈婷ਗ਼庞ᜪ䷉只喳䰅ဳ㢒坹娺亴㬪㕰ᇌᎈ㬆൸⮺㗐澇☌礭䣋屗َ⋃熐⛏䔹㋲㗘澊墵㑦棕憺u䅏䓳⦂ᫎෳ㍺㔓ྉ僃㏆䖵攺厵嗌Ⳳ峓粝峉⡀᭵ᘘ氦境㊊䃕ጻ湖ൊ䓿仒曷疔匊㒓ⴹ婮㮺盭礂⅔旪䥾䧌ᵶ㗱ᩴ㟋俗ᾉ₆巅潪濄媉坶槗䶉童ฑ⩡㒱三實㨶籍⭪㓅勬䑷䗘嚍朞㗍⮧喴椴徶㸦慍爳ቔ寉䣲⻚嵪㫫繆⩚㓬漩夓⬪嵍痪ᑖ煈睸嵎厔笏䴢嬇垀楥忓⣺䑭ⱋ䝷䆈癶䝗掀團甤䭁査Ⱉ剼㤶搭呻҉暽ᗅ獭ግ畄猲嘦⣹彳㎼煭箻╖㣔▻杗楢㓃ⵖ寃垨欕ᑋ▦法䦺䱷⚊˻ᧄ㶋圃䵒官㚋⾴孉㎒箉䕻喅╉۷壊籡抶㖔沵卾⋨അ⩻磂坏屺姟⭷⳦䶬叓㜲洞哝Ⲕ倕筺㚵墋疼啘↉欋䷕䫶坍⨩嫋㦘䟍䎓瀅㖈彿磚ઓ朄ԧ⫵旤瀅忁▵�ǻ秖炈Ჲ⃝浥ᕏ㖼品㞲䫚偫㼴ⷵ兺䖌୷斋檪䖨匶啀楁员ప爭獻ⓖᆪ嫰㫓᎑ە䅄㓙⦕喥⇊䎍ᐊ䯗授䗃奷⬟ⷣ䩢嚆瀏⦲堍徻ࣔ皏⫺旋殛ᛵ浀⬃➞桇ᰛ湍籰埕䎊㾲ᓖ箟真䵳ᮻ㓠⤣吋㵂氽攪㊷䥨绷淒継䛽ധ樬㓄氥勻㠶睭䪫⒕⪊ᇻ㇛㮙看㖾残㙑橇ờ№儕⏺炨りㇾ揅→ڣⵡ䮑柏⺄咪Z籙抓⊔⥠燵终宋籱䔨狄癛ኆ屇㡤ኽ೫歔࿋㫷㷖㙼㜀ᴩ婙㙴⺴孧暍⥰⧫嫸㓅⮒໕ⶕ欔瑱漕幫㫮崕⼻ʕⷋǴ烖海櫈嘎婄嚚沓冧㧮喩䴫Ṕ⩉塻㻓ᮌ嚧ᕙ娵簉⫲升ブ倹汒ⱗ挋杵淕ᝬ⻛ඃ㍼啰Ⱬ垣⦌嚭捚ᔵ猎ᆵ緎ޅ企╎只甁汽吧ぎ䆽偛ߴᓏ灷嗆坾㓪伖珢攋伋屛ㆦ捽䱛䲶ⅈò嵆ދ۰ค刾斱沲僷⨖唽Ⱳ㑗⥈ⷼ䕐㍴⺽ⵑ㩭㗅檭宪♖滭࿔▌᧴筋㝹㜛ᔦ⪫喖䪜坛㲆刕侂槷眏槷ᯑᮌ勞媎矷䳰嘓㸮䣥り彵羊㋷兖᭣滹嶧㪺瓸⬥埋㰾琽䤻碎ⷖ枃㜟ᶈ㮄ᔥ湝勣㏖朕ಛ潗楋养峒垀⌖ᕫ♃濝彷㴮䃽惚䎔睪瑱⣖ঝ猙◊ᚽ婛Ⱂ瞍ᇓ咵ᨋ壿囏⍥嬗ㇱ䪱㟹渧兯⨎憽⥱㴕ⲏ珶ᯎ䮕滎ⶕ㨼皫洧塗㦎灱孺喕ㄍ劷旜幯甂㗎⮕甂亳ឪ〮拝咛ᔗ刌䌰㟚䥵廄⒛擷Ʉۃ⽓ᷝ㠠༔徒㯷毓⮅ຮ乡䅈ۛ沗呕䗾寝䬠伖罆㢨澻ဪ㸯㴷祫Χ殠ि【ߝ槚ƕᘉ⻳ᾛ㔤緤³瘿⃯儿⩞眆㤚娕琥溄⿅Ἡ㻯㷫娾㐣珯弿㳞僶ᷡᨗ氋ߴ濚౬㻦縙篁䝇楧呱ⴾ䕌༚瘕㰍柰Ήὠ攸甛师⧀溈折⊞嘀䎚媷ฎ௺䧑瞒廧牓穁禷Ț敩ঐ洝㌁㯫䠋娂╦㾁缎絒瞻涴䷟㪯ਝ䐉䠖䒩橅㿂⨱智犽䢯癟欴ޑ؞捍綫⧵Ȏ⿲ߍὺ缗緯筓˟桉䰠琞栣涚㐗倢唦Ûŭ䉧緐ࠑ摋椷嚏Ȿ䁞ᠧ䥳燭忴䂛Ċ傸Ͽⱏ爰ᰚ楿ℎ怣⥄੨溅₌㽮缓㪢䅺第⦿僠描⨣耛⨗Ⰹ傂悍⺧⽼Ѓ筸悟幟㤜ƹ垼㐖䐿溾悜䞇ǫ穤栗ᘹ䉡抣㨧咙ᠾ緳῍䃿仏ᖳଂ囖梕旀撏ᭊ⌦䶛屡俾奶䏘䇧綶ߖ画添劏ⴡ稝ధ尬氼个㟤惻䇍Ү⫔༺怢᳠爞緒ᰉⴔ佩ᑻ炘ჶ缑絡ۤᐏ槿吚❴䁣爛焬䨈϶惏㝧Ȕϋ筈湨㌈䥁獉斪䂲⋩㯳犸僿庰䏡㉪ᕾ˔珚ൣ㎺䔯樹㸡ᔩ憢ᨮ䧛犫歴ᯗ坘ׁ寀垴搬堈偗暬儍梕㜊ᄚ಼乁旰犠佣熦洬ᵑ梔࿂捥䍝漒则㯾䋮榧⌭ൎ㸇⢛儖ゝ䎾ഋ兔ᨈ㇀悾伸嶧䴯㐹槳哃ᄓ䇌䏣߮༼ᰀ㢘䜁䗣℧ഭ฿⮁璻⡂嵉綽ݶ༼‘㒎庞惝Z䰔搼摔ᢗ֨ᇟ䐁䠡สȚᰎ䄱禭摦䑸✢⸱瑲抮ᆦ䨻ܔ།⣟底弱橃筑墮揂ᆈ䭣⦤䤁䕔䟍ᡴᮯᨉ↱緆ᄍ㧲窩瀮㾛惷仼䚑ஜৰ㌵∊䢕ᜧ礽絮埅畏>⍺㶦␒ể滲㨐၃翸બ㚐孡Ҍ㖎仇͞⩩䍴㓈栻ᜄͦ翠㋢牓ᒈ搡ᔫ䤶⣵ລ䪄㿉㏲淃歧罰ⴾ忽㒖䄥䑦牮浝ౄ㾵㪺壃䂔㺯䤹ᗌಘ⅒├竨ቚသ扉ᤸ绱傭佫ㆭ䜥㗱峩ᣣ㓓䃻矈䥦᪔䱲㨞咧䙷刹䉔碎࣫ᰬ掙䝌哬㫈⺸敀ओ妮ƫ噟ಉ⎏ݺ揅⫊女ઌ㧢㈸传吱磂ᘂ傻ᇻ䀿㈄䀣䘦ఠᬀ㒬⪸澃標⎭嘁䂸ن㤟㇕㳽䟛⓯ุ坬⤤⌑箧瞖ḽ橘ಚ⊆ᔙ搒ጡ䖎ᴪ䳚剙翸瓧ါ]ႆ㞌䇒ⷖ挡䛾᪴カ႘侄䞂摓̤粙壺ᛜດ挟Ღ᠘疑䶴竦ᮭ宮ࠡ湈⤖檱⎦歫ഋାጤ狑䐳䞃Тܼ慞Ბ磷໒梔提䲾Ღᦤ疑䈸洃檹⦫ᅑ%䅡ㇺ瘔᪕ඌ᪓崘恊䚑၇ᝀ㎭⹛䲚5唊ṧ㋎༺䝌㷤燰⼳翦خ嬸梾炚䕐䦥㚵䛘䵩᥀̈́疑匃䇧䩬炽䉙Კ䓰燞掵䞴䵉ᮣᄁἩ䗧穯净௵咁焑㈝揯ࠐ佮ᥒ㏔ݩ嶳糡ᱮ⠭伀沊扫䧱ᏻء禸䤒㛤灠崚ᗉ泥縂ᥝ㕝匼৪㔨♪㕞ᱜ㯚㪡焮䚃弯٤湖䀱張ၥࣾ䄀Ȼྜྷᑾ奉橳⋠眱㴤敐㐨決䦲挺⚂俀Ϫ㺴烉噳䫧ᕭ唧救䪖哾䨌怦❧煨⚕帗⺸墀囇♯ሠ畛㯛⦎燫Ꭼ✛瓹ᥦᏴ櫰έdž窹洯檈塀㛄卌ʦⵥḬ┸䉢㣃瞬吏⥗ႜ㔀ᣍ叆䨤䳍ᠪ枹ᆰ冧ά⺹卮窧㓯㻋፨✨⚂䩄䖔涩䷳⯇⮯燵㘢咅彋壦ఠ⥜䵑ᦪ㸔瀹嬳傆䑸ࢺ師ຫԔᨄ畟箹㔶ᢜ㟔穉䇳扆烯ȗ⌵♒1塧ᖢ⠄俠ᨴ囬❑撳Ṇ䃭䚻ᙑኛ惹᧟Ꮔ枤䲝欚媜娵ච䇻೭ᙐ劢暔唃樒卋橢痓Ᾰ懬畒暥⚇˯祉捓ڂ㝭ᔑ㐐柃㜟橦㯔泉绳拺癷▼捗嗑ઊ妦㏮㋯ฝ⳰双濱啕䖊ޮ禿祶岈櫓掲᪷෮ὼ㸗⬺嚳姦掬䕑㗕ഒ姌ᗶ暽俈梖㳘掤彵亝ၭ涽䵻ʇ㣿纱吚ۜ中椌哸眒䋞⻧叕▸⍣僊磦Վ榼ᢝ㯽᭟巬楹粽ᅫ槭ᐸ旹域᳸漆丛巹俧ᖥ填⛲䑠㌆ˬ⮺獚⤎㧛ᗅ晥俷ᷣ啼悆涓暆嫯䭭⅛嚋疚দ猱枡䲻‚忼樺硕呇粷粼坟䔶㴐稂⏦柽䲱䡾ㇼ纙䞳䤺淮㦺僻㤻㴙ᧆ珿३栏ᶮ㟜糙䭓ᢚ峆⹔ፖ╽⚪槷是住Ẏ㖥∙䉼ช纶徺彞纚ᵱጀ࡙嬟俊ʞ㶄料玕彇峔煏罕㚑攖⦪界ᭆ䷕ḡ㔔砬簫ᠶ絖湠⃚㊌㝰程嵣枽伧Ɫ㏬料堭ਆ澗傿牵歛崀姩㌡䮙数徎㦼玁䤓આㆋ僒㺝㴉囱紛晜瑪䋠ࣿᩗณ症昷䇏烝Ὰೲׂௌ喨就㺌秬爡Ķ粌歒㗕⌞׃朐亠姭Ể眺淨䶇ቖ命潗ণഄ䖼獧朊㘈奙像僥樵ቢ啬ᕒ⪈㕣䖦叵➼ⶹṞ巈澑掓标ᙌ╞熉挍⧻斎ᛲ䲤幊㛔瀳圷絬怡繘庀ᣨ୯㎠䱠岅ᘤ综䶥؇店ᳫ⽘憈䤒☄㬙倄弡㐵㍢洓䤺ხ挎犰ړ⤗䖫Ꮸ朵䷛ᵩ㫑㛅樓┘ൎ羾囿ዄ糼▧瘔䲈寙墛⭚享䕲䍌㡿棗榛䙯֤琘兴佽浲㩒撶朽ষⱎᅭⳖ篗┝䗓㍆尕临怔㒌故䁫㖻竮晼子描⚎◚唢㨪⾥ᾶ姂粅砕嘷恵垾垱禓㴖☁㏑筵͇Ậ㪼砎玹Ἐ䊧㠒ⓚ㦄匛ր嘡婆‒箟⾭ƶ焖ᥨ烜㦐洈凓䭈ᛶ㓬奙嚜滙䘓綶濬ೝ纆⇆ᖷ㏏ᜄ瞼念婪慳Ⳬٷە泎㋗Ẇ䦃秨⯸埁⾃䬡兪熵䜍л糌奼狻犄挃旰琒显丘姥㩲戶柫ᬷLʺ۾╖ጋ䫤⨉ᛉⰰ媪㷂殅櫋Ҷ䮗畹繓ߟ峩䗜噾Ⲍ宙㝪插師澇摏綿啑উ哴◚䯤㴼Ⳛ奊㛒惖䅽☓盭ᵼ㕓⪕櫷■款ឺ乌堮㻪晙矋ᇻℭ完滾沋྆弘玞毡啀ૠG喹䊫瓷ᕂḂ㳑绖ᬅ⇖渟⪓⺆岽嶺猠溋㺪Ҕ䣬筟ᲅ㌐燧㏧䙍ⶬ嫕㭪眵涋䛷㻮൹劷ⶏ泰曓妔来秤宲㍬晕罽缶᷏ᯊ໑纊杺曱气果㝌孥ㆢ毕禫㚶㛌獩泐▇洃囵毺⠉㜎嬅㡢拥唋喫寍律㪷妅⫭ᓴ⯷婨撂忭㎣⊕泋ᾓ擇煿˸䕁㋠痻୩曽⼷ṝ㏊玅朋懪�㉽绕稤欍䑷ᐗ垍±睵䠻㝲抣⃔翍䛶琇映ⶐ姎㤚牵掣強䱎ྻỔ⭚崐旳巸㚩⸎嫌㵬纹戋⠭ύ૾₊⌒敓埰浑夵ㄫ㪭侓䏷粏⡿໕矔㴄旮姜琐洁嬉㑆拙瀭硖ろι䎁܀㙛Ⲱ季㖫Ω䊻庶�扻ǒ涝㌌伄希㊾斡嶹㱼榕型ᮇ㢍筼⇑厎⫳沧ᮁ䷹婽㚢擶昫筆檌楻᧑ⓑ⩯䶺㇓អ潤头嘶綵摻㽖淌˺穻涋朇ר尜䭣妑㻊粴橻佶幍漋ݒ榛᳦痭᮹㚢⽚娭㘊渎噻㋗憌墌僗㶉⛭⸖௲㙤海浝㴆揅捻ᩖ㊌㫹睙ᇇ⳩䗃䭌㘿㘬ᾃ㙦淴旫䕶曮粉惒嶉罦0珄窜⾧㬚灍捉㭶㯌ᵹ廜浞嫦ⶺ⤣㜨潢Ύ㍊枵类淖䬒㽼旒岂ᬇ☋嶽ឺ淑嶋㜚漶佫ᵗ侌纽瓓ຎጔ㘃᭞囹痑⦚墺琙绍ᓶ殕狩㷗盯淢毬䜮㛅䦛ㆲ绅篻⧖窌䶉⧜及疳它溽槧㖦篍甫Ԍෞ⟅ೲ尅嫿♱宓㭶札䴓⹖㑍棺ड़掀眝ਂᯫ㛑涖䨃㏺纙圻总潔槽惘ក䛢渆䬪昪汳宵㟪甦䵛丷协槿策喖܊拭⯄睭盔媷㺆畽䇋⺶奍淓僑ⵉ淁巎⦮㟍⽍ㅗ㥊⫻◛㋁瞊㑪召擑砰滠Ⰰ灴㗈恊䩨㏛㎗淎૱咀瞋漑ṅ嬞睝浛夋䕼哭ᲆ䢙⚋滾ෘ箖ᛜ〸篒啌y冨⒄݃ᛶ梆Թڻ旑ម盨渍ၹ益ᩢ䁨⺾枭͢䕔Ⓥᨲ叠䗖䓰弖㭫㞪ⰷ忈⩚嘭∂欖犉᪀だᚃỤ䆓ࡂ㳐·屿僾植䤻䧷婣㯼⾍牟㶾箅㘑椏惞愘缆ᛗ֍緺伾㮌᧔ᴽ熉壽Ǥ栟◞㷜Жẚ斿嗁Პἄ纝筨ഫ勅敟レ㿭⥁䒹῾戸簫懞㷋签㐣沟忖燽櫁䃕>㖷㿟䲁ഝᵭ㭮㚣䦠㵎⬡甞㘜织呲㪿煞ᴩ²Ї患⚕嫷㷤ᴣ剩䰮㻳灞⇽Ǹ偮ჶ倂ⲩ١擦ᵼⰯ穸灞䂗䄕斳纪߅䂨Ố㽀罡矼㈰ㄱ羱桜傛溽⥠䐖ܬྲྀᥐ㽗㠈ྣ梧Ḯ䏰䑞炔ᄅࣟυ⬌⊯汨ᆰ竁琝夛ᗖႀ呛ೠ摿∝绢䠠Hᙱ䱜ၬ㮦7乳屭㥫恸㫼䚁汒Ѐୈⶠ屘措槴娢纾㳘<⇯旍䦈ᷣ疔䂯⪥属刍箷窨␏㬾㦘㨶Ⰱ烀㾧䃨儽ϼṆछ滱籫�Ⴄ⽰㭥ᛈᭃ䐘伯燃㱟恀䤎怲⏙䔙྇ⶠ⋈牳൰ᓀ砡䏍㐯咘検ǧ偂䝽jᾞА稥嫙⭧ڸⴾ翵⨱䀴ㇷ㮝矨ᱣDZ畈㱧ắ杺䙟灈夅䲭値檮ባ䡆埦䍑紎㳲㊮瀠⩞碱备䖼Ⓝ䝤⸄⃤晱ฦ⌞㧧┱托ଇँ碾掣䞻⁼㯘粈渃淧ǓՁ┡၂╯燴幯䳻ḀА瞇㝻⁇㤙湁┧Რ〨ᨲ偉₉䄽⋍匟䬩畀㱇庡䪡ᨠ修䔓ਂᐘ䃶䁗眂㮤炩橩ᑇ̇䑘⥝箤䔅箰⢑䔷禉᳂㪰㰩癃照㦯़⅞纍┍ਉᏌ❬倉Ᾱ☄熩愳秀㾮Ⓖ䕟犘┎煝ԩ⠘俩ὂ㰴祩柌Ç站ԯ٧ઐԇਝ握溯ဘ䭜㬄科䞳䱇㹯ࢾᕛ⪔ᾤ樄古❘侥 㬴絉碳巇㉯☂㕚湮ᔗ樴偧⟒両ᾚ㯜㫩戃筇➯悽ለ稬㔙⡉发⠆佱ᵺ㿔綩湳棇敠线朥䚒甌娷参❞俽㯚䋒۱庇窢᱖℠㎮㡗⎏吥侭ฆ㪩䬢旞ᮀ洯ᴏ᯾擡缫㎥磘ᠮ偘ऌ翑ắ㏧㡥嶾℗砰ᴛ㧑湽曃佌Კ曐磷ᨮ═ᅠ⠡Ⲧ⤤烿本e⫈ሖ䭇ׅ�䵰燸⋡崁溗⪻㨝⸮䅐⅂ھ㣧ә筈⬇椴ᮼ≊㴇㢙珅į佇࣡ݴ䍰洓澬ᐠᾼ⽟䀥㴈ᠺ珳勗佌⏾㬜爙爓堷᎔䎧ⷷ㺙ᩩ喘䌐⸿找㥼瀥朓䑈䢱穴†✏ᴘ桉㱌ផ拹⠱㲊䊛䌞㨰㱜ᤁ杚天倴幙ఎ姦儈弛䔠ɪ妫䟴匑Ȿ࿅ 弨棔ӹ扜⽕ᔶ㦉ɹ榛㔆㵯⡂य़ḩ檿ᑆ恘⌜⸺㸕༂ҵ粈伺犢㸦崛ᐮ䀢呔怪䆶䅲碝ᷤ⊷╎᠒瀡⦖碭◱䢉ӸÔ崉㫒߅於ᦷᾈ乾絠\"⃒伅挼▷ൎ㙼怦榟㎪摉橯䧼弚䀠A㊢ᗷ䮨紊⿌峠ג瀵箆ᑷⷨᅼ橃⢒亂₮剐㣅烒嶎⇴䚵窞ૅ垽檲䦳䬉ɏ䁂ܵ⻮䳏㗌照䬵㥌䠝瑼塄䱪ӣ▒⤎⛊㴳䁽ÿ㭷ỏ䖳竞疐浔塁崮݄哦屸䂺盥昪⢣䔱䝭䃇䶑愉ีఫ粤ჾ婐ܠĤ੶吱Ὑ寇ᔩ挰紥⡙堶⦉抜拺珕渤绷チ❲㻤ṉ朰剂~㣣引㭍༕磒㯷祈䷪⼺ˑၻℽ㥏ᝃ㓵ρ曂们箆ၗ④粑廂ག䑫⅁⧌傐瀞徬㶨䲤ᄻ灨ᒎဃ❇䘧'‼䯝㡞Ⅱ幸ܦ皠ሻ懷婥ᇛ綐摺世⡺㝨熊䏍㣺稓Ả์ڏ⪰碕㬗㘏礊僠慮全сʕ甋嫤ᤡ℀ 䮐缦&湐$湔扒ۇᨔⓤ⊏ᦑ甦涗朁ὗᯯ瓲澫፫㩃ࠖቻ毮焁幇㎔ਲ਼专㥽㞽྅岸恶熗䥗Ð㾒㗞嶗嬀ⷢび咆溝匛㸕 ಠᷥ䩀眯烔ᏺ֑ໍ絲炠ᥡ綠'⮟ូકᑛ熄儏Ǽ䏛ޑ\"ḋ寎Kᆃ峠n羞ኻ䠠意⧾締#睎熅ዛ暗洎函珟䞘会☏䁲硕澫ჷ㸕ս撵ភ粉懾⏚碝༂硃㯂眮⻟℗㱞䕽珛䧗憫旿䷘僪漎ฤ篤㢋࠵戝䍯㖛庘⡹☂㟙筫异䤨䮡窧濒幗噞瑁儛濈瘠Ƞ。徑笅乍簂擗渮ㄆ⥠绁療⹗ⶻኰ㿙߫⬮ḓ灪ℊ⹉䀠䐒⌝熋摈瀎║ـ檌愪䇹惈䂀㴃㴡耉ရ啀䀾♣�澯ȝ杒⪠秸ἰ㵔悡畾梧織瀎⡟翟ℚ䈿ש߆䈰Ṷᰯ劦佝燝≔䏥ओ㝕稢洒㘙վ粗濗⮐紁焙䎧䦢⤨璯㼉ख⬌婘䠚ృ懨㩐怰琷൩◀社⤮ყ槨㼒䰴ҏ矅伎䀯≱竐䋩ắ焖欱┤ت㒈ዥ䨳⡍厸籌狧᭧紀䁁ᩞ䂟夓企⋄灦糶პᾆZ篡אɢ佉榾䲞夘㾸奅䟓ཇ禬㳧ɴ熃橇䗇滸ነ岘椗含␚䟏ގṐ�篴ڬ瞯チ㹞ⴧ礛崏栴偸倃Ẵ罴缂ᛂஉᐱたᚮ唜䄲楆勇漲㶘㽕䊇ړ嶼拀ᾦᓇ僆ḯ՜璺佭Ẩᴬ粉砜㻢㳒ㆮ࠭嗤㸬嶳猫⟕悍ᾪ᷈税桔χ綯䫸瓱ᔖ㐛ⵖ⬛ḻ▪㬓䔇狑㻏㺏⯇契傠棏ߝ籧礊ḓ丮䭘䵰⯔䷎垡㗙嶕眙师䁯⁄滩屳㵽ஈᐐ⟌⽡滠珝娥琠$䈠⎜̡嚢疳哦稘ᴤஇ価楒᳭昚ㅀ墂ᙏࠑ㳿㺘ᶚ崶㲻壠⼢枞㹘䛢眠ష䑏疎僞憟䌘䘒睒�廇㇊ϥ禱琐㓯⊇ᐱ唦猟䘓珧尞㝤忣䐜絶穭箩偏ㅾ⃟⦞兛☋戝៘⿴庹㴓憅灋綷斠ž峝ၪŪ程Ⰾ埡『濕廽㸦౫怷哏牾懣焧ⱪ؞⯩㒂䝪弹㺶څ稝ᢂ㝏硉檫禜ᬙ䤟ᬣ䄊ա墭㶜紖穋曷䥏わᛞ沦̕☆䯣埮䝮幵㳚筵看恗嫰䵾绞続ۧ嘙分ࢃᄐ⡞㼺籅瘴᳷䓏㉾凜料䜟㘒కদ⾩庱㳆緭珠䖁哾䷝ẜ੍動ȓ斏炟ᤌಋ㸭牋磗壏烿ዜ⇚嬝ฎ氘៘澴庁㽊硥璻缡̾⠮堫眻ᠴ倾Z桩⢎竽缌⚃榘巾⺻䊤㸇ⴢ籏⁈⣯㷵㨄⦛罺Ề䷿䟞ਜ਼㊟ẫ䖵瞧澛帺ㇾ绝羙ૡ烥䉆漰ྜ叡炌ᦩ哸♽䐡砬築琚㭢ၞ啹䄞㉌ᮡ悒⟡崊㋁缨ⲧ狭㶔ރ檹ⳳ戕夅簌ᘢ 搟漁罖᧤秸害ɴൿ℟∛Ѓ≰㣲ख़䝺巌⊺烕欷搠幏⽘㤝ᘥ搈ɺ࿋滇⤘締3索∓㣷ㅞij㤟ᄆज⟽⟐㈒㺄縩穃砹纚㊿傩㊟煑Ґ吁榿晍⢴䄔繌こ硸ᣯ媿ᡟ珲Դ᨞㐟䝉促Ὂ㹆㷌▔ಇ挞ி䝟᪵Ğ㵋㐃焕䎯Ἱ䣚忶֮☈ἤ⮧䃞ᝣ̝ؔᐆᏉ檁坡㽦ᵥ给灕毰⑿宴欳甤潎㰪⡗科㻤⃫终乿㳟俟唚瓨Ⰻ⿍⣙㻤⪬糫熠拚勞㔱窢ᘒ瞆㏾ⱪ徙培㆙笝祳綸ǟ㼀ܚ⟯缍䄩ᕱ心㓉m磓烧纚ᓿ營愆༴⸓ᰑ䅋⾦徃㺊櫬䲻盷歎⚳�ङ斗小ஊ匽徙⽮簦⽛绗絏嗿猕ᘣ䱤⯍␘ㆈ濃౯㽟Ў繛硓玏篿ᬡ侜供㲦簙砧濖ᾥᅦ粈䄋篫磴џ⠠⩟婞縒朶က濞䔗㽁粭翛絗拪⫿㋟᚜⬜搝帒砆濌㼻㿺簲匱ભ珏伸凟s䀈␞Ⰴ砆濺䀕㻩罓絇翗月ᑟ将ᡳ漜琛䠞㠞῭徜缨匓禼ൺ烸⛿敫㲮弟帕᠐⤏䀝㾅粚រ䢠奿氠䂈欰㾫⸪㆙埽⾲⫺翱下縔㒗憿妈䎟㬞欝穘㺢濩後⨌紙⒗紷殧⧴歟奷㰕㢰刴Ҏࠦ罂攫⎻籇琚䄞㜜Й剿糩ᕖ㔜羣翯▯瑝ਥ嫤⟠倣罀䟨吙凊䀔翝祜繋稀䶿産῍ロ㐝炘儢⨹㾸缵纫纟㡏߷惟䶟⬞櫱ᰝ栛眤㡔䩪⃮႒᳙焏燥ᯟ岟ᣟ簜ᘠ‘夨翎耄ᆝ慠䏧䆅ڟ昿厞礞䯧倓太翵⨴䦐䅪偞䮟伟ស刚仂䘭怀㽬絝翇罗綀ş砏燤稟㾞䈝ࠟ佬䀕㿶ྗ纐承箠မبཏ溟惱㠛Ⳃ䲗吒〔㟀)耓‒怔-箦―倔䢂瀕䀨䀕㰔罡䀬戓䒷䀮我ῂ瀒竢犅怒怖怨⪄【ఓ䍢怮櫢犂ࢁိ稦ῆ绣弖ئᾐ忣砕倫ⴐ‒ᠵᵠ〫ᾔὣ〫ⴔ⦖㎕㴅急㎗㋣冥䖓⺑枖䎔岓⤤㘡ᔠ⍦✤Ⴅ䬕䜖泣瀮ᶔṀ⠭箣瀩瀮⠬熦❢ࠫ₢碕ㆠ䠬✢䠯ᔡ䠬園众䠮ஔ⠫㋀栩⠮⠮⦕堨擦栭ૡ㨡⎗栩拢✢ᶒሥ䠪圖នᦑஒ⠮⠮ᦐ堨奥砯瀭㧧庤㠩ࠩ㠯⸠ᠯ㠨Ꭱᠬ伐⬔罡Ь堫چ㕠ѣ⠮緲㡥Ы噧Ъ妖⮓栮䐫㠪ᠨᎤ熢砫ᠮព搩溆启ѢЩ搩搪殠䐬ᐪ䐯ࠩᐫᔣ䐯ᐭᠬ佦㐩吮ᄄయ᠔㡠搫ⶕ㴁Ѧ怡㐬㮣㐭栨琬堡䐭ᐮᐥ琨伓桁樣吪ཤ氯భమ堓న㐩䰯ྣ䰮ᒒᐬ琬䠮琮ᐧ䐫䬔吨ཡ氪ᰪమѠ㰮䰫ஒɥ眕⨁䄑䀤搪眔㇠簯ᢦ丶ᰯΥᰬ璗ᰬⰪ琮䠭Ⱝ尯琪瓠眔簬Ȫ㰫ɧ簪簫㰮ಣ䈨ȭ㰨䰮౷∩∪Ȭឡȭ┣ȪⰪ尬㐭嬖䈯Ⱝ憆∬ȫ砬簒刬戯樖堡簫㾕篅眓戬搩栫ᰨⰮሬ䈬砫琨刭燥㈬∫⮠眕∪⋥㈪㈨斕䑥ਫ㈫搩禒㠪ረ䈮ᠪ䈫䠮ទ䨮㍠䨫熡橂༴䨨Ε䑥塥䨨㸠ሬ䤦爪⨫ᐫ爫Ⱞ泤ᨨ樬⩥樮樬ᒤᨫ樫⎑疢㨬栬糧㈯䨬䐫綕㠬尮䠩尭⨭ᵣ㨪ῥ樫ਯ䗣擱ࠦ㨪向晠䘮簯㨨ࠫ䨫䖖稪玖ᐫ稨砨䜧爮泥䣓䘯抅䘫خ昬㐭练昪ᨮအᨮ㠩稭☬ᠩረخ砭䘖ᘭ娩䘨ࣖ簫ث筠㐪戮緵㘮䰯䘫Юᨨ爨⨫ᨫ☨娨昪娮ប瘩昫啢筣㘫季䂠搪䘮䐓Ť丯刭㑣ᘬ⨬ฮ尩⨭嘬罣อር柴⸮㘨㨮ಣൢ氮ၔ丢氨㠫瘮☩宔嘭䐩Ⱜ娯ሮ娭ḭ氪濰怣吭潁㸭丯㘭簬䒢Ḩ縨②⸨ส嘯稨渫尬罡縬㰩㩇㸯Ī㕅ಓ丫耔憔䲑ᘯ縨嘨尬į☫ሬج罡ಒ稡别ڂ愫ث愭䄯ⵐᄮ瘭搭瘪稯㐮ℯȫ⸭ረ吩䈯憐℩愨溆ᄫ嵢礓ࠬ堤ᄭ撔‡岕攓⤤ℨ帨儩☩℩帩嘩į佦焫ㄬㄮᄇमㆣخ䤯⸤ᘫ牕ㄩ䤫焯ᄯ䰬儩爮⨫帨愫प⤯䤬䤩疣䤭焫ث孂䰠焩㨁䘩ᄭ㐯焫⤬प儭Kฯℬ渪䀕Თ椬⭅㤨ḯ㢠夯渨ㄕⲔ䘩⤪☨प帪मⰩ儬昮ព礩渭ㄕ㤫ح㦓ⴳ䔪夭䰯焭⺥⸨㤭帮ฯ帮ប┩筡攫㦐⤮䔨Ԩᐭ┨Įऩफ儫ᚢᔨ㘯唭箣֗䔫̰㔪┩ᰩ┫ଓ┮मĬ唩㎦㔩筥甯ᔮ緰㔮ᔫ₥ᔯ⤯ᨯ⸪椮㤪瓦ഩ唬䊥䴪㊣俢㢡㢣㢤渠宦塣℡灤䌣炣产㚠椣皦䢠ᒣ俥䣒儗ᨢ⣀䦣牅⇢Ԡɓ₥⠣〠㴦吢⨢㛇㣥攡ᤫۣᦖ倢樧ᗦᓆત⼠倥䢥怣〦紪夥皤ࢠḧ縠£䰥Ⴇ紕̩‥ⱄ翢᧣℮昦㫢ᠣ庒➓ᰩ碓Ⴁ㪤ģ炤校Ⴆ挭⚦⤣挨ェᨦ娠↦猂翤溓敤儭偂Ц校̫ဢ⺐䌫梤̯Ф㌮焠ᴬ⼥Ф̩吠献ሠ⌬傣ᚥ傡〉稣〈Ɛ挭Ȫ挫妥挡ጪᴣ妣⬣䬬ウ兡ⷀ俦匬䡇ᝇ❁䢢玢瀦ဥण㴨沐紫紡⠥⠠犠ว碤̮̫傠ฤ〥ጯ㢣斥唣ᬬ圢ᴩ⠣〤紩䌭礠ร嬪䐢㬬†ェѦ栣ᦒ嬬笪䔡㬭怡吣ᦐ㌮嬬䲢吣㌨笪嘧ᬭ䜫ṁ熤朥笪✯䊢⨣ᤲ弁縤猧⸠崥ሤ΄ണ漐ᜪ䲀⸣玣™嵢✫ક⨢Õ缤䑠㜧既 "}
The complete round-trip took 46.4 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
formatfield).-
. 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.
-
. object
The response in JSON format.
-
-
Slice Message (
request-slice)View Details. (deprecated) The server slices a file based on the given criteria.
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-slice alt Server-->>Client: response-slice else Server-->>Client: error end deactivate ServerWe deprecated the slice request in favor of the
static-sliceQuery.To slice, you have to send a file analysis request first. The
filetokenyou 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": trueto disable the automatic selection of elements based on magic comments (see below).Example of the
request-sliceMessageNote: 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.0", "r": "4.5.0", "engine": "r-shell" } } -
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
filetokenofxto slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" } -
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":{"files":[{"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\"]","filePath":"/tmp/tmp-8223-UPh2kkBDfjcs-.R"}],".meta":{"timing":2}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8223-UPh2kkBDfjcs-.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-8223-UPh2kkBDfjcs-.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-8223-UPh2kkBDfjcs-.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-8223-UPh2kkBDfjcs-.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-8223-UPh2kkBDfjcs-.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-8223-UPh2kkBDfjcs-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8223-UPh2kkBDfjcs-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8223-UPh2kkBDfjcs-.R"}],"info":{"id":7}},".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":3657,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"vdef","id":0}],[2,{"tag":"fcall","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":"fcall","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]],"_unknownSideEffects":[]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}} -
request-slice(request)Show Details
Of course, the second slice criterion
2:1is 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" ] } -
response-slice(response)Show Details
The
resultsfield of the response contains two keys of importance:-
slice: which contains the result of the slicing (e.g., the ids included in the slice inresult). -
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": {} } -
The complete round-trip took 6.4 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
filetokenis unknown, flowR will respond with an error.Within a document that is to be sliced, you can use magic comments to influence the slicing process:
-
# flowr@include_next_linewill cause the next line to be included, independent of if it is important for the slice. -
# flowr@include_this_linewill cause the current line to be included, independent of if it is important for the slice. -
# flowr@include_startand# flowr@include_endwill cause the lines between them to be included, independent of if they are important for the slice. These magic comments can be nested but should appear on a separate line.
Message schema (
request-slice)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts.-
. object
- type string [required] The type of the message. Allows only the values: 'request-slice'
- id string [optional] The id of the message, if you passed one in the request.
- filetoken string [required] The filetoken of the file to slice must be the same as with the analysis request.
-
criterion array [required]
The slicing criteria to use.
Valid item types:
- . string
- direction string The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
Message schema (
response-slice)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts.-
. object
The response to a slice request.
- type string [required] The type of the message. Allows only the values: 'response-slice'
- id string [optional] The id of the message, if you passed one in the request.
- results object [required] The results of the slice (one field per step slicing step).
-
-
REPL Message (
request-repl-execution)View Details. Access the read evaluate print loop of flowR.
LoadingsequenceDiagram 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[!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
expressionfield. Furthermore, you can set theansifield totrueif you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of theidfield 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-accessif you are unsure).The answer on such a request is different from the other messages as the
response-repl-executionmessage 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 theend-repl-executionmessage.The semantics of the error message are similar to that of the other messages.
Example of the
request-sliceMessageNote: 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.0", "r": "4.5.0", "engine": "r-shell" } } -
request-repl-execution(request)Show Details
{ "type": "request-repl-execution", "id": "1", "expression": ":help" } -
response-repl-execution(response)Show Details
The
streamfield (eitherstdoutorstderr) informs you of the output's origin: either the standard output or the standard error channel. After this message follows the end marker.Pretty-Printed Result
If enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away: R> 1 + 1 [1] 2 Besides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. There are the following basic commands: :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r) :help Show help information (aliases: :h, :?) :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) :quit End the repl (aliases: :q, :exit) :version Prints the version of flowR as well as the current version of R Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command. :benchmark Benchmark the static backwards slicer :export-quads Export quads of the normalized AST of a given R code file :slicer Static backwards executable slicer for R :stats Generate usage Statistics for R scripts :summarizer Summarize the results of the benchmark You can combine commands by separating them with a semicolon ;.{ "type": "response-repl-execution", "id": "1", "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)\n :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n :help Show help information (aliases: :h, :?)\n :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" } -
end-repl-execution(response)Show Details
{ "type": "end-repl-execution", "id": "1" }
The complete round-trip took 1.0 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
falseby 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.
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-query alt Server-->>Client: response-query else Server-->>Client: error end deactivate ServerTo send queries, you have to send an analysis request first. The
filetokenyou 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-queryMessageNote: 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:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.7.0", "r": "4.5.0", "engine": "r-shell" } } -
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
filetokenofxto 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))" } -
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":{"files":[{"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,\")\"]","filePath":"/tmp/tmp-8223-Swxwr0itLpbw-.R"}],".meta":{"timing":7}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.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-8223-Swxwr0itLpbw-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8223-Swxwr0itLpbw-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8223-Swxwr0itLpbw-.R"}],"info":{"id":91}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":3845,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"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":"fcall","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"fcall","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"fcall","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"fcall","id":16,"environment":{"current":{"id":3688,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"vdef","id":12}],[17,{"tag":"fcall","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"fcall","id":22,"environment":{"current":{"id":3704,"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":"vdef","id":18}],[23,{"tag":"fcall","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":"fcall","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"fcall","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"vdef","id":24}],[32,{"tag":"fcall","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"fcall","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":"fcall","id":48,"environment":{"current":{"id":3762,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"fcall","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"fcall","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"fcall","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"fcall","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":"fcall","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":"fcall","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"fcall","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":"fcall","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":"fcall","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"fcall","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":"fcall","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"fcall","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"fcall","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]],"_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":{}}}]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],"cfgQuick":{"graph":{"rootVertices":[90,0,3,"3-exit",2,1,"2-exit",4,7,"7-exit",6,5,"6-exit",8,11,"11-exit",10,9,"10-exit",12,13,16,"16-exit",15,14,"15-exit",17,"17-exit",18,19,22,"22-exit",21,20,"21-exit",23,"23-exit",24,25,31,"31-exit",30,26,29,28,27,"28-exit","29-exit","30-exit",32,"32-exit",33,36,"36-exit",35,34,"35-exit",37,52,"52-exit",39,38,"39-exit",51,40,50,"50-exit",49,41,48,"48-exit",44,42,43,"44-exit",47,45,46,"47-exit","49-exit","51-exit",53,54,"54-exit",55,"55-exit",56,67,"67-exit",61,57,60,59,58,"59-exit","60-exit","61-exit",66,62,65,64,63,"64-exit","65-exit","66-exit",68,79,"79-exit",73,69,72,71,70,"71-exit","72-exit","73-exit",78,74,77,76,75,"76-exit","77-exit","78-exit",80,89,"89-exit",88,81,87,"87-exit",86,82,85,84,83,"84-exit","85-exit","86-exit","88-exit","90-exit"],"vertexInformation":[[90,{"id":90,"type":"expr","end":["90-exit"]}],[0,{"id":0,"type":"expr"}],[3,{"id":3,"type":"stm","mid":[0],"end":["3-exit"]}],["3-exit",{"id":"3-exit","type":"end","root":3}],[2,{"id":2,"type":"expr","mid":[2],"end":["2-exit"]}],[1,{"id":1,"type":"expr"}],["2-exit",{"id":"2-exit","type":"end","root":2}],[4,{"id":4,"type":"expr"}],[7,{"id":7,"type":"stm","mid":[4],"end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],[6,{"id":6,"type":"expr","mid":[6],"end":["6-exit"]}],[5,{"id":5,"type":"expr"}],["6-exit",{"id":"6-exit","type":"end","root":6}],[8,{"id":8,"type":"expr"}],[11,{"id":11,"type":"stm","mid":[8],"end":["11-exit"]}],["11-exit",{"id":"11-exit","type":"end","root":11}],[10,{"id":10,"type":"expr","mid":[10],"end":["10-exit"]}],[9,{"id":9,"type":"expr"}],["10-exit",{"id":"10-exit","type":"end","root":10}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr"}],[16,{"id":16,"type":"expr","mid":[13],"end":["16-exit"]}],["16-exit",{"id":"16-exit","type":"end","root":16}],[15,{"id":15,"type":"expr","mid":[15],"end":["15-exit"]}],[14,{"id":14,"type":"expr"}],["15-exit",{"id":"15-exit","type":"end","root":15}],[17,{"id":17,"type":"expr","end":["17-exit"]}],["17-exit",{"id":"17-exit","type":"end","root":17}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr"}],[22,{"id":22,"type":"expr","mid":[19],"end":["22-exit"]}],["22-exit",{"id":"22-exit","type":"end","root":22}],[21,{"id":21,"type":"expr","mid":[21],"end":["21-exit"]}],[20,{"id":20,"type":"expr"}],["21-exit",{"id":"21-exit","type":"end","root":21}],[23,{"id":23,"type":"expr","end":["23-exit"]}],["23-exit",{"id":"23-exit","type":"end","root":23}],[24,{"id":24,"type":"expr"}],[25,{"id":25,"type":"expr"}],[31,{"id":31,"type":"expr","mid":[25],"end":["31-exit"]}],["31-exit",{"id":"31-exit","type":"end","root":31}],[30,{"id":30,"type":"expr","mid":[30],"end":["30-exit"]}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"expr","mid":[26],"end":["29-exit"]}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["29-exit",{"id":"29-exit","type":"end","root":29}],["30-exit",{"id":"30-exit","type":"end","root":30}],[32,{"id":32,"type":"expr","end":["32-exit"]}],["32-exit",{"id":"32-exit","type":"end","root":32}],[33,{"id":33,"type":"expr"}],[36,{"id":36,"type":"stm","mid":[33],"end":["36-exit"]}],["36-exit",{"id":"36-exit","type":"end","root":36}],[35,{"id":35,"type":"expr","mid":[35],"end":["35-exit"]}],[34,{"id":34,"type":"expr"}],["35-exit",{"id":"35-exit","type":"end","root":35}],[37,{"id":37,"type":"expr"}],[52,{"id":52,"type":"expr","mid":[37],"end":["52-exit"]}],["52-exit",{"id":"52-exit","type":"end","root":52}],[39,{"id":39,"type":"expr","mid":[39],"end":["39-exit"]}],[38,{"id":38,"type":"expr"}],["39-exit",{"id":"39-exit","type":"end","root":39}],[51,{"id":51,"type":"expr","mid":[51],"end":["51-exit"]}],[40,{"id":40,"type":"expr"}],[50,{"id":50,"type":"expr","mid":[40],"end":["50-exit"]}],["50-exit",{"id":"50-exit","type":"end","root":50}],[49,{"id":49,"type":"expr","mid":[49],"end":["49-exit"]}],[41,{"id":41,"type":"expr"}],[48,{"id":48,"type":"expr","mid":[41],"end":["48-exit"]}],["48-exit",{"id":"48-exit","type":"end","root":48}],[44,{"id":44,"type":"expr","mid":[42],"end":["44-exit"]}],[42,{"id":42,"type":"expr"}],[43,{"id":43,"type":"expr"}],["44-exit",{"id":"44-exit","type":"end","root":44}],[47,{"id":47,"type":"expr","mid":[45],"end":["47-exit"]}],[45,{"id":45,"type":"expr"}],[46,{"id":46,"type":"expr"}],["47-exit",{"id":"47-exit","type":"end","root":47}],["49-exit",{"id":"49-exit","type":"end","root":49}],["51-exit",{"id":"51-exit","type":"end","root":51}],[53,{"id":53,"type":"expr"}],[54,{"id":54,"type":"expr","mid":[53],"end":["54-exit"]}],["54-exit",{"id":"54-exit","type":"end","root":54}],[55,{"id":55,"type":"expr","end":["55-exit"]}],["55-exit",{"id":"55-exit","type":"end","root":55}],[56,{"id":56,"type":"expr"}],[67,{"id":67,"type":"stm","mid":[56],"end":["67-exit"]}],["67-exit",{"id":"67-exit","type":"end","root":67}],[61,{"id":61,"type":"expr","mid":[61],"end":["61-exit"]}],[57,{"id":57,"type":"expr"}],[60,{"id":60,"type":"expr","mid":[57],"end":["60-exit"]}],[59,{"id":59,"type":"expr","mid":[59],"end":["59-exit"]}],[58,{"id":58,"type":"expr"}],["59-exit",{"id":"59-exit","type":"end","root":59}],["60-exit",{"id":"60-exit","type":"end","root":60}],["61-exit",{"id":"61-exit","type":"end","root":61}],[66,{"id":66,"type":"expr","mid":[66],"end":["66-exit"]}],[62,{"id":62,"type":"expr"}],[65,{"id":65,"type":"expr","mid":[62],"end":["65-exit"]}],[64,{"id":64,"type":"expr","mid":[64],"end":["64-exit"]}],[63,{"id":63,"type":"expr"}],["64-exit",{"id":"64-exit","type":"end","root":64}],["65-exit",{"id":"65-exit","type":"end","root":65}],["66-exit",{"id":"66-exit","type":"end","root":66}],[68,{"id":68,"type":"expr"}],[79,{"id":79,"type":"stm","mid":[68],"end":["79-exit"]}],["79-exit",{"id":"79-exit","type":"end","root":79}],[73,{"id":73,"type":"expr","mid":[73],"end":["73-exit"]}],[69,{"id":69,"type":"expr"}],[72,{"id":72,"type":"expr","mid":[69],"end":["72-exit"]}],[71,{"id":71,"type":"expr","mid":[71],"end":["71-exit"]}],[70,{"id":70,"type":"expr"}],["71-exit",{"id":"71-exit","type":"end","root":71}],["72-exit",{"id":"72-exit","type":"end","root":72}],["73-exit",{"id":"73-exit","type":"end","root":73}],[78,{"id":78,"type":"expr","mid":[78],"end":["78-exit"]}],[74,{"id":74,"type":"expr"}],[77,{"id":77,"type":"expr","mid":[74],"end":["77-exit"]}],[76,{"id":76,"type":"expr","mid":[76],"end":["76-exit"]}],[75,{"id":75,"type":"expr"}],["76-exit",{"id":"76-exit","type":"end","root":76}],["77-exit",{"id":"77-exit","type":"end","root":77}],["78-exit",{"id":"78-exit","type":"end","root":78}],[80,{"id":80,"type":"expr"}],[89,{"id":89,"type":"stm","mid":[80],"end":["89-exit"]}],["89-exit",{"id":"89-exit","type":"end","root":89}],[88,{"id":88,"type":"expr","mid":[88],"end":["88-exit"]}],[81,{"id":81,"type":"expr"}],[87,{"id":87,"type":"expr","mid":[81],"end":["87-exit"]}],["87-exit",{"id":"87-exit","type":"end","root":87}],[86,{"id":86,"type":"expr","mid":[86],"end":["86-exit"]}],[82,{"id":82,"type":"expr"}],[85,{"id":85,"type":"expr","mid":[82],"end":["85-exit"]}],[84,{"id":84,"type":"expr","mid":[84],"end":["84-exit"]}],[83,{"id":83,"type":"expr"}],["84-exit",{"id":"84-exit","type":"end","root":84}],["85-exit",{"id":"85-exit","type":"end","root":85}],["86-exit",{"id":"86-exit","type":"end","root":86}],["88-exit",{"id":"88-exit","type":"end","root":88}],["90-exit",{"id":"90-exit","type":"end","root":90}]],"bbChildren":[],"edgeInformation":[[3,[[90,{"label":0}]]],[0,[[3,{"label":0}]]],[1,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[2,[[0,{"label":0}]]],["3-exit",[["2-exit",{"label":0}]]],[7,[["3-exit",{"label":0}]]],[4,[[7,{"label":0}]]],[5,[[6,{"label":0}]]],["6-exit",[[5,{"label":0}]]],[6,[[4,{"label":0}]]],["7-exit",[["6-exit",{"label":0}]]],[11,[["7-exit",{"label":0}]]],[8,[[11,{"label":0}]]],[9,[[10,{"label":0}]]],["10-exit",[[9,{"label":0}]]],[10,[[8,{"label":0}]]],["11-exit",[["10-exit",{"label":0}]]],[17,[["11-exit",{"label":0}]]],[13,[[16,{"label":0}]]],[14,[[15,{"label":0}]]],["15-exit",[[14,{"label":0}]]],[15,[[13,{"label":0}]]],["16-exit",[["15-exit",{"label":0}]]],[16,[[12,{"label":0}]]],[12,[[17,{"label":0}]]],["17-exit",[["16-exit",{"label":0}]]],[23,[["17-exit",{"label":0}]]],[19,[[22,{"label":0}]]],[20,[[21,{"label":0}]]],["21-exit",[[20,{"label":0}]]],[21,[[19,{"label":0}]]],["22-exit",[["21-exit",{"label":0}]]],[22,[[18,{"label":0}]]],[18,[[23,{"label":0}]]],["23-exit",[["22-exit",{"label":0}]]],[32,[["23-exit",{"label":0}]]],[25,[[31,{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],[29,[[30,{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[30,[[25,{"label":0}]]],["31-exit",[["30-exit",{"label":0}]]],[31,[[24,{"label":0}]]],[24,[[32,{"label":0}]]],["32-exit",[["31-exit",{"label":0}]]],[36,[["32-exit",{"label":0}]]],[33,[[36,{"label":0}]]],[34,[[35,{"label":0}]]],["35-exit",[[34,{"label":0}]]],[35,[[33,{"label":0}]]],["36-exit",[["35-exit",{"label":0}]]],[55,[["36-exit",{"label":0}]]],[37,[[52,{"label":0}]]],[38,[[39,{"label":0}]]],["39-exit",[[38,{"label":0}]]],[39,[[37,{"label":0}]]],[40,[[50,{"label":0}]]],[41,[[48,{"label":0}]]],[42,[[44,{"label":0}]]],[43,[[42,{"label":0}]]],["44-exit",[[43,{"label":0}]]],[44,[[41,{"label":0}]]],[45,[[47,{"label":0}]]],[46,[[45,{"label":0}]]],["47-exit",[[46,{"label":0}]]],[47,[["44-exit",{"label":0}]]],["48-exit",[["47-exit",{"label":0}]]],[48,[[49,{"label":0}]]],["49-exit",[["48-exit",{"label":0}]]],[49,[[40,{"label":0}]]],["50-exit",[["49-exit",{"label":0}]]],[50,[[51,{"label":0}]]],["51-exit",[["50-exit",{"label":0}]]],[51,[["39-exit",{"label":0}]]],["52-exit",[["51-exit",{"label":0}]]],[53,[[54,{"label":0}]]],["54-exit",[[53,{"label":0}]]],[54,[["52-exit",{"label":0}]]],[52,[[55,{"label":0}]]],["55-exit",[["54-exit",{"label":0}]]],[67,[["55-exit",{"label":0}]]],[56,[[67,{"label":0}]]],[57,[[60,{"label":0}]]],[58,[[59,{"label":0}]]],["59-exit",[[58,{"label":0}]]],[59,[[57,{"label":0}]]],["60-exit",[["59-exit",{"label":0}]]],[60,[[61,{"label":0}]]],["61-exit",[["60-exit",{"label":0}]]],[61,[[56,{"label":0}]]],[62,[[65,{"label":0}]]],[63,[[64,{"label":0}]]],["64-exit",[[63,{"label":0}]]],[64,[[62,{"label":0}]]],["65-exit",[["64-exit",{"label":0}]]],[65,[[66,{"label":0}]]],["66-exit",[["65-exit",{"label":0}]]],[66,[["61-exit",{"label":0}]]],["67-exit",[["66-exit",{"label":0}]]],[79,[["67-exit",{"label":0}]]],[68,[[79,{"label":0}]]],[69,[[72,{"label":0}]]],[70,[[71,{"label":0}]]],["71-exit",[[70,{"label":0}]]],[71,[[69,{"label":0}]]],["72-exit",[["71-exit",{"label":0}]]],[72,[[73,{"label":0}]]],["73-exit",[["72-exit",{"label":0}]]],[73,[[68,{"label":0}]]],[74,[[77,{"label":0}]]],[75,[[76,{"label":0}]]],["76-exit",[[75,{"label":0}]]],[76,[[74,{"label":0}]]],["77-exit",[["76-exit",{"label":0}]]],[77,[[78,{"label":0}]]],["78-exit",[["77-exit",{"label":0}]]],[78,[["73-exit",{"label":0}]]],["79-exit",[["78-exit",{"label":0}]]],[89,[["79-exit",{"label":0}]]],[80,[[89,{"label":0}]]],[81,[[87,{"label":0}]]],[82,[[85,{"label":0}]]],[83,[[84,{"label":0}]]],["84-exit",[[83,{"label":0}]]],[84,[[82,{"label":0}]]],["85-exit",[["84-exit",{"label":0}]]],[85,[[86,{"label":0}]]],["86-exit",[["85-exit",{"label":0}]]],[86,[[81,{"label":0}]]],["87-exit",[["86-exit",{"label":0}]]],[87,[[88,{"label":0}]]],["88-exit",[["87-exit",{"label":0}]]],[88,[[80,{"label":0}]]],["89-exit",[["88-exit",{"label":0}]]],["90-exit",[["89-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["90-exit"],"entryPoints":[90]},".meta":{"timing":2}}}} -
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" } ] } ] } -
response-query(response)Show Details
{ "type": "response-query", "id": "2", "results": { "call-context": { ".meta": { "timing": 0 }, "kinds": { "visualize": { "subkinds": { "text": [ { "id": 31, "name": "mean", "calls": [ "built-in" ] }, { "id": 87, "name": "mean", "calls": [ "built-in" ] } ] } } } }, ".meta": { "timing": 0 } } }
The complete round-trip took 21.9 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
plottovisualize). 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
ggplottoplot). 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 offto 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
fileFilteris set, but a nodesfileattribute isundefined, should we include it in the results? Defaults totrue.
-
linkTo alternatives [optional]
Links the current call to the last call of the given kind. This way, you can link a call like
pointsto 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 alternatives [required]
Test regarding the function name of the last call. Similar to
callName, strings are interpreted as a regular expression, and string arrays are checked for containment.- . string
- . array Valid item types:
- . string
- 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 alternatives [required]
Test regarding the function name of the last call. Similar to
callName, strings are interpreted as a regular expression, and string arrays are checked for containment. - . string
- . array Valid item types:
- . string
- 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
-
. object
-
. object
The config query retrieves the current configuration of the flowR instance and optionally also updates it.
- type string [required] The type of the query. Allows only the values: 'config'
- update object [optional] An optional partial configuration to update the current configuration with before returning it. Only the provided fields will be updated, all other fields will remain unchanged.
-
. object
The control flow query provides the control flow graph of the analysis, optionally simplified.
- type string [required] The type of the query. Allows only the values: 'control-flow'
-
config object [optional]
Optional configuration for the control flow query.
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
- . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
-
. object
The dataflow query simply returns the dataflow graph, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'dataflow'
-
. object
The dataflow-lens query returns a simplified view on the dataflow graph
- type string [required] The type of the query. Allows only the values: 'dataflow-lens'
-
. object
The df-shape query retrieves information on the shape of dataframes
- type string [required] The type of the query. Allows only the values: 'df-shape'
- criterion string [optional] The slicing criterion of the node to get the dataframe shape for.
-
. object
The id map query retrieves the id map from the normalized AST.
- type string [required] The type of the query. Allows only the values: 'id-map'
-
. object
The normalized AST query simply returns the normalized AST, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'normalized-ast'
-
. object
The cluster query calculates and returns all clusters in the dataflow graph.
- type string [required] The type of the query. Allows only the values: 'dataflow-cluster'
-
. object
Slice query used to slice the dataflow graph
- type string [required] The type of the query. Allows only the values: 'static-slice'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
- noReconstruction boolean [optional] Do not reconstruct the slice into readable code.
- noMagicComments boolean [optional] Should the magic comments (force-including lines within the slice) be ignored?
- direction string [optional] The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
-
. object
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? Defaults to false.
-
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.
-
. object
-
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.
-
. object
-
readFunctions array [optional]
The set of read 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
-
writeFunctions array [optional]
The set of write 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
-
visualizeFunctions array [optional]
The set of visualize 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
-
enabledCategories array [optional]
A set of flags that determines what types of dependencies are searched for. If unset or empty, all dependency types are searched for.
Valid item types:
- . string Allows only the values: 'library', 'source', 'read', 'write', 'visualize'
- additionalCategories object [optional] A set of additional, user-supplied dependency categories, whose results will be included in the query return value. Allows only the values: '[object Object]'
-
. object
The location map query retrieves the location of every id in the ast.
- type string [required] The type of the query. Allows only the values: 'location-map'
-
ids array [optional]
Optional list of ids to filter the results by.
Valid item types:
- . string
-
. object
The search query searches the normalized AST and dataflow graph for nodes that match the given search query.
- type string [required] The type of the query. Allows only the values: 'search'
- search object [required] The search query to execute.
-
. object
Happens-Before tracks whether a always happens before b.
- type string [required] The type of the query. Allows only the values: 'happens-before'
- a string [required] The first slicing criterion.
- b string [required] The second slicing criterion.
-
. object
Either returns all function definitions alongside whether they are higher-order functions, or just those matching the filters.
- type string [required] The type of the query. Allows only the values: 'inspect-higher-order'
-
filter array [optional]
If given, only function definitions that match one of the given slicing criteria are considered. Each criterion can be either
line:column,line@variable-name, or$id, where the latter directly specifies the node id of the function definition to be considered. Valid item types:- . string [required]
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'resolve-value'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
-
. object
The project query provides information on the analyzed project.
- type string [required] The type of the query. Allows only the values: 'project'
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'origin'
- criterion string [required] The slicing criteria to use
-
. object
The linter query lints for the given set of rules and returns the result.
- type string [required] The type of the query. Allows only the values: 'linter'
-
rules array
The rules to lint for. If unset, all rules will be included.
Valid item types:
- . string Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'network-functions', 'dataframe-access-validation', 'dead-code', 'useless-loop'
-
. object
- name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'network-functions', 'dataframe-access-validation', 'dead-code', 'useless-loop'
- config object
-
. object
Call context query used to find calls in the dataflow graph
-
. 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
-
. object
Compound query used to combine queries of the same type
-
. alternatives
Supported queries
-
. alternatives
Any query
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.
-
If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.
-
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"} - 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)
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.
When writing a command, you may press Tab to get a list of completions, if available.
Multiple commands can be entered in a single line by separating them with a semicolon (;), e.g. :parse "x<-2"; :df*.
If a command is given without R code, the REPL will re-use R code given in a previous command.
The prior example will hence return first the parsed AST of the program and then the dataflow graph for "x <- 2".
Note
If you develop flowR, you may want to launch the repl using the npm run main-dev command, this way, you get a non-minified version of flowR with debug information and hot-reloading of source files.
Available Commands
We currently offer the following commands (this with a [*] suffix are available with and without the star):
| Command | Description |
|---|---|
| :quit | End the repl (aliases: :q, :exit) |
| :execute | Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r) |
| :controlflow[*] | Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) |
| :controlflowbb[*] | Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) |
| :dataflow[*] | Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) |
| :normalize[*] | Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) |
| :dataflowsimple[*] | Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) |
| :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, :?) |
Tip
As indicated by the examples before, all REPL commands that operate on code keep track of the state.
Hence, if you run a command like :dataflow* without providing R code,
the REPL will re-use the R code provided in a previous command.
Likewise, doing this will benefit from incrementality!
If you request the dataflow graph with :df* x <- 2 * y and then want to see the parsed AST with :parse,
the REPL will re-use previously obtained information and not re-parse the code again.
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.7.0, R grammar v14 (tree-sitter engine)
R> :dataflow* y <- 1 + xOutput
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgYnVpbHQtaW46Xy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfLSBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAzIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46X1xuICAgIGxpbmtTdHlsZSAyIHN0cm9rZTpncmF5O1xuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCAzXG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDRcbiAgICA0IC0tPnxcImFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=
Retrieve the dataflow graph of the expression y <- 1 + x. It looks like this:
flowchart LR
1{{"`#91;RNumber#93; 1
(1)
*1.6*`"}}
2(["`#91;RSymbol#93; x
(2)
*1.10*`"])
3[["`#91;RBinaryOp#93; #43;
(3)
*1.6-10*
(1, 2)`"]]
built-in:_["`Built-In:
#43;`"]
style built-in:_ stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
0["`#91;RSymbol#93; y
(0)
*1.1*`"]
4[["`#91;RBinaryOp#93; #60;#45;
(4)
*1.1-10*
(0, 3)`"]]
built-in:_-["`Built-In:
#60;#45;`"]
style built-in:_- stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
3 -->|"reads, argument"| 1
3 -->|"reads, argument"| 2
3 -.->|"reads, calls"| built-in:_
linkStyle 2 stroke:gray;
0 -->|"defined-by"| 3
0 -->|"defined-by"| 4
4 -->|"argument"| 3
4 -->|"returns, argument"| 0
4 -.->|"reads, calls"| built-in:_-
linkStyle 7 stroke:gray;
R Code of the Dataflow Graph
The analysis required 0.6 ms (including parse and normalize, using the tree-sitter engine) within the generation environment. We encountered no unknown side effects during the analysis.
y <- 1 + xFor the slicing with :slicer, you have access to the same magic comments as with the slice request.
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.7.0, R grammar v14 (tree-sitter engine)
R> :parse file://test/testfiles/example.ROutput
File: test/testfiles/example.R
program
├ binary_operator
│ ├ identifier "sum" (1:1─4)
│ ├ <- "<-" (1:5─7)
│ ╰ float "0" (1:8─9)
├ binary_operator
│ ├ identifier "product" (2:1─8)
│ ├ <- "<-" (2:9─11)
│ ╰ float "1" (2:12─13)
├ binary_operator
│ ├ identifier "w" (3:1─2)
│ ├ <- "<-" (3:3─5)
│ ╰ float "7" (3:6─7)
├ binary_operator
│ ├ identifier "N" (4:1─2)
│ ├ <- "<-" (4:3─5)
│ ╰ float "10" (4:6─8)
├ for_statement
│ ├ for "for" (6:1─4)
│ ├ ( "(" (6:5─6)
│ ├ identifier "i" (6:6─7)
│ ├ in "in" (6:8─10)
│ ├ binary_operator
│ │ ├ float "1" (6:11─12)
│ │ ├ : ":" (6:12─13)
│ │ ╰ parenthesized_expression
│ │ ├ ( "(" (6:13─14)
│ │ ├ binary_operator
│ │ │ ├ identifier "N" (6:14─15)
│ │ │ ├ - "-" (6:15─16)
│ │ │ ╰ float "1" (6:16─17)
│ │ ╰ ) ")" (6:17─18)
│ ├ ) ")" (6:18─19)
│ ╰ braced_expression
│ ├ { "{" (6:20─21)
│ ├ binary_operator
│ │ ├ identifier "sum" (7:3─6)
│ │ ├ <- "<-" (7:7─9)
│ │ ╰ binary_operator
│ │ ├ binary_operator
│ │ │ ├ identifier "sum" (7:10─13)
│ │ │ ├ + "+" (7:14─15)
│ │ │ ╰ identifier "i" (7:16─17)
│ │ ├ + "+" (7:18─19)
│ │ ╰ identifier "w" (7:20─21)
│ ├ binary_operator
│ │ ├ identifier "product" (8:3─10)
│ │ ├ <- "<-" (8:11─13)
│ │ ╰ binary_operator
│ │ ├ identifier "product" (8:14─21)
│ │ ├ * "*" (8:22─23)
│ │ ╰ identifier "i" (8:24─25)
│ ╰ } "}" (9:1─2)
├ call
│ ├ identifier "cat" (11:1─4)
│ ╰ arguments
│ ├ ( "(" (11:4─5)
│ ├ argument
│ │ ╰ string
│ │ ├ " "\"" (11:5─6)
│ │ ├ string_content "Sum:" (11:6─10)
│ │ ╰ " "\"" (11:10─11)
│ ├ comma "," (11:11─12)
│ ├ argument
│ │ ╰ identifier "sum" (11:13─16)
│ ├ comma "," (11:16─17)
│ ├ argument
│ │ ╰ string
│ │ ├ " "\"" (11:18─19)
│ │ ├ string_content
│ │ │ ╰ escape_sequence "\\n" (11:19─21)
│ │ ╰ " "\"" (11:21─22)
│ ╰ ) ")" (11:22─23)
╰ call
├ identifier "cat" (12:1─4)
╰ arguments
├ ( "(" (12:4─5)
├ argument
│ ╰ string
│ ├ " "\"" (12:5─6)
│ ├ string_content "Product:" (12:6─14)
│ ╰ " "\"" (12:14─15)
├ comma "," (12:15─16)
├ argument
│ ╰ identifier "product" (12:17─24)
├ comma "," (12:24─25)
├ argument
│ ╰ string
│ ├ " "\"" (12:26─27)
│ ├ string_content
│ │ ╰ escape_sequence "\\n" (12:27─29)
│ ╰ " "\"" (12:29─30)
╰ ) ")" (12:30─31)
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.
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 @configThe following summarizes the configuration options:
-
ignoreSourceCalls: If set totrue, 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 supportsemantics/environment/overwriteBuiltIns. You may use this to overwrite flowR's handling of built-in function and even completely clear the preset definitions shipped with flowR. See Configure BuiltIn Semantics for more information. -
solver: allows to configure how flowR resolves variables and their values (currently we support:disabled,alias,builtin), as well as if pointer analysis should be active. -
engines: allows to configure the engines used by flowR to interact with R code. See the Engines wiki page for more information. -
defaultEngine: allows to specify the default engine to use for interacting with R code. If not set, an arbitrary engine from the specified list will be used. -
abstractInterpretation: allows to configure how flowR performs abstract interpretation, although we currently only support data frame shape inference through abstract interpretation.
So you can configure flowR by adding a file like the following:
Example Configuration File
{
"ignoreSourceCalls": true,
"semantics": {
"environment": {
"overwriteBuiltIns": {
"definitions": [
{
"type": "function",
"names": [
"foo"
],
"processor": "builtin:assignment",
"config": {}
}
]
}
}
},
"project": {
"resolveUnknownPathsOnDisk": true
},
"engines": [
{
"type": "r-shell"
}
],
"solver": {
"variables": "alias",
"evalStrings": true,
"pointerTracking": true,
"resolveSource": {
"dropPaths": "no",
"ignoreCapitalization": true,
"inferWorkingDirectory": "active-script",
"searchPath": []
},
"slicer": {
"threshold": 50
}
},
"abstractInterpretation": {
"dataFrame": {
"maxColNames": 20,
"wideningThreshold": 4,
"readLoadedData": {
"readExternalFiles": true,
"maxReadLines": 1000000
}
}
}
}Configure Built-In Semantics
semantics/environment/overwriteBuiltins accepts two keys:
-
loadDefaults(boolean, initiallytrue): If set totrue, the default built-in definitions are loaded before applying the custom definitions. Setting this flag tofalseexplicitly 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 atypewhich is one of the below. Furthermore, they may define a string array ofnameswhich specifies the identifiers to bind the definitions to. You may useassumePrimitiveto 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 constantAdditionally allows for a valuethis should resolve to.{ type: 'constant', names: ['NULL', 'NA'], value: null }functionIs 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.tsor open a new issue.{ type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }replacementA comfortable way to specify replacement functions like $<-ornames<-.suffixesdescribes 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
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
project object
Project specific configuration options.
- resolveUnknownPathsOnDisk boolean [optional] Whether to resolve unknown paths loaded by the r project disk when trying to source/analyze files.
-
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.
-
. object
The configuration for the tree sitter engine.
-
. alternatives
- 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
ignoreSourceCallsis set to false.- dropPaths string Allow to drop the first or all parts of the sourced path, if it is relative. Allows only the values: 'no', 'once', 'all'
- ignoreCapitalization boolean Search for filenames matching in the lowercase.
- inferWorkingDirectory string Try to infer the working directory from the main or any script to analyze. Allows only the values: 'no', 'main-script', 'active-script', 'any-script'
-
searchPath array
Additionally search in these paths.
Valid item types:
- . string
- repeatedSourceLimit number [optional] How often the same file can be sourced within a single run? Please be aware: in case of cyclic sources this may not reach a fixpoint so give this a sensible limit.
-
applyReplacements array
Provide name replacements for loaded files
Valid item types:
- . object
-
slicer object [optional]
The configuration for the slicer.
- threshold number [optional] The maximum number of iterations to perform on a single function call during slicing.
-
abstractInterpretation object
The configuration options for abstract interpretation.
-
dataFrame object
The configuration of the shape inference for data frames.
- maxColNames number The maximum number of columns names to infer for data frames before over-approximating the column names to top.
- wideningThreshold number The threshold for the number of visitations of a node at which widening should be performed to ensure the termination of the fixpoint iteration.
-
readLoadedData object
Configuration options for reading data frame shapes from loaded external data files, such as CSV files.
- readExternalFiles boolean Whether data frame shapes should be extracted from loaded external files, such as CSV files.
- maxReadLines number The maximum number of lines to read when extracting data frame shapes from loaded files, such as CSV files.
-
dataFrame object
The configuration of the shape inference for data frames.
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 RShell::tryToInjectHomeLibPath may be of interest, as it enables all libraries available on the host system.
Nowadays, instances of FlowrAnalyzer should be used as central frontend to get analysis results from flowR.
For example, a program slice can be created like this:
const analyzer = await new FlowrAnalyzerBuilder(requestFromInput('x <- 1\ny <- x\nx')).build();
const result = await analyzer.query([
{
type: 'static-slice',
criteria: ['3@x']
}
]);
//console.log(result['static-slice']);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, a slicing pipeline using the PipelineExecutor looks like this:
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...
- Provides structures to investigate the results of all intermediate steps
- Can be executed step-by-step
- Can repeat steps (e.g., to calculate multiple slices on the same input)
See the in-code documentation for more information.
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).
-
Create a new file in
src/statistics/features/supported
Create the fileexample.ts, and add its export to theindex.tsfile in the same directory (if not done automatically). -
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
initialExampleInfotype holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resultingExampleInfotype 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, withInforeferring to aFeatureInfo(likeExampleInfoin this example). Next to anameand adescription, 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).
-
Add it to the feature-mapping
Now, in thefeature.tsfile insrc/statistics/features, add your feature to theALL_FEATURESobject.
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).
Currently maintained by Florian Sihler and Oliver Gerstl at Ulm University
Email | GitHub | Penguins | Portfolio
- 🧑💻 Developer Onboarding
- 💻 Setup
- 👓 Overview
- 🪟 Interfacing with flowR
- 🌋 Core
- 🧹 Testing & Linting (Benchmark Page)
⁉️ FAQ- ℹ️ Extra Information