-
Notifications
You must be signed in to change notification settings - Fork 8
Interface
This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-09-09, 22:23:19 UTC presenting an overview of flowR's interfaces (v2.4.8, 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.8", "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.8", "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":4}},"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-9604-Z69iEb6KKrpv-.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-9604-Z69iEb6KKrpv-.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-9604-Z69iEb6KKrpv-.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-9604-Z69iEb6KKrpv-.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-9604-Z69iEb6KKrpv-.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-9604-Z69iEb6KKrpv-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9604-Z69iEb6KKrpv-.R","role":"root","index":0}},".meta":{"timing":4}},"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-9604-Z69iEb6KKrpv-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":5}}}}
-
The complete round-trip took 18.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.8", "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-9604-tfox2ZNmrGHb-.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.8%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%2D9604%2Dtfox2ZNmrGHb%2D.R%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A75%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A184%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A148%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A58%3A18%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A200%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A259%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A153%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09" }
The complete round-trip took 8.2 ms (including time required to validate the messages, start, and stop the internal mock server).
Including the Control Flow Graph
While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add
cfg: true
to its list of options.Requesting a Control Flow Graph
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.4.8", "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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-9604-bIEYZ7boRuD8-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-9604-bIEYZ7boRuD8-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.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-9604-bIEYZ7boRuD8-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-9604-bIEYZ7boRuD8-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-9604-bIEYZ7boRuD8-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-9604-bIEYZ7boRuD8-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-9604-bIEYZ7boRuD8-.R"],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"function-call","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"variable-definition","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"function-call","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"variable-definition","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"function-call","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"variable-definition","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"function-call","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"function-call","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"function-call","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":3}}}}
The complete round-trip took 10.5 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.8", "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.8", "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䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ气䥓ѣ⤀㐽ᩢɀᐲᲵ䎴䭌ذ綞卒佢ᡨ侶䧴䜉䮂疲䀾䂁拠ᏹ籀ř䑪߬၄ؠΐDžᑘुࠠ嘠˅☰墴儠ಳኡ㻐傔介㎔ᴩ̕ᰮ㏭ьᓑ㕍旅㛌响㟨ࡳᒍ䷋㞌嶯㙕緀灀⎡僄ᦤ犼䡶ֽⲢ炣䮨ս毂ǂ寀哄㒰矽Ý柉灼㞽炝俛甝忟琣䂈Ǚ兩䙘㎠偆啬掿Ⴤ婲ǂ⦹牢ె仳㪂ǘ昨Ą偗㝠ㄬi瑲ϒ恨㪓厄堨䛬㒴䅪烢▿ፌᖵ㇌炜䙀ඳㆌ熹༌ᓏ㛠咘犅⠡䵁䳖琲箨]䲆㜳投痝矃疜ᾷ瘜pढᅺ灍䊄皼塒ᑼ檡䘱嫎哠悉吭ᦥ勔倭叔䳔ත⺢㒘ᬢ䑣ၿᝲ䆨㜭ᇔㆢ燑坸捒㟲Ẇき玒ವಪ墌ⷣ㗑汁䥩୫ᰧリ奮Ⱡ䩍ࡓ䕗⣊⁋ྊ㲆癋㮷⽋䟄介剽⮳ං䦊⪗䤂偬㖣䮇⎥櫠桤ⳣ冖ப硱汆ጻ浫䫚⣂綪琼縠䃳়珛ದ睧⥒䳟ৼ䊐灦扲Ჲ㕬俋牳⩳ⶊ䤴暰㋒憮䯳瑡䴠䙮ᘶ‹䬠ᙦ嫷㙢抅ຓ䶓湦㌓ಯ䢴偟䧒′昫ⅶė擴ⴠㅮྪԘ攈ഉഛ撆Ⳃ泲ȧ禙汋⋩⾧⊅⺷ឪᶲൢ事䩻ⰶ㱭ਇ㶏⠋ʰ槴竈緝氅䒃ᮌሗ溮岀瑯ㄘ夲⦷彧㨒弢㶆㊼Ⲱ劧ᶅܓ㣞ᑅ᭹ᙯ㡗佡交ຠޖ૦ʴ盌䮘割丣ずヰ欒嗜勦佹㊋䅄ำ䷑ⅹᡤ扻ㄧ碬优㾣䠹㽩∖喁昈Ⲹ恓ӳᥝ秠␕ᕠဆ嚨Ǭ殠磗רᢳპᜥᡗ₰ᬄ撦䌘⒪㡉༳仈�ㆢ䁚წ倠᱆⮠#䞵⎪䋻哉焮ᇒ⣆Ġ㊫僚偓綨ദ俅ႀౠ晰㙐嵨᪴䢡䉔⊐⼦礱䡶࣐䁷獱䱪撟拥䆴⊲咉₨栰䡯ȱᢦሃ⯩䧰♥ど䕈炡⢴䂑ഹ愘ᢡ婓䆔㽥籬ܸ暃ٳད唰煕枂ᄪ⥪тᱨݘ咨惹ྱ梵煊ᒲ⥓ঐ⁆礴ᏹ∬昢䵩ᆋȐᔲㅛ扌⫄沂◄䒬攗ற伶ㆭᢠᄨ協⤡䪈♪㽩哨䡱㲴楍ᵀႂᝣᑕ➨䨩㢰Α䰵樕ᕓ࠾㌶㫄䁑☤嶱ೌϹ▸㇕ᡙፇ剴㴆剢⛬塣㓵䤉䶳䤭ធ̈́卜勻䙪㏯໙岻㤶ᴓཐ∠牆宁墚杨篮瓸䶥♢䰸≨䉴-ᇐ戥ヤᐢ前ᝬ廦⦮慲‽ੂ冏⛢呏㭘⸄Ѻ燨嶳瓅⎠㌴༮᙮ᰧ拢⹅剿⌄冱ᓀ匄♸ᛤ䟒㌗皰✲㌞ࢪ᭓䯖㰶ဲ唻㋃猁⏥ᝌᕄ奢ؼ⭬ቶ忎唸嵊櫸侞♰tᙺ嘊凪Ṟ殚◴㆞垂懌ଃⴀ≺㖄呒ዔ獓߶楽⓼汩㫆⩜坻把廪奓欃㟅ᎏ喂罊᪢⸭ᅶ㔶圠囘碅㍪䕆午]㊋㋄⽭ⶵⴶὺ㧀欙ὔ䶈垺碌嫨椠盳ව娒淆㌤•࠻㕕ᮇ⒜仮亮瀕ഥ刻㷄嫫⬡ᝨ疒䖮仆⠠縹澕曰巺力䯏⟗ட㚶愊廝欕ᔲ㷮吊⭞இ⍴㍼垚璍犵淥寸ⷁ噊㫃㩖涌㠞䪪㪤淑妰Üᑚ㶉彛篑ð筺㭨പ堼滨᰽屜㙚㢝ڹ㊗儒埄富憴Ϸ⎚宺ǐ䙗㼖ဥᘮ洸嚪ᱽ橜䎢ဠ簸㝛䲕嬰ɯ⾇ദ眻۾羺纒㌚㊂⚹ぢ┏瓖簸壽ᾳ嗵捥峆粍⛢偮䝮有卋ᬝ噳紾傇ᒑ朐砬չ価徉⦡櫓Ⱙ琄㮇嫓暔槬啪㖾嘹а㙔͗將䒀⡎㍂⳹瘾旆⠠劜寳㝑㷑ᡶ庅᜴糬ℚⵡ䠧ᗰ廣狐⭧䑷璓紻㽮䬏⠅歸喥ώ櫟玶㕫㶍坔烮း汮絺㫖库䙕Ꮊ升禎㠚瓭⫿䶎愍⸑嶣ブ⮋ぷᒾ㟂珌䫳ⲽ竸ᇭ孫ᇕᖹ侶垑堂樌⤱ⵒ暇㖴ཛ珽䍿㻧碇枎枯漋砣绿綹塔㧀孑㓧䮒㚁笏Ȁ涍䤼斡⮺⏨瓫瀠Ľ䖏砂炼列㔱桝⧊⭇៓ᎄ羮瀠仂ऩൗ澞汾䧩屇ᚘ㔄稦䪆囡牰程ᴅ楚㏾㩔䚜杼ೈ㒽乼玾ህഓ峝渳㒗㯴焖⸽ͼ燮搻糙䷢㫤䩩Ẑ簖熞亹狼㳆廃师姽㶞க㠂美ԑ溥⤬̸ᢆᏛ㲻䄜လ窶唐ᛉ≜䏽ᾧ備߆⫾ᵭ品痯ᒍṩᷥ͟ḫ烿㯩⇯㴜㟺婾媦㙕ᎠՒ烻殹Ꮉ㬕ཀ眏㈏慳㸄澗忂㌆懤䀿⾇㣾戒䚧撝尖峧䙺勉砥义ࠑ㣞碠㽤懨濂幍坾戒⎇䂝猥瑗宓ฯ矞⣥絒䝄崦繷㿵㼰க䦀㝽桿௶˿昙洏窅⮓劘�搀羗ᤌ䀢栬¹篟䣝Ḋ繨Ԡ㊙昋।נᨣ礌 ↭焄孧碻䬣碣ê㢗府笌侌ԟ孵ᐼ₻筚ཝ砀䜢ފ䎰ئ⽷碍嚜搷⭖ַ䖜㊇惊簃䂼倣䂮宯䭜✊ᄄڐ⭽〶㼺㣨㪣ㅃ�Ւ䈠憪ὼۻ䩣嫉僮ᇨ◽羘٪â⨻椫Ւ䪐篩䀽稀⾝熋オ⏸⤝ᖍ想ް㘘⸶炡Ճ䈥⸳᭭烒H債㤌䑂愾烗碸⸣帹ᒈ䜉ᅝᒌ䤊秠ᝰ╮ࣩ٤㭵៥䣃㤸┝椋⭡栴㎡夲䃾䡴Ⓣ礍䔪₲ඡᨇ䣵є⧂⽥Ѱ㷃䴺䢳㬔⚌傡⃔▣ㅌᣱ䠇䁽⠁䝊⩬㋢⩀壆⡚ż䰿䄐ފ喃ᴻᣒ䚃它紵墶փ䜻䁪Ƭ㎃ㅊ夓䔌㓃䌅䀻䑼圶㢫䚼⪱縩㤎壈喂弽ᤈ礐ゔ缸墫ࢢ㌢ۣ䣐Ԝ⋤䈉Ӹ䖐Ⅲ猱℃ნ㟄炳᭜⍶ᰃ簈ᕣ笴⚃眹罬憂ㄝ縵㽜⓭侘⒠➜ॢ㦢圻榊⛲℠¾潏妲璽⢵℠䳉a⋒㶂丳፡◆༂㬆ヌΪ㖲㲱ㅹ⓭噳伲ᒫ寥女墊ⴲ⩁咻ئ䬰᪣7愂㧣ڼ㓳◒㏢ष⭃⤺⓳₸䂛♺⚌檥䒀䦺♭溹甋╂⾂哃甌ᅚ⡒ᖣᮝㄉ庹ᬨ敠线ऎ䛟ᙓ熿ᓀ䪲乓⌱傸ĺ⭱倡�ẲᬳӤ*ᝓ禸Ⲵ䑂㹣়䓷玶㭱ᖶ䲊枲➅භ䲷ㅶ⚍新ÜჄ㕲三᭾攋ΐ᪴Ӭ㢮ⵐ掻咫८⸠掽䳌⋌㝜尭೪᮶▒亥త斔㻓昳䳍旎㚒斸㴃䛎⩐䮲䳉䘮⊝涳䴋枮⎳ώ⳧撾㘒ᦵ旐⹒砊¦⚶㳒㾲稚䏣纰磬愡㧱㾴甈ᔸЫ儊抛۾⽣ㅅ�ᕞ㛳ρ䋵慚㜪䄴攪Ⅾޙ䖺ᒸ撱⬪䦹ᒂᓒᒪ榻⊽焱═㮺䋶䜔䒂筫峽䙡㦰ⱴ瓮ᙾ㎜䘪ᑪ䁐⫝̸摶咹ᢩⱫ氱ኺ朸⾒Ʒ圹ឩ⧳⩷ኹ孂ṱપ瑩ᔮ㊭婰呣厑⢳効䱃ᜉⲲ坍䍫ᘽᰬÐ䗑㲃㵈犣ä₳¼糬㯙♂涽啟ᜉܜ檨吭㣙ㆲ⩎⒃ᔴⰪ焴勾ᝥⱊଆ䳄嗴㎝斶帢ↂච⻧䲝ᗾ㽢㦵䪨ą⽊犵猖➁㊓䕾幒啪帓㕽䫼啪傜畲欜呥㓒╿⬜呉Ⓜ劸䣌ĕ⏊犰䢭㳋憺⪶⎲ᱢ㾋䣷ᓈ䷐墫᪶慱㾒堢嫕址㲊ᱳ坣享吀⫔᜔䒪❿櫢☭⻳䝴徜ᗽ㶝却竳埑㦋睺㊻嘮匊签竇啒䶰殠ᴟ撶㬭ôⳋ垙㫊哎۶擹㹍ン᭶㥲àት欌ᭃ㔺᭼勷犃㹫㽶ӣ㡢ᥱ⒞⦊玶✌㜑㫑擶䳚㓭䢝殳妆㚝⭳φ曔杓㺢ࡷ粽ٍ㉊ᙌ˰ᒑ儲疳䛩₫⧳勴攭⊁⊺䋸䂙㘁㶺Ꮅ┵㔤┓ᩭ碬㏒⳽喝㝠ڻ䒷抣㒾㣻䅹彐π࿃棾哛㚻㳫怤皳曻㧂䳃簩⇌摹⎏㑎㧺䍹䱠瓅₻ࠦ➥⿺剹᭐˥ⱻ㖰䫓㑇㱛烶ᓽ拇喐瑽傩ݢ㬬寣仍爸⹋拲亷㔷㗣㧴瓊矀ۚʲ摡⃠Ͱ熶�咓䀫墆F瞺嗚⒮漀瞊㟚ⷶ滽咇㹚⏿满畒䆠ۈ囲旯㿴櫳狊⥏㵛㋉⎕瓭嚑➡x㫧⃪㭋庮⎃勊㚽⊶ზᔚ亲㼝畊㝜榯朜疗㵳尵督⽼怮绻偧⠛ְⱙ㑠ತⲥ㘻㙄亪Ȑෛ㈺啹㻬捠檑し棔杀氦ၟ䜷挛⁺✼യゔ⚱廪殓傦䳆扠矄呖㻒睇➪曷⇻睰榵⒦悛㘿ナጴ棔྿∪曱懔౧㡦㎀-⸡䦡浒㒱奓悂綻ⳬᲭᵅ⍬嗄琠ఫ䡔ᥱڭ䑛⎿污䠡璋⍮䥑皭㷅塍䧱䖨缪挰栱䓖磎挦ۑ䨄岚搌᧑漹༃泾仫緣ᗮ撤䲯݄Ꮮ᫅㼔璾ऱ溩筃⇴ᏼ᭚䪨ና⺖䶩䔖燠氠澎岁珁㘘ᦳ㴂嬴嵩椠Ẅ怴儛摞Ճᐠ㢐Ĩ✯偁ማ䎄☐䍷夜䌬嵸䪟፮䰉狀㟮拇楖㥕䊉纀̹䩛㢡䃺ᡡ瞸Ƨ⌊暑㍃ඌ↙乴偉Ŷᕊ䚓䄔梮懯硩䬊߾瓬៛ط᪹凬暕憬ݹ勯熳㠠嚙曭挻㎹䌨⻯皏⻗媆ƞ獋緯⺞ᛕ珙絕ౖ㌿ṹ勱碽猫ᦙ埭ۧ㎛ᯋ㑍Ƃᵘ崥朘怼ఃṩ寶慘䬯ᤊɏ熹䛅積糳టᤗՌ佈䭐妻⸨㦒㌅偍憑玓ᵥ柭ᆄ㌔年㟭景玕㐅䑍卖⮇⺢如㍛ᙵ睌ᓞ履粂榎Ă壄Ⓨ纋ண坵湍㊍⬴媅㊠喔䮴池㖀廵䵍䖕欬帍ፍ櫱氆堩益綀䮖ဠᫍ圐㬝ᥕ۳嘸ぼⅸ泮圭䛓ླྀ䫦㵋䇲䛿囨㥦䳺܌擣㌝傏䗋㡋ͽ攵䰭㒋瓼书圂瘸ᜁ♃㥖ɦ䜙⛕㼻粆㼪ᛛ㨋㍶笀瓻㖻⅖櫐眓㡂ࢢ㜇㪫㍆⧿㛰ᵛ㚫◁盽ឳ㢋哺䫩坑潛ᇸ᷏▗ㅛ瀣䙳嵵㷊昢篔戬ୢ䳁⑊ᯞㅌ皻䁇⛐נᷨ哠凊゜描哺為㚜怭癔ⷝ२仦ࠧ䬷H䇆溛皀犰ߖ#ᇕኛ缾曮摏㈄ᰑ楤�䏫䧗⾱ថ疕毺䁍砏㪻䟺䀧➩◳㟼扅⛟㭳忼㔓✠耈ᐱȞ秠狨䡟ᜬཕܛ硙⅂䂓汚ᇩ柤翩丒潔ĺጽ烽伄涄穧⪨ቩ痈㓵྿㍧埻ٳး獳Ὸ㔟発㐧尬燸เ签㹛処ᔤ炧ສ倄穣函䒻俲垂ᎀ佗䜜筁ᙎ乿㔥䍘绵♬璜晟᧻བ䇧䪪爍什瑔ݚᬳ侤猇䲔׳厒灉ݠᠧ匀㏽䓀⾪罥〈ؕ༣悇矾ᨗ皂皇噟秐າ率ṛ娔眧杝ਗ笪祷㳚炸姞ء䀩墄⸃䧞䷶灱捷㵛嘘⸺稛棛哫⸠盷⭘瘗珷ࣛ痶⸦笜㧚◸橍㷊珙丝ȯ壇羍翝箽擗マ甛皬ࡊ̥㤸⁉مヮ䔡㐑⩣䚀焤⭾䶀嘶夨⒇痚㘆漟㫷䭜罕倖緷㓚Ḇ⾙ɇ帮㸊Ⰿ坍娱㹐匍㓍ᨲ䀩ἶ甛㟟☇澽З㿛刀䂀ႛБ凝ু㠦䐎䦁礷䙝᧲ῖ犯䓝Țὲ翧䝘嘰云綷ඎᐅ瀝㔣䖛㩧ᆐ癷庳ሮ๊尷樊湟䞪濙䁏瀞甸ЈẸ₸䏲ङ礌䛚ㇶ湌继ৃ⏪「疯ᦟ痽ⷕ煇⯝ₚ忄瞂ぁ㸿峙㸞并缗⎚縃῭穸ₛ㐕忡瞏ẘ㯧䂽缯ឞ帲爏㷚簁澀綯≧䯾巃礿Ꮽ堟伧慜⛫䠋坅䴾合⸭炿㢚䗢ᾂ粯瞜䩉㻚祏廜堒Nj笜眙㠊ཛྷ篲娜癰✌ె漮䢃秏ᔳ⋗䧟㬘⦋溛纷枚௫籟䞯௹㽑煿徙᷽營⠡䟺㎿睥М㠆糣ഠ⸛ᐉ㋟竟梟㕼爕凢រ㱭獗妾羁后枭帰箓毯⺜縔௹坢縂瞋䜞㈛㸏㿇Ò祷檗ഀ耔ῢᵀВ瓿ජ耘ἇຳ簦ǟ樠瞝爓司澄粀มച㨉ߖ㹐稇濿Ɯ᠒Ą岐ཏ䁮࠙昄⁷糮䇟抓ⲣሒ㊧⢕ℐ瓃ᥡ⃛䪌㿓ı㦿溠傣ᠭ添£崏炰㼡㾚ݮ偳劶ࠃ䚸ቬ㐪ὦ䅻˛痋尡㗘о㾼⹛㫃機ㆢ匐旲⃢ʿ犐ⶶ✦ߣ氫い寸Ꮳ⌝愫ਹ愅嵼࿃彞༥ࠌ⾨繦҃栀燼别喭㡬偂ઔ佁䕡房䝏г憊ೀర湖濶॒䍱哈㧰㜹ဆ�ߘៀ枣⌑៣ᄑ粝獐㈞戹樱⡵ℰ桧⌠ტഭ㣫ⱙ㕳¡ᠺ⢤劁ㅆᐾ⫰估浜㨮⑃僴䉤ഋ埡ਘȵ䅨盔✮孷杠؎瑍刎珹⸶塩縻ߔ㺢師௴⃝䌚ࡀ浫渾盝慬厨櫀 瘑呑@≡ဓ噞☦ሺ䁦溣穿暰瘜Ἤ摟ㄞ䊒ఽȱ別Ћ椶ᇿ秸䃠㣁₨[٢∸௷䘱嚥愰Ή带ޘᏰ渣☮籗ཡ棩㥾庱夿䒌撢䇗ⵠ䷣㐩ᮡ՛䳁ຈ㊱䎛⤸ႇⅷ窆Ѐ橂弯ᡓ∧厰✱ḛԱ⁸㹻搒ኽᒃػ⢰ɉঐ⪱ƛ愻⑻懽ӂᯰ帣䲮俦㡣⍥ୀㇱᘚ普濄ᄽ楋䋻┘Ꮰ穁焍˼ୠ☁楥ᄻᑣሂݫ溨恣ᳵ穝䣔ᷕ➔ㅡ专尃呬盗ѭ⅜㥃ᨩ㑂⣓⊉࣠㋱璧ⴸ撄㆖䔼Ồ⚂熨∴抳ᵡ㽦吳夣ㅦ䞆Ṉ澜禪䩛ャΫࢬ㿡⣤縱だ梭䗆⋸睃ɂᑂღ拡಼Ɒᇦᠲ㒎㇚ܦ᷸絃㶩ᡔ壥∷斨㑰ᇤ⏋熕䛬䁮㔂⒯䖤磶抡拰㘱令券䑮愲碶Ὸ如疀幉棕≌⎜㗱䄰ৠ❊ㅾ䘊Ꮢ。妪幇掷ࡤ㡡Ủ瘿ᒍ养䘋䰤喃篕棯磃抟ଜ㯦忧朼㑢⇆䑡ᆈ坢䖩䅆棆␀䶞⑇メ⊘燀惒à⨂ଫዱ�緐䮌㆑灆㘲岝燰♞៸癣冬接䓪ᐂ戲⚩メᠥྤ䧰䟑✳ၫ剝焂ဂゑ䅅Ⓐ䳘䦖䎆⌠⏁羭澰⣂咔䣴Щ潓⼷䉼䤤⓪ᨏᢢᮮ㹌䒣撬䵴⎱ᔱ毫剺म⅗∣ㆳ䒬ㅞ歾ࢩ㗯ө繱䲴履䤥䘱Შ劲籬俥䤓祜䰪㡩䄫抽牭৪䖠ݟ㞬楨敚⓼።亘㹩䋦⊻抍䥊⛥፮ッ奯㿢唅綢Ꮈ㣐㵡璸炡䧑ጶୢ㵳栢Ք塐ᎄ俪㋩僧ⲹ硼णܙ❴撀ᵬ╒㙶勀ފ㍱妰⬈①㡍Ꮄ竣Ưᩜᓋጅू㎑懅⥯᪑昿䙀࿔勄䎑ק愩ʌ㴖叅央㪍㴞䓾ᾤ䛳絪浙Ⓒ名䜉癠⺲ᮤ硙⫽ᐔ䅼罯₢�慝⇡狙܂ٸ➹珲ྭ快ᄗ叫࣋䘹㌲纴⮦᧿䞠ബ糀ഴⵘಢ㋉ߤ䜩嗅娴ౡ⤱▦Ộ䩒ܫᕐ㞂㌵Ն⬹ⱡ圢暔岤堲ଠ♲㳫ᓴԖ抚䫆⿉⒄沿♠熬撛俬叅ʦ䀸㍹䡳D䛄≏㖲妺કᴴ㝲伩ಾᎱ䭤☑犨➩噤榴るዌ箲怢樫眻瓎佋囹杣涶ᑬ䧚柍ᬐ䵒ͭ䅔䓽叟劖⾚沓翀笘焟◘⫓˵ᙪ㜹ࣕ倖ݹ㗇猹皆樁䒵᪬吝懫䀩攘捴ᓮ㚉䄰㴲瘭〥ᧆ᳴潩ת㴠ⳳሳ䳆⏹ქ䖸夸䚃䅼熒亵㝏Х㌤⁔ᐾᵋ็䫗䙝携È㾒穃䍏ᓝ㎳䦚㕙ইඹ䜰禝暣晜䨄௩ཉ㲼䲟用嶢喘ᶻ↶礴祳拔揣৪癛䓕拂䭮↹࿅≯幮示⛿⢝㍅ቲ᳂丐珤乙㋀殹ᑽ煰➿ᱴ洓癪羣紓㎟愡⚩刳朣牠冰朔䤢栒Ⅸ煁爻䨖➉朅⥯ƈ冀卤搠摁ᝀԔ掚⟡㞹␄̻㨕搻Ṍ凒䁌昴䌅礮䲁㫜秢⌥Ѹᅉ䄗⦘疒䋯㭊䋵挴䠡⺥㾆徥憛ؓ筁ᓐ嬫湯⡔㳛ʀ⺨╤㤷垾Ṳֳ杰怜懒ભ࣒⠵ਧ䥜彥㈅䎰琢䗚䜰叟᾽炰⹗ᔕଋ䰱⫱ఆ{其s㪸孌喪䣴ળ㲂֗丘寥⑀㐸ᙻ奇期Ⴤ掫䉉棃˝㢰䃾၅❪扳熎ᧇ䅤̠ẅƣ磂戴䫲⺩䵥憇汶㹰䗺ᔭᴲ民奏Ⓣ⼼玚❉㝅₅威ָᆡ㣓䬫㥓䟬僔糟犪ⷁ⩅Ņ皸⯓╸搬坲怀厣〵⡮悩䡐҅ᙡ䙲昄ᙝᘴ䨪㑌㝝˾䪹䪹㒅熵ㆽᦌ攳ᗴ彳ᷳ亠怤籥⇰ِႀ䦶㩺ㄈʼ偘尣擟䊮䯢⩂㉅噺繀ᛷ䮒緫杌峝浢嶞⹙⼅ʆŴ祽◄䨰儬努ᗦଇ䭢⫸ヅࢷੴ湷斲䈥撪灊Ꮲ⋀ല㶠ँⴑ抹॰䆗秗䛂姲穋嵌糕Ⓒ㗩⻡㙄ᙡᥳ⊐礣䋟Ḉ仨ൔ⢻䨞㪵㞵䕺攬嘋䯪皓喨墪⫹俾䬰義䄲ຂ嘟ᮂ繪ɋ⋝狑⬌䦑㍐啵䀤啵䄪场嘑晠伹⫲⭆攀̣啰ᕻ╢喑፪滊瓌拂⫼㐽⽵⼶彷䷪ηᖠ⓰伫䅬勉甅䫔ⴕ㱵⦄䗦ඛ燮⛢⢺牫ధ做̓૫䩸嵕ੵ硲䕻啂図ᔂ䢫╌䨩紬檳⫉❕آ⭻䙣㺮啧杤恼仍㓂䋷⯉䥮⺹勵ㅲ打㖥㨚墔䎊ᛉ孫㋙䭊hNㇶ㬡ᶒᘍᖤ塴熊Ὂ竞᪹◇ⶽ㷺痶❾懅ၤ䒲射勔㮣滈ዾ⾽㡵䗷㶽媞喅喀Қ瓊前熷㬜猑伦⧉堵畉䙢昐撈儂䟋⭉廗媦⭬䓸岅⤥㔶ᑸ䄦床柈盔ⲵ䫰Ⱓ㯵䥢惼斏┈㓱ᖦ䆠്嫒䘼ᬅ㚕㷕⩶㶋槱╿Ṹ愺ݮ⛑:᪆患⌆扱拞൛ᅑ崠ᕁⲋ仁ܝ㊃⠣㓉氄䀩捫൭慚⩆眻抈ު䠴愈⊣㭕ᡖ擶摑ᕇ呦徺稊撊筂䛫獅丳∭㥖哱᎒丒㟙ᄦ簠ʦ⨡⚯檴棓❩惹啫攫垉卜例⢊怼曡⨌條㬬⽖⳰獹䵴䈄Ὲ㲫幐䇄ᛉ慴⼝⊙ʷ嵺ᖌ㕈㛎妸ѻڥךᛔ敲涐䩍ȇ咏㙸ᄤ烛ᱦ拫䡌棋勡᯳䰽Ⴭ粘⏍⭶䦻狁Ὶ披ବ‱囕䣳⾭棷䫼䍰丅䗕嚃ఋ㒵枳墋ᰁⶋㅤൢ䛾൧⸐㚱姺甓巉瓃曬憦檻㟭珦⛽᭭ী撙♖䭻㮊䃟䫖橪渝❵Ӕ⫵⍽ⲧ㒍卆暋ϫ࢈«䣷嶭浰㐄筽ѯ⌑彖戺ʍ痒囬㡞溛㰍Ꮻǵ箜⠮⪰䗨㠬亢䐶㢝媸䮀ᨽ墔 ݠ穓㞋᧶濻粉痚竞嬊晧㮰咗击㮄楈矅ᚮ䉛湪Ꮖ㯜㗇㔽⍶⮍ᖷ㘉幸捛甉ṫ仇↢Ⴧ⸽喉䄻杺᷊梊塊乛嶋㏀໋嬧ℷ⩀㆔⏏ੰ眳奮呡㡇䱙囄㨥歧㍽暕ᙺ枟畒璓塮滚ᬉ᭧伓㰕海☽刉急了㗅擹宄ਜ਼県㯘盖ኼ桍吷燸ݵᒬ矛噮婤漍㝡溷欹槤檕䵫嵱瓧冮柛䅎篓⛿㪰瀗㙽彈函ཱུᷩ癨嶦⊛稌䟗Ở㭒㢽㴔⭿男㒻坜悚昌嵍ᦂ簙櫏ぽⶋ潢嵺殫匊據䜏埋ỳ㬅樏ㅽ䏇澎媖ᅯ忎䖚琌察庲᩹每⦕㵴৶ὧ㶚畏哎侚㜌澱人禬ȴ䭽礗䛴㽠Ⓡ瓷嚖类氌◓㺼箩湟㬝⮗㾇䚧瓃制䍛怋◆绘媫⫝⸉洕᯼❯綏瓣吞䲺䈄叱༛ⷬ湇凭খ埾㮝縌癗城∦瀸懅⊌ٿƝ⟚⮒慾綘浤ౡ䌶䞃ါླྀ瞠㍞ḧဿ柊Η眠㥦椚㦑㈸䇜巘ᢣ͢ム⼍燆䉢㋠劝✒㏶䆮Јᬀ㛾☬琂愁嶋矐㯆昦පࢆ㞗敔䜜㲃䑞䎂ౠ撦⨔寽Ἦ㸄᩠ㅣ縦濴î䷮剩ᆧ⥷梅ㄹࡨ᭶⥺⮾卼淴ම㻠掴園墑ě㴘ଋ⢝琬᯿ↇ悾Ⰱ僥槎磵戂孭న稡椬䉙モŹ筐㞁性撋㧙㜄婥Ũ攒眮㟤䈾ࡽ痝嶑̅耎ᢃ睳ےᣗ亣傭牐億⎣瓈㤁箺改咉凔撦᱂塪ᛣᢡ⾉ი㜋明䓛᤺䢝冹ݚᲀ曣Ắ塐烩␔喴㵑擦榵沉糡ি捴ᡣؠ乜椂㸬礤㶱朢愿撖懈䜚斕慗๔慽ඏൊ⤸⣀咣楱匏䞞ᭆ⺃Ȕᙞョ⏙໌ㄱ揝༻ₕ⇇ڠ漠3㵊䃴䓷᧞㮜㤠ᙔᘎ烜⢇∄坨睑偯ɛ㣷⎋ར㯱汇紽ᒘ⚼❑ῦ妥౭煐绉ḧ嚶␝⳧⨏䲕凥䝳疰漃溯䥑夑⍫㞌㍩䥁ᕉ䫈甑⟁憉備奬⹖剗ᎀ佌ㄩ眢撹⁂䧖ۉᴴ糑ͣ⁂庌厬煲ྚ֛瀦ᨥ♥ɴ碳㹮䥕Ӧ卢仙剉䯧斫᪄樗簷៝͢㨰毁⾓淞住厘兆㜽媒̥৾Ṱ犳枭捺磯卅槡✹垓笅آᡇ䭭ᥬ牐㼮曶侂匲ු㯩䫦檿媉⇺竃Ẕ晓坬㍖䴛繵䵆㰘梦ֈᎴ⇠晒Ổ摓䋯ⱜⴁ⏺喊㴹剻䊏嚋⇔攧ᷰ懍ʒ夦䧃㌳佸劖殆禹犂憦ګἬ懳䣮筞ⴟ㐝㞮㮔妭宸ⓦ慈Ე䁨ў䈆ཕQ獚礝尹勦㤺⺓妵晫ῐ硳ዷ⥛哹猷丧杦䯑⠈纐熱⁑橠⯣⤇リ墠㛹丆Ⓕڀ冸⟷ᦜ杳㫒䃔愛揵善倥呜䦹ᠷ㰍㛢戫积ᕛ㳼䐁㷹毫侾⻂姛▬ē刕籌ϡ枥㵼ٺ㶙䆇⪿庖❖爝㤑ᣙ䭧Ẵ᧱ᓺ棕Ჹʒؖᜏᵂ殫䝭㭰䋫厕㎧殝ࢶ狴呺焓空槏�ɍ䴂獄㻑嬆㱸⦚䘒䗴媔孫竔䚋ၿΝ偷啠綶妺揀ᇩᘬ怄絳䟭瓹䮻七潠玶㋳妇䇾㒲Გ称烌存┛䰀佩㒅䒇▿䆊䘟ᜧ⎀䩋礦烹焃ඐ˭┰篣㻛懲攐䏪惋➓⋕ℌ⭊俥ぉ欆䥽ᦅᗞᛐᷪ朰糎Ɉ⾜ⳅⷕ㹵砻⵿⏂䡈䈜Ţ廃䱗竚戰殎࠲㕵愶㚸皆▧䟘峂掝Ĕ嫗䫤毣Ⱪ幕敁፹斏ᗉ巨䜫㿋Ϗ㬫勴ī䷥㢅嵷幹皑喵坠᭺淋Ꮜ╘綗⯉ᔗ⪕䂙絽ሲ㇐⋾娚掳叴獕㔌氍䲑フ熶ൾⶁ绵坿䠚瑨㻚ሷ殙⸊㑵瀶嵿疍ී嚈᪢瑓旮擒㌔ᬸ㜕癗ࣽ⎐槭磾孌Ѷ㚑统欍ᬩ嫑㵵焷Ṻ皎כ嚁墚渻䚏ឍ㊽ൔ瀓㟕佶厠⨨Ã囪嬶映ঌ姚۾ᰓⱅ㽵吇㹺㖖ුᰚ嶎䧚ᦎ矸㩻歺澫㊍浸ṓ㘆嵖檋姬拟ᛴ䭷㹥䮻牻⮇䶭㜒峖残瞌眹嬑孱¨㗁䍖祿箁㝙㜔壚曋箌㧔嬊尗⺐㜾㽷䇹㶏暤皔ᰜ渋ᵁ✡䋅嶡淕ㆽ孁㋼喜⇐皨庢悻䗍擘孿䯭⼓㞵庖姻䍰⸞國墶矻朏…䛈殘ൗ㐉綗碾宆㘂眆弦楻ᯌ⣓༗ᮑ湝㔰ᮖၤ算ᶾ皠ॆ令㟌㲄Ⲯ㭱ˏ㵹㓶䗿ᶄ帜㝘彎梻爌䧐㕨丝⺏㝝䜗癐屖㉗嘻ᴎ昭经᭝廩䏖沙㞉夷᎖ᇳ眏娼扚䀎䝜廥孛䙫㊍栯⇽澈㷺嘽嬞礛᱖㻷尙פᅭ砮⡜⫸Ϝ噔㟂Ļ瘌炐ۮో㱝痷廞α篴ᮖ淋ȼᇙ䮟⮔ὑ瀂恚䐵䏨ྑ寖綻倏⏜県㯴ẙ壣兘桟ㄈ丶ྐྵ柞疳攏゙ᇰ獏泔㜝时㱜ᎊ෪Ჾ曛娽撒ߒ᳓䮗㕗䝼窌㢓㠖契拋Ծ⹕Ǹ᭐ᵧㅽ忚ᩜअᜃᣊ性圼ދ盳Όᴘ秣焯屘羕⎵㠘㢾秧嫗燾䞱ᵀቍ呠ޭ涌搔ྪഴᅇ䌎忘Ἅ䞱漐焃暚九ᎄά㤑礧ᒾ盛眄թ㧐祳眙楜⤓Ꮂ༌㧩椛傼俘䇻歕ᰫ㚥紻絼甎ᐅ䌆悇厥檝ㇷࠏ泡㢝媯ⵘ℁ਝ㟮ೞ碇ᰎѦ竣㖌᷌考纷䩚Ԋ㎰佋妖獧ᨿ懿浵㖲仌犓彶敺煽㸞ᕖ㼮涻ᶾ⇗娃䜼ྤ罓簌╙疏㑿㜤Ọẅ瘎纟帱ݻᱧ㋃滮㹹䴊䎢俶巏࠷儾Ɵ奱䞙ⴸ嚂珛掋㶅ఀ『㵎愛➼↟姠䟰巕㦫梯ᣝ箋⡉ྐ婶䌷栏篓弘査Ṭ瞫混忺䌗縞噉䀞潻ћ眈炷⟏㿫噎篼⮌䏘ཁ㿩綷ℍ煩㻰埞泠۠ᑠ䘿⾁⯅⹊ᴹ睓ھʔ昂⯯Ḅ笓兏⥌⬕懯亭㭵盕㢿䘵幧㯲ẃ㿕僣䋞䄛᐀們㦙浣䍽⢅箾嶃Ⰽ狎甏ᗔ䜉㣩曧䚿ᶞ᠊畋孶⛞猈᮴䞝峖橀狁Ⴂᬍ坒㇝㊻媎ᠤ㬋Ꮠ⾹㬾扷媘⧪⟣⻆篈㪏៹朚寜澝宬䱐ࣣ槐᭄䍖粩喯ܛ⯒皫㪖悷ゾඔ淫㞷溮笈㳎屔朜ẃ堘ㄭ织廼⚟渎城怊缋沎䛞笓浄峌⹝㑼嫽丞砍㛙㰭嬷䯝挕㯈湫㣽泗瞌供⸃矞漅⓮ๆ汝㼏礏䠓㼭烗毿ஔ᷻➓ṓよ狕ᬓ簗瀅㭬ͫ䏽ᢶ竰匔ᬢ㉦䘏⼙ⷕ瀞殅缗⟌愝痾瀅囻罶䖈⼌㎠住㢦耗䇽嶟Ӫ洱ᵤ̌槏⇭漀㗓㘡㳄ർ䇕嘅གྷ澰痆渎璛ᒕ㏮Ἔၭ淋噀線搞୩ᵤେ眿⢝̑琊Ṉ㨳悃絕㇛⌘矺㹖皙嬯徺㑛宾ặ㭣欗澘Ќ栔㶳㿇梯ڞ䱕䠒ڬԧ㶛杜廸ܟ䐇廓㎫唾ᚘȖ䞭Ὲ瀊緯傗⊞ǝ䬾㷤紇嬮㆛崄⯲ྀ㰁櫯江ė䫼、㳥繫䠕毽孌◀㛙ᩱ祯ᵿ紓␚矢㺉粫䠕憛星吓䋋㺧䍗⩼䫙圝嵻㲧傆㺟澏柱盪竣牷ᱟ嫟∼愭㳶穃勮掘㜕䟹㘡㩿㣯╜Ẓ⯿⾊㳅硗婿ኝ殑帕嚭嶃昐䩾㓟Џ⟔底睙漾暝瘀➬稦絍掏᭚㘞澦ᶀ礳䲨军䨂瞗弴缋瑷ⓞ犓㯽瞗㺝瘷槏䄜䏕䞣特ẋ晧ọ澰寯澩㿸狳嫿㞙娓ⷛ獭㲧穏♭攗⓯瞝徹狗悾⤜Ѝန庑糫榳後煘Ԍ⿈倃矧壏䦜ؕ秚壾姇礳卼㨖䔍箓峓䬳岿⫚䔞࿂庶罣梿毝燾对Ὧ⹊申槎䌝䔙ᮽ捆媻槏䏜ၞⷤ⇊翕烯䗿粟侪徢絉筿䫾瘚ᇢ⠆翶獞潟滺椹尌糸㽙㱐箙瘜Ⱈ彷㸝問橞⊘宁濗㽍砯槿圌䙆ℭ㱰粋絫厖戚凯ㆱ㿮礗炿⾞燽ដ⽒罯㬿䒟៸弼 ࿙五᷋䋍禸』Ⰾ綫粿懞ⴜ↘䌢獏摁匜㫞㜽䀑ᱠ瘨峒洐Ṝ忿ḭ纇糏⃝ȸ〗㾭綗稣䶣ؘ䶖埳❻窿竏Ԟ䴔倅潵簯端涟ᐙ涚㿊剗簺盏ਝ威嬚徐㿺槿䃶楘、䯅缛耛柿劝䩚䀁習曯珕璿Ⱅ㠎१ᅲ㶂ӟ㚘䀝㐠歝粚筿癧浿八㬞怜婢䀐:ዄğ绿縗硋叨ⵑ剁㑞劑⸘᪅愊䇻矈彾繬粏秇皷澟䌠爡ʤ〦〩′濰徧ܮ绍籘㤀౯慿妟㾞�䜙ࠓ㏯⁌ソđล簯穲ڿ歠➟జᒛ瘗怲U㾭㽅⋯籉Ə猀ᑀ㶐∡ලȤတ崈W瞲ᾉ书紧箠๙愿ᔇ␊ࠜ樦ဪ㎋Ȧ㿁㽳ņ⠸ُ犀ᰠ⭠校獍判ⰮஃR悄睾ƞ浊ዓᝐᛯᎰ㞡欣氯げ⁸ÇǞ˜֔璴檟俠佞䄱⠚✐専偘㞪慈�練ك皉戰㖠亡炢⤦䜐對忾徻⼻㹴ɀԂʠủ䁗⨞䀜㍣倓ሃ淰ၾß帲ʒ珨᭰㕇礣攦⨭小࡛䁡䜰盩Οबഓ涹像⌡暣ᨥ疓㐵ၜ哕½淰ٌସᙰ㽀槢撢䭘㈪㔂痲枣䃴嚙ϖӠᢠ㑰ञ撣朤ₐк၊翐䇗糸܈ᆣ䨟↞អ⥛嘬琵ࠠₕ℗纐̊ܨ࢈ኇ䧀倡箣ᢚḭ搰塗傟罙Ƨ⒊Т൩柟䏠条⪢㏚嗧簱⡚样༱ŀ岢Ӕᤨ㷀瑁堢墤暦琿ѓࢇ罷繜䗿穊煬࠭૰᪀⁌濨ㄬ᠊嗡䡴�悍䆹Ԍࢭ恛喏ǡ欌⌁椯㖈摇䡢⍂䆆嵙ޒ๙Ⓓ唟ᗞ琡椤簫㠄⧺濃⽞↟嵪稪നᤀ⒰拁敢劤ഭ氈䁇殭坔Ȕ燿硚瞫攋䭰䓞澝Ц縖ৃ⡚桴僓∋ɝ壊ഔ᎐⼰瓡Ⲣ༦ᴫ怌瑕志傾䇊䉋㰔૿崢ᯔ撢ㆧ枕ḃ㛪へႢ℡䎭毇癀幐寡㚙妦䴮企㑛丽ჭ⅊㷕ܳ爴ọ嗥ㆁᠢ嘪ㄉ羲婳缕䉫ݍ煯敎嵐儡惣吤愇壬ᡫヤƜ䢟祤ؼᎈ⃗⦁筣⨚㬪㨺瓵徸烉⇣䌰ي़ዘ㲐瀎䧣涧≓䊅т䄨サ㸴䌈桊ᤸ㔟㚜ȉ瀠䜯Ḷ2碚炢㻬ȨӮਬ⭐䖀䬦ⴭ㸾勲碉僤⅃䍚ۖഗ拟亀塡ቢd欫縼屛液僄䆟Χ筡ᮨ㬷ઁᦢႦ̪㰷䡎宦傸Ÿ⊋㥈ರ㰟ḁ䚝⦥傪㸱䉄䡱ࣉℨɱۂ♨ᆩᢨ墡剃符甬ᰶɕऻ儃䉞塖ੁ⣆儠ൡṃfⰑ〴ま焖Ⅲ⊋ԩᅨര憁㙢簥撨瘎ዥޢώ䆱尢竑ิᕸ➟∁溼မ䔒⍡ア廄ḷᜑ旑橍琔័⭨䠱㵢ㅈ䲩ジ╍奜›痘琂ጎ唺⡰睂䱂尼扖摸䣰ᅊ⥼䗠Вṇ亭ྱ㝂⾠㲪౮੍⮪䅐≑≂䝒൝憄ⷫ⸡ᑃ纥䢮࿅汜壊⣄冽ⷄ剅ཪႴ㟨䈘涘沋儬Ө䩊呧ၸ᳠䋌䔅ῷ䑈綱㊵畦⤦唾劻咃≦儵⋼䖘ອ喰嵱彂⍤㊪罉㉝⒟ჵἅ䏔䙶೬Ѵ⪈影䧃壂䚪഻扎ફ凢∿۔ऊᛤⱈ埐䪭慧㚩ϫ煥ᒂ⣜ჳ⌰⯲痘ᾨ㔨䬱㭂❥㪭礷㩝㑻䣏刌ᦎ䓛ՠᔿ哒ᅱ☄ⵊጨྃず撆䤖刈⎗ҝਚာ㰈䑱傃ᝥ垢㤪䣱ᑺᤙ䩞䎰䒈෪ᬔ㤈亱ᗃᣧ…挺ᆤ䲚ᣟ凞␛揦⇚ᵬ⻮⋀⦨㣤ጐ椰ᑑ㑻棂ㅂ䄲䓳આṬ㺸嶘㚬悢瘴圠㝵刎ᅥ䐽ௐᚸ㽈洁।⼇模>䔿ᤁ冲扵䙽๐ᤅّ彃嫥㋇శ㷲や凰投ғᗬ㽸仑३杤涬ᬹ㩆ํ㱫炚拼䝛ਧ䵌㰰䅑境䒦亯㬸睳沝墠熀䕳ࡦᜠး掁悃罦⎪笴ಙࣘ㈅喃䛱圉戬⃰☮妰䕤ള㬱ᱠ⤇刘探䜛༲Ἤ㽘櫑䏄㧧䜃墤⩚笻[㆔拼䟷ᳬ㛰朁恃ӥⶫ圼〡屧烶沅⎛䑪✮ᄴ㘣ఀА毻䖬┶Ṃ㱶箆冓⌍֎ઘ毥寘甑抙㏥ᆭ䀹➣㱣䩘˞䦥樏ฬ䡼⨸孑䦝◦䊭㼫㳷楋㵣煝檷みℜⷘ䔁㛣ᷧ侬甴䢩籲嵲盛搈ᦏƖଧ䯨䘚㠥翧爂Ⅎ晞㑹ビ煩挝䙿डဢ⧲⸆倲㙺晠〩㝚ԃ熆捯䑚ডᙼ✈☩㓨框㑁䶦䅌䠦Ԓॸ䗕ࣖᗼ㗻㺀䪩ᥑ棳Ⴑ幮扈偬ঀ䗸⒰䫁ᦰ⚤筑㨳ݙ〢炰伭ᥐ䒹夌ፈ⚐䲁Ἴ☈䦑㰲៦┠䢴慛厲䔓㣻䡂䑽扎亠ᔺᑠ煣䞰㰗⢶ᡋ≮䓝७⏡䙝ดᶢↈ琩㦃侥 ᢹ兀㠩䓎⅜㓹じ䦱ಂ⭰⺩ᜳ劊ᢶ䷵ኬ༶⇼咈ᐘ仍栲⭙㦱ᧂ奧ጮ傾㙟䊛礗兂烢⑶©᎘㙹੩丠楇攬ᢲ抭䡛Ṧ愂丈䃺嗊ᨲ⮠ѱ㲲椥ា㘮䰵嫙䓰滀䌂─亼ᮂ⊨䔤岳汉⩩㬣⥘剦┒䨍ⰽƔ䱉᭲ⵤ罩䕠㲢ᤖ嘨祳ᓁ䔑䤱≙Ĺٜ䴜⎐民元ॆ㦩㝦ᥛ䡜擉䥫ዦ૬仹ᥒㆄ傴嘘ᵄᴥ傯৭⡘㵦燵ˮ⚭皌ྎ嗘砩眃⭆Ἥ㒼乕抽撫䤯Ꮞ⠗൷ؒⵀ俩͡䏥籯璹⥉�げĦዡ⚔䢥ᖠⰸ檱⻝奥ᩮ墻䅝犌Ԅ䥐匦◢䳀ᜂ⬴繩ਢԫ燤撺䷦ፚど燅፴Ⴒ䭞Ჴ崑窳ᩭ炿ॆ扬⌬懮䏉▲䧶ý䃨杉婳峆䙪℩灆沺ᴥ䧳፭ᨸ䬀Ɋ⤄磉斳瞤斫收敀咝䔞䥲匓ც䯹Ἠ㉴朠楲担坆楀ንⓂ䦃≢╲䱕Ḳ㣴榮㥲⑦摬✾䕟ʇ撫⧉ው⟘狵ᴊ⭄毉岅ᭅի䲿৷Ɽ响䤳ጽ䔐䶆᪪◄勉禃䑐ڰ൝缬㒨冮戭┪䠩ᩢాᫀ碔㍄㵨毆℠㠦㒱৯ቿ䔡ὂ␘叉ᓳ慅卫暳3ᒪ槉ዋ䳭Ჺ≈䌠╼撠皭ႂ歧檋㔖榝⤫Ⓦ乍ᜒ㉔嶩棳絅孭ሧ檿㊘瓞榟䲛▬ིNJ⛈䊱᎑湅㜤⺷啌抂ᓓ廆扱╠䭥ቚⷄ䟘㗳碡䴢⺷楈⩥渭槛ቮ┒ᛵᵊ㖨☨Ⳳ䋅啯柁窈㓨ॳ䉛њ䡱Ṻ≈氉njῇ捭⪳啝⪃甉廇ᐑ▔䮮ᠺ⡴硉弄ࣄଐ䦌䕙䪓Ⓙ榧剞⚆Ⴆ㍘䘉ળテწર⍜牰撾䧆剣⮺侣Ợ䌄埉ᤳ䗧浬憱䕟穠擱应㌋⒱䮃ᷲ⓴焹⌲久㱩ڽՒ穧䔞᨞劾⟯ൣᘺ㾔䒉ᷣ䲇ラẹ煌♿擵樝ጼ➈䠳ᯌ◔欹㒣࢘怡ᒲ嵌劕ഌ⧚㌊➎䩬ᯚ碉㊆ᵯ䦽͛ኀ畃憗ኔ攤䤽┦⣬繩䛳秇Ὤ熶䡋晭㒢椲㎂♹亳ᶆ㭳 㭒ẅ糭暴浄⊔瓈奙右␥七᠊∬枱巂䱫杭▹٠甙⧾挄✞䭍ᤶ㒘懩㓓碆剳ᖳ䭒ٽ甜⧔㏘柆֍楪㴲Iʳ撅œᦱى䩴䴏槻䏢朵俷⯴呡䌢䎄儧ࡐ㚊䲱ᨊ㏯◡䣱ፖ❤有穒籆奩妱㚐䳑峂㎶撑䰃᭖㦌嚹哲ㆄ㍩幫㥛䴜噋㉹佻ၖ㺔燹ⓒ垅盬㶽ⵊ癱洐䧛㊤摥ࠩᯖ⛴匱㭳㑇噪嬰筓癭璪姟㏡斉伥ᦖⴌ獹ḙ了ያ㶴晏ᚍ咦ᥠ獫╄䦃ጮ┌䶉広滄ይ䎻捀ተᔜ₽厪宁䔧᪲㒼碹ٳ撚Ⱬ溻歙㱵㬰㥄劉杉䱓ᐖ㱄筙ᓓ݄积䶹⭘᩵攀⥦捒䞙璳ᘚ⦘妆ᚓ瑄䫬ஸ䵘Ც妞劙撝䵩Ṷ⁼䁩ඓ羆ʬΰ䥓撲⧺琂斓佷ᵶ㔐䥉䯓榅㭬方㝗ຜ➋娈㌚昖㑗ᆖ㻼呱干漅Ứ宷⭍ၭᓓ⠴刬敱䴃ᆒ㿼嵉䞒嚇ᷩ⼻ᝓ㙨㳟㥼劺ࢻ䶃ᨾ⅜掾睓㺅ᇪ㚽㝂争ᱤ㥶牃暥䪯ፎつ峙Დ弄⫫ា筇湰哖榦捇➳䣦潮ფ涙掵瘄௪㎽ᝀ珘➙楍狳Ǘ䯻᯾㼰މ庒ፆ७ℍ筞ᓒŚ犫䛍䷛ῶ⬼峙㽲搅厮䐰䵊㹩ⅰ⥻㉪犩䥿ᐆ㾌亩㸓ῆឫ㼰㝕五洍姓㊯撡仿ᣆ⾜嚹Ჴኣ㱭䨼嵈ಅ᳹䤵ᖿ曘䦿ኜ㉜獙⼒焹㋬羺ㅙ⺐ʿਚ勗摍䳟Ꮒ㾼䔙㕒〶ᗭ厹歂抎ᢰ夽玲娲畞潚㸢䂹䐪ᴇϨΆ䃑牼璲⥀୕枤䭀吞⫤憙耓ᠶ႒厵䥒䅲㲠䥀曄砏ᅞ㶢焙搒ᷤ䭪ᖸ彖Ṵ⁎ճ利摥ะ剡㻬夥ਓ惆⡍⎰ݝພ崞爲敐ⴰ巆Ⱌ澩甓ᐅᶻ畐犌䋀夶㊚敫䣠屛䬢笙唪亅ͨ䔺惒ƒ㳠⤣∋㦿嚮㟼早Ł䠨硍㲴㩘㲼ᥔ㈼ᒘ⧯䟖⽄矩䜫䠩㓩恴千䆎䋈՛玆旷伀啡ㆼ䦥⺌䂛椖恸孃♿㳄䕩狂ᙄ⯬׆〬则ਓ䔶䠮怷თ䋕夫玴ᐡ䬣ᩎ峂欙凓₇╯德ボ䴝禽ઢ⟗䵨嫫奴変Ӓ崴䉍䊵棈兣⌗ןᐗ昡倇Ჱⴢ罥棽⏅ᔷ庾啎ㅲ㳹䖘ன枓䠭ᅞⒼ岉䪫㐄滩䦻⣜纝㓌䥁劏暻䣘姆⻢安͠䓊漨便㣎C拱㧱Ꮵ朥乐媞⥢姥廲༶G恲歆㩠ዔû➭䡐Ӷ⡜灅玪涄䵨疼䍍⑤岳禜સ曹䰰咊㈲䣹圪炷۩ྸ䵕店ʩ祊犩᠖䱐巶㉼俥瑪ᮅ㋫玶Ⓢॢᴋױ旐⥨ᥨᣠШ悳ᒆ態ࡾ擈搷ዞ䗴䬎搨⾽᪳妁݅䅪箇䕍☩ᓄ经䕎㍂➔⠨嶲⡲婅ᅪ男汋⩺ᣔ䙺匈㧐刾┝㘨嵁ヲ硥悫猷㹈橺㣏憂᳃╮ੋ斺⨨嚾㛌䞹ல㨷懭䉪歀慽᳦䅯⎟擰ⴏᝡℳ㾥㵫ᘶ㷫㩶䡖慶䋴严枭ഇᑁ▲祅彪₧絎偾䃍ᆕ供约ᎃᑒ⣋ឹ❂慥㬪埅佭䁻ࣁ㩹㋍䕾ધ┘⭟ᮉ⌜樉⠓欵呍ᙼ泋ㅡ勝▷㈳抺⬌徎が檅ᛂ⤷Չ婲⽐ↂ勬秾㎕ᚭ県實㚂纅Ɠ玵㱰穁劚㌁时䩽昜⸵ᛑ→嗥ᷪ椉捈⩻ᓀ⥩紭祱抠➖䤉ᮣ唒䶉氓ܴ͌晰ᣊᩪ抸⥗䭙ᖾ⻟ᒾ≲清珫悵㉫ؠ㐿㽓䋫旖珓☡⥋䄃ʲ笅֪⎵㝈㙷ӂન㨁ኰ哚⾨ሞ㩆 Ɠင⊯幽ˁ二૭旱狧ᔠ⫢嘙ⵢ渵㿫ᶷ牯ᙹ瓀⑽匊斶䫉ᜱ⹏᷾ㆪ焥䝫壆嗨瑺哈习岩昜⮸囂⸽ᧉ㮒悵箓礅ⱌ䙹ຏೖ斘⪺᠏䡲嶥㡪漥克⎷壌㙸嵂䖔䫘䕚⪴哱⣙ᗈາ⾅凜♴坌勄䕦䬘ᗄ⭺摹⬂庅㼤⑥Ⲫ䂅玐வࣛ犬斫௴秩䰰嘅㳼䕹濄櫨慿㍑敠䫸⥱⫴垘ⱄᰁ㻪摵湩徴拉㥷ナ䕯犯旼䯀桑⬹᨞⭊哅㣋㖴ዏ噴䫗橡⪳旹⭠ᖁⱊ彉⣪瑹猓兵筊㕼⫄⒍䪲ᕺ⪄堇亼冒㽜䐙䎲畴狏焷Ⓜ㉰欕┽⫸嘠⽿ṕ⾌忉燊㑵刪綱Ⳝ沿ᔻ䭆吠⽐徆「橵汳ޅ汊ೌ檏ኣ敪㉆嗶⸘傥㻂瓉䮪ᬶ♊⚷フᎺ䉶簢玾坈⇌廵㌊䵅篓㦶剰絿峝疋㸧禿牕撲尵㐊懱勊坷䫍༱یᕧ峕稙⫐垵䠺叨ᾜ峩ொヴ绍ੰ䵙⺖攃旸勣搪亊徲Ⓔ冾ɋ⠵ⵌ浼ೃᆂᲪ㗃Ӵអ䲆峓岒壥₳債忭枿㍗⚂ዏṆ捉ᒩ⼚噅㬊窥㺊乵ᕉ帹᭔㕠ಹ⹘⬮┪犦僊⟸奵⻋▄♪⭿峏橼均嘎⯓晗伇ࠕ㯪啕࠳䋴燍୷ۉᦑ峕տ綢嗒⯂匩⦲僉壪䱷囉奲ᛓ▔欞䧎歘坪⪸剎⺒擥始┷ϊ啴⫝浭㖖⯵喽ⶺ忙〬䋵㬪ń䏈噲仜ᶜ包㔥㌸晻ⶮ庽㸒兵昫慅Ꮚ桲動ᶝ૬䘋勯⟧Ⲯ勥㚺妥稪⟆ᝯ䝷䣆≓㪬留ዼᒹ䥴埉㯚嚕Ԃᤆ懍䝱嶞犱痎㊩埼䡼嚅㰄弅嬋曶断捵哂㥱狾喠吓ᑕ⾇䬦⚚䰹˴僪籷⻚ᶇ⬏㕒⪨族⫾喼≊䶙ᚐ漳矫㚴碻ං竼症殛♟⠿ᮝ⪰ⷤⵓ㘇⭎㱰້⺟㫝㥕ઃ囟⪨ఝ⿺缅࠻匶ᛏ牽⫌䵺₺痆橾⒵⺞嘍㮊䉹ᜋ䳶慩瓍ᑺ堡㥻₠㝴⾿ᨣ⌦縭ವ箵㚣㉺Ӊ煥㋴仔ᭌ园।廅㤚哵爺䦶ᢈᙿᏵ熀ዩ瘕㎦✔䭆偃㲬榹⑪䣆࿈⽸啅絧ک敾匼摦⮯Ἡ⒄氭嘊晷城绚⎚ۦ瘖㍷喯ⱔ凝㞪眵嶪⭶ಊ⁾ᇇ㩰嫶ശ檔㒦⯔场⾊洵宪娵孯盋楬瓄ඣ䨷䓸歡噣㝦丕ⰺ穷䂋䃸ᓓ㶒檪痍㋶址橍ᘕ㛦䁭笺渶盎惷哀當䋌▢ᬻ⮰⢤喳ⱦ缕摫ቕ粎棸䧞䶖㔙ൈ⮒㚨瀜妝㾜噅塒海⇏磲㻃䎝✆䗘䯎ᛴ泾免㡦哕ᠡ糴☨ὴト絢⚶䶡᪴㔔桑寽㎺缭㒢惵䲋橲㛇捫ܘ嗭㞬滴厍⑆䔅㒋䙗牯䳵晲朄䬨啧ⴹ廓⥆䉹ⶻ呍泵僗ٶ⛎㕎ઙ呅俤屣⺜䧥劺㦷泯㳵᧟ኞይ疢㈶㕯⣑偳≦热⤻⫵ߋò廑掊⛰ⴲଁⴐ埑㮼秅⡋䭕ઍⳲ⧌㍵曮䵈婍ᔷ⻇ᆫⶺ梅{Ⴔ篈勵䧋⎔ᛅ瘂⬨晲溼噦➬段株幇岎獴潑如䴏േᬹⓡ⽙囓⮊䛭⢫䅖溋૱滅ᙥ╬㕒婞㜼⬫ḓ⎴䩕䨺䨆烉哵્ஊ⓸嘓殪㗲榱凓⁄汵扺奆㋴泘畯ጇ㘚⨨㙔楶塶㺶壕Պⅵ寋⬩廄全ᚫ䨘⫑㙢毵儋繍浫㩶溈乾棋↛᳙夳牃㓤樕嶃✶绍㬺敕ծ䛾ݏ㙪㜃䥕ᩝ㘼殤帋㾶絙檊⍗即秇᭲䪷威ዣ㘀橬弝㎢栕宩狕ᷭ偰滐ᮊ➗疠欋㟜⅌嬋⨜䇭༺祷㟬⺼㧒掙䳘淈ᮑ㙼橭压⟖摕緪⩷溊国䭑ൿ宙㕄䫊敎櫶寋㹖翍䓺◔㗏朾㝙㮀吢㔳ዲ显汄č㓦皍㹫᜶㞋䷉⮋卟喗⮍垽⨞忍㼚簍ۺ者͎㛹ᷔ፭朄㕗氇㝿⾦喥ㇺ坍⎊⫔ᗬ䃻㷞፱㛿淛孲⪟䦌刳⪪伵⪵僉ű䭄翋Ⳍᷔ寗㑞極ፅ㼮䘕籚濗Ɗ建箌⛡榐㯧㒪氭塞⋌猽ⵒᇕ㎋盿ᵝ䝹㛛ⷹ欧噚櫖巧㈴瘡┒䊗慪ݲᕆㅣ⊢ᵙ檗㝊榝ᵇ⾌氉᪺緵㖊撺Ỗݳ⚦ᷥ射皔派劋⇬攕㦺䁶Ϩ䇿祈獩会⦙嬝ᖼ汍巇℮溽㮻ᚖ●䏌珍拭൙ᩜ甯䥬嶇ⵒ涽⡻ҕ熋绿壓枞狰嵞㪱㚡檟ᤳ㎮昵ᣛ⧖礈ླྀ僀➌㫊ᕉ᭰皟佩啻⊒杍ុ峔擋狼᷋嚀四ḗ客癁淫啋⌚渭ၚ杴㵋䗺棝⩯募᷶⪥㟹潨墧〬碅䁚㝷ᬏ{㵎坮̅ᕹ砑栭堛㢎廹懚濔廈冻䫇废櫷啩㮠㚰棋备ⷔ峽ᙚ䮗㵩ኳ槍➖⒡䷦抦㚮濃幷⊖戽³ፔഈ䭵卛䚆㪩稗㫂⛎⠵倷⿶沽≚䌴⊪㷱⭇睭䉳㊉䁂φ圱䡜䀾尠ₛ㗈䈊绸憇⼁ᩳ䄋箣渧儕ᄾ䑝̠℔炢➩းṈ㶀䐭ƃ欜யⲎ䩽攸㋄⟀㠴Ổ搴篑眳泧奯✾䄀唠犺㏾䀵侔ệ敫ય♪χ啯㎾縴峠䴕䈅㏸柞侟䤜㵂筅瓉๋务⳺篽燚犖畑䯸៘⾛ềᚻ炅Պ牎ⱕ◽ໝ凣㨋祽偀ᖁ廝㵶ⵢᆒ嵸॓ໝ嫢ᘈḈ☺毗捶皯帋㯫櫗堭ೢ徚亡䑀ፍ䒩澕廅↡箹Ҳį勗⒦埭侚疀瘈䟼࿇জⱤ綺ᦳ盐嘗傘шǕӪ偑䐊圃俄佨ܘ絆擓璡ℒ庣Þ皝烊竁㐌妊彮䬳㶐⭫皃䇷姜᧞喝✚⡆ѡ毶孳報ྚᘝ竖檱疭婷ぎ䟝䊈䠉හ揰瓌绉婌㴌ℋ檇๊㎥Ɲ㘚䭆㔏嫵ῑ䞝ཱུ紺ᡞ㡏泿咟㍞䷝√緔瘋矅㍽盀巳竝琷澿坦嬞慜涚ؗ㡶枀෧⽷绋Ḓ筮㐶沿峏㐎箝倛ᆡ㜖甋翂ûᬋ絫᧭ֹ槹ܠ罺㆝㗛နᐎ㿿�潥绌О窍瞑俱ᐟ⃞䄣ⷲ.弊T埔佪庬Ϟ穨ྀᩴᝠ换㰉゛䈻ᠼ⏺䂎ᾚƷ撌ࠁ㒜㈀㈪⻤㖀噠瘙挧斂㽣敊ᝰᘖ墤ణ洰㍢ၰว尊䓯悎℘䇥Џ䣴ཊ̰ダ疤續洧ᴖ懳㝚℁䈙ẖ㲃皜湰㗠犒㦣挦灳氿樄悘ℂ桡嚷笰ဈ❐㎟ⲡ纍䖛演䀹⡗圦⃨䆽͏篚㢤ᮐ㥒㟞罀猧⬲䤢䷏埜㛄⇶悿樲ຖڛ喅ⷾ縝㸚㪗䬱႞შ浴ᚲ䰪ഈᩈ㢰枚ⱔ⒦ⶈ⌢爸©㴝綅ഊണⅈ㤚嗁䍣ᥔܻ䋱⍡ᣩ䍬⓿ⴡۈຠᮯ߰暃ㆺẦ䳀ᰣ寲㊬ࢬ戜䉽嶈砅乫剿㛡啈֦噱ᵄ江㊳㸢懅↬ቻô᪂⿐惧᳴䲧䱗ㆉ摘࢝ヾ屳䎧ؼ姆⟘㓜࿔㓣☡喡ᔩ皽熴烷憶緌⮺༩刘㻂㮁篣圩⥋ĸި儣䳘ⵈ⎲䊗瘑椸㐰渻ⱃ皦纈儹䶬䅞ລ犼ᵪ楑ඦϾ塓テ僣殧ࢮ渽㼧䒝厜Ⱚ⎷⊔䩴◯劕⦂㔑䣡繥ⰸ⫴梏ტ壿ᇔ䙹ാ᳨牐共ⵠ焅箌䝙ヺᴋЌ䘼瘵౪ᑈ玘峃ሃ司ᠤ弥䥌㜾㣅⍊䛂NJᰘ㽽⸾䳃彃ఢ㔾機壱ᒁ冾㱺䙪牽ٌ㺪共歧ഭᮋ橙撍撝刀煟㍍๊房⧘䕩墴䞕䗬ୱῒ䃺憠␚䛼䖚婴㺸敄䕦◰缧⩗ಁ棯盇⍣夲䙆ᮔ㔰ᅑ柃⸡䊮㰸䱭晇ᣲㇸ㷹䮤椵䕅㵘䆃丠妱֫㤺䀽⤝ㆽ⎌᭣ཚᢪ擱澱竧યㅤ⌵ᣱᑯㆨ$䞮甲ᵛ嗇㴎䮃哧㹤ܼ剕撔熺⍐ߖ╊ី竅ፃ嬐熰礦⹔ⲋᦛᓐ掜䙗ൎᨺ槜㚱琠⏦溇㎭ᩜ咇佚凓⏄ߡ㕸樬㱐摑䝃䧦湥漼漱粑⤚ʅ₋⦲䕯ࡔ㦪ထ緱Ⲧ砕伈㿱捉净Ᏹ⡪䐯ఢ㰘瘩䵃㬜˘»㤹濥廜ᇵ䎈݀俬⚾ኤ攑䄳䕦ḯ猏䅖片惣熱浯䙩ೞẴ㫸穁朑昛ឮ粨Ḣ➵ഹё₹ࣉƍఌ㋤撰ᬳᵠ戲䔢煓投䤃㜄捅䠗൶瀲硩曱㡇ᒁ洿煟䐰┇ਙᎷ⊟໒֢㦸杰෩孧偮Ⴘണ劅堠懯䗤䟠伄ᯂ㜘扈暳恇䙮宭牝Ủӱ䦼砢䷙ฟ䝣㽩澱佇♮̻㷼粇ԋ燈፞☥ɒ⫩⢴㟩嗃䂨奱昻⅓筆ᓻ䆽揯䮶ᘁᦂ㢴泠䞃ᝦ瘽圻㩞嵑劕⏡㔽|㩘瞞䷣屇继ᆨᕚ䒞ᘨ厷⍀ɜ慐㎾㚑它ྦྷᣖ瀊屑㊒唐⧔厕䝚䴒䲴摴㧉偔קޭ㜿⩚㲓㤅㻌Ꮛ㭘൵᪲冑哳೦㍭䫵䋙Ⳍ▃Ò寖䲨㐵ߔ槑䗭◇ᣄ⫈ᵘშ瓭⫇祛⟎俙漡䑔滆硩㇆嵮簹姱ₐᔂ樞名Ꮣ⛝Ḻ㋱⸲翳ⷆ倆崿͵䋕棸䨏淥䜗༱溫弈狘晽ࢆậ皈岷㲂棭処嵒⯱伺Ὰ㬿⛡姳沓⪴熼婑㻄䳭㢼巊䬅༔樘ᙈ粞䁳ᩆ䅭ⲽ㹳ዚ䴟會ᕕ䙒㓝ᤒ䬞㒩禽₆㳯ኽ珵䍓গᔁ㫥中洶㕳⓴羠╽ݮ䆶㵓ᚖ劜始厪普信楬㋬珆粭喇㭮⪌窹ӎ⳽槥㍀殊嘶᧢偵⋹呓ᢛ㮮َ歔䏜洕ㆻ匵ጫౝᣢ㓌絮䄳ආᶖⒻ䍖ᯰኚ砣㎡昩ˬ毶㶔暹䧓揆㛬稏祱䓜䭥擈獮⬳䱋㧝㋄亦穦囖㲌ᗹ楓ᳰ姘珔䭺撇ᩫ䒭〹劭ጆ⬉皉㦴ກͨ㧬ᐂ䠄ᙪᲔ㠌氎磕澇罔殽ݙ廖擲㏝昦䀷᭗弼痌䄓ᔥ泭别ཛ寛᪙㐙ⷍ七Ẏㅄ瘹宓ᔋ囬佐窋檘㨕㌧㯗䵇ᨖ㹘栉爉犻Ⴔ瞾䝐㏟㴊㦰㏞䞘㛢狮プ㹎渓ኙ短嘶ᛓᕲ࠷猿ٽ倅㌞㏯࠙氭悆痯y䝚㟝糵嬐⧀ᚼ㗄ฦ㧝㠥伕䟆徺ⴶᛂ㦔֤ⴷጀ⽷Ẳ㋄癩䢳秚⍴⥞抈ⓡִஶ拰⻢䶂㞢沥窳晻㡎䡻⥝抚㳢ⴔ搊᭓ೠެ㢜戩爓珆ᨇ匼睙憞姇社杍䶁⼱㘢痞奃縷䑸睖嗓繧姭痥✪䳳᭱㩴泩祳ѧ㑭㖹厤᭑哥竭୦㫢㖾⡞㇢梊稓ਸ਼ɇ߉惱滚拣୩显䲞ᬓ凈朑伫䭇穎纻䉶熂ⴊⓏ捘ᛡ䲢澯ᕷᇙ啥☆ワ涸ᣟ㍒೬ײ⤴暦瞖派Ḍ渢䩫笆㙎ው䝲勊⌋㫊甪ᚣ亨孪ၯ⼰⽓⤦䶥᾽毻䰬勶◕㖀᫈嚝惈ᨂ筺栙⚷㕎悈壚挔䘟䎜ᚩ侂䡞㑂日丫䬆甹⤏ʶᦎ⾅ল崬枚亲᱆㩾㻥惩紆乍玽ᝓ⧊㋼种䭾体ᶩ㜩➅䁫Ⲳ孏㪋ⓙ痋峣㨚㎿✹依Ό㰂抆披䰷ᝌ檏ブ仜ኀ䗥玌䙻䳏ᢖ〲づ䆽⳧⣮ႈ存䆖㴎斥䰝ᚶ⸊⼥ㅜ纙珓上㑍䥒憊䮈㲲ொ♱⺩ᬙ㹄穅䰅ζ䩕ᅼ拞ↂ統ᘜఊ☾佳ᡛ囬朵瑓㮇磌Ṹݖ暀杢冬唥⬓筨䑓丬樜䛀槙橹䋱懓ᕿᘊ滟枙ⷧ甅㕌憢䞫啧⓬༏ፐᖕڠ䤪埫㘤廜㭊楅筕捓⭬㳈烑媍㔏◽⏍昽五ⷵ㙼揆磕獷♍屸烟熖䬍妴厜稦〄們ゲ桅䘽㵫㛌䫘喌侃亩斎垾⼚墚㗲檮䁩↶໎掾པ⺛ᩰ斣ᵃ⺭瞎䶓䟵䪋篧Ҭ↉棝䊎狯䖳獒⯳⽇ᶡ㡌絙疀尰棌䅸刮ⶂ૾䖳⬤埕ᕚˍ㋾䧦䗩䛷旎悍歖උ೦㳮毷暋ⵓᯭ㝂爆梭Ặॎ筻⭖亘૪槩厚嚝ⰺ宺ㄲ椂湋穷⥮ཽ㖂綜瘊祪ᯧ》ᣱ㒌柅咋瀷⡎⁽⩻嶂ᘓ毆枳圷⭍㪤籕渋⛶经⠽⽘続嬑昙獯嚠⸫ᤡ㐚棵玃⡷嫏牬ᛐ憐嬌۵噕ⲃẝ㩐涕汉啶䉌ᕿǜ犟磤昘ᭈ㙠乼ὒ㙘瞥緫糶ᨅ➹㧸⎕拦ෙ玤㠛⼆寍㣪敵椻㕶奇ࣹ廚䥌䫽״Ⰾី潐廥㣚爒爋䨶围ɯ㇕䖁⓪䳘┢㟨⻈孞㗺疑痍浪埬❹䇔䒈㫹疩ᮝ坏⽉害㢪湵俋䢆䟌摼Ⳕ΅Ẃᦰ淊䰍漥㦂憙圻彋㪎ÿዲ֙泳䗗㎬㛒⒤墝㓦璹耋叆㚎㥬毀ᳩ䷇ᭀ碬⸏ᩑ㈆獹唻籖Ǭ䱻凘唉䗊⯽ᚉ壺倦漭抻汳䳌ᆋ斉Ⓚ寽ᛂ溥帖㰒绕䈹ზ揎᪽᧗㶊䮅㘗歚㜚⻅妕㍶秕晻俷淌災䧗嶃䋧ⶫ殕㞭⼵宣㶪㯍竓ℶ䎎❺獚䥋㫼秩嬴㘩䶙廭ᵖ搕擻߇乍筸ᷲ宎⛬淉⎣噸标⧼ඵ㒕媥巖犴歬⛙⚏⥻旔ᰇ㛘嶱㌊挄䁋惶䃏៓Ὑ⥜ᚫ淮䥗㜔澏ᶛ㘮帍惩䙔ሀ灐伧盩塇䄒䭘䙪娣塀濲墨ᡛ俗�灒㓋ޝᜠ݈㭨睡深揉⇚凅ⅼ֍ྸ㗜͢㰾ḟ瓘矗⤟愘㼡䥺〜圩䠸伎兟ᦖ嬟ⷷ灔眙⤩廵૮昕㤢Ǵ刐䠶嫏ސ伈ᡞ㯹ᩔ䬫壜㡂ᩄ㎎⑀唎6ޥ㪎仨熦㭘㟜⾥妼ݎ穽渦ጏ旺噓䷅瘠ᠳ廻㊶塍ᓑゕ朎㖫˨ᐼ̳崪䯅䧚燻奯⼔绍槛⺙㜌䏱沤瞅竝甸㭭䅲᭞堗㵒獕倊⋖ㅌ哂ߜޘ䑚䩈篞ȣ氵枯ㄜ羨堺႖∏ཱྀ᷎ܽ䬗敓ࢉ癦煇孷䏏ፑ岄㵆緔Ѐ䔿繄攑巼ᰎ矫漷嫏㊙ໝ斛㝇Ɂ毺㨮溶䉅囼喍砗傱搒ぞ俍䒛Ш∓枸矐㐤ᤨ縖箝皹勜⩔䯾珝宜娖同媈ᾛἄ偕恏䄇涯弪㢠眛樖愩㟹䳀ⱀ滾緹筇矋泋庇㇞挝本䊤砌瞓墠\"七ᘝ嘌〡澂槡⎮噛緔擏睮ቖܑ䄈ᠣ珘䍀㹋䀬剟Ṋ⣀ํⵢ憄డ栣勁ݘ您ၛ䏞ę࿄ΰ剐๒Ǡ㦩ⲡ洣䑼㱹䐽懼㎠〫㱒㶷㫸ৈ᳃䂠熰ݮ⌂簯☢ࡘ箯䐾䇻᙮߇䐑Ƃޠ拚弧į樎䀤株ǡ并ސǸᲫ䘰焎儣緘⋘∽⨿䒔愕ḛ灣䛤ᴀ㪀祁斎㒧央緉呙⦂敍楀⫢瑌ὶ㉐乁绨ḧ堯ԋⱛ啓ጬ瓅斉䍵坠ば䕑潐珣礨ǹ堽㐭悓䱰懽ⰲࡾยᵜᰐ糈௧ợ抱弯扞㮩纺灞泪䇬ᬑ▘姊⺭ᙧ⦆っ㲇撚待巢䠈ᦽλ䉎䧅ᓳ╧ษ固䉞უ⤞䦱烦䝒䱔燪㎈爞璮牙㪠樦怨࠳端墀ͬ哞ɜ䷸咹碠澆㋯柆㈉ກ㶍ຌ௮І⫑秼ョ址挽箴䲓ऽ⣊揀䌋໊䠼㼆⽘ূィ㖮㿱堠岑夞6揉愃ດ䬌㩱࿑欃䗧䎮漼బ厷孼燸䥜⤟ᰣ㡡⢠ඬ⣢⛧冮༼癝⊢儨২Ꭱ䠃䂴尜㷞䢩梪զつ宠ⶖ㮯椈ႏ唊屃参㷦⨠˝ᅇ疀䥘䝪?慷㇆䷉瀲ᕃ罖ಮ稽ᜃЩ㱏搷o礉ừᘄ瓪ၤ֚䅮ੲ‷㤬氼㈋䢅(⤁䆙н扚₨ůʽ䄶怬ᔈ慈号ә爅ɪ㺴瑄ᙳ晘啮亲൚㊠$七ೳ珘൯抿㕙䀥ᔄ笰䡾ᐶ仳ᆺ㪅 {捛叫⟦磥ᶊ㦠ω绳劬အẽ升㪟缴绿ᦨю箠搛愱䢔䏂ᢇẘ幭䯻ἢ瀺瘬㏤柛皺ႆ㧪桢旽៱璹σ獘ㄋ䙲兀ଋ⁀๛㣛ƺڹ砲▇狯ह歞嚐㒸㛘綪竀㴴⋖㵄玥ඞ夨帗涾筙䶮ਬࣘ⠥ᒭ坔ǠŞ਼㑈㧰幈⎼⏂Ԥ攪ᙝૄ塑壧ᱮ㰮ᦜ�ⓔⰠ沀⏁ধㄧٗ䙣朥佑挾㭬䢙筩⅒㽭䙳簯⪕捿ࡈ㙘撧✣ᰫတᜳܓ擹㗡㘃ҹ㤡紑㼗珹࢟侽拲₾ܠᥠ⽇瓐橣潘ᠨ紊ή槠板伧ม㴆℞怫瀇ᑎ㪁ݘ܈ဤ㧱䉀磮慼䊓ዼ礡涓攇ឃ厼㌥亗ᴐ璮௧⢻熤ǩ䌤⃥攼ఠ奘怣䃝傡榵愴皂⣤ी岅惄๙沫停扎曳ᣙṬ挑⨸䱦ᜡ尸岉䏢緌❨ℷک≼㆟庣䘈⺎៰⸿≙搲给檓檷ᄈ‡據㩪㌉䨠Rַ漸噼凥垥搿䉟䝲䆝 ݵ孏ష䕍䮳擖⽌峹㯒焠ǫ溷稡䕀峙䀮猏乖珬惶⺜峭䀠Їଛ挢⮠坡⺼庥㮒爅殳簠㫑䥼但▔攱ᗥ㵢圪⨌幙㲠紅捋摷絮哃䝨䬀嗬䰚ᖑ〄屐懪燆໋皸丑禁䓥ᶯ⋛嘘汙ҕ㈚嵚☺焅נ烚ᜢ嶾糄䶔坸ⶳᐺÌáࡍ㧌禮ᦋ䨄族橒㥍៖㾄ᜁ⃛⾶犎䖒狸୰ᣇ梁⾩㛝濐㬜渶ʉ䚰მ沭ⷚ狸Ἃ䩘ώ崳ໝ⍦㬚㰳繇執堼俢บ猕犦㗷ଔ憠䇘⥦笔縧毳垢塗ʼn㜦癠嬋禧囇۵剄祪欎⻟䩩稡ၪ݈盹歙ᗎ哀懢᎐㓯ฎ磟Ⱓ㥳㴷ᚻ涔䬀羻毃俕斀᮫ᯌ䉑墷ㇳ㕊ߜċ婧低曰㧙⏘㩸ⷽ磛ࡸ䁦⣜Ṳ㸃ቻ岄㧈㋽ቛᛮ嶷䷥႞㟢渘弯ᒬɯᷨࡠ梯帿亡ী琷罅牡梒濅帿፬亍慻啜♰墡涡椮።廝導⥮潫ペ怶竍絻佗䶏犣㗛䂡ⷺ㒸䜦₭峒Ŗ睑欠ௗᛨ滼⏆䞘眂Ž䑨є剏䁝㦗ⲽ紘ࣤ瞪糾⻜箟按ᬠ審ⳬƜ䄴琌䑼咈℈എ瑠楛♥⼕ᷳ᪑匊乭䊌ٖທ偎秾⁞玐䶫籛噢瞻墒刏Ү禸ᗛ砾冏ᇄཚ㉚㷴氘ߓ漑㈯᮶䁱碻垘⭍會無ᵡ濳㷧橱柵䂤岎㣂疵绨དྷ㯃み嬦䐡摐Ꮨ7ᥥʋت燨ᑰ नD秴ǒת⯥ᬢ硢㯿组ዯ䐶⽑憳繠ᾗ崸╂碝殓䧨ᅡ偿俟䆙㼇䁕簎悗渿怑㪞笝縛栗ベ忽䂙㵡瓠恐ޭ眦Ǜŗ㵦犎ἰ⤯ᒑၞᤣȔ緣珓挷満㲒š硘洧搧ా濾濞愐㞷ϩަ䶃Ո㷧ೀ穣櫲㜗Ŀ⊡ⵃ澟匘☆珚ྟး㳡㪁炣斧丗吿╁瑚焕䈀栮ߓ㓸ࣤ㻫ᘱ畃碧泬䳄䐆懜抟开昙ఈྪἀ㳈磊ۃ涧縗䴾ሿ㒙焛刏䐞䞫ར懘ᴎȶॡ皆㢯檣㹞ᠦ䤑Ț揼䟃瞨ṯ屘窜竃瀄⬯小汝岟夡爃緷䞵崜ᾢ㴸砩縳碧换ᒎ稗兇伪熿羟ᐺ࿖Ḵ㵿㩱缣槧副甿⥞๙䈓揷箿ྕ粬Ȅ穉獖ᥰᙀ䘡歰⯷甘ᨚ㑽䏾䰴䀦㶼㞇㋪劇棯玑⊠獁ഝᨓᓂ柵咓Ṷ㸤㯹渝涇狯↾㖹ᚘ洞媠⥗缚ᘍ䞌Ἀ㦖仸耚嬃ඬ劯ᴓ㏰皋併招า攣䦴吇囯籽忿㺟㿩稇㪹关⢢硲䴓濦ᡏᔻ↚笨咊䅏ਔᏞᑁ㹼繒瑴ㄷ噳刂琲㟧皐㐸Є:⟲穻ᷠE琼㔷偧㎈磞䦚⾨☏姯㐜⿔彝䛀㭅瑫恗ȧ噿漶↟䂜ℓ䯢╾⽬廣䒅░䁹୰㽬⋟㔧☛㏹婦䋂必㷤撵癋灷怆š拝䄷⬚嘁䇺᠋婿矕㹕␅爁䳓䳰皅⊠徠嚒㘔⠹垫⽟Ὄ笑╌畹竷媧孾⌺᭞㬞㘘拆籪ₒ摋Ƃх秸ݾ█㻜ण笐จᯮ埪⽎楣㷞栕灹ၗ枒ჩᥡ䎜瀯ช㛄㠟硉忰ᰦ疭璗ਇ滏䬏姞䡛䚜⸊⳾㟯⥇⽃恷働爯䄅ₑ峝痥圝捵ൕ㟺瞅弋㷖祯ซ珗殏ำ㧝箘䲍慆Ⰿ染㑍徧㷥䵍簋狗渺ሲ姜枟⏀〺ሴ涋冣強㼏ⅽ緸ಇ憏䲑㗞㞞ᠪ帆㏶幮漧庯㷚┍筢᰽䚧勩㗝⾚䜛ᘆᰅ矈ç笈槾禝熛熗殏漸Ꮬ瞞䜜㌗簒㟏濧ᾛ㹎祔䴓⇽瘸嫿悜ᾛ༔縌߫灨掳㇀繁紝窻眚眄ᷜᚠ曗搩寢ʌὑ䅿㾔痍玧洯尌ඕ1抿养⸑煵䂫借思犖篃积媗稿ᙟᎄථ窃᯲㞪穼㻳đ籭眨惗挿䇰ʜ㪽爙ᑂᴤ俁Ᾱ徥㰲Ҁ䀻幷浧犹碟䱆⬗ʳ⟳ᑝ炨መ翞䢊䩛绷委嵟ڜ攘Ⳏ戩⩖糕暬簡瘂䶇攒㖿䈐摁െ᯦伜㛓え�㻞熒緽烞ᗯ碚帧嵙㴙稒燍梹Ҝ圎㻻牥稫矕漯羿㶐庝⌝稘⡶᠔》ⲋ̐䇀繖䑐ຄ泟矢愞ᨒ皿㈼彮䣪縵粬ៜώ㞬嫟罜ᤜ㼜㌁埼操㼱㫯呜֨~䍚滟㶝涟娖㚡య⿕㶨ᐚ維碒䅗潯烚槟ڝᬛ䈜㌄㟽ࡓᾳ甆繹綹ɗ殥ኾ⩁㜟中儙៏ઝ往�ᜋ緗硂㝿㫞ఋ⼜㘚ᐙ堁ᵛ徍㺵歝紋秗篏旬⚭㎝Ⴂ㷅ᦸㆢ澲彫㽞耝簏⬗砏埿ㆬ癁䬙縮ᬀᮬῩ垠约纵筹笯枻䨄Ҟ㳼՚憟⋛Nஸ汦傝ᾬ㸪笙惻䆠孠繠㳃㬢ᴙᏦ䟠枘纍∽ႇ獖༿也㻻ⴞ畤啤⠊籟௲㾆偉糛ˇ破ڿ卯圿甞棚᪑᠉⧻ΐ篊們羴摇秉碿潟紟ᶥ㬨⩍ 佱⺐͓祜䝏溫嶨㦞㌜⍞檢㠓信ῠ棼繫ℱշ纸�䛟Ⳑ⌜岘焖㚢濱厮㿯⨅ʻ粣缶Ҝ㳟ₑଟⵝ尟搾瀝ࡧ㽢绒憋紷眏旺�䚞璈ᐞ簓\"㴠羡羯捻穷珯爣彟ޟ欝␚搢砅ᏸ忽㼹缳羔烏瓭ರ㊟ଔ氀縜尐堛Ῠ㾲䀁翩縷砪ി猰㛟㌞ພ氚⾭⌎䚣㿴罦繂缯䐿簏戽瘸ሞ樟悁尖瀈䗡㿪㽽羫糧綗皳睁ğ瘐琟眶瀓码㧢俆漗⽧缨㝉燻䔟暟䫐జ嘚】ဓ怕―翅缃缹㩉熟禰償ࢧ栟≠耖 燗翫罉缻澌ᡗ缿缣罆罀缶罿❥缵ច罡㽵罙罾缷羋娠¯罯署䍴Đ¾撒佀Ć眭搼¨Ì罦总罜羖罨缤Ç罚㽽㽂侔ç樺ß羞‼üĒྜྷцâċ缼罰羜羛缵羊㼲罊ú㑖ÍὃI㾍㴦ㆆý彅䊑Ė¥ᠲÝގ®罾í㼾罸罭缫ᙚ硺Čᢞ硣缵綑©¦⍉Ë罹î¸ò㉕㽅ć㽪½㽾ᒍíô絝¦ğ玎�Č獤�ó罖©ܥĒç缵罠术ě¹ᢀ䃇Û獴罷ü喀䄃墏ěၿ§羁㾋Þ罓㐸䃪罩⚔䃃呃灡罅⢜㵧呦罖碘䃛㽛罥ĘğËふà末呼䂧吼䂽缦º䂽罈䄞ᅆ䃌Ïóû罸¾Ē䄄䂠䄇罕ę爢䃨䂬䄚ᚁ䃱µ絨恚缭絮Z羙置䃲ò䃟ąê䃠䃽㼶ᑙ䂨琭䃺䂹䉹䃩罜䃂͝䄆䂹Ø䂥䄙ÒÄ䃋Ğ䂡Ó㒍䄃䃋㵃䃌āᙕܶ䂷㨨怷䂳䂻墂䃐罅䃫䃗炋䂻Ć్ܰ䃩増䃱‽ù䡐⃔罐≈䃏䃓䂿«䃫Õ缠䂷㑸䄌ᠬᒝ㝓⡷䄑媐䞟ޔ恘℀㢏䃤䄄℞à₷㑢₰瞚ူ⃣ᑼℂ₦º⃒㾈₠渶⃜₲℀羈Î䄓ØÇ㼴䂡䃠朮ℂℚ₽䡱⃚₨⃡ࡗܷ£䄚ᕹ⃯ę䃶罾⃒㾅䄎罁₻䂷㑥ℑ⃠咇މ₹兦儱䂦㪝ą㽥䄎䃒䂡⃤Ê䃽㼽₶剳₦³➜₶婷⃯䃲⃮䂸ྒ䂭℄ཱྀ㼯⒀想❖ℚᕷ⃓ℂď⃟䡿₻⃪⃔℃ᝨ惬℘墄悹塷❗ሬ惯ℎ℅㼿⃟℟䃭℃ឌ惇惗➐惞洬惈愔;羜惿䂪₤愄á栺悴悹ᡖ悶䡏⁙⡽㝊欬㠾࡞ࠡࡌ悚ᠵ硗䱓岄ࠩ偗䡭⠩恃䢜ၢࡻ࢞㲇Ø㝆⁅爻㊁‵卮湻㱾瀬灺偌瀥〬ぜ瀶䀰q憜⺌倱瀩炀氽ဤ䌾㼹�5偂䁏⁂⩇璗ၗޜふ✢�‼y惢悊၂ࢌ�O惁ၣ䡧མ�-䡦灟惘㝱䂜�WĪ⁻ሻ㱵汐偽⢅⁃䱭]䝡㜿Éݿ灛⢁息瀥�灘Ⴗ栺၂აࡆ⁖₌⠻灻㱉䝙撖罼籯E�წ悁䞈ჟ倠ჟvჰႿ䠸灴ࠠᄂ䀾ფᄄᄟ灡梀ࠬჱ⁌Ⴗ䜼Ⴄ䃜Ⴗ梟倪Ⴟ瀷栮ぅᄐࡘ摉ᩮ㲚ᄓ笮x㊙惏\\ၷ悫ޗ愌`䀯惲ᄕၾ恩ࠠჀᄔ䡾恒jႩ㭪ᢐ假ࡾ恢䀤䡯�+თᄘ❸ჿ灯ᄉEu❛Ⴓ၀儌�䁵✶ᄛჄ�/ჯ�ი僤$傠Ⴙᠿ〠僤傥惧ゔ怹偟悛ᘪ汱伢傾ؤ悈塭悘㑤僆⁙灰獥瀣碑い᱀ "}
The complete round-trip took 49.6 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.8", "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-9604-2HyINXWrjtfF-.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-9604-2HyINXWrjtfF-.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-9604-2HyINXWrjtfF-.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-9604-2HyINXWrjtfF-.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-9604-2HyINXWrjtfF-.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-9604-2HyINXWrjtfF-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9604-2HyINXWrjtfF-.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-9604-2HyINXWrjtfF-.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 14.1 ms (including time required to validate the messages, start, and stop the internal mock server).
The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the
filetoken
is unknown, flowR will respond with an error.Within a document that is to be sliced, you can use magic comments to influence the slicing process:
-
# flowr@include_next_line
will cause the next line to be included, independent of if it is important for the slice. -
# flowr@include_this_line
will cause the current line to be included, independent of if it is important for the slice. -
# flowr@include_start
and# flowr@include_end
will cause the lines between them to be included, independent of if they are important for the slice. These magic comments can be nested but should appear on a separate line.
Message schema (
request-slice
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-slice'
- id string [optional] The id of the message, if you passed one in the request.
- filetoken string [required] The filetoken of the file to slice must be the same as with the analysis request.
-
criterion array [required]
The slicing criteria to use.
Valid item types:
- . string
- direction string The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
Message schema (
response-slice
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts
.-
. object
The response to a slice request.
- type string [required] The type of the message. Allows only the values: 'response-slice'
- id string [optional] The id of the message, if you passed one in the request.
- results object [required] The results of the slice (one field per step slicing step).
-
-
REPL Message (
request-repl-execution
)View Details. Access the read evaluate print loop of flowR.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-repl-execution alt Server-->>Client: error else loop Server-->>Client: response-repl-execution end Server-->>Client: end-repl-execution end deactivate Server
[!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.8", "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.7 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.8", "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":5}},"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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.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-9604-lkkTtk26PzWe-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-9604-lkkTtk26PzWe-.R","role":"root","index":0}},".meta":{"timing":2}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-9604-lkkTtk26PzWe-.R"],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":7}}}}
-
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": 1 }, "kinds": { "visualize": { "subkinds": { "text": [ { "id": 31, "name": "mean", "calls": [ "built-in" ] }, { "id": 87, "name": "mean", "calls": [ "built-in" ] } ] } } } }, ".meta": { "timing": 1 } } }
The complete round-trip took 28.8 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 alternatives [required]
Test regarding the function name of the last call. Similar to
callName
, strings are interpreted as a regular expression, and string arrays are checked for containment.- . string
- . array Valid item types:
- . string
- ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. array
Valid item types:
-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName alternatives [required]
Test regarding the function name of the last call. Similar to
callName
, strings are interpreted as a regular expression, and string arrays are checked for containment. - . string
- . array Valid item types:
- . string
- ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. object
-
. object
-
. object
The config query retrieves the current configuration of the flowR instance and optionally also updates it.
- type string [required] The type of the query. Allows only the values: 'config'
- update object [optional] An optional partial configuration to update the current configuration with before returning it. Only the provided fields will be updated, all other fields will remain unchanged.
-
. object
The control flow query provides the control flow graph of the analysis, optionally simplified.
- type string [required] The type of the query. Allows only the values: 'control-flow'
-
config object [optional]
Optional configuration for the control flow query.
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
- . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
-
. object
The dataflow query simply returns the dataflow graph, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'dataflow'
-
. object
The dataflow-lens query returns a simplified view on the dataflow graph
- type string [required] The type of the query. Allows only the values: 'dataflow-lens'
-
. object
The df-shape query retrieves information on the shape of dataframes
- type string [required] The type of the query. Allows only the values: 'df-shape'
- criterion string [optional] The slicing criterion of the node to get the dataframe shape for.
-
. object
The id map query retrieves the id map from the normalized AST.
- type string [required] The type of the query. Allows only the values: 'id-map'
-
. object
The normalized AST query simply returns the normalized AST, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'normalized-ast'
-
. object
The cluster query calculates and returns all clusters in the dataflow graph.
- type string [required] The type of the query. Allows only the values: 'dataflow-cluster'
-
. object
Slice query used to slice the dataflow graph
- type string [required] The type of the query. Allows only the values: 'static-slice'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
- noReconstruction boolean [optional] Do not reconstruct the slice into readable code.
- noMagicComments boolean [optional] Should the magic comments (force-including lines within the slice) be ignored?
- direction string [optional] The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
-
. object
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? Defaults to false.
-
libraryFunctions array [optional]
The set of library functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
sourceFunctions array [optional]
The set of source functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
readFunctions array [optional]
The set of read functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
writeFunctions array [optional]
The set of write functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
visualizeFunctions array [optional]
The set of visualize functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
enabledCategories array [optional]
A set of flags that determines what types of dependencies are searched for. If unset or empty, all dependency types are searched for.
Valid item types:
- . string Allows only the values: 'library', 'source', 'read', 'write', 'visualize'
- additionalCategories object [optional] A set of additional, user-supplied dependency categories, whose results will be included in the query return value. Allows only the values: '[object Object]'
-
. object
The location map query retrieves the location of every id in the ast.
- type string [required] The type of the query. Allows only the values: 'location-map'
-
ids array [optional]
Optional list of ids to filter the results by.
Valid item types:
- . string
-
. object
The search query searches the normalized AST and dataflow graph for nodes that match the given search query.
- type string [required] The type of the query. Allows only the values: 'search'
- search object [required] The search query to execute.
-
. object
Happens-Before tracks whether a always happens before b.
- type string [required] The type of the query. Allows only the values: 'happens-before'
- a string [required] The first slicing criterion.
- b string [required] The second slicing criterion.
-
. object
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.8", "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":3}},"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-9604-gDRU8JXv4nXM-.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-9604-gDRU8JXv4nXM-.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-9604-gDRU8JXv4nXM-.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-9604-gDRU8JXv4nXM-.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-9604-gDRU8JXv4nXM-.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-9604-gDRU8JXv4nXM-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-9604-gDRU8JXv4nXM-.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-9604-gDRU8JXv4nXM-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
-
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 7.9 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.
Note
If you develop flowR, you may want to launch the repl using the npm run main-dev
command, this way, you get a non-minified version of flowR with debug information and hot-reloading of source files.
Available Commands
We currently offer the following commands (this with a [*]
suffix are available with and without the star):
Command | Description |
---|---|
:quit | End the repl (aliases: :q, :exit) |
:execute | Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r) |
:controlflow[*] | Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) |
:controlflowbb[*] | Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) |
:dataflow[*] | Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) |
:normalize[*] | Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) |
:dataflowsimple[*] | Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) |
:lineage | Get the lineage of an R object (alias: :lin) |
:parse | Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) |
:version | Prints the version of flowR as well as the current version of R |
:query[*] | Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) |
:help | Show help information (aliases: :h, :?) |
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.8, 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 1.9 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.8, 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
- 🧑💻 Developer Onboarding
- 💻 Setup
- 👓 Overview
- 🪟 Interfacing with flowR
- 🌋 Core
- 🧹 Linting & Testing (Benchmark Page)
⁉️ FAQ- ℹ️ Extra Information