-
Notifications
You must be signed in to change notification settings - Fork 7
Interface
This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-08-24, 20:02:04 UTC presenting an overview of flowR's interfaces (v2.4.7, using R v4.5.0). Please do not edit this file/wiki page directly.
Although far from being as detailed as the in-depth explanation of flowR, this wiki page explains how to interface with flowR in more detail. In general, command line arguments and other options provide short descriptions on hover over.
As explained in the Overview, you can simply run the TCP server by adding the --server
flag (and, due to the interactive mode, exit with the conventional CTRL+C).
Currently, every connection is handled by the same underlying RShell
- so the server is not designed to handle many clients at a time.
Additionally, the server is not well guarded against attacks (e.g., you can theoretically spawn an arbitrary number of RShell sessions on the target machine).
Every message has to be given in a single line (i.e., without a newline in-between) and end with a newline character. Nevertheless, we will pretty-print example given in the following segments for the ease of reading.
Note
The default --server
uses a simple TCP
connection. If you want flowR to expose a WebSocket server instead, add the --ws
flag (i.e., --server
--ws
) when starting flowR from the command line.
-
Hello Message (
hello
)View Details. The server informs the client about the successful connection and provides Meta-Information.
sequenceDiagram autonumber participant Client participant Server Client-->Server: connects Server->>Client: hello
After launching flowR, for example, with
docker run -it --rm eagleoutice/flowr --server
(🐳️), simply connecting should present you with ahello
message, that amongst others should reveal the versions of flowR and R, using the semver 2.0 versioning scheme. The message looks like this:{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.4.7", "r": "4.5.0", "engine": "r-shell" } }
There are currently a few messages that you can send after the hello message. If you want to slice a piece of R code you first have to send an analysis request, so that you can send one or multiple slice requests afterward. Requests for the REPL are independent of that.
Message schema (
hello
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-hello.ts
.-
. object [required]
- type string [required] The type of the hello message. Allows only the values: 'hello'
- id any [forbidden] The id of the message is always undefined (as it is the initial message and not requested).
- clientName string [required] A unique name that is assigned to each client. It has no semantic meaning and is only used/useful for debugging.
-
versions object [required]
- flowr string [required] The version of the flowr server running in semver format.
- r string [required] The version of the underlying R shell running in semver format.
- engine string [required] The parser backend that is used to parse the R code.
-
. 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).
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-file-analysis alt Server-->>Client: response-file-analysis else Server-->>Client: error end deactivate Server
The request allows the server to analyze a file and prepare it for slicing. The message can contain a
filetoken
, which is used to identify the file in later slice or lineage requests (if you do not add one, the request will not be stored and therefore, it is not available for subsequent requests).Please note!
If you want to send and process a lot of analysis requests, but do not want to slice them, please do not pass thefiletoken
field. This will save the server a lot of memory allocation.Furthermore, the request must contain either a
content
field to directly pass the file's content or afilepath
field which contains the path to the file (this path must be accessible for the server to be useful). If you add theid
field, the answer will use the sameid
so you can match requests and the corresponding answers. See the implementation of the request-file-analysis message for more information.Example of the
request-file-analysis
MessageNote: 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.4.7", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
Let' suppose you simply want to analyze the following script:
x <- 1 x + 1
For this, you can send the following request:
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
response-file-analysis
(response)Show Details
The
results
field of the response effectively contains three keys of importance:-
parse
: which contains 1:1 the parse result in CSV format that we received from theRShell
(i.e., the AST produced by the parser of the R interpreter). -
normalize
: which contains the normalized AST, including ids (see theinfo
field and the Normalized AST wiki page). -
dataflow
: especially important is thegraph
field which contains the dataflow graph as a set of root vertices (see the Dataflow Graph wiki page).
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11174-mKTS9pPKwIib-.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-11174-mKTS9pPKwIib-.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-11174-mKTS9pPKwIib-.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-11174-mKTS9pPKwIib-.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-11174-mKTS9pPKwIib-.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-11174-mKTS9pPKwIib-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11174-mKTS9pPKwIib-.R","role":"root","index":0}},".meta":{"timing":3}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":12,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11174-mKTS9pPKwIib-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":5}}}}
-
The complete round-trip took 19.7 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.4.7", "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\":\"file\",\"content\":\"/tmp/tmp-11174-jhOXQSgQnC1B-.R\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.4.7%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22file%22%2C%22content%22%3A%22%2Ftmp%2Ftmp%2D11174%2DjhOXQSgQnC1B%2D.R%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A75%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A184%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A148%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A58%3A18%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A200%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A259%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A152%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09" }
The complete round-trip took 8.3 ms (including time required to validate the messages, start, and stop the internal mock server).
Including the Control Flow Graph
While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add
cfg: true
to its list of options.Requesting a Control Flow Graph
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.4.7", "r": "4.5.0", "engine": "r-shell" } }
-
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
cfg
flag. However, additionally it contains acfg
field. If you are interested in a visual representation of the control flow graph, see the visualization with mermaid.As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]",".meta":{"timing":3}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RIfThenElse","condition":{"type":"RBinaryOp","location":[1,12,1,12],"lhs":{"type":"RSymbol","location":[1,4,1,10],"content":"unknown","lexeme":"unknown","info":{"fullRange":[1,4,1,10],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.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-11174-r5sFXDxqmfXB-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-11174-r5sFXDxqmfXB-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":true}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11174-r5sFXDxqmfXB-.R"],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"function-call","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"variable-definition","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"function-call","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"variable-definition","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"function-call","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"variable-definition","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"function-call","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"function-call","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"function-call","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":2}}}}
The complete round-trip took 10.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.4.7", "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> \"variable-definition\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/name> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/nodeId> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/nodeId> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/origin> \"builtin:assignment\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/tag> \"use\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/nodeId> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/nodeId> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/origin> \"builtin:default\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"returns\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"built-in:<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
The complete round-trip took 7.2 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.4.7", "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":"ᯡࠣ䄬Ԁ朥ᢠ⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨⸠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥう᧡㉕ࡉᨨ漡╁Řోⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ气䥓ѣ⤀㐽ᩢɀᐲᲵ䎴䭌ذ綞卒佢ᡨ侶䧴䜉䮂疲䀾䂁拠ᏹ籅懏㈯䱂券冇〠橐媨䀥倣哀愶ᕉ,䦲䃞塰㩮嗓㨽Ң窼ݓ暹圤ᘴ壕ᜅ勖噴囗摐⦴㛭嗗㙽䟖ᬝ傐၃䃰刹䊒亐⬥仌䆑ǫ䐥⼋儠养側剔䢗溧䬠弇唐圥弗刑㺏向纟䀬㉂䳲ىᣧڐਤ櫉䲓爴嵭剬䕓Ẑ↣⤺⭬⁗ೡ<䨦眈ف䀩᪪⠩ē卮㪌䬡ࣹ䆥暲忩⹈ⓓ犅䋒噕䨯䣤ǒ㙍乒ᇽ䊵相ಯ唥槄ᦶ滜⾑'庬曢㡪幗伐㹯嘐ㄏ尕缟夫⸥徬仳䬦⊫䵰ᣢ᭵檸࠭᪡卐婶䨡媖䦷Ǒ嗰⚯⣐㐫爡峱܁剖䘰⹖ᬋಆ♚㗬春䚏䆲䴋ㆁ䖸㛐ᶤňᇩ㎠盉㵌斨।凚㣀病㈓冕ǁ㗊ᗼ➓燣䓎Ể⋏ল⛉䨕㖪⥩ㆀ♔䄫㏃䋐⌊恨㑍ℱ㴮䕸㾈ጳᨊ◪䕉ᆝ䖔ພ᠉ḟ⺩亓妫Ϸ∼煬䨼ᘍ⸺न瑬唲㫎䦕⇏䧭⥯ⷊ㵫ں㭮凚㐧楘僩æⰥᨆ㵼姶⦳央⧩㤹巪⥾⨡禶␢Ⱑ⡊惎沿׀ቈ慑㼿ಽẼᆏ㢫◄㖺℟❉ᶙ⑽溂火ᖲ猒⏒盍䦭Ⅹ㔼⊮獽㟁疢忉檚倫匝䜋猘↻㛁搈䞌ん䜥⅝䍩搧ᕲ浚䤹洺柭㠬疹䪑㉢尸熴ϭ挘傳ⶄ呺佪㴦㨰ච㨠᷸⬸ੳ嫒ข䥪㠭䊉䍣⯪䜒䬺ᶅ䧎Ұ㡮㛡ք愳࣋䐿扒ᰎ縮翉繪侌勃⨜庥䦬͐䵓ዿᰧ彨゠栅㬏滬殠磗ᇨ梳ဠ᮷ʸᯀ䠪犄䍩䅄䕘ᒯ吠㕑䅠ᔰ晰<婫䀠ǭ䫃䅢䷨唑ܱ奈区㘡R䗰崯械Ἕ䐹ί劰〬₆ၖ␊䩨䂢᱂塇ΙὨ⭐寠擁⣬▄ 挒᧡ੂ䦴㓁Ҁࡨ➠ࢸ䄱ᇋ攂ᓨ⡊⏰⣤ᒐ䅈䩣壕ഀ尸䂺᧡婙緜㽧₌چᢆᣳ㬱⹖ᄰ労偢ụ�䑨樮䣹༴冩Ჳᢻ̜㞱ℭ䰟ᘧ撴丶炸Გ᮲晒勌ⅆ剸䒄殩䤗॑估榥Ể䠴厢㉰∸☸摮䔎䱠憿৲Ƞ愦ᆔᥡ⪈䓉∢㢰Ƒ㐱榃έ㈶⫄䀱⠘秖㈽ૠ㶸奃ጣ㕇ዚ⥤❬缫ж䥹㖱她᧲ㅅ玜㤄ᙀ枼嗨䓚䯙㌲祯ሠ/欓⍻へ㶆⒆构磪⤈⩒敠㲜⨠ڱ墂ː戴Ų㪷♾敉╎⦹䚪偔㉡♇Ⅴ᚛㋭䌟ޥྶ燻ᨫ࠰ɳԨ䤶᙮ᰥ挜ⱅ扽⋄冱擌獓ဤಕ斜䓭㬨椠燔䋫乑⎴抒吻ً猁⇥䝌ᕤ幢ؼ⭬ቷ῎囪灍岽⪉ᦰt撐凋ᥝ䮉⊄嶚ᜒ罊ⴀɺ㕄忲ዀ៷⥼垊俌㬞ੜ坶嗌姊廞橆⥕綆ᘺ惎ᬀ椵㍱㖐䞨┵䱲㑢䀣歆朷⪤ⴕⶽ番姀欙ၔ䶈垺碌嫨椠盳ඖ奻婁•㷵ᮛ❂仮亮栭㳴ു寻䗔嫐ঔ䝥㙎䊉 ࠁ仦殅ᛱ䵪Მ䯗᪥⃖䍸堖䦌໋淽祹㴧唋㻉䫽㔕厙疮栌欼欍嗳浥多寊ᯃ㛵瞇ᘡ䑈~ȹỴ溍敨㐧ᷛୠ演㝤ฮ显咺⣝㌹䍳岦⫍ታ⏷杻疸攌凝〕᯿下帧ࠬ䬧ㆯ䮝เ༸䊠Ё⇺ᩥ㹜刧㟝䛣㎬⎉束ҽ㻘橱慑֢Ɇ珌♴泤㔄䴁璼ᬃ՜㏇ࠣ⚤犯㽭ඉ囍㛓ళ♓无ゆ沈昿މ䶀㎿᧧ᱠ罞卖㫊܈拮Ы倊䬌ᨛ氍潔緞㦹冀ᝨ狯ფᐠ⥖⺉娏↸䷫ⱗାシᯐ㮪碮掀⼵乺Ṝ嫃砋ᴥ㟧妁噪疭垇久䦸劰ދ䛜叕ㇶ㦉欺盯䌈䱙䙾昑崋⥖Ⱈ㒷ႀ㠆竎䝮旭幹旪₻ヒ殟塶憏崗⾵䄹□孛ෛͥ㚖დᢺ斆ฑ䯾㇗ᠵ磜宝㕊堾睞愔ൔ橭篼䗠嬧珛筫ę粁砼ⳬᱢ簠g㹺᳧ᷞ墝涘ク犟圑放˾ῃ尠揈䎢⍪篬儷媜仉暾൞ἁ䲺秤㲴䲚枔籖ᦗ侉愖秷͊േ县沇᧖᷂焉㮿✁猏缑ḣ峟ఔ嶷ᚖ៛䥮ᤋॉᲘ∏璝䖼掣㶒䖐➼篷⬙緭烾㗮摛殰䋊↠挦窏Ɲ潝綽绱ᴙ罻篏㭇༧凜㪻⧝樼㌔㲲Ⲛ宮㨋㮩精̌㭓歰ས劐Æ⺃㺷瓶ᴥ瑾Ȟྫྷ滾┥㱊Ꮬ猚簔ࡼ汘倝䘀癭繝䝻㲗喞⯀繫绗潚わ䝧漰尕䓬祃厲纻㌓娓灞悆徣瀾堘㶮欘䊮⍚䘟㏫秪ࠍ㼩掟߶籠ᗰ侫᭟ࡸ㞺⼠᪨滛瓟置敟娥䀓秗生殏磟岙娅罍ㄟ䡱椉瞘ǟ媬厌㽯窒䏼憣ß秇嬌┍Ĝ≗䙅䠺䄝筚ᥜ䠊殛稰⽜⨈ཫ竍䎰إ佛稥䚣㈎䜬㥠ᘣ䶍潆㨫䖢›玌᥋嶜崋⽌àᮢ㠱ᤱې℔ဢ䃘窐ⲕ刺找ڵ傜吸ᴥ֨⥥樱Չ意ጡጇ㌲ݣ䰤ᒧ儏娐㫽栲孡椈ⓢᨶㄻԭ籎帶⌙ὣ瀸ガ壘ⷢ昼傡ۻ厝俭烍ᄏ䞅䄿佘̊渹ݙԌ崘儰坿֕忢8ܤ䚐ᩃ‴潨䚄㝼串eⅲʰ⒦恹ӫ姼糂⣒䑰㫝ȸࢾ㥴㓂瘸䁂䝴℔傡⎴├ㅉ椎䛴╣电㾇琔◂挱ԧ墢㤁㍉䗀⬌嘳㮙䚤㎵猹ᢶⅲᜡᐣ棤Ӥ䪃嬰墵㡔⬠ܳ壵䠌㎃ܱ壊␘ឃ䞄光䗼ゃ⤱䃠㥜◂ἵÝヤ⎢ᔴ䂣ნ⌝䌺嬯㤜㭃㠰㊝稪䆝瀄彝䑬伱喤㣁筰☲ⴴ䓃䞘⒡䝼ଜ␜༶ㄼ☂℠䂿罗䝟ҳ碱ҩ䭲℠a↲⚂㼁䭆◆Գ⨳㬮▲㚲䩋撣欒㴃ⲳ漽䬪⮲₸ᴩ⑼⊄ኽ僜概Ͱ〩䆛䘑䣴䪲哩⒃ኡ唅⛊㙲䩏响♟䘠墨ॕ⑹䵰ᚾ䊍◄㨘㚹㓃▸䧲皱ս㊉ड़嚸୯╠᯳撹ㄎ㦀ƿ擓દ㯂Ⴠᑅ▊ᨠဪ缭〲㸲䒸䀸枊ṓলऄ䙍䢂㪺宔旦ㇸ妲棢暆ⵐ婭ഓ╟䬨℺ᓘ䚒䙒㖴䲼摽嘂䬿歆斋ᛓ▽ⴎ撋墥ᣄ禐߲ᦃഁ敚ੑƸ夀暆ʓᬲᴉ枦ⵓ暹ᳱ昮㉒掿ᄓ▎⚓䜻哌æ⾒⮼㴂Ⱊ⩒Գࠚㄜ炰䃴松㧱㞿㓪♪䘢⑻磴侬ᾲ納ّལ疿碸䥠ါ⾱泠㦡㖐ⴽ˻Қ⪐寬䲧昑䊱ࡱ˙杒ᴪ⺰ঔᒚ║厼˾䑬䯃孯峴☮咫䮿€奱⏃፩⡒ގ➄䘪ᑦᛰ㲣愀⠆ゕⱾ拚Ԟ⋭籴抨⭂ṱપ璄ᚘⲕ扰呝厱㮳綇ዩ᠓䚫㉷ᒙᛚȴᰪ罗ԱℲ䩋劣Ę⥢⤳抧♪ᣪ㸾勐䑆⓫ᖰ⤒⏩ⅼٺ䴇ᙊू晻䴖暁⏪夻㋳秊Ꮺ㒨Ჵ瀲ର氨癜捩㚃ƃഐ呠ቋ具攏ᗖ⋪澴㴓♅㥊权䊤囏ᝊ禪潢啥⽊湹ὲ哅〉䈹䰼喵♊⮿⬊咚⥊Ⲯם倃䑴兖憂᷊ⶣ⪳䚆࿊Ͳà哤咊ᵺܶ‿ಝ䱹敤᠗兪劳㭅埭✫歽ἣ歍⋊ᚌ嫎ᑸ㚓㕺㎑礩㟳獱Ֆ⇎໓瞳ኽ䭽◒楽抪♡㨙ཽ䲩呬䐊ߋ❊‸Ტ筸ୟ吣⢋䰰㚑Ⰻ༸㒟嘇婒ᒫ慸嗒㹣ࣶڢ旃㽊棺潒⁍♄渎䛡栳✪Ӱ⃯旾⸣ㄲˤ❞Ⱃӳ㬻旳✫Ⱘ⢊ᰫ䣶ᓆ碓ㄋ⨌㬁吻僶㆖㓡㼪䖷䚲ᒆ㭓佴㪣曍䯂ዳ䋥㝠ࡳ栣⣀㟒㵻瓿歐✪競⢨⠠ૢ⣳屴㋴涐·⽖⡕㘝㛖淗בn樴殴ⷅข䬒汻䳕疸⬠ቤ巐᷁⡈䜒圶㖽瓆睶ೌ持楐撔痐༑潠⊔烅ᶩ沄䭂Ԧ:䠔堢㫁义䰃ᠣ㏜檙楄ƕᏙ糅槮䖕⯀涅淮纖⁀儬ǭ❔ᭆግ桕磆癝準秴㋰㴧喼⨀‼欆䱫䟃䣳⏖嵧篟嚓沾䭦城梬䩯᪀⧝䆤䥎眗圯嶶⫠ᠢ祄㌽ᨖፕ䴥ઔन太Ⴆ沶劫濊㡯濶挕獄綹䎞搗ῇ֟椞凔⨆溮缕䷳˖涶彗旐㪀ᦈ戬Ⅼᢇ䆞妪傁㷐ῖ猖dzЋ歡䑊䤭䀺溾垔♸䍕ଞ澴仒䐃ൈ䠬汹磷䝡戣ᢔ䳴ᣪ寶┽䍍ก䑉煚&̄⬮ҕ䅂Ṟ晶㌬⏢ᦈ䲬䒄浍䃌欯⍯⸖侵㢓ᡐ㊬烇⏪ᩁ欬硃␉〖洯䙊Ⅎ䞄⬮⟓─仡匔翟䣶ἤ䯕沆揺ਘ曕䝦搚㕻ᾬ坓挥ྼ⮁⏏㷥棓⡭挱⇆ᤠᲄ怴僛柾Ճᐠ㢐Ĩभ怵绥埼ᭃ侤䠄ւ°㫱Ṵ᧶⿁甥榩䈋柈汨樑䬚⟁叐瞂̣㐭䂁ǾⰙ皽唟攉睭㩕塖睙⥠刴匬榉朡ᇅ㨕ᦹ䈋吺㎭ᭁ畕ᑩ㎀։招媐㍝᯦✀瑷㏣ᮬ⣮㌬ᄃᲹ罸㚋㍋仙䋮♙㏌ᱏ⛬᚛㍆ಀᇮ窞㑼坭的獝㌹䓮囹獗ᦖ桏溔ίᴎ嫭䱦ð嬂仭纘珿⟬䚐இᣙ桄ᆅ渐妙漨ⅻȤ嶁煌溙畨娹埯挧玘䝥䁌የஷᰧ᥎庅㧌居䅦琺୭ᴅ㝌䦍珍⟅橎䳸⬴䕙泫㆐㬜嬥焕䝦⮰姑㊠禕㍝⭑㋌֑ఏᤉ牏⦟Ⱓ᷵䙎ᦋ尽ێ斊厼坕拌晠�ᕸ䄄✢澋䵸化囥㿋徺勱垛⓫嗑㫥嚊憶ù嬟нㄳᑈ妢㑋䍻甃磝䀓敠䬙杭㎖屻䫮放㑣烺疄ܢ恨坻䔅ᚳ㼸ӻ勼㞳㦫䥻✟㠻䷔狝㝣㈠ࢥ曱㭃㠶㛺᛫ങɻᑻᝋ㹋櫽✓ឿ䷻۸㶤敇㋻昤㮬ᛵ㢠秼寏ᨬൢ㓁␠᭮㬬粻䁁⚯ታ♠⓲✗䭕咿┆♯䎳罡ⳗ光৸愡ᦂ瀥ߴ⧮⺛癲Պ怠㉊汷㹕䳼狟眊ㅅࠦ卂瞃墠樗䌘㇛ᠢ滶傗㞳⠠ᔁᒪ㗠早ἒ⟯㚳㗢弖✲昶篽漳癹̛指㼆児瘛с继䨚洧せ牫媸絬ࡰ潔jል䝼盢㳘疱堿ŗ㷛䱽漊ဗ㺧䏺懠兯㊳㱘擶⚏㛔㯻撃瞿㡾䩜戕๋୧幧刊浘片ÌǬ▬緧儉墱壧䫣᭙ᤏ㚝䟛Ͽ乱砂㝇᱘ὂ丨狇扟⧹่眛ᵚ㰛楨㨠ཌྷ㌲筚⹍ᜠ独。痘⑊熑ㅄ猇抽䨂❜熛籞⧱ༀቧൟᇶ亢眇俻ף༡澇ӟ☐㭲碷ϰ〬䕂嘻㗧⻗ମ䳛∛岄禨汛ỷ住㑷廣秣瘢煷细ס奢睧烘ྛ⼒ዧ㍘䳗睳㘈䈛䮖熷杞䨋侷ᒀ䅰ᠳ䣢Ũ䙉ᓤ⠳ᾨ⢢剟匧䌗⬥さ侢揸稈渪瓇毾ᘛ祪獗埻䷵⼶炇旜㇡潸盝㚎僆ѹ᫋䡚傴ı矷⏜෩滿䎪䀵溎甸㯟ἡ䄾紗捦穔䌀ȗⵂ縛伒簗潘不睦䰯䵝ϵ矇ⷊ砣Ҙ㉡⋩೧嘹ఌ྾忷⥚揮⺑纗䯞差侩焗⟘アㅉ缗㡅史䡦烇燘Є湪耇皞樘Ῑ瓗嫜㩧ᆀ猍熚௭䑃Ӡ䣝徂磎⦞昜滮紈֜ᐉ㈎穯喙㷦忉痏༡毯漕硷Ι㐄冭繷ຟ丕⹍竖垞㯮箇圓པ嬫啎❸旊㩘呃ಚ昑澅縗ښ䠟漨碏䠀⻡爛࢚ሴἡ摿崙㑧㺫ᬰ箪ॗ䧄㞞☘䊗䌁ขယ㼮癿ᦟ与徐翏嬝䠉揆犏䫞㠙彁福ẓက绀ᗯ砘罇疿ʫٔƧ粯哯„织祏䲘懻保瞯ʚ⯯堣癯㖝㷵ẉ縿䬟䧢绱祏櫇⭜ต䷳伥嵗疏实ـ々ᾫ婗童晭☝㲗嵴纇 矟䚞䠚伋䟏序笵ȟႜᔓ㷴Ὧ屃狏倡ᬚ約㟊縩窻懟✡窖䁚䄬Ѐࣻ䥤ᨩူ⢮儊䈍柦⼢ຑ綣澒紇璯䪡Ȇ厽ƭ硠Ჿ⮄ࡅ充ϱ捬᯦Ⱊ燦傉㸣㤀᱗㢢排F䄚粄༠⥞ဦ濝屺ԁ⳩ố⸁瘥堵䵰ೖ埜ܥ䔭傔廚ࠟ澷㈑Nἳ̳獗䦡ẙ炌晎槎ڴ⎢⌆炬㱍↴¢སሙᑣ<℠橄ᴈậ向案㞏̹瑿䣡椦䤆徳㻚㢤ȭ椨⑉Ⴖ攑㛈㍁崸݇㻊むዽⴀ埔丅㑚䈯͝玓庞̧⠵ႈơѐṰ猢ᘩ䁗綎䍞儀⑺ᦥՌ缴稽ӯ❉ዣ㴭儝̞環⻞报䬋ၹ䅰٬㫢۷ⱂઇ慴 Žἴ䋬⋘㜁孛帀羾∔砠ᡐ滣䰐䍴ㄕ緦ന✌䞧堽த摠䚿掂␀⠨䛭Ď痥ϟ乆ᄦ栅墅ƿݓ瀀䬜┯偏烎㱊ࡰゔ䡧Ĵම琤䞢ፒ秲䉏ᬢ綅攜䘆枤爹灻愣Ԍᚨ哽᱘Ⴉ䌬灡嚱Й熋撓幈ᢏ२䞌エ䲬ᢁ␁ಓ壈垧㈏䢕㹿߂ᐐ筃☬牀ࢵ畅࿄℡䵦簃ᤱ㹯؇悁㭇橊⤁΅࣏币ἦ਼ᡠ⅊䔤ᣠ坃ᘬ䨴棍⌆ౠᗱ嵧硤⾨则稑毾ᤑᠨ≂棑ɱ㙤ฺ咃刊䟗核慃捾ᣲ␘嘹匶㑿ʨ䖘ᖈ䅣ح婃ࣈ戽ဘ㋁ᯒ㌶瑨ᅪၶᘈ䉉儫ᤞɌ抨ㅰۥ㌿攮ㅬ䞌ᰀ瀣ᆩϬゼ⊽સ⻑囦䔨汳⬁߆၃⎃眬‣ຑ拐෨㳤ᔺ撍Ȗ䐮ᤠ湂Ⱜ㢤揇㉱ྑᓤ䀡䜦᳞䔺᧰䱩➪ٚ⣮掷ຄ⟑⊤䘱岖ᅻ䔮㘃箫熳礃捯়⍡缾沉ぁ䝂ሐ碃㶯⹘壭搄ৼ✌⁆⬴⑮搨⛶ᤏ䀂⬯ჩ≔Ꭰ䢪ᐩ峛䂸粁䝡ᬘ氲✬ົӤጳ༴▰ء✶㾳N穑ጐ瘢嶫ِ䓝䎿ूⳁ䇦挼縸レⓎ⁄朔垰⨱梓扜ᙔ㇒ㅄ㔣㲙凌⟾᷸䷃ᱫ婛䓙Ϭ༄㵖᥅社瑱㴂☪ᔅ㚔ဢ➢Ⓤ㒷㜁Ḷፄ炴玢䦶䑞᳄矢洒扇䓗挘䲴˩捆撵粝籦╹Ი祃ᗴ矩夒㦉ਪ↱㺧炽㑡ㅊ┶Ὸ椲ᩮ㩘ⅰ力牡奉ጘ瓆梑゚䊹ጽ⪅䖦傫ᔔĄ们⼩㴧墰牲兮⒒ጸ妃綇敊b劔䫌ⳤ竆᪰㊕休㩞އ❳㍔⹑䣥Ꮺ亪〤䬻抍⦕㤕ዱ㵼嵬㉾ᝬ岑Ⴐ惇奇᩻ါ☷䇐剃ᅯ晈ジ厨䮪◩㉆㒻囊樌䉍ᕔ槳歬ሶ㓑烑šȠ狢ഹኅ熒䯥澔揳᭭晞擁半䤺☩Ӈܿ⯛楆ၽᮔ灓㖪͞⡊䗚䬦⨹抪㺶扡व☖ᩰ窳䜮ᵂ㓸㋺ᔦ⃠㯅憵䓈ؤ䋠ૣ倥䓶磲吅ࢰⶑ挤弸㩠ᧀ䤳ᥳሲ䠲㍟ṑ燄ᇪ㽖匠ュ⒖ᥬ䬃哨䙊ң勱仼㲩ᯒ禹暗䦡ルῬ筲㍃+⢓帇叓啹杣喲扲熖╉ᐔ䩓乨䭝礉╕䢾䆚愉䶾嚚ᲇ榎畃伅孎!㉠䷒㑑⒄බᚊᥧ٫ᆬ緘仪㕅䳼У䩶㾤ͦᶣⱘ♴䠚Ꮢ㢓睧፞⓽㏽䪪㞉懆縿⚚ᦩ⚆ܼ撒ⴱ杋й碌⁔ॊ㙍ોۥ携ل叽灀⍀㒯㍳业㵙掅岵䁅㧅擷ᜃ㯃淮坜岴ർᗀ偾ម柊⫡䗛ᘤ䪓બ᭚哲挑ɐᴙޱ侨祣杢㷒ᾦष㎐䢾㮉嗦䖻♺䥞撻ჭ༒狨斳ʌ♁Ẑ㮤¸ଽ秛擹ᒼ攒㭮佋泃㍯䶎㍐栆⾶ᵟ秧䙠ɢᒓ⊪䥆ឃᎩ䧶㿉㶆ڸ湬秱䗯ᜤ滔偎㍚䒡⓰⾆㓚ࠄセׂI䄀彨彲ᅫᕁ峯环伶⠙燇ᾨↄぴὐ儫㖬ࡌ峺玶䬽ᖥ伅殷ƙՔ栌ᕢ嫂㑌䨫䌒犐唱㛙ᮄᴮ偾ի嫍滵༫䧨罟䋎ጤ⧊㺙ነ洅溓⧍ঈ尕毦恣䊽䤀䍾ศℤ䪿幹ճ擈嫄媫䡊䭟噳ବ⪫䡙᱾ㅧ≘䅤̠ᲅƦᣉ宏ஜ⯑入砆ྐྵʅ攨凂恙➡磏挕岔⮩㡅䃠溺⟋曓䟹据⽳揫㽀粱㉂⠱⩅甴偹䚚┱ߚᖲ崍ᆖ届㡖ŵԌع̢橲摝╄䉔匢椪哭≈糂䯟亩㓅ᬈ橷⥣╘擔囲捪楋⓪瓔懰ɞᅰ琣నᠳ◳ᙍ᭒糪ⳛ䁰䰒⨉ヅ唷ੰ煿妲䏹櫒憙歊䍑㌅䨭咫䴅杠〡奵旻ᗄ妩ᠪ纫ੀ⥨嵾⧹㫥收穰㦟╅ᙘ噲矪㝋༻狋唱痟威姤夥ի祒䕸已䐲侫壐狑劂⾚帵4ọ䖑煵搮ড়䟫瘴峁掘⧑䀅㑶Ŵ㥶㤢偌堼䘪Ⓢ㋔ᴘ䳵䲾䬰枪朵㙧ᗯ᧐滪⣊ᅊ哄ੑⰹ⑥癵䀩斒䆲坪契র揢狑粬奘u⃠㹴䡰ᖏ昁ᛂ嬴穋ࣔ煕⬙⼥壵ᆐᾄ╤ࡺ嶄扊祎櫀勽Ⱆ俵⤉㩶㳉汃ᖬᛔ⎊爂㯰ᠲ檷労␕ⲵↇ㺰䅷秓斪尪棥ధ竇涃⧞⚄䴛啼ṳ庪唜岪䜲槫卅峣⭂◂㻮፷崲䵽抬䢬廲敠ण姢嫮惋Ⳮ㡹㶵ᵲᖈ椦嚂劒涋痈᭳嬊檨㓄ัᡷᕶᴮ瀣呸塌剋්㒶氞䳮㢑ᇶ㵷挢痌唻Ԕ妳႕⻁嫐橈Ⰹ㉕㛷䕺㺨ᥗᛶᕨᕀǍⱉ≳橣⢽㮕嬵畳╴㗧ᖀ֚粊ㅁ㻘礗樬é⢕ᶲ㽶旆啻哺烊罯䕎㫵够⣉❥䡔ཪ㵲暤兺ࡥဋ᳃䇚Jℰ櫽㽹烶≰綞痱噪દ䈺痡㑰䜔ᮨ殗રᓠ桮㶆আኾ啦瑊揍㭞櫌殱䢭㑵㱕ό䱝ඌ䉑剦攻㲊⛟䉳氀4ᥰᩗ灲ᎀ呐Ω宊祊䩉櫄܆珈⾍㨕瞓⓻፣֜ㅩ噆䕀䊉4竈䐕♥桥㵵ၦ㕮杪嫍㇓沼ᬗⶕ㢑䍖ബ㍭䵋䫙劁㖺編ᑣຍ㎇ဓℎU㺵䍮甠啙僬漃嫩ᚱኌ⍜㜥㍖Ͷㅂⷤᜄ嬢䊻໊⧗᪵ᨯ⺱冕䁇瓷䒲㰾啅崼煊环䢣⡒寲棆✕フ潼疎෮㒞ᵶ浻⹊㋊囲尔梚⓪ॕជ殝禕㙇ᦶ填妎仔ڬ玝䯅⢍䋗拎Ő浇坝斨㐠ᇯǶ㣀絶槁Ἀ䱗恾கᖱ㞡塚殍淇ճ媖榪ݪ戱㤤纳偱ˮV搼氥州皨ľ泎乭僶▝畧㓭屘毻岧㷓眙嫜ⰠߕỺ斐ᶗ㕣哔洂焏㷏㛞ଞ溋‽㐅檹ݳ偍ୃ傮䈉礈㷆Ԡ䪂≇␍ኗ祸Ν䷸㜎処死χᏊၪ㩽劇ⱺʩ᧽䅛⇩㑾勴乚ᾊ珕Ⱆⱛ㺽⣔滩枊婘⩫夅ඩ䤎㝮�㏪漡╍⭁廰坲嵃㙸勦攋姊㝗ᚡ䰐櫠ṽ㴊ᗾݸ瑆琺ৎ涃䤉戺嬧ⶱ☍㟕深筬ᵺ瞮収渋椉仌۠㭶旗㻽玕䉂睰㷐皧墮爺攈䟈⻟䩥瀛ⱽ揔◳ྔ嵑瓽刮毛䴍塴亩䤣棇㭝⪖䋿孳ⷞ睭單恘稊柔慶㩃櫏ソ嬖׳佱䨭畫塾打䌎㛊㛜歴泬ዝ䜔均澊嬉痽偾ㆡ䲶珂圓ᬙ椧㒝爖揸厄淪㘻嗦煰澍俛Ⴚ窇民ຝ戕∤㎋ۨ砏宆畛㬋㇑曤簝沇⸍␔߽㽻䷐㘛䚯㏻⦱ুྋ櫝減㹝ಔ⾓磏畟嬚䓩而悿⛲甭掙⌑店គ摘̭坟澠淽瀑Ᏻ羀絨ฟ亾澕㿺⾗㸙㞠̡䐉䂚ᥐ懖犏ⳤ椪䡖澒爐ဃ棏∧Юₘ䄕㳰ᬯ䌣倖㯴彰ᕋ瑰㧷㹴痿㹟⭸ࡣ搖猳ℋ缔༉⋏㥝䰹翵䆪˱櫠毝㳕䰨䏑咂⑁擤剀䂙瓈۶灮㭽㇖瀿៍Ξ筋栿ⲧ怔毼䂺㨮桯㗕ڗᙋ儇拎ര槁大ᲄ碊䇫≄ᯀ梾摕羨㼈่ㇾ乺⟮⿎䫱ٷᛰ惂㡁キ侌熩噁寣縸墈ᇋ٢ᦀ滣吔᳷❳䐂畘厍ᩦ⮵⒞Ԣ䕩̝⤾➖千⤝उ㞠禦Ю䢇ᇴࠄῨ猣ฬ惬⍍䅔㜱僧眑䲦繕むኃ暭籚椄䎡㰱坧㘾毾憲穴Ẩ碑য偵畮换䩦ੈᕀ剴擐爃䠙愫⍃禬ɟ矃϶チ竦㼌沀㇠㋮᪲䖒ᰵ务≿ਭឦ缾㨳䕫䙺᭐憃宯ᙒₗ⎋ఴ㭮䑺䀍罏ƹ丞᪦勅䎮兔ᒩ႕ഓ学猍墻䂚燌䚶ᴈ稳喭耇ӣ䏿眴㒾滔Ҹ᭠䦥▟挐惰普籕瞱ᐍരᾑ幧ソ璒ማି⯅㖳仕㵲ᓨ屖殡䘁簠咢䪝䧇絙᪰箳岬慑┟Ꭻ研㭪焂㊻䪏୩⛣⚬䚤㔊朶孺㬒亸㐏᭦䪻岅⨒⛸ṏ㨃中㕐ⲱ医挌㰙⯇ቔᠨ懖⺴柳䣡ౙ睩䎒空ㄩ斦⠻ኌ䃞⟸ᠴ旵ክ嗠厧祆㘉缩➭႐ᚬ㥈ᴤ溃灬湑ೳ͖ས㛉沆᪺䒕熯揓Ḁ癍櫮笀ᆦ䈘方历๐旋励ℵᱸ揃䣭摗㔘⎑瘔ㅹ珇㮬㚍㓙೧ḩ䣙基㒠䡕幘乯嫎揑搋五⽹䙙Ῥ碳ử磯⎅䴆屙僇䎮⺂奵暍眎⚓⠡佖ӄ䄻Пầ毈㒋皧朩殳᭬噒ⴝ卪മ㡉朻̿庝瞗➤农砫傓మǎᐘᒸ̣㮆皌皝程⛁ᰌ簓Ǭ៰㴟珮ပ䬥氵ၽ䇜住ިོ慳㭜哷玁൜㳁叆䞸䇐䗯ᯩ砎㞚䗭⁘瞻玁䰶㶱澇䖺冒䦭䞈堢碑癌垻㺭䐥牷⫣Ҷ塗䆄绬䙟ᥢ瞫䞯磘甆厔⸮䵅䭥 Ǟ棜ᬀ㝫⃯ᣲೳᄒ⽁㩩樶籿⪓ؘ枉ở䍌ㅁ䂃䮄樸㱁珀湹ᆂ榷糘奄枫巬捐瓭ஊ㫠堋⸾㍣昗تዢ᷊⢠匣帺痙➉圠ᱶॽ杘嫼披⣭ⳟ崞嶧亥㊖橷幏▔⦴囲幐䔕勎㻱℞ġ┾倧㕼ㄡ嗳Ւ嵂筋ՌⳔ勾獡⸞㮅昚㞅䖛拖场奃㗋䩣嫛Ⰽ㬱ૣ⣶㹍堮᚜姪琓㳏ᓝ㌁⭸ⱆ㠞島⭼Ⓧ拫欮塺淼嫎䤤椆涷⸩梇歹疟旾❫ᠺ湓ᛗ盐⎍毣ⓕ嗶㞸᧖嘑⚨娦炮㗌ၞ⌆殶⾍ふ截㒾Ṱ㛹Ḛ椻ᫍ拖Ⱐ皫ㆭ廍睽ᦋ姨➚堪瘋忯廙䝲፫ⴃ㤤壽ᛶ㗔囇tܞⲌ京ì渃㢥睷晾㶕⦿時Ὄ澋㭌曳ᯍ瓃㩍策䐉䖖営挼ࢺ搻㣍旖ᐢ将䱝ㄭ慗㳿皚䗡噞帶氋▏䈺囤対ᝋ㩈Ӷ䖇䇾崵弑㫻㈇櫳坹䮰湉㱭罗λ᎑ਜ次嫖羣ᮎ㳻⬝尔澘姄ᔀ恲䯆痘坣宄λ㖏燖⌆孛䳝㼍䘷㭺纣㙣婔籛妧⬔㭙漧㔰Ɩ㠔嗳囃廮瓛炍ⵒ盱ᯩ濁ㅖ䶶竸⎐ๅ噫庠ള㴎⯖༕㮶澘傃ኅᇸྍ⌹㖄弰悻䋬祗會㯠㘫㺽䕗㕼ྗᶳ圈橾璛⌎㍞箑ⴆ㹝嗦৺侖槔ᚕ崖縻ഏύ⬅͆泳䁁䳗ۿ噉愈ᚷ㉺泻ᬏ䍝拲㭓溿㽝䮖燖⸐䍆增璑⌎ҍ∽毣浤ร翷濽禛㨉矕奲硋⋏ブ漍⭐᷽〽屷ᡟ儿师໑旖悧㠼㛚監㭟潗㹭矖䭽ṘЏஈ㿡甑尌淕dzޛ湛㊅块ཹ王緄ຖ宦皕圌䗟∕᳷濚፣梮矹墩㖽⛧Ɂ癧矖ԗᮕ涋㊝爯㫺儇庿㚢⿴疖ᰌᒖ䜗䖈㲃倜㶗䐕ဘ㾃㴛䘎矞ᬮ῝摽姖㍺ᄍ揵㝚弒捻␎⣓ۻ毟消管気愯㤛ϳ㛢㣖缛漵澷䣉䝱Ǥ疜❗仼➑Ћཱྀ巑灧而璘䧲儑ᵘ笳繮埧愇䨳ᒚੁ泇㚤ⲓ戚⠙⸤祣埗婚ⶊ厪乂㾪憁簼印䨗❉ṯ㨝嵮ŝᎈᏆ乢㶊烕䀬⯖朿囵づɯ獛甐綡侯忉碇䚽沝⇼构⯔罓坯漧厣乚⮮殧弼嚟爟Ⰻ᷇㠝綮捾ᴎ䏧娾㿡扥卖壗䓲每᳴竃單歘ஃ㐌伎㪨ఇ䊿ƛ権䵥涊ם絧ᕾ磊柜㽶盛㒾嚔᨟杗ἤ盁湯烟箆綼⸡婺璐䤔憑㍁厜犫旯ž崀⏟㪒㭅灴䞽ঔ⻬�Ťੁ启ⳟ㌇懤〃奱犷ⷍ⺞䘍ច產痫汦ٛ㌞ሉ༆廈ⅇ㒤Ӳ䞙倒砃惏哞ଋᏚ⻥㮵琷տ戴⻧湀ࠕ住䫚斛䎿伦㨵揻ᆾ㚜樅歞㵋䳩⅜㾑嗈䁪䎢োቾ編ț堈ʚ篈㟎ᓛ⬚ර⽳夵朣ⱽ嶚ᱧ坾岀ओ姗燞ܑᰜဝጬɐ塪綑༰᭄䊆爑潎杞⌌ᯞ噕㷕怷浽㚗૦㝹幜筻俦㋛䖕䰙⻈㉍畇勽巛Ỵ疵庪絻偪呔䬕搄抲弆Ⲕ堌䞚栊岳㧋稛盛ഉⷩ潡㨔㖵䪌ദ㲁挩ᵥ╮៦叛禗珔⹋㣥璇㇑巾矀崎秛䮌㉛☹ㄇ着珝秹緼ႚ䗤㝭沾烛娏䷟弑理☂涕盋×ඔ嫬⸍怔炛痏旜䜋⯞渽㮪晍ᰏⶳ৽⬪浠磤ឯ曚疒殡㦣琗⣾呒彲殸㽷幃哶ᒦ䔉小ஐ婁溯厼㮝Ḟ࿓弾瑧囦ႊΟװ⾐彭猓Ҽ佞冧ܽ䵑甧簎қ侗專湨稦羯ṟ礟䇸ϴ⏍僙䫚债ⶉ⟃Ǯ沃爯㟽⦚搌ဓ帢翻吕㩹⨑班Ῥ米睫Ҿ㔚縎⭌㳇㡧尿力勃➻ὡ㯓昇␉ₚ噵栰㽌癇纾亜䨋簃Ḱ箥椚皽純⼋❰Ħ爗࿏࿙㿛㐊ჺ摗▾喜揹㜦㽙璇喎ᆘ甍᠊ࡒ籭琷㣝䬘炭ྯ㑧㨧歷⸈؛ៀ庇㤫柗マଘ巸氂汱眵獗硜悺ఄ征㱩綧凔䔛口俙㷕矎笿ᖹᖎᗡ庋᧞榏竮儖寙佤緇卿㢜眜䎭弫每昿㲣ੈ㽽媧椒⽇⟠弔綋篗姜崜⏻侓᷽玝䷿ઞʖ柿廒篻杏⢑氜ཇ㺂㨇濿嚙䳼燻῾ᣘ笯Ἴ䮔ߡ潖ᰵ瘯倏幊粖 禅涷ጿ撐⠃䠗㽕礗掿供Ὲ刃彑稑㢿疟⠕Ỏᵤ砻䊎䦟㴒✟⽧ྊ櫏筝⇝ᰅᾥూ㸛䲾⁜㡗倖㺳㶇澿簾ᙾె帩Ύ离條紛ᄛ緣弍㧇汿厍喨埪瞚绋羣娐⑀឵⠗䫇楕罛⺪东ᤎ瀇᳕煯䡞玙ຄ㘋㹕ח礋⻗寓㠊ຘḳᴈݯॹፀ䡲㷪孷绛ඝ初⠇⽸庳ᘿ畷⥬̣ࠜ箞穳儝矴ǠἮ羳硏珟⾘爇䣔翓籟卟㠎吚➻⭑㲇砿疞冟尙䀓糷橯㟟㕙倝㼷櫏㫱➟卹䘒忚埼㶼㹟∝ㄜᏢூ㸇簯殟ℝ㨃忚翆幖緱刟䛝⯹ᆹ綢➄⣀畹ࠐ῍翍束✟⠚䠆⠈翯磬缟橦瀈習翏秤ᜟ䙀䗩倚☰Ῐ楜瀙咇ኩ缄岻恿ഞ検⌛㘓㫊翪Ⴏ罄繿籀Ӥᐿ正吟ㄮ搜Ώᰒ>㿦ᾦἵ竃縀߿畇䃣䁟ᖞ䩠㘘䠓码␦忉ὠ㹈˯硔玿滿䬟ġ刢军礴 恌▦罚繓ᵧ㡛ᖆ⻠㵕ጺ㸄仸/Ⰷ懭hø纸͛碐ઠᤖ剠愞⪌ੳࠬࠇၐ寂ὄ⻨ͯ祧焰ᩎ呿ᠡ䔢瓸水栄偀䲿㹬纼䈁䡀Ⴏ借Ԗߜ厚倮倲矽▭汱縶˄Әి楷䩿ȡ༣⧘㫑⠷既䂚䄁Ȗ̫篭犐ᦿ寠找⤢ᄤ䎔က㿲㑐羃⻃紂ԏ眿湗功₡䤜䄤榑к矤乆缻级綷礈剨ၰ㹀甾㘣㠦⒑ㄈ䡓Άܤ⺞Ϋ㧈ැᕠ㭀䘞娣䘚⨭ḅ၎偺澃ǩ簶ঘ࠸Ṡ㝟㍡ണ䄥娪᠆偩⼵白㕧秥熟栿呰㪞ԣ┓ᘭ᠈濩傀¶䆓巰ٿ焈ᔰᶀ搖⤢䜦䂕䐺⡇㾱º䄯綏禰ἣ咀噡嶣∤〩栺➹႐ᝦŋ縒ٟ瑟恟张侪ண梛ⸯ㰴ї恵䂣的紾҄眸័㷀員偣㼦⚢ᐳ濤偲ᄓ㜋縘⅄அ抸ᬊᗀ㓡ྻዓᮩ忧ࢋ䉈í䃻2ࢯ曃倇ᬾᲣล爯瀊ࢅႫ焚ʹҔ熄ᾒ䵓Ⅴ猜㌚㰭ⰵ俱緄弿Ǵ䌯㢞甫愀㣋ɁⅢ㴘厔䐾摔佇䝖㻂䎂܊琴Ή䀳メᐝ傦椬ᨇђゃᄗ䇚岐Ԙ厵桟套ݞ㕜確䠔娶ᑚ⽩∔䏅ԺපὍ岯ㅡ㹢ǚᘭᏭ䦿ⵀ僟尺կ痴ᒛ彰䯡綢㊦̪䠽ౖႉؼ湔䒹ߺ༳椈㷏ᓁ㐼嘩ጬ⨷⟧梔݅䨰᷎墢௬ᵸᘧሡޣ嬥䘭㐰㑔ႋ僼糝⦀ᬣ傟㵄㸝┒嬫ᘺ⇳ၬ愱䐁ۚऌ᪈㗐䗁嚜涥崫ਮ৾灷ズↁ䐒筶෨ᛎ௰峁ལ⢥ᜨ䰎⡋ࢆ㽰粵樀Ʈᘠថ极䬼朒吇汐梂烠缛䌯ںໜိ䴰眞㇣䤧ጮশ䃰ī紱ٞᴘ⒐䂎㺜ࠦĽ呋ば䂾懯ɟ֨Ṙ⌰䠱☢䪥ෑ⨹ࡐ㿓缤ƈ⍠䞶༢ៈ⺐稁ឧ株䠼翼灻枋∘ᓱӞછ恿䊀縱䳣ࢥɫ䱞㗊欤Ǭ∽姄ဟ掀⋐叡㩢㑤ᜫ儼嫡㗏烃囙䋨禮ଲᒘ㛇ઁ口䌙₭㰵籍ު烙䅄ɗҋ摄ᙛ䓥㪤䥂四⒫㸵⓻ǟㄗ䑺≊ᦈ⛈櫌估≮ᠬ嚤⸕⯀ڨᑅ䢦ࣺ⌐磗瘠ᝄ㉐嶌獂瀠Ც⤵畮摥䣬ࡶ≚ኙ༅柠嚑ᾱ⽂ҥ砭㽉懤ᢗࢨᇜ␇ђඩⰴ㉈磤ᓃ审ʯ夿ἤ⼲ത慌⦢䞅ऄțᡐ䙡᧢እ匮㨱䱒⡘⣈䂥⍧ᄁ⇊⩐ᄬ惃ᤱ⤢権恋㲿≶农做䙱ગ歟嵐柶Ⱐ㕥媫田橇咛⣺持⎬㊙ညጄ㍠掦俣⮀暨䴾瘥咝䣌Ⴝ⍊棵ૺὔ⻠澁㝃٦䙆Է婍㑥䣝儻≎䙛ʞ槯䦖⻱ᯃ筤瘨┷䉟䒕⣳冯⏮䖙ৎ⧫ۤ൱ᘁ癢暯夰ل玴焃懚⏈䙅ঔᲴ㠸琠Ꮌ⻳纫䌹䩂撓㰠撁⎢䛃࠸䦤㪐磁ड़ᕥ碪┲㩞撆ᣔ凤拔牊Ӝ䠔⟈娨䞀䦓ඕഺ然䱳棪憰⊶䝡⌠ፑ⿃➛甠䀥帪瑷䤃�樎⤣࣒㱊㬱挬᎙㢮愻᱉桡ᤈㅤ揥䒫ഄ䏬≸棑䆂儡䇤ឮ㸬ⱷ䢽㈗㦹䔑༬ᒔ⌐狑䬉ඩ猸㙏ⱶ墲狗⋨䟽चᜠܱ欢傥抩愰噊⢱兎拀椗炚ᬌ㤸垱॥竦ỷ◦ي⒋烨㇏〈䟝࿒Ḽ➸碑ⶃ毑堣⬾䙞撚㣕ㇸ握䛧ᥴ㢈暀᫂㧧欪⻂䩘怦㢠㙕≝懃枿ѝ庸灱㬃ᡀ᮫ཱྀљ⎠⃰戅≾穋ఖቼ㧘䉜㜃ⓤⲩ㜼ṇ┧纇⑨畇䗺⊒ῗ䖸䯱㎃㑥ⳁ伶玵今礆儼疒妘㒛杜┿̑厂泧撨ߍ幀㻎⬩燨䉛�枔☍ࠜⰃ䆈䪭䬽汛沞挜塟ࣖ⼈䟓᠑囘澑㬀·幒䁡磼ᅫ拾䠆ȡዙƠ)ࡰう燂碏ō妧㢵拝䟫ஞἼ⥸旰䲩婈簒₰㴴⠰ӹ扤Ꮔጻྪᢜ㪳㋱䇱⑅䏡⅐䊎Ӷሰ☇মᕤヘ徑ဂⱅ灪痃慄⸴牏ᆋ㧣叀&䔰ர湱懜朂ѭḂᅌ≤䔒掛䟟汁٤炩ǡ片䤨懃ぽ≴䑙ॺ䇤➈佃⨣٤城ἵ矛咪瀻䂬抐㜫৮撬尐পᩴ㜸檁攲塇箬ᑫㅂ塝䒣慨⚐ؑᏨ㝚ᜠ⽂ѱ夣Ꮸ氻ࡅ⪙⊰შ伩ἷ䛙㎀瓠᫉ᾬ笷ᙇ屹焐ऩ拴⚤䤉愈ॄ提ᒲㅇ籯撸䥒ቩ⓴欈炄♊Ȅ୴㫐ᛪኅ㕇㤢礱搿⣖ग़∫䛙ਫ਼ἄ୩窳浅ᩭ梿䥎剻ⓦ䤻䥬➴俁⩷姐˚䴃तቭ䲿㊉嵼燱揚⒐三ᕢ㶸桄斲ມ晫⨮奜岔䒹䦧፶✼䡔৩ۄ秩ࢳ怘戶䪀㥞牬¯繽Ꮌ䐽ආᯒ㤘䈬枳熘ṫ㲷䖯犓ᵷ䧟⋩ࠤ䴕澃ᵐ⎑㢲㙇牯ᢲ㸽䡔ᔖ爎捁׀䳩ឬ㷤乩氲祅悠昉Չઘɒ䦘刱╢䩅ᮒ⼴圠ᖄᾋٯ唲ῦ≵ᓘ搭ቚ✵ॡᆋ䒀稩ⲳ㉥穮ᴳ朡䪇�⧬剦☿栅ᡊ㚴朑㼘Ⴧቮ䒽婒澨⒲⦖Ꮕ◨瞙⓸堩ṳ曥祯䊸啘剬唂⥾⏬╊䶗⼴磩㸕⋥ṫ楜橦攔䨈剿䒀䫥ᇊ㦘湉⽂曆▯檳煺橧咪⤦匌✰䚛䛈ል㍩浲㹄ͨฤൎ䊆撯䧯⍈ᬊ㼴碉禳䇆䙨⪶ൄ䈤㒸á厝╤�䲰㧞䠬㚤摯暺啔㓵⤴Ᏽ➜倉ᾎᓔ䆉䛈䃇牫ᚸⵀ⊞ⓕ崋₥◲䩹ᇺ⩤ញ煳ᵮ撼畂ʆ゙⥢ᐛ►܍ᵥ֟ẩⷠφ♨䪾՟ኃᓗ㪴䃰₦䳅၊⦴挰䷳䁆Ȯ嚳癃执碩楱÷◵㟽ቊ㖔伉痲ᒢ㝭暱⥁汶瓐䨔ᒪ⒧᷼㌴䤉嫳㳆፪㺰㐰ᱼ愀⧯匿Ⓦ䳉៊㋴幉炳▙൪䔷㕹抓磒凿叙✞䡭Ṛ㨄氹嵳䫇᭮䆾͎ڛ㓜⤺፤☸䤕ᔦ㊔婼䴳⒄⪿幍⪑甌⦾ዯ✱䬱ᙦ㬔儹紲咄浯帼Հެx䥲Ꮹ挑䳑ᚲⶴ举ᣅ屩线橦䨑㴘朶噈᱆⇤妊፳⿆੫攈൛᩸㲚⨒㋔斆䵭᭦紹䰳ಆ佮ʼ䵒᪇咪䥶㊔昱䮕ᶊ⾔祾㵓⛅᳨溾⯸暁瓅৲㉾䬑ᖊ㻄玹ὃ㤂٫ܱ獓ࡠⳜᤷቀ柆ۭ框ぼ☹⊲充拪ີ敝碈瓼䦒㏂柅玣ᛅດ巩ⱒ⦇⢢ᠲ嵃䚅ಲᥓ剿⛨䬃ᡚ㐔杉ᑒᦅ僭䦵ୂ䚂奫卝ⓑ䱑ᡚ㝔禩㭓煻⫯疹䵅᩶ᣪ榔㊯▹䳫Ꭺ㭌忉ೳ媆۫⚷᭐በ泪ㆅ㎶敵佃ᾪ⻌垹⿲劆僩䦿獌窙䒽姘㉖朕佳ၲ≄櫹櫓㚄䛪ڶ橤䲧⨉㐔䘙䫫⬌籾ᯒ䮅㻨ᦺᭁ暞ᓕ䧷ካ⠈ㅍᨺい灙籠勧͑䬱䥅皃ⳗ妢Ⲹ摢䪧ᮼⴌ偙⮳儆ǯ㪵䝑㊌ᔑҁ㌗樃䦧ᲅ丼緉摓箅ᶱ筌窎Ქ䧇ኤ春䬒ᚮ➬䑙䯲⺆筯⚸क़ᙺⳤ㤢Ɫ壃侇ᯮ㠌禩庒綇絯嶽䵚撑㔒ᄰ刦枢᧼㨌教唇廩䶹筘㙢沰妇Ꮩ栝䨭ᤶⴔ䰹磝ࣅ䵡䊰䭖⸲Ⲣ⨆牱❫ཨᒦ㗤嫙⒓̄ⳬᖺ㝌䩦索奙㍪离乥ᠮ⼌仙寒濄෮䮷杊乫峴ຎ犒枝䪷䛬䢙֓ć獬䬾ⵔ獰奍变旇伯ᴎ⁼咙唳㎅獮架浗癪㴛䩙玓►䠥ᤌ⛨否㪓囄毭枷剟Ṱ孁勼柴䪏ᰖ㫜桉䂓嶄䅯☨祕晻ⲣণ珿秛࿗᧤㸼櫙ᜓ⩸௯㞸䵀㺗㴖ᧃ狘敗䫏Ⴒ䣤䕁ỲԆ刵咵彁⊝⳩ᦙ琇旗䧩杮ㄜ熩亲ᤄ割礰兗᩠糶㧵㊿撳亏㳬憙俓〄᧪疹捒嚓粩㥞ኯ撯俥ᒞ㞌䍹ओ⸄៖箌㭎折ʬ㨆ሿ晽䧿掾⮌樥匒ဴ俫侲䇼繲ፓ椸➛䬒ᡡⶼ䲙渒㩆䁈咾Ü㙩䳩奮厺攽严Ⴁ㢢忹搫᧨偼⍫㙹咺կ㊕٠ⵟᮡ☢皮ܓ畄塎⦹惝䆚泋奧ኘ䌟拻㢼粥ㄙ䠄ᇪ䁶㽄㨀㐆╽㕰嫞㙢早ᔫ䴨㡏ᖾ歀ť㳲秀િ數⣍ῡⰨ窥Åᩚ侔怿ᵂ憋֬猲昖䣋ᨁⵐ▙䯒ះ㯭|࣏幺䋹礿珆攫份ᡊ▜䙙オ䐇尳ƹ协䚐㳴䖶暐䥱ᣞ⣜䕩㒫㾇牌摻䵂窓糍姅૿摤⪗Ꭱ◢皡浭⋅ᥫᑸヂ冏糀ְ牍⚠⽑ᛦ㚢瞹懲ބ㗩䑱孍䚂˛फ़华栆䡔Ԫ儐栥প瀡♍Ꮄ煜乪崊䕱ସᛳ䢍ᥑ㨜㞥⮒娆㙋 ݐ檖ಲ奣㊕✵䡐ঀ⥼権斪➤橊ḇ套犛᳜妾匮ᖼⵋᖨ⢼檙欪崆ᳯ咹磞慸䳄㺮ୂង⥝ᘞⱢ䭙⼫ệ嵬䉻䵇㾹❪⃦àⅸ䬊ᡮ㽄居哠ࢵᅊ摳奆了岢ץ㲗ɂ⬿⨊㴲䐮絀墴剏☀⣊䆘ಢ䕸઼⫷澑⧠痙㩪ᤅᑋ⑹ⓘ憞䊫㧗捳ᄈⳳេ㕗ᷙ墒༄柩Ⱳӓ纎⋯夵እᑈⱐ孉㟈ヅē悄䁎籴ニ䆇Ⓘ䖛㎼ᗼ⨙ዩ㷼曅姳ሴ緯䘍ო煺ኲ祑⥠ᔏ琘僑㩈勥ī堶噍扸ᣐ灵匍䗮炄⛺⦤妖㏔甉㊪㘵❨䨬僄犖ዥ冋៘⬍ᓱ⌼翅ძ6⻪⡰᭗⚚匄斑狃⫢ჩ◲䃥椒᪇匑♰但ᙱ㊲䗗剝䵈天⫂䷥峫䤇獏ẾⳎ榇哊攡ૻ□䭄呩㭔䡥㓪ᢷ䥋࿎ὒm㊨ㆲ䯂ᑖ⾤忹㯒硥ժ綵㭌R癸岣″硇楛ಣ䜡⟤墀旪䊚⹏㊴瓇ᦈ狨斎䪷ᙅ揈⫡┒䬅Გ射筋澷֠繽䚙斏ᏕᘨⲄ囿崬柹㰓ྵè㘿㳄ᥦ糄敁猣ⰴ奱㺲灅ᱪ禵䅎ʻೕ䆂勶䔠⩫ᗧ䠸䍩ㄪ䋹䟒¶吮晾˂ᦋ匑昀㊞擮ⵢ墆ⶌ䗅猪巄潌宵瓗憞ႉ楋玿ⱜ宥⨪电牋厵捎ٵ牟祹䊢旅㳕ЂⅢ康侪緅ѓີň䩱˞妓◠岉Ꮢ⼣ᑅ㿜耙ㄲ⌅͋硸ㅄᕘ⭀坪⺃ᓅ㵪䑹䀒橴㧪ᮼՁ▂䊰稆⭔囶Ⲃ叅⌜妵奋ぶⳍ悩彁祤狎旵㍟៙⫤屙⟄皵䥋㩶罍㺹泇斁䋏ᗓ䩉ᑁⱌ圾♼塙㦓ڵᏭ祽奟斋峉ᕜ⮃攧䱈徥♊乙歳幷ॉ灷䫂ᕡ⬋ᕃ䩄囅Ⱚ姡㽊䠶⚓ḇˌቹ䕿泚夢Ⰲ礍係備㳊䌙筋窆仪㥹卂癳⫶昉犩۵⬒᱕㱒汁偫ᕶ扌㑳⍁ᅳ㋭ㅈજ⪨❠動㉢ትǂ嵵灍䁽瓝㕥⭝㥄ఖ啾⢜勅㵲栅ൊᵷナ䵵ᓇ喉响示⮏摝ⱒ啾㗄枵㟋᭴ᚩ嵶ᕷ咾⁰䫾喒⧗⋪暹㾒䓆㻌粸幇畬檢放猩▛䥔圭㠺祉⣊આⱯ䖷擓ẙ˞ᤷે撛ࣇᗅ㰊刅㱊ᤴᱯ斴䛏皎嘕Ꮉ㨵ⷆ幫刺沉䱶懋絾䵸⬋⧬嶁ᒹ⻋Ꮯ匊嚅ᲂ㙷㛊桷㖃櫶Ԣ橾坍⨢宙㗂ỵ⚪坵ৌᴳێ畱檸ᖴ殍ᗟ䭌塊㫊斅狫竵°捍ʦ䔿㒭坔ⱖ屵㡄䑉⎋ᴵ汪孼囄⬎嘆毹敻⤸吂㽺搙๊Ҷㅈᕺ勆䕨㌇㕢氓䝅⹆嫭㵺槾⻲延塏䙿⫐ᵽ嫣▪㏲ᕲ⤳ᥕ㕺䥕忊Ჶ㏊敳୍ᶅዙ䧵䨤咷⮌怑㞒碹緫坷㏎䝱盚▓㊢瘉㶻⾝᭾㙼岪殓俇ᦰ惞嶎櫣╝欨圅䰣Ჾ⚼ᗤᅩ檷獫ᱥ介牠竱ԭ厇喷䢾嗑ނ⺉ᔓᔴ晍ٲݎ㶔᪼疌歗土䥾墹⧊䕩ދ䁴≫ݱ䋟悕拒喎檖噏⿳Ἵ㊺稕宋Ą喢涹绔啿䫈疖⨻呥ॲఖ╸⽕㶫匷啉瀆ǘ▜䶊疂⭽嘟⠪匽㈦峥ⶪⒷ㖩壍嶌Ⳳ䧀歧喼ⴳᕽ〲嘵ᖋ珷翌ཽዎٲ䳴⇽檮䭦兹㜦櫩櫪㿶⏋坶⇉継ˆ畃檸㑷⭀岭Ⲭ歵湒篵捯ヽ僚֜欞唱ዦᕕᆝ㹺娉夻濶篏偻獑͠܂祏毈㖇世唵㓏୵䰊穖㫮⣳獟兺䜒ฉ⭖撯ⱑ勪ℂ槥⪲ʅ㇌ᵿ䕒䎐䚶㗂ᯥ噜ⷁ啣㠬枭簻㙔籩睸盀፸笃ඝ௵斸椁凖㢚矕䂳₆璏⍾⛝ᶉ⾊㗁᭾杠ⷙ溃⍲䩭⬺॔༫㱳ᓜٹ欙猥哿Ⲉᱣ㸦嬭ࢺ扖ൌ䭺绐卬嫓畁犪㙱⾩ῆ㓆愭䱋䋷濈⫆ᵥⓚ䵺ᯨឫ俁唑ㆦ瘭玫⹖䷈槄Ṹ朎ളᰒ㐪⦎凱⃦伭栺䋪抨ㅺᛃᎄ⚭◣ୄ㞷Ⰱ妮ⓢ欅㬓愇痫䩰ヅ浯⛊䶝㖔⩴彉♆犥ṫ㌈摈ƶ㣝ᶒⳊ䥳᫆擬潱娓㠆玕Ὰ竅緎ᇕ卼ᔓփ珏嚔淞卽⒦缕؊㕔憊熹凇捺ᛪ奚᪺嗿䴒傲倆羕眺渵䙨ዳ潀䭻⊹ᕃ⩔䗔濷ᖅ✆瀕㮻滶㊏ᢵ㋅獢䬐ⵁ毉㝸䵤噥⠦䬭ⷊ䗉ዷ旟拁䋤畊䪂摱ⲑ噕⍲崵焋汆֍瓼族㍲䌘䖧ᰞ☗䷭㎌栥ᵻ浴ᖊ沴嗉䮃竴ⵌ物晸棧Ή㏌敍楺殷祈䊿ᗌ卶曮啢宖㖺濥ị㊺禩⹊㈴砖⽳㓕㶁扴东獔៚椑垪㿶攕㐻㏶㦊皲槆⭯䋱⸁㐏⚙䢅嫣㒦畭ࣺ涇掌筑ᵿ啡㉂枾䲆娡灹勻䎈桼ნ᭨嚿䕉嫰ⅶ橺◭㣖檍䃼㳶旍⳼⧒榗⋣ⵑ剭堜楥嶻㷲䇭ⶊ䉔㟋獵孟ᩧ✜㖈匏噒泭従㍆洍㳻ص垈盲㫁笓啻犵吮櫍ኃ㱆䬍㶻ᾶ㗊畟㭮嬘䶯㗗ᖼ洎廙Ⓠ縍䉻⩖侈竴僋㦉狹䅟䮊㓞檽偃㪚傭㪵᥏橲✡媘盫淥珄㓨⧵型㴆籵㱳炗❏⛼㗙㭪嚯ⵈ㪲ឞ⻦庋↼堅䂒毄劺緔掛盱淤㮞朱泅嚽⮌禩㩚˕㻉ᗍ檤ᓦᵏ᪫埰欝妙㲆伽ᷫ珗ᗬ⋹⧃މ囱洣᩿㒢毝帛㿦筥帺✴籪烶䏙䞈件ḕ௹斐榙嫽㌌栅紻㷗滈㹰㗙歫䒱ᷨ宩㗑浅墇⣦塵⸓ʹ㺏ƹב᭮按ᖐ嬤畼⸳宓㕮綍⺕ᒉ擰໒㥱༒斊䰔瞭⸫嶞㖴籍犻嵕ឋ᧵䷁它㋡⤲ீ瑾佔帞㽪䰙ₖ彉倾糏╺䫃ᔾఁ厬⹚卛㓎匽⢊≗按秵牟ᩤ䈣嗒嬊皨◃冭Ⅾ恩治䪖⬋㣽⯝➞崌䶼㭺眆䷵ᐽ㵲烽䜲ີ䕌፺㏊坥嶃㭝⟭滰䇬䵐Ѡ壵侠⮶ⷷ5㝣#ċ㯒痶ⶻ屉厎盽巛び་ܷⷺᠼᕘiƾ爍涼₈ᮤ≜寚Ρ眈嗼曚㍨皵窯㯎瓝潠ܗ◺柚瞖⼊㷳㯙睊䀪牷㮡琮ҧ志㛪佽¹儗䈍䏻ʹཿ滨㴪䣡瘝檧嶯↫❽䏗䴎Ẏ䟁䗀Ỳ㴬ჹ冲భ旇屘ឦ屣撧妐䝎ᯄ▄滥洹嬂瘽渼⃯⚾獝ⵍ唕ᨎ嘣摇佮ㄚ㴢穻㯣槹妫䖝ࣝচ⮲昌ャᤤ⽳偶Ѱ斱ᆫ滚伵䡦㲋⊷⟪䷹珓來໌⻪篕癊ݷ彏⁾䫝ɢ⒣ᅂ叹埀础⡸唹牌悫沗嚻ㄖ䓹揻ህ䔉䯰៝澎崙㌞竟ᇆ熈ℏ㍂ฑ筺粁师䟶⏄箑廟㸁筄娠栗嬿㻾捝ዔ㖈䄗䭲៓ᾇゐẾ笈ល潩嵏⺵⺝盔䢛崷⭥ߘ䬡㵴灦⛮ᄷ僿⭲憝庪楕䎍柞往䚃╝綻眗澆⧏㭞呍র⌔ఎ᧸睚㞗⻎㷜砥癷槱⸾ᢝ䚚㡉欑柰៍㽨勒㦌穜盥榻傿Ⳟ朝䣠㶚Ὸ⼽玟ґ絝ᣫ墏渿原保㕚琗瀌⭯柕罳ȵ綡嶕✏䴿嬝~倝䣚溕睋䃸㟀羏廃綺笠沇崠愺⭀儝峔兌桯㵓㞃纲緎ஆ櫀ᱠ㩹ᬡ勵ᬱ喠ျ䴯⫪䉀倥നཌྷ殬༵䲝搲冔嶍坵珋彦ᩂύ䂈ධḁ៑伡笣刦琭⑁灝ₐ➣盘喣㔤ཊ۶ᝇ帎儍≻क呇⫸ℎǖ͢ش祾⁰ヲ㉞戽ㄦ⨬俰悄杸ƹ綧篖ᢈ叿务梞樧㘗䙐桕ᢴ䠭ⶄ▵㕌༰ᵾ儀珐ଢ଼ᠺ䑔挈現�羜䇽Е⸌ີ凊幙曤眦㲤⌧ሼ缸㲬∈ܛ嗞楐㪿Њ⡣ㇱ儬滁爺㵱冲Ǫ婙ݦᯀᴏ妠旭㿴䊦ញ䨽咀㴡怰弙Ǧ岊ཤᙰᥟ㱲甝俛䔖因㑚劥兇⇝傂⢸ͶЭ殢◐Ꭳ䮜മظ⼧勱ც䜒ᵉܧ↬ᷞ懵ᵁ仨禦䌭筣瑙$愯䕡ৌᨆ౮䩈㝻□峣级ᬭ瘹慫墛・岙ࢋ䁦໋剅ຳᏡ曭䌧簗స䁒獪烻ჯᬏڙ֟ಛ⇽㑡搼ᾦ憢⟫毰⛝侚ໃ㷏ڬ獿ธ㋱ေ塉寭䷦⌤㤵乔㱲ᇥ㧠ހ㑴橐㛰湡䷸嬂梬䞫㪰⒋ⱶ傄ᕭ搌䚲Ὸ㭱㪤幃惃ᒬ禬剕噑䁙硠䦉㡃䝒ệ䔰න擝㝻ܮ椿失撕䣫⸾ㆢ䛙ೕ拶ኜຸ糕᫃ክ⤻橷ⵑᱥ䣹⍜掅උୗ滏┱塩匵㬔砏毶҅❤ሟМ䙱䞊᱄㼵哱囑㝭䛰⎪婗ᒌݢ刟㈖⎍ഓු㛈殠楦ᣧ崻婖糅噭⣉摸戱䖚ᴀɥ⑰ぱ吠ᇤ⌹牜嗒ࣿઐ揇窣䟦᳟嘸绨彈促᧱紳璗刀冉䙀́渲䞸歑囑ᥔ᠖婬܀燊ά㈛ᆅ䟀vᢊ涸梈堙籧斬礤噖㒎够劖掭䚹Ƅ㻨翑獞棦ⲗ㴈猰ᒈ㣿㻎婕⌥ວ๎揪�⡱牦ᙧ㊆⨨岞ٷ䇎䴱毡ธᬼ㋔㡈欃噡买ᬈ斣ᲁ㤑燙搑綩㨟歑㑟⮍ʚ㈯ሽ䙜㒍檝燮搏䛕䒯檓徴⭈搑暦ܗḹ扛῎爏煩ᐪ䝏櫆ᾄℐ≜�⑁䔤䑥ᩂਜ⁚䅸ኪɢ㹔⪁熝抦男眹䅒ԚᏝ≯༮嘪᪤縩䘳ⱇ卤༿ṛ横၂㲜㥗䝘揱᭼㲘榩什孲o町痼ʖㄋ爙挼✸佑ᴔ哻ᶩ刃兇屬殮Ծ㾼·凄焢䁖㑮咀㒫㞑彃ག䩬漪ٝ劖⓬ਃԁ⤊้ᩴ㢄碡厃⌂ⶮ⢻ᥝ⛮ᇕ䧽Ԇ⠍䛇♴䄼㋭⏀ާ⩭ḽ硒碈棶䦫凮⚶౩ᳺဴ溑䛣ᯉᆬظ৲ҁ㭾缏ጢ♿นᬒᘴ洒䐳筃䥯ጽ㙟ⲝ壤㣎挵䙌䶐䫒㭸攞瞃体㩮儻㙚࿗୶糞㋆ᖬЂ梜却灴ᵳᇧ䰬䨿油㏄ᦃ⦧剰䯊䱰㊊㭇⨚⑳ᄦ⼖斏ᢾ䪟ᓮ⊸疃⚦作⯑Ṕ痪䢅敧旕㟮⩓䊌፳绝振ਬ癍Ḵ㎇−櫃寻⊯㤻௨甎槧捩چᠹᢉⴉ捼ൻ䗺✻ᙖ箝ᆳ叠巰吸ᪿ嶨梾湃࡛ڷ椿秸撑㥼榳ᒲኟ棻ၽއ׳榧爗⺿嚾杚燿渚玱䰭᳁廫俉睳穚癔敯砥䚄䇟⦶厦䝖䰺⿷毉獳䌪⼷沌⪛㭸┏⍜搦ᢺ㵕♚垵暆筮䏎穒毕㰻⺫ढ晩䲉ᮊ㗔掌嘃姆㹆►惵⚉⽙㍂暜䶳‚㵅ㅹ羽㦆塖ቫ箌矔㕲㚫朒ᏂẪ㑇㐡倳忆䦸᭖絇ⴑ㌔度柹楔棨屌灦擓▇煮粹嵓䛝磴亹㎧☸䵎ᴫ凉ㄑ笃皇㝶ƏƲຂ礓㫲幱枚䀭ᮆ㮬柺睓墇㡬୕㚟ં㦺㍮欙䲣ḩ嚑㺹煓₻ㅖ梊ᝓ䚍㓧㼔琘⟥佘歎㻌昆尹猆畬ᚺ橒䇀珎妺ⷰ嫏㗙⮢ࢯϙ墓㎋ᥕ㳋睝➠ワ⧾琍柧䴣⼺㹓㚙斓僻嗬椽⭜䛞㳼䫭ᨓ➏㛯ᾚ㽜留竳ద㗮㎺⡶庁甆秇㌱ወ䲱᳢㙤簆傎扆⾾⅞皂洀䦵玟㍏䱟᷂㞌瓼儳㑇Ῥ澺ͼ璐⎓冥珕寉དྷ⮞ㅲ␥笓ࢳ⺬甊澶皙㓣狗㏀ᝠ眚᪀凴渑烓Ẇ塌त䫻䭄ᔎ۸ᦤᝰⴅ溌㛭⥢害ᝆቩՔۚ喓㧻猬៵丏ᫎ㸢簮埓撋䱏ㆾ卓ƞៗׂ㏽❉㛮ᩮ㠲⑥椫ϛ㡿抾ᆅ玌燀㕫❏咛䪮❲夫䭆ᑌ䏭ⵗ憒੫槆唥嬰⿊⡑㐌扥䉝䮆濯౾惞拁㪔瓟㍵☺九毤ฬ竑泍俪枒‖๚ㆊ⽦㧗玎⺘媚儂睐Ꭻ簶૬硽归憕⋫狩ନ晛权⢎㥃ⱅ悫ᜇ瑔ᶾ⒄冋皍娇珒߬⽨实塲⭅䋭㒷♶㷉孔㚐ⴑ◡猠婹㕛⭉㋮崒浫ʷ敍れᣔຏᶖ柸ⱚᯨ孩ⓥ䰫撻ᾯ玼ҴƝ⦙䒰ᛠᰝᑾ㲅䰠歧⌅汫䃞㺔埂㨗叹杆ⷀ姬ㆢ旮睓Ʒ籍玹ⳓ纞糭獤ឮ⸟ᵙ㔜毥潃ἶ祏䃨罕㦛Ԟ旛玷ᝨ佁᳅圔沅嶩䂇呸ᕖ曕䮀ㆦ䭞Ꭱ俸崮娏䯷㵳ࡶ缚③嗥ছ㎍旣珞乢席慜昵姞⡷䉍Ếᵝ禇扽槊䭿㪊瓨工㯔湥奋㴷皖剎ᕗ䪜㎎⨌叹ឿປᱦ㎭㚵捋ֺ⪾勑ॄ⌀䜑டᚂⳒ宩㠖㙥扫䟆έる狖姂⬇䗡⮆ᛄ⻒壑噊细䱹礷䍎ࣙ喆独㈁⮩召⑄引垂㍹圓ょ狭ῃ斊瓾嗾䭑㏱䳰壕㷔疀氱曍ᴠ刪疊欜ᦻ⬥᪂柚崕䀇㿵痲冺幖㕼ࣹ⚜ዷ喭厺⠎⺉䢭㲲簙䓭ʆ⛍磎斓乻◺☉垭伊ᴤ㬴枑狓䫍㊎曗㚙ᎉ㗌ฑ嘹侼婭㷊繵瞫摷㇍炋単㖚ޅװ歉嚄ី䨭ㅲ旵䐃ѷ⻖畹⭝ᆛ嫿㗉㎡ኛ᳕⳯㡃㻵介処䗌䕸咻ᶇ⌚ᧀ㖤埦㟎宽㫴燕熋ળᯌ瑼ዖ嶀ᴌ哵㫫᭮伾婅㻰盙弋௶劕掿⨬ᆖ竩㨁፲✘嵆ペ罵嶩篷摭⣏殳綀㔃昗䰃⎿ⴡ岞㶤绕剋昆⏍汫Ǖ纑㋯䓘ᬠត㕗ᱶ㼔甭撋矷⋬睼⻟䍞崆භ䬸㘳ⶀ汱㦺晌櫳䡖䏎㽽嫞䯻⋣榣吇昮Ⲧ᪁㊼悕匣睎睹亇⋻᧪ⷄ㝸䲎Ⱙᅦ涭窳䋷䕽㪈欂ฑ⌺囈⳼῏ᕊ⒥攻秶ኍ㽸Ӳ↑峽ؚൿᛨ汤丙㩆痁䰓墷翆Ⳏ˚喀月㇓殯㤨⾦女㒆栉乫䕷㢍捺槞ᖁ✈◍㴾埏ౣἎ㠖⟕咋Ї傍㣼榸ஈ勸痀㕤㟋⾦忣ズ桍帳თ⺌≮䗜⚁㎊ⷁ囙⺗ᨅ忞㶼登䯶罬惾䭚ⶁܛ⺪欺嘤⳥忥ㅚ盺嶋䝗曯ᦖ勨⪡旍坑㒍䫋㿴欦棫絗▘♸㗗曯嘅䴣㠆ⶶ徫泒痷ᦓ䒳曻㺸⮗ዿ紥宥ቨ櫍帒Ŧ䗘噪籁භ᱾桔緱纨ͨ崇劻ȍ婻㌆浭㛻Ꮧ㮏朅綄㮇㛹涽ᓛ⪄咫䗺䬭碻᱗߉䞠緔殷眏㕓簣樑䝟䊁ḝ∹ᚦ亏ໟ扸༄本ഐ瞯ੀᒫ䕸愍瘜㠤ᧈዺ⽑Ə͆ᷴ樹稑淉䢗䨎ࢹ䡛兂㎓䄡ޔ╶ᇦ子矈淨䋇㶎嶚⥛檖毚猹孳伟ᤙ穿㚲淉吆ᵆ柟↺⚂དྷԢ㽬坽ప岲癝欆徏⇦簍䑔埸猎罻ⱪ垟⛒畑烇㚒潀ᷜ㿺刍事䖪ࡸ᭸⹐滭淆愔ᤱ儻宫䩯Ἠ㝲ޗ圎㧓ᯛ䞈㋓巠絋╝氾䏗䓤翲ଳ㽖ፁ緺弲氥ⓧ絊ᰊ㝓§堯㹄晄ಛㄗ㼏杒毰⺺䈾⇫㺞皽ˇ塔߮揹汛䥡ᨎ⟆১ἒ㷌篥瘯⇎ӡӉࣝ媛嘸嘌毾柞ྒྷ䎻嶮௯总澷寏㉭ຂ掛ଗ瘫⯽㓏ౕ䓣㷡篙癦瀇嫠ɞ撦វ␌Ⅰ!▁䣞敜ゼ兘䢓䔅ⶬ待㥂維䒭䂾ヒϿ㣎ދè嚚夓〥ᒧ➩抡総㮃倽ȏ巿㧻⤖੦気枍ᖂ㾎磙綬䂷矾ჟ寛㼈伝搛旲墧焠漧垒嚬ɐߐ熯沄ţ䓘䰝榠‗眂䁙応眥Ǥ卼㌐S⸩忤֨ଣ燛倠〾ᨥ῞䨢缈ቼ࠘ະば㱷⤶≐㨠㾦⍬㋣傜Ҙ⠱λႿ盨ᱱᗞࡸ灌㌧䊔歫⏀ᄙ᧓橖ސယ䡀㮠ҡ櫪ェ䃆攊摞呑疁紹љ໓䒨⍈㭕ഡ縝氧ሯ䚢㡙嶮儔䉆䏓䍪ຬᶮ̲䑲ށ斧㞹␉圦竧ఢ懆ਖ਼䕗珽㸠烗ԕ否ࡀ損竝焐͓倱㤁桘傳ᘨ疾ᐳ⒧椯䈱䉚瞊䑆ህ滵筰笲徣䢧ǐ㘠籠⢣࿏嶦+▓炂▽䏺䙔侨Ζ㤌㵩┼䔃⏸䤕⃜瀰纕༵愄㪒ྱ瓙ᅧ梱⤫竷ᒔ䩡凹㽚䟕凐`㽱悃僧䚯瀣ᩚ丠⤆⚻⎥࠽ဇʴ∸磬広惧ⵕ䒧ᙜⲖ㾧ਧ╹承婀ʣன䓱潃擧嚮彁ゲ沙吳መ灴紇๓玼㤔䨁嚑ᜀᷛ㔤岝稡ⴳ垗≯ྋઠ̐民痒⫸羮⻲䀧⎦桯Ⲕ卐⟢⭉˸㮠ཱྀ祰⎧ᴮ匑䈤䘩席搢恰⒰亰㊂㢥⹇⹉倐岦㘠⤉摒䁯搩懼䈮䟤猍ᾤ็屯㎫〧抜窰䧩䉄礒䅩ᾲ㰂३朌⍇ᚩ㲼Ⅰ\"▁䑉煼େ扯沼怣ኟ璡᱆❋䢥ᱢ䀠J憹⨈叼㱤仹᳠Ą絉澨☴啮⮳ᕜ㾤ᾈỲ䒆䔞ᤧ↺㥼䳱ࣳ畜ՇⱮ䩅媟㓕㘣厷MࡽἎࣚ樁搇ᆪn╻嗻㻍䂧↶猋ᨓ㩛Һຖжᢇხ㡲㉆ڑഁ⤩ⴼ筌䰻環䊔綁ᕓ犇₹ᦼǑԫᱤᐷગ⮺ĀĿߜ溜፣眬㽀㛃崷礨䌵䌬ⲉ≥乫ᵻཌ範ጪጸឈ妀ାⵯ㏨枣创ᴁ⠌畹ᬹԣ祈昤ज़⇏䐾歟剞卲ᨙn㣆冀榓斛㈇ᡮᲥ⺕热㡁㰭杮⃧ᶑ⏤䙜ภ㊠䱮䦂䳖亐〶㨍廂㌫亗ᰶằי抑⼇䟯士哣暜㗰‡㐇吾燌㐎㫈䅹攝厇勯㫥ʡᴩ䊫稕㎽રⸯ⌨³丫汘ᠡᲑ䀥ẝ℠匩䉖沤凐Ꮎ㡻䅨ᣓ䠷篙|仄↓䊱ײ呡ᤐ⾭㧡㩳Й硸暰翯䔳ࣞႜ䌒㴺ௌ岸⽏Ṟ䄫侥秓妇ぎᦢチ冒梸◤ᐠ�ㅏⱐⓝ䎨⼫䡏Ѽណ̜̚ૌ幐☴楎㡳ⓟকጆ◤Y〈Ĵ䉲猠ի存䫯ᦢⓜ榐㴠/嫫欬孏㩿瓘⦔㌙☊䯔❎Ŷ恙㧢䄅戴ᶷ⼬繽㣅䦟ጄ缂䯷ឆ―䀪猍澷⩏狷ⳝ冚ㆳ旲䲈垊〪ᎅ䐳࿖Ṻ䙷⇐楲囡斒梠嗮䩝Ũ甔ܚ㢷♵疽ᵖࡰ㐢堥之⬀㧭氦坘⠺尨摤堾日䙸⏮㱬绦疝ឣ㨷瀶恺䂩ṯⲙ湦㭷篣倰橗®侔笔殶惓⾁戕䀟ࡕ怺ࣷ㛀叠ႀ嶽缽坫㈕㦗䲕煼㔐歿۞櫡尵Ὁ毁ዧ⹒䬭ㆎ哪ቷ䚔㙰羬淐⢬๙湈㴲䄢Ὰ㭺䴌堋更悏ļ㤅ᜧᬊǂ㱛㺏⹓扣㶤キ筞ඛ⠗䛚叁⎔�䩟㙝ⴍₗ䈕㮤盅攊㩗ࠥᄨ夠掐㴫ࡍ┩䏟杸㉳䀔䇵ڻ惌ྐྵ䏑ણ掙ᬀ䷡䯊犱䄱烙Ĩઁ祰և͔ຣ倆㔸ᴮ丕ᰞ㱋䧥屓㽧䄪ରැ䵁尶朷䮞»䅶噸氼澑屲ߦ睭圫块丠㳼⤣玐ീ⸎䡁㝌䁥嶔㳬ˍ拒ឈ㛾ᗚ䲳ㄻ繂ᓓ灰漑ᣛ㵞ױᡪ字揯俸✂⭓Oტ䊋ၧሺƉ簢⯗澎溿⏚算㙀儳き䳓䖳怞偘緍綻滗ᐗ壽熧ᛧ,⬤器呛惍忌䉊⛫ቁ㦗硧矒νㅙ䢭竾⯡椕瀝Ῐ垮㛭੫⍷绐ᚏ簈悛媱႞ဣ哯⦠峖㠲缅枠ࣀ䯯垿杚夯礶搾揘kᥥϋR燨ᑰ न¨秴ǒࠊ⦥آǴ㵭朶⻅ï䐿❂䶻⇇湖制㻌e撛䖇Ꮀ䓩㚪供㴆㷺ၙ矽䄷彏㷢竝掛圗Ḏ⺑矜徝媦悰ޫ炴瀬Ζ�紕洣䐯埾磜ᆚ洄琣篩砕䟇岼䄄ȝ惑堗ᐖ㿾㟘⾟缘着߸ཛྷ༥搂ҡ熡爧懄ም摞嶬ᩯȖ縟ఛ矓漿峮㭡猝挧紗倎╀瑛愗缀栠呐ࣈ㵰㥁竉ᰧ筬ኅ碢⒜⮬Ἁ䐎䠴⻏ῐ絊ৣ欧北ḿ䐽碘ᄐለ䏰䠉㴎¦Ń筶㔯缏䙞ᠧ儔ἆ緿௰ỿ廐繱睙控洗䰾゜椓㈻␖篽ླྀ禨㿔柁碝灇䘧Ⲥ佽㮿ḷ⍖绞ₒ㱈禁窣旧檯㜾属㲙⾐ⲗ緮䟽砚ὣ礸Ա瘳愔㋀ⱡఢۂ碌⨔吜ೖߋお㽬ㆎ瓂ᛇ惴璑⊣䵄㔕甜䑫⠞吴䁪㷴竰絠⾛杯㚾䡒ڞ甙⨈⥚绶፱䛘却纴䂸母҃∸冭䊪䴚ᄛ⇠媟⪓ᾜ䑌紡䄛ҹ⻯㠗絝ҟ洘㾷㏿㕤㓋⋢䠖啺ᵓ涇硔ᅠ坝暨㔰稝㑹䣺捦ᑓເ⁙經匪ⶑὮ敭嵬ڝ笇᧹篨Ā举眢笿ਫ硪䳯₎䦽怡̝㙛᧼ឤ⾩溌∠㥥缍缥㩏䡿ࣞ嚜ᴐᚻఔ籈⾿沂窰䯃Œᛀ㉾ᐬ⦞樭☆琞៛佹Չ㿲羑䭫檷乏呿挸ᄄ猙䘐㚯ែ异モ紌䁋繰ㅏ糈拟嬂᬴ജᨈ偛勂䂿䊦㾬罋纣勏⾿棚ッ䚗ᘁⰚ垪䛱但䌊粱ⱏൈŀૠ墢䆜瘬掼縞ժ旭㹺绕石簇䧴㭾曞㠠嬐䲪毡㥘砖幝㹚稕礞ᓷ灼姤滝ᐆଛ㨙樐㟕爎䓣㲴戭砋爎ჷ羐帹掝䓼专ᦔ儱⾠烳㵆砦䊻櫳璏瓿秝㷠✞瘏ᰑԃ⻙忰榞十ᇋ礗☴櫾䌹殜丆尌ҳ⾩忧兤䇋⼓櫗冏俔ؠ箞瘥⨒㯎潍䆧㸜維灛篗熠廿㖪玞傯宑箊㉅潰ő廐㬽玖ᶗ䩓㹑㯞緸༓⸌⼱矒伬幽㰫⊍罳痲⨏䗾Ϝ啄捹欌㩎㞧濮录㻚翝禢ᦓ坺忞ྜ✛ᨥ㰟懕漣张緞碍爛怯䲀㷿嚲䄞䈟縜寴挃ᐖ丧㵁窈㐖᭗揄呟倀ᓅ㜘䐇ࠃ㜹䠺拳ȭ┋毣ㄿⓆ廟䤟縀ⵅ῾幞₃瀻氧嘄癿㙒㤟圚仳Փ១ᑚᘘ缵槑Ϝ᳄Կ篲祲椘䈟␂⟱ʽૂ㻮₵⏡㷙揅䒏䙿⮂ዂ矠ᚇഴEⓘ礙㹡暌ே瓽ഹ㱾៝溚ᨗ吜眩㷅ࢶ㹬糼䩮牢ṋ㺿笖亟洞䌝帄㸻侷ὄ槜罹硝ȸᳲ㛀渱怾⸔؛ತ᠘⧢缥緞˱ᙏ囀䣟墰⤧⧪憧㰺⾾᾿嵐傅繙狧畏槯ຕޡㄢϰ㐏ᓑ⿲影㿒粽⎦ɷ社幚疜瓄㘖ᐉຫᾆ㼈緼緋畤ቯ歚盟䕱ଛ䄤咾㠴ި佦⦪縰冀矨ጯ喴䧟⎜ᬞตᰐ仑徍㾦纅窳紷恺⵿䷟綜㜜ᘗ埫♔䜋㼀ˍ哹乱叏璿滟䞞⼘៏尜矩濊䙪奚㼻⅊粋屏篿䲌妞䌔慥簒嘛儠㾸沑Პ㾶嶠ᰓ屬⍰᪼ᦔ⼠ؚほ‼其㳤༃箧䌇࢞偼簒搐㴢ῶᐘ羕≘憧熜ᜫ籟♏टⲂ㬧爠娚—倆⺐á㧢䑯漿湟㱯洞ៅᐛ䦱㧻≓⡨缽䃃絫ொế䚯䲟ᴜ楝搗┙俣㿕緣穼翯窿僟Ⲡ甝力ఘ树䨓擺羋ᰴℏo擳䒄㈑ᄟ┶䐚攖မ㽴羱缙ط皯捿丯Ꮙܟ㈚痊砇㕉心㽯庖∻筗琖˿磇ẞᔜ呞儠᠆倊ⲕ䀊᾽簫␗眏毵Ჟ䬖撠㸞溜倔瀑Ὲ㾙倵罻簇箏灿緟᠁༟␚礑名—簢枱ӫ翪߷玂જ㖟澟匏ᬲ堓'Ύ㾄繯沧繷瞏秸ໟ冞㈜ⴞ㠓堒怛㱏㿏懃፤翭歕旟狈፭ᐝ≠ሿ砜愶䀖翡纍綧祷灿機䞯䶞粟栞們〗ⓞ翥考繘纞ⁿ罿皟燎ゾ吞〚⬻ 䀕缦ǣ绋簏甏擟媤搟䭆耒瀆怘捔➣㿊矏爰f㿙循羰㿂忎㾦羯㿊ᾥ堧羢玸⟁翀侸�ឱ䀬忕羰�翋ృ羮䎷㾾㾤㾺徨忂�ῒje䇖�翘䭙ᣐ�࿔㻍�`㿄�叔bῌ�㿏㾩�㾢珓㰥wⴿ�r廍}�ϙ㰨䁳�翃〾�Ρgq�羯�᾿�w唪䁰䂋湛㦬羳昶䁮�氬䁭䠼䁫翆羷q㾮羠羨ᙎ䂜㾬嶵䂞䕟㧟羵翜嫈秗K㿆㿔䂊羻�䁻翖羦ῃΐ䁣䂇扎䁠�ж橕㿃䂋সₖ䂜徧䁮㿛�䁼c徢r䂆₊䂚剙癚㾬樼橙㿈䂔߂橆₎₄䁣翌羬b₇�ῗ�䂇羺橁翆橝₀⁵ệ*㾳㻄〪㾷Έ�翋羶翕ⁿ䂆ਡੇ婐恶₂㾸廋⁸羵㰡䁾ࡏ䁵⁹䂀恩樸恱Ổ悚悟㥝ξₘ澦ٗξ䂛䰼悏ⁿ₉䂒珓Ϛᶡ恦䁰ᠡ悎悎ⷞ恮悁恼᱑恱䁹恲恥恪恠婕恭悏σ悝悁䏉寕࠳悞巂(ႈ㾡䀻悀㿋|⁷䁥䁠恣ᾳ䏟ᯔၠၦⰴၹ吨Zၮ႘ႅⵖႚか䁤�䁴b႔ၷ悄㾪ႎ義橑ၸႆႌ䩞ၩႎႜ楀恁ႅ彛ၫ䂑₎�₌䁢悂₁㾯悊ၭ⿌䎳ၸ≘傝悗ႀ磘傌ၫu徹₉悂恭႒悈偮濜傕䁥䰬偬ீ叇ႊ崠厢備ႜၩ摇悊傐傛篅悃ᾱ傖傀ⱍ偡琱偡側̳傏႞䂌⁹傀傅⁺偨偽ၠ婋偫∠ひ叓偾ፂ发傚V㿇備ₕႅ傟㿍ⰸぽ偦ⱂち琸とゞԺほ偱恧傌篙偰傂䂕偾叐翛兆び偝呏ᮧ嗕氷Япж〵ఽ簡昢л砪搻䰤瀱摖࡞ѕ䐽ṓ䁭殳ိ㤪奐债㗚ூ㝚帷㡊㠵⡏㡊ᠢ堦ᠫ 4硑眦⠰砸硍噆䠣䆹ᾬ䁕B栱‷倴ᔮ稫䡛ၾᡃᎡQးึGめすࠡіUY灿ࡁ搪䞼P䀦摍㡕灭毈恞#炑嵉㘫䤺幞㯜�䡊⿈偆䁛⏁ᯌ䂑湄уら䬪搢䁇硗炒䰥࡛硜ࡡч䡟刹ഥṑ⏙͓翘㹇䀲䀯炆〮⎧炛揇䀿䁁ࡳ炑䁍炑‥ࢁ䃟炏础瑀ђ倬昸ࢌ掤ࢁ䁴硌㐯株ࡢࡤᡟࡺࡻဿᐵ硚幖ࡧ兑砣椨ᥗぷ倦6࠱灠䎩炖@⁉炂࢚桏じ䑍炝灺〹(ђ㔸琨⠣䑏ぁ⁜⑇䁕&䡹䡵掷炍䡧硅䢔䀲䁃Ꮎ䡶䢍ဳ䢖Q⁃Ꭱ࢞䡲Q%䡹ࢆ䡹偖䢀⢑䡮摇堣䢀⡯ひ䡚い桕愭伧硁н➢⢌̢〸ⱆ瀰䨸⢖ှှל硜簶⏏瘰 "}
The complete round-trip took 48.0 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-file-analysis
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-file-analysis'
- id string [optional] You may pass an id to link requests with responses (they get the same id).
- filetoken string [optional] A unique token to identify the file for subsequent requests. Only use this if you plan to send more queries!
- filename string [optional] A human-readable name of the file, only for debugging purposes.
- content string [optional] The content of the file or an R expression (either give this or the filepath).
-
filepath alternatives [optional]
The path to the file(s) on the local machine (either give this or the content).
- . string
-
. array
Valid item types:
- . string
- cfg boolean [optional] If you want to extract the control flow information of the file.
- format string [optional] The format of the results, if missing we assume json. Allows only the values: 'json', 'n-quads', 'compact'
Message schema (
response-file-analysis
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts
.-
. alternatives [required]
The response to a file analysis request (based on the
format
field).-
. object
The response in JSON format.
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in json format. Allows only the values: 'json'
- results object [required] The results of the analysis (one field per step).
- cfg object [optional] The control flow information of the file, only present if requested.
-
. object
The response as n-quads.
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in n-quads format. Allows only the values: 'n-quads'
- results object [required] The results of the analysis (one field per step). Quads are presented as string.
- cfg string [optional] The control flow information of the file, only present if requested.
-
. object
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in bson format. Allows only the values: 'bson'
- results string [required] The results of the analysis (one field per step).
- cfg string [optional] The control flow information of the file, only present if requested.
-
. object
The response in JSON format.
-
-
Slice Message (
request-slice
)View Details. (deprecated) The server slices a file based on the given criteria.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-slice alt Server-->>Client: response-slice else Server-->>Client: error end deactivate Server
We deprecated the slice request in favor of the
static-slice
Query.To slice, you have to send a file analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly slice the same file. Besides that, you only need to add an array of slicing criteria, using one of the formats described on the terminology wiki page (however, instead of using;
, you can simply pass separate array elements). See the implementation of the request-slice message for more information.Additionally, you may pass
"noMagicComments": true
to disable the automatic selection of elements based on magic comments (see below).Example of the
request-slice
MessageNote: 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.4.7", "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
filetoken
ofx
to 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":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":7}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11174-yiKVZMLA6v3b-.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-11174-yiKVZMLA6v3b-.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-11174-yiKVZMLA6v3b-.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-11174-yiKVZMLA6v3b-.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-11174-yiKVZMLA6v3b-.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-11174-yiKVZMLA6v3b-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11174-yiKVZMLA6v3b-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":131,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11174-yiKVZMLA6v3b-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":1}}}}
-
request-slice
(request)Show Details
Of course, the second slice criterion
2:1
is redundant for the input, as they refer to the same variable. It is only for demonstration purposes.{ "type": "request-slice", "id": "2", "filetoken": "x", "criterion": [ "2@x", "2:1" ] }
-
response-slice
(response)Show Details
The
results
field of the response contains two keys of importance:-
slice
: which contains the result of the slicing (e.g., the ids included in the slice 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": { "slice": { "timesHitThreshold": 0, "result": [ 3, 0, 1, 2, "built-in:<-" ], "decodedCriteria": [ { "criterion": "2@x", "id": 3 }, { "criterion": "2:1", "id": 3 } ], ".meta": { "timing": 2 } }, "reconstruct": { "code": "x <- 1\nx", "linesWithAutoSelected": 0, ".meta": { "timing": 1 } } } }
-
The complete round-trip took 16.9 ms (including time required to validate the messages, start, and stop the internal mock server).
The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the
filetoken
is unknown, flowR will respond with an error.Within a document that is to be sliced, you can use magic comments to influence the slicing process:
-
# flowr@include_next_line
will cause the next line to be included, independent of if it is important for the slice. -
# flowr@include_this_line
will cause the current line to be included, independent of if it is important for the slice. -
# flowr@include_start
and# flowr@include_end
will cause the lines between them to be included, independent of if they are important for the slice. These magic comments can be nested but should appear on a separate line.
Message schema (
request-slice
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-slice'
- id string [optional] The id of the message, if you passed one in the request.
- filetoken string [required] The filetoken of the file to slice must be the same as with the analysis request.
-
criterion array [required]
The slicing criteria to use.
Valid item types:
- . string
Message schema (
response-slice
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts
.-
. object
The response to a slice request.
- type string [required] The type of the message. Allows only the values: 'response-slice'
- id string [optional] The id of the message, if you passed one in the request.
- results object [required] The results of the slice (one field per step slicing step).
-
-
REPL Message (
request-repl-execution
)View Details. Access the read evaluate print loop of flowR.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-repl-execution alt Server-->>Client: error else loop Server-->>Client: response-repl-execution end Server-->>Client: end-repl-execution end deactivate Server
[!WARNING] To execute arbitrary R commands with a request, the server has to be started explicitly with
--r-session-access
. Please be aware that this introduces a security risk.The REPL execution message allows to send a REPL command to receive its output. For more on the REPL, see the introduction, or the description below. You only have to pass the command you want to execute in the
expression
field. Furthermore, you can set theansi
field totrue
if you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of theid
field to link answers with requests as you can theoretically request the execution of multiple scripts at the same time, which then happens in parallel.[!WARNING] There is currently no automatic sandboxing or safeguarding against such requests. They simply execute the respective R code on your machine. Please be very careful (and do not use
--r-session-access
if you are unsure).The answer on such a request is different from the other messages as the
response-repl-execution
message may be sent multiple times. This allows to better handle requests that require more time but already output intermediate results. You can detect the end of the execution by receiving theend-repl-execution
message.The semantics of the error message are similar to that of the other messages.
Example of the
request-slice
MessageNote: 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.4.7", "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
stream
field (eitherstdout
orstderr
) informs you of the output's origin: either the standard output or the standard error channel. After this message follows the end marker.Pretty-Printed Result
If enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away: R> 1 + 1 [1] 2 Besides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. There are the following basic commands: :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r) :help Show help information (aliases: :h, :?) :lineage Get the lineage of an R object (alias: :lin) :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) :quit End the repl (aliases: :q, :exit) :version Prints the version of flowR as well as the current version of R Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command. :benchmark Benchmark the static backwards slicer :export-quads Export quads of the normalized AST of a given R code file :slicer Static backwards executable slicer for R :stats Generate usage Statistics for R scripts :summarizer Summarize the results of the benchmark You can combine commands by separating them with a semicolon ;.
{ "type": "response-repl-execution", "id": "1", "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)\n :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n :help Show help information (aliases: :h, :?)\n :lineage Get the lineage of an R object (alias: :lin)\n :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)\n :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)\n :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)\n :quit End the repl (aliases: :q, :exit)\n :version Prints the version of flowR as well as the current version of R\n\nFurthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.\n :benchmark Benchmark the static backwards slicer\n :export-quads Export quads of the normalized AST of a given R code file\n :slicer Static backwards executable slicer for R\n :stats Generate usage Statistics for R scripts\n :summarizer Summarize the results of the benchmark\n\nYou can combine commands by separating them with a semicolon ;.\n", "stream": "stdout" }
-
end-repl-execution
(response)Show Details
{ "type": "end-repl-execution", "id": "1" }
The complete round-trip took 1.8 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
ansi boolean [optional]
Should ansi formatting be enabled for the response? Is
false
by default. - expression string [required] The expression to execute.
Message schema (
response-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'response-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
- stream string [required] The stream the message is from. Allows only the values: 'stdout', 'stderr'
- result string [required] The output of the execution.
Message schema (
end-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'end-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
-
Query Message (
request-query
)View Details. Query an analysis result for specific information.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-query alt Server-->>Client: response-query else Server-->>Client: error end deactivate Server
To send queries, you have to send an analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly query the same file. This message provides direct access to flowR's Query API. Please consult the Query API documentation for more information.Example of the
request-query
MessageNote: 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.4.7", "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
filetoken
ofx
to slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "library(ggplot)\nlibrary(dplyr)\nlibrary(readr)\n\n# read data with read_csv\ndata <- read_csv('data.csv')\ndata2 <- read_csv('data2.csv')\n\nm <- mean(data$x) \nprint(m)\n\ndata %>%\n\tggplot(aes(x = x, y = y)) +\n\tgeom_point()\n\t\nplot(data2$x, data2$y)\npoints(data2$x, data2$y)\n\t\nprint(mean(data2$k))" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,15,10,0,\"expr\",false,\"library(ggplot)\"],[1,1,1,7,1,3,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[1,1,1,7,3,10,\"expr\",false,\"library\"],[1,8,1,8,2,10,\"'('\",true,\"(\"],[1,9,1,14,4,6,\"SYMBOL\",true,\"ggplot\"],[1,9,1,14,6,10,\"expr\",false,\"ggplot\"],[1,15,1,15,5,10,\"')'\",true,\")\"],[2,1,2,14,23,0,\"expr\",false,\"library(dplyr)\"],[2,1,2,7,14,16,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[2,1,2,7,16,23,\"expr\",false,\"library\"],[2,8,2,8,15,23,\"'('\",true,\"(\"],[2,9,2,13,17,19,\"SYMBOL\",true,\"dplyr\"],[2,9,2,13,19,23,\"expr\",false,\"dplyr\"],[2,14,2,14,18,23,\"')'\",true,\")\"],[3,1,3,14,36,0,\"expr\",false,\"library(readr)\"],[3,1,3,7,27,29,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[3,1,3,7,29,36,\"expr\",false,\"library\"],[3,8,3,8,28,36,\"'('\",true,\"(\"],[3,9,3,13,30,32,\"SYMBOL\",true,\"readr\"],[3,9,3,13,32,36,\"expr\",false,\"readr\"],[3,14,3,14,31,36,\"')'\",true,\")\"],[5,1,5,25,42,-59,\"COMMENT\",true,\"# read data with read_csv\"],[6,1,6,28,59,0,\"expr\",false,\"data <- read_csv('data.csv')\"],[6,1,6,4,45,47,\"SYMBOL\",true,\"data\"],[6,1,6,4,47,59,\"expr\",false,\"data\"],[6,6,6,7,46,59,\"LEFT_ASSIGN\",true,\"<-\"],[6,9,6,28,57,59,\"expr\",false,\"read_csv('data.csv')\"],[6,9,6,16,48,50,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[6,9,6,16,50,57,\"expr\",false,\"read_csv\"],[6,17,6,17,49,57,\"'('\",true,\"(\"],[6,18,6,27,51,53,\"STR_CONST\",true,\"'data.csv'\"],[6,18,6,27,53,57,\"expr\",false,\"'data.csv'\"],[6,28,6,28,52,57,\"')'\",true,\")\"],[7,1,7,30,76,0,\"expr\",false,\"data2 <- read_csv('data2.csv')\"],[7,1,7,5,62,64,\"SYMBOL\",true,\"data2\"],[7,1,7,5,64,76,\"expr\",false,\"data2\"],[7,7,7,8,63,76,\"LEFT_ASSIGN\",true,\"<-\"],[7,10,7,30,74,76,\"expr\",false,\"read_csv('data2.csv')\"],[7,10,7,17,65,67,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[7,10,7,17,67,74,\"expr\",false,\"read_csv\"],[7,18,7,18,66,74,\"'('\",true,\"(\"],[7,19,7,29,68,70,\"STR_CONST\",true,\"'data2.csv'\"],[7,19,7,29,70,74,\"expr\",false,\"'data2.csv'\"],[7,30,7,30,69,74,\"')'\",true,\")\"],[9,1,9,17,98,0,\"expr\",false,\"m <- mean(data$x)\"],[9,1,9,1,81,83,\"SYMBOL\",true,\"m\"],[9,1,9,1,83,98,\"expr\",false,\"m\"],[9,3,9,4,82,98,\"LEFT_ASSIGN\",true,\"<-\"],[9,6,9,17,96,98,\"expr\",false,\"mean(data$x)\"],[9,6,9,9,84,86,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[9,6,9,9,86,96,\"expr\",false,\"mean\"],[9,10,9,10,85,96,\"'('\",true,\"(\"],[9,11,9,16,91,96,\"expr\",false,\"data$x\"],[9,11,9,14,87,89,\"SYMBOL\",true,\"data\"],[9,11,9,14,89,91,\"expr\",false,\"data\"],[9,15,9,15,88,91,\"'$'\",true,\"$\"],[9,16,9,16,90,91,\"SYMBOL\",true,\"x\"],[9,17,9,17,92,96,\"')'\",true,\")\"],[10,1,10,8,110,0,\"expr\",false,\"print(m)\"],[10,1,10,5,101,103,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[10,1,10,5,103,110,\"expr\",false,\"print\"],[10,6,10,6,102,110,\"'('\",true,\"(\"],[10,7,10,7,104,106,\"SYMBOL\",true,\"m\"],[10,7,10,7,106,110,\"expr\",false,\"m\"],[10,8,10,8,105,110,\"')'\",true,\")\"],[12,1,14,20,158,0,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y)) +\\n\\tgeom_point()\"],[12,1,13,33,149,158,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y))\"],[12,1,12,4,116,118,\"SYMBOL\",true,\"data\"],[12,1,12,4,118,149,\"expr\",false,\"data\"],[12,6,12,8,117,149,\"SPECIAL\",true,\"%>%\"],[13,9,13,33,147,149,\"expr\",false,\"ggplot(aes(x = x, y = y))\"],[13,9,13,14,120,122,\"SYMBOL_FUNCTION_CALL\",true,\"ggplot\"],[13,9,13,14,122,147,\"expr\",false,\"ggplot\"],[13,15,13,15,121,147,\"'('\",true,\"(\"],[13,16,13,32,142,147,\"expr\",false,\"aes(x = x, y = y)\"],[13,16,13,18,123,125,\"SYMBOL_FUNCTION_CALL\",true,\"aes\"],[13,16,13,18,125,142,\"expr\",false,\"aes\"],[13,19,13,19,124,142,\"'('\",true,\"(\"],[13,20,13,20,126,142,\"SYMBOL_SUB\",true,\"x\"],[13,22,13,22,127,142,\"EQ_SUB\",true,\"=\"],[13,24,13,24,128,130,\"SYMBOL\",true,\"x\"],[13,24,13,24,130,142,\"expr\",false,\"x\"],[13,25,13,25,129,142,\"','\",true,\",\"],[13,27,13,27,134,142,\"SYMBOL_SUB\",true,\"y\"],[13,29,13,29,135,142,\"EQ_SUB\",true,\"=\"],[13,31,13,31,136,138,\"SYMBOL\",true,\"y\"],[13,31,13,31,138,142,\"expr\",false,\"y\"],[13,32,13,32,137,142,\"')'\",true,\")\"],[13,33,13,33,143,147,\"')'\",true,\")\"],[13,35,13,35,148,158,\"'+'\",true,\"+\"],[14,9,14,20,156,158,\"expr\",false,\"geom_point()\"],[14,9,14,18,151,153,\"SYMBOL_FUNCTION_CALL\",true,\"geom_point\"],[14,9,14,18,153,156,\"expr\",false,\"geom_point\"],[14,19,14,19,152,156,\"'('\",true,\"(\"],[14,20,14,20,154,156,\"')'\",true,\")\"],[16,1,16,22,184,0,\"expr\",false,\"plot(data2$x, data2$y)\"],[16,1,16,4,163,165,\"SYMBOL_FUNCTION_CALL\",true,\"plot\"],[16,1,16,4,165,184,\"expr\",false,\"plot\"],[16,5,16,5,164,184,\"'('\",true,\"(\"],[16,6,16,12,170,184,\"expr\",false,\"data2$x\"],[16,6,16,10,166,168,\"SYMBOL\",true,\"data2\"],[16,6,16,10,168,170,\"expr\",false,\"data2\"],[16,11,16,11,167,170,\"'$'\",true,\"$\"],[16,12,16,12,169,170,\"SYMBOL\",true,\"x\"],[16,13,16,13,171,184,\"','\",true,\",\"],[16,15,16,21,179,184,\"expr\",false,\"data2$y\"],[16,15,16,19,175,177,\"SYMBOL\",true,\"data2\"],[16,15,16,19,177,179,\"expr\",false,\"data2\"],[16,20,16,20,176,179,\"'$'\",true,\"$\"],[16,21,16,21,178,179,\"SYMBOL\",true,\"y\"],[16,22,16,22,180,184,\"')'\",true,\")\"],[17,1,17,24,209,0,\"expr\",false,\"points(data2$x, data2$y)\"],[17,1,17,6,188,190,\"SYMBOL_FUNCTION_CALL\",true,\"points\"],[17,1,17,6,190,209,\"expr\",false,\"points\"],[17,7,17,7,189,209,\"'('\",true,\"(\"],[17,8,17,14,195,209,\"expr\",false,\"data2$x\"],[17,8,17,12,191,193,\"SYMBOL\",true,\"data2\"],[17,8,17,12,193,195,\"expr\",false,\"data2\"],[17,13,17,13,192,195,\"'$'\",true,\"$\"],[17,14,17,14,194,195,\"SYMBOL\",true,\"x\"],[17,15,17,15,196,209,\"','\",true,\",\"],[17,17,17,23,204,209,\"expr\",false,\"data2$y\"],[17,17,17,21,200,202,\"SYMBOL\",true,\"data2\"],[17,17,17,21,202,204,\"expr\",false,\"data2\"],[17,22,17,22,201,204,\"'$'\",true,\"$\"],[17,23,17,23,203,204,\"SYMBOL\",true,\"y\"],[17,24,17,24,205,209,\"')'\",true,\")\"],[19,1,19,20,235,0,\"expr\",false,\"print(mean(data2$k))\"],[19,1,19,5,215,217,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[19,1,19,5,217,235,\"expr\",false,\"print\"],[19,6,19,6,216,235,\"'('\",true,\"(\"],[19,7,19,19,230,235,\"expr\",false,\"mean(data2$k)\"],[19,7,19,10,218,220,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[19,7,19,10,220,230,\"expr\",false,\"mean\"],[19,11,19,11,219,230,\"'('\",true,\"(\"],[19,12,19,18,225,230,\"expr\",false,\"data2$k\"],[19,12,19,16,221,223,\"SYMBOL\",true,\"data2\"],[19,12,19,16,223,225,\"expr\",false,\"data2\"],[19,17,19,17,222,225,\"'$'\",true,\"$\"],[19,18,19,18,224,225,\"SYMBOL\",true,\"k\"],[19,19,19,19,226,230,\"')'\",true,\")\"],[19,20,19,20,231,235,\"')'\",true,\")\"]",".meta":{"timing":4}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.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-11174-qJbPMJXKVMzH-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-11174-qJbPMJXKVMzH-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11174-qJbPMJXKVMzH-.R"],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":8}}}}
-
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": 1 } } }
The complete round-trip took 31.2 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-query
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-query.ts
.-
. object
Request a query to be run on the file analysis information.
- type string [required] The type of the message. Allows only the values: 'request-query'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
-
query array [required]
The query to run on the file analysis information.
Valid item types:
-
. alternatives
Any query
-
. alternatives
Supported queries
-
. object
Call context query used to find calls in the dataflow graph
- type string [required] The type of the query. Allows only the values: 'call-context'
- callName string [required] Regex regarding the function name!
-
callNameExact boolean [optional]
Should we automatically add the
^
and$
anchors to the regex to make it an exact match? -
kind string [optional]
The kind of the call, this can be used to group calls together (e.g., linking
plot
tovisualize
). Defaults to.
-
subkind string [optional]
The subkind of the call, this can be used to uniquely identify the respective call type when grouping the output (e.g., the normalized name, linking
ggplot
toplot
). 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 off
to be included in the results? -
fileFilter object [optional]
Filter that, when set, a node's file attribute must match to be considered
- fileFilter string [required] Regex that a node's file attribute must match to be considered
-
includeUndefinedFiles boolean [optional]
If
fileFilter
is set, but a nodesfile
attribute 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
points
to the latest graphics plot etc.-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName string [required]
Regex regarding the function name of the last call. Similar to
callName
, strings are interpreted as a regular expression. - ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. array
Valid item types:
-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName string [required]
Regex regarding the function name of the last call. Similar to
callName
, strings are interpreted as a regular expression. - ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. object
-
. object
-
. object
The config query retrieves the current configuration of the flowR instance.
- type string [required] The type of the query. Allows only the values: 'config'
-
. object
The control flow query provides the control flow graph of the analysis, optionally simplified.
- type string [required] The type of the query. Allows only the values: 'control-flow'
-
config object [optional]
Optional configuration for the control flow query.
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
- . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
-
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
Lineage query used to find the lineage of a node in the dataflow graph
- type string [required] The type of the query. Allows only the values: 'lineage'
- criterion string [required] The slicing criterion of the node to get the lineage of.
-
. object
The dependencies query retrieves and returns the set of all dependencies in the dataflow graph, which includes libraries, sourced files, read data, and written data.
- type string [required] The type of the query. Allows only the values: 'dependencies'
- ignoreDefaultFunctions boolean [optional] Should the set of functions that are detected by default be ignored/skipped?
-
libraryFunctions array [optional]
The set of library functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. 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 data reading functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
writeFunctions array [optional]
The set of data writing functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
. object
The location map query retrieves the location of every id in the ast.
- type string [required] The type of the query. Allows only the values: 'location-map'
-
ids array [optional]
Optional list of ids to filter the results by.
Valid item types:
- . string
-
. object
The search query searches the normalized AST and dataflow graph for nodes that match the given search query.
- type string [required] The type of the query. Allows only the values: 'search'
- search object [required] The search query to execute.
-
. object
Happens-Before tracks whether a always happens before b.
- type string [required] The type of the query. Allows only the values: 'happens-before'
- a string [required] The first slicing criterion.
- b string [required] The second slicing criterion.
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'resolve-value'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
-
. object
The project query provides information on the analyzed project.
- type string [required] The type of the query. Allows only the values: 'project'
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'origin'
- criterion string [required] The slicing criteria to use
-
. object
The linter query lints for the given set of rules and returns the result.
- type string [required] The type of the query. Allows only the values: 'linter'
-
rules array
The rules to lint for. If unset, all rules will be included.
Valid item types:
- . string Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'dataframe-access-validation', 'dead-code', 'useless-loop'
-
. object
- name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'dataframe-access-validation', 'dead-code', 'useless-loop'
- config object
-
. 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.
-
-
Lineage Message (
request-lineage
)View Details. (deprecated) Obtain the lineage of a given slicing criterion.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-lineage alt Server-->>Client: response-lineage else Server-->>Client: error end deactivate Server
We deprecated the lineage request in favor of the
lineage
Query.In order to retrieve the lineage of an object, you have to send a file analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly retrieve the lineage of the same file. Besides that, you will need to add a criterion that specifies the object whose lineage you're interested in.Example of the
request-query
MessageNote: 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.4.7", "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" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11174-0OFZ6zHVSYYy-.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-11174-0OFZ6zHVSYYy-.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-11174-0OFZ6zHVSYYy-.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-11174-0OFZ6zHVSYYy-.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-11174-0OFZ6zHVSYYy-.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-11174-0OFZ6zHVSYYy-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11174-0OFZ6zHVSYYy-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":256,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11174-0OFZ6zHVSYYy-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":1}}}}
-
request-lineage
(request)Show Details
{ "type": "request-lineage", "id": "2", "filetoken": "x", "criterion": "2@x" }
-
response-lineage
(response)Show Details
The response contains the lineage of the desired object in form of an array of IDs (as the representation of a set).
{ "type": "response-lineage", "id": "2", "lineage": [ 3, 0, 1, 2, "built-in:<-" ] }
The complete round-trip took 12.2 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-lineage
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-lineage.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-lineage'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
- criterion string [required] The criterion to start the lineage from.
Message schema (
response-lineage
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-lineage.ts
.-
. object
- type string [required] Allows only the values: 'response-lineage'
- id string [optional] The id of the message, will be the same for the request.
-
lineage array [required]
The lineage of the given criterion.
Valid item types:
- . string
-
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.
Available Commands
We currently offer the following commands (this with a [*]
suffix are available with and without the star):
Command | Description |
---|---|
:quit | End the repl (aliases: :q, :exit) |
:execute | Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r) |
:controlflow[*] | Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) |
:controlflowbb[*] | Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) |
:dataflow[*] | Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) |
:normalize[*] | Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) |
:dataflowsimple[*] | Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) |
:lineage | Get the lineage of an R object (alias: :lin) |
:parse | Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) |
:version | Prints the version of flowR as well as the current version of R |
:query[*] | Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) |
:help | Show help information (aliases: :h, :?) |
To retrieve a URL to the mermaid diagram of the dataflow of a given expression,
use :dataflow*
(or :dataflow
to get the mermaid code in the cli):
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.4.7, R v4.5.0 (r-shell engine)
R> :dataflow* y <- 1 + x
Output
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgYnVpbHQtaW46Xy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfLSBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAzIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46X1xuICAgIGxpbmtTdHlsZSAyIHN0cm9rZTpncmF5O1xuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCAzXG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDRcbiAgICA0IC0tPnxcImFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=
Retrieve the dataflow graph of the expression y <- 1 + x
. It looks like this:
flowchart LR
1{{"`#91;RNumber#93; 1
(1)
*1.6*`"}}
2(["`#91;RSymbol#93; x
(2)
*1.10*`"])
3[["`#91;RBinaryOp#93; #43;
(3)
*1.6-10*
(1, 2)`"]]
built-in:_["`Built-In:
#43;`"]
style built-in:_ stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
0["`#91;RSymbol#93; y
(0)
*1.1*`"]
4[["`#91;RBinaryOp#93; #60;#45;
(4)
*1.1-10*
(0, 3)`"]]
built-in:_-["`Built-In:
#60;#45;`"]
style built-in:_- stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
3 -->|"reads, argument"| 1
3 -->|"reads, argument"| 2
3 -.->|"reads, calls"| built-in:_
linkStyle 2 stroke:gray;
0 -->|"defined-by"| 3
0 -->|"defined-by"| 4
4 -->|"argument"| 3
4 -->|"returns, argument"| 0
4 -.->|"reads, calls"| built-in:_-
linkStyle 7 stroke:gray;
R Code of the Dataflow Graph
The analysis required 3.2 ms (including parse and normalize, using the r-shell engine) within the generation environment. We encountered no unknown side effects during the analysis.
y <- 1 + x
For the slicing with :slicer
, you have access to the same magic comments as with the slice request.
Many commands that allow for an R-expression (like :dataflow*
) allow for a file as well
if the argument starts with file://
.
If you are working from the root directory of the flowR repository, the following gives you the parsed AST of the example file using the :parse
command:
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.4.7, R v4.5.0 (r-shell engine)
R> :parse file://test/testfiles/example.R
Output
exprlist
├ expr
│ ├ expr
│ │ ╰ SYMBOL "sum" (1:1─3)
│ ├ LEFT_ASSIGN "<-" (1:5─6)
│ ╰ expr
│ ╰ NUM_CONST "0" (1:8)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "product" (2:1─7)
│ ├ LEFT_ASSIGN "<-" (2:9─10)
│ ╰ expr
│ ╰ NUM_CONST "1" (2:12)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "w" (3:1)
│ ├ LEFT_ASSIGN "<-" (3:3─4)
│ ╰ expr
│ ╰ NUM_CONST "7" (3:6)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "N" (4:1)
│ ├ LEFT_ASSIGN "<-" (4:3─4)
│ ╰ expr
│ ╰ NUM_CONST "10" (4:6─7)
├ expr
│ ├ FOR "for" (6:1─3)
│ ├ forcond
│ │ ├ ( "(" (6:5)
│ │ ├ SYMBOL "i" (6:6)
│ │ ├ IN "in" (6:8─9)
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ NUM_CONST "1" (6:11)
│ │ │ ├ : ":" (6:12)
│ │ │ ╰ expr
│ │ │ ├ ( "(" (6:13)
│ │ │ ├ expr
│ │ │ │ ├ expr
│ │ │ │ │ ╰ SYMBOL "N" (6:14)
│ │ │ │ ├ - "-" (6:15)
│ │ │ │ ╰ expr
│ │ │ │ ╰ NUM_CONST "1" (6:16)
│ │ │ ╰ ) ")" (6:17)
│ │ ╰ ) ")" (6:18)
│ ╰ expr
│ ├ { "{" (6:20)
│ ├ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "sum" (7:3─5)
│ │ ├ LEFT_ASSIGN "<-" (7:7─8)
│ │ ╰ expr
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ SYMBOL "sum" (7:10─12)
│ │ │ ├ + "+" (7:14)
│ │ │ ╰ expr
│ │ │ ╰ SYMBOL "i" (7:16)
│ │ ├ + "+" (7:18)
│ │ ╰ expr
│ │ ╰ SYMBOL "w" (7:20)
│ ├ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "product" (8:3─9)
│ │ ├ LEFT_ASSIGN "<-" (8:11─12)
│ │ ╰ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "product" (8:14─20)
│ │ ├ * "*" (8:22)
│ │ ╰ expr
│ │ ╰ SYMBOL "i" (8:24)
│ ╰ } "}" (9:1)
├ expr
│ ├ expr
│ │ ╰ SYMBOL_FUNCTION_CALL "cat" (11:1─3)
│ ├ ( "(" (11:4)
│ ├ expr
│ │ ╰ STR_CONST "\"Sum:\"" (11:5─10)
│ ├ , "," (11:11)
│ ├ expr
│ │ ╰ SYMBOL "sum" (11:13─15)
│ ├ , "," (11:16)
│ ├ expr
│ │ ╰ STR_CONST "\"\\n\"" (11:18─21)
│ ╰ ) ")" (11:22)
╰ expr
├ expr
│ ╰ SYMBOL_FUNCTION_CALL "cat" (12:1─3)
├ ( "(" (12:4)
├ expr
│ ╰ STR_CONST "\"Product:\"" (12:5─14)
├ , "," (12:15)
├ expr
│ ╰ SYMBOL "product" (12:17─23)
├ , "," (12:24)
├ expr
│ ╰ STR_CONST "\"\\n\"" (12:26─29)
╰ ) ")" (12:30)
Retrieve the parsed AST of the example file.
File Content
sum <- 0
product <- 1
w <- 7
N <- 10
for (i in 1:(N-1)) {
sum <- sum + i + w
product <- product * i
}
cat("Sum:", sum, "\n")
cat("Product:", product, "\n")
As flowR directly transforms this AST the output focuses on being human-readable instead of being machine-readable.
When running flowR, you may want to specify some behaviors with a dedicated configuration file.
By default, flowR looks for a file named flowr.json
in the current working directory (or any higher directory).
You can also specify a different file with --config-file
or pass the configuration inline using --config-json
.
To inspect the current configuration, you can run flowr with the --verbose
flag, or use the config
Query.
Within the REPL this works by running the following:
:query @config
The following summarizes the configuration options:
-
ignoreSourceCalls
: If set 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": {}
}
]
}
}
},
"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 tofalse
explicitly disables the loading of the default definitions. -
definitions
(array, initially empty): Allows to overwrite or define new built-in elements. Each object within must have atype
which is one of the below. Furthermore, they may define a string array ofnames
which specifies the identifiers to bind the definitions to. You may useassumePrimitive
to specify whether flowR should assume that this is a primitive non-library definition (so you probably just do not want to specify the key).Type Description Example constant
Additionally allows for a value
this should resolve to.{ type: 'constant', names: ['NULL', 'NA'], value: null }
function
Is a rather flexible way to define and bind built-in functions. For the time, we do not have extensive documentation to cover all the cases, so please either consult the sources with the default-builtin-config.ts
or open a new issue.{ type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }
replacement
A comfortable way to specify replacement functions like $<-
ornames<-
.suffixes
describes the... suffixes to attach automatically.{ type: 'replacement', suffixes: ['<-', '<<-'], names: ['[', '[['] }
Full Configuration-File Schema
-
. object
The configuration file format for flowR.
- ignoreSourceCalls boolean [optional] Whether source calls should be ignored, causing {@link processSourceCall}'s behavior to be skipped.
-
semantics object
Configure language semantics and how flowR handles them.
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
- loadDefaults boolean [optional] Should the default configuration still be loaded?
-
definitions array [optional]
The definitions to load/overwrite.
Valid item types:
- . object
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
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
ignoreSourceCalls
is set to false.- dropPaths string Allow to drop the first or all parts of the sourced path, if it is relative. Allows only the values: 'no', 'once', 'all'
- ignoreCapitalization boolean Search for filenames matching in the lowercase.
- inferWorkingDirectory string Try to infer the working directory from the main or any script to analyze. Allows only the values: 'no', 'main-script', 'active-script', 'any-script'
-
searchPath array
Additionally search in these paths.
Valid item types:
- . string
- repeatedSourceLimit number [optional] How often the same file can be sourced within a single run? Please be aware: in case of cyclic sources this may not reach a fixpoint so give this a sensible limit.
-
applyReplacements array
Provide name replacements for loaded files
Valid item types:
- . object
-
slicer object [optional]
The configuration for the slicer.
- threshold number [optional] The maximum number of iterations to perform on a single function call during slicing.
-
abstractInterpretation object
The configuration options for abstract interpretation.
-
dataFrame object
The configuration of the shape inference for data frames.
- maxColNames number The maximum number of columns names to infer for data frames before over-approximating the column names to top.
- wideningThreshold number The threshold for the number of visitations of a node at which widening should be performed to ensure the termination of the fixpoint iteration.
-
readLoadedData object
Configuration options for reading data frame shapes from loaded external data files, such as CSV files.
- readExternalFiles boolean Whether data frame shapes should be extracted from loaded external files, such as CSV files.
- maxReadLines number The maximum number of lines to read when extracting data frame shapes from loaded files, such as CSV files.
-
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 tryToInjectHomeLibPath
may be of interest, as it enables all libraries available on the host system.
Once, in the beginning, flowR was meant to produce a dataflow graph merely to provide program slices.
However, with continuous updates, the dataflow graph repeatedly proves to be the more interesting part.
With this, we restructured flowR's originally hardcoded pipeline to be far more flexible.
Now, it can be theoretically extended or replaced with arbitrary steps, optional steps, and what we call 'decorations' of these steps.
In short, if you still "just want to slice" you can do it like this with the PipelineExecutor
:
const slicer = new PipelineExecutor(DEFAULT_SLICING_PIPELINE, {
parser: new RShell(),
request: requestFromInput('x <- 1\nx + 1'),
criterion: ['2@x']
})
const slice = await slicer.allRemainingSteps()
// console.log(slice.reconstruct.code)
More Information
If you compare this, with what you would have done with the old (and removed) SteppingSlicer
,
this essentially just requires you to replace the SteppingSlicer
with the PipelineExecutor
and to pass the DEFAULT_SLICING_PIPELINE
as the first argument.
The PipelineExecutor
...
- 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.ts
file 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
initialExampleInfo
type holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resultingExampleInfo
type holds the structure of the data that is to be counted. Due to the vast amount of data processed, information like the name and location of a function call is not stored here, but instead written to disk (see below).Every new feature must be of the
Feature<Info>
type, withInfo
referring to aFeatureInfo
(likeExampleInfo
in this example). Next to aname
and 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.ts
file insrc/statistics/features
, add your feature to theALL_FEATURES
object.
Now, we want to extract something. For the example feature created in the previous steps, we choose to count the amount of COMMENT
tokens.
So we define a corresponding XPath query:
const commentQuery: Query = xpath.parse('//COMMENT')
Within our feature's process
function, running the query is as simple as:
const comments = commentQuery.select({ node: input.parsedRAst })
Now we could do a lot of further processing, but for simplicity, we only record every comment found this way:
appendStatisticsFile(example.name, 'comments', comments, input.filepath)
We use example.name
to avoid duplication with the name that we’ve assigned to the feature. It corresponds to the name of the folder in the statistics output.
'comments'
refers to a freely chosen (but unique) name, that will be used as the name for the output file within the folder. The comments
variable holds the result of the query, which is an array of nodes. Finally, we pass the filepath
of the file that was analyzed (if known), so that it can be added to the statistics file (as additional information).
Currently maintained by Florian Sihler at Ulm University
Email | GitHub | Penguins | Portfolio