-
Notifications
You must be signed in to change notification settings - Fork 10
Interface
This document was generated from 'src/documentation/wiki-interface.ts' on 2026-01-18, 12:57:46 UTC presenting an overview of flowR's interface (v2.8.9, 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.
Note
To execute arbitrary R commands with a repl request, flowR has to be started explicitly with --r-session-access.
Please be aware that this introduces a security risk and note that this relies on the r-shell engine .
Although primarily meant for users to explore, there is nothing which forbids simply calling flowR as a subprocess to use standard-in, -output, and -error for communication (although you can access the REPL using the server as well, with the REPL Request message).
The read-eval-print loop (REPL) works relatively simple.
You can submit an expression (using Enter),
which is interpreted as an R expression by default but interpreted as a command if it starts with a colon (:).
The best command to get started with the REPL is :help.
Besides, you can leave the REPL either with the command :quit or by pressing Ctrl+C twice.
When writing a command, you may press Tab to get a list of completions, if available.
Multiple commands can be entered in a single line by separating them with a semicolon (;), e.g. :parse "x<-2"; :df*.
If a command is given without R code, the REPL will re-use R code given in a previous command.
The prior example will hence return first the parsed AST of the program and then the dataflow graph for "x <- 2".
Note
If you develop flowR, you may want to launch the repl using the npm run main-dev command, this way, you get a non-minified version of flowR with debug information and hot-reloading of source files.
Available Commands
We currently offer the following commands (this with a [*] suffix are available with and without the star):
| Command | Description |
|---|---|
| :quit | End the repl (aliases: :q, :exit) |
| :execute | Execute the given code as R code. 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) |
| :dataflowsilent | Just calculates the DFG, but only prints summary info (aliases: :d#, :df#) |
| :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.) |
| :dataflowascii | Returns an ASCII representation of the dataflow graph (alias: :df!) |
| :help | Show help information (aliases: :h, :?) |
Tip
As indicated by the examples before, all REPL commands that operate on code keep track of the state.
Hence, if you run a command like :dataflow* without providing R code,
the REPL will re-use the R code provided in a previous command.
Likewise, doing this will benefit from incrementality!
If you request the dataflow graph with :df* x <- 2 * y and then want to see the parsed AST with :parse,
the REPL will re-use previously obtained information and not re-parse the code again.
Generally, many commands offer shortcut versions in the REPL. Many queries, for example, offer a shortened format (see the example below). Of special note, the Config Query can be used to also modify the currently active configuration of flowR within the REPL (see the wiki page for more information).
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.8.9, R grammar v14 (tree-sitter engine)
R> :dataflow* y <- 1 + xOutput
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmdyYXksc3Ryb2tlLXdpZHRoOjJweCxvcGFjaXR5Oi44O1xuICAgIDBbXCJgIzkxO1JTeW1ib2wjOTM7IHlcbiAgICAgICgwKVxuICAgICAgKjEuMSpgXCJdXG4gICAgNFtbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzYwOyM0NTtcbiAgICAgICg0KVxuICAgICAgKjEuMS0xMCpcbiAgICAoMCwgMylgXCJdXVxuICAgIGJ1aWx0LWluOl8tW1wiYEJ1aWx0LUluOlxuIzYwOyM0NTtgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46Xy0gc3Ryb2tlOmdyYXksZmlsbDpncmF5LHN0cm9rZS13aWR0aDoycHgsb3BhY2l0eTouODtcbiAgICAzIC0tPnxcInJlYWRzLCBhcmd1bWVudFwifCAxXG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMlxuICAgIDMgLS4tPnxcInJlYWRzLCBjYWxsc1wifCBidWlsdC1pbjpfXG4gICAgbGlua1N0eWxlIDIgc3Ryb2tlOmdyYXk7XG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDNcbiAgICAwIC0tPnxcImRlZmluZWQtYnlcInwgNFxuICAgIDQgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=
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:gray,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:gray,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 -->|"reads, argument"| 3
4 -->|"returns, argument"| 0
4 -.->|"reads, calls"| built-in:_-
linkStyle 7 stroke:gray;
R Code of the Dataflow Graph
The analysis required 0.6 ms (including parse and normalize, using the tree-sitter engine) within the generation environment. We encountered no unknown side effects during the analysis.
y <- 1 + xFor small graphs like this, :dataflowascii also provides an ASCII representation directly in the REPL:
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.8.9, R grammar v14 (tree-sitter engine)
R> :df! y <- 1 + xOutput
0<1>0
┌────| 1 |
┌────────┐ │ 0---0
c<4>c └──c<3>c
|<- | v<0>v┌──| + |
c---c──| y |┘ c---c u<2>u
v---v └────| x |
u---u
Edges:
3 -> 1: reads, argument 3 -> 2: reads, argument
4 -> 3: reads, argument 4 -> 0: returns, argument
0 -> 3: defined-by 0 -> 4: defined-by
Retrieve the dataflow graph of the expression y <- 1 + x as ASCII art.
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.8.9, R grammar v14 (tree-sitter engine)
R> :parse file://test/testfiles/example.ROutput
File: test/testfiles/example.R
program
├ binaryoperator
│ ├ identifier "sum" (1:1─4)
│ ├ <- "<-" (1:5─7)
│ ╰ float "0" (1:8─9)
├ binaryoperator
│ ├ identifier "product" (2:1─8)
│ ├ <- "<-" (2:9─11)
│ ╰ float "1" (2:12─13)
├ binaryoperator
│ ├ identifier "w" (3:1─2)
│ ├ <- "<-" (3:3─5)
│ ╰ float "7" (3:6─7)
├ binaryoperator
│ ├ identifier "N" (4:1─2)
│ ├ <- "<-" (4:3─5)
│ ╰ float "10" (4:6─8)
├ forstatement
│ ├ for "for" (6:1─4)
│ ├ ( "(" (6:5─6)
│ ├ identifier "i" (6:6─7)
│ ├ in "in" (6:8─10)
│ ├ binaryoperator
│ │ ├ float "1" (6:11─12)
│ │ ├ : ":" (6:12─13)
│ │ ╰ parenthesizedexpression
│ │ ├ ( "(" (6:13─14)
│ │ ├ binaryoperator
│ │ │ ├ identifier "N" (6:14─15)
│ │ │ ├ - "-" (6:15─16)
│ │ │ ╰ float "1" (6:16─17)
│ │ ╰ ) ")" (6:17─18)
│ ├ ) ")" (6:18─19)
│ ╰ bracedexpression
│ ├ { "{" (6:20─21)
│ ├ binaryoperator
│ │ ├ identifier "sum" (7:3─6)
│ │ ├ <- "<-" (7:7─9)
│ │ ╰ binaryoperator
│ │ ├ binaryoperator
│ │ │ ├ identifier "sum" (7:10─13)
│ │ │ ├ + "+" (7:14─15)
│ │ │ ╰ identifier "i" (7:16─17)
│ │ ├ + "+" (7:18─19)
│ │ ╰ identifier "w" (7:20─21)
│ ├ binaryoperator
│ │ ├ identifier "product" (8:3─10)
│ │ ├ <- "<-" (8:11─13)
│ │ ╰ binaryoperator
│ │ ├ identifier "product" (8:14─21)
│ │ ├ "" (8:22─23)
│ │ ╰ identifier "i" (8:24─25)
│ ╰ } "}" (9:1─2)
├ call
│ ├ identifier "cat" (11:1─4)
│ ╰ arguments
│ ├ ( "(" (11:4─5)
│ ├ argument
│ │ ╰ string
│ │ ├ " "\"" (11:5─6)
│ │ ├ stringcontent "Sum:" (11:6─10)
│ │ ╰ " "\"" (11:10─11)
│ ├ comma "," (11:11─12)
│ ├ argument
│ │ ╰ identifier "sum" (11:13─16)
│ ├ comma "," (11:16─17)
│ ├ argument
│ │ ╰ string
│ │ ├ " "\"" (11:18─19)
│ │ ├ stringcontent
│ │ │ ╰ escapesequence "\\n" (11:19─21)
│ │ ╰ " "\"" (11:21─22)
│ ╰ ) ")" (11:22─23)
╰ call
├ identifier "cat" (12:1─4)
╰ arguments
├ ( "(" (12:4─5)
├ argument
│ ╰ string
│ ├ " "\"" (12:5─6)
│ ├ stringcontent "Product:" (12:6─14)
│ ╰ " "\"" (12:14─15)
├ comma "," (12:15─16)
├ argument
│ ╰ identifier "product" (12:17─24)
├ comma "," (12:24─25)
├ argument
│ ╰ string
│ ├ " "\"" (12:26─27)
│ ├ stringcontent
│ │ ╰ escapesequence "\\n" (12:27─29)
│ ╰ " "\"" (12:29─30)
╰ ) ")" (12:30─31)
Retrieve the parsed AST of the example file.
File Content
sum <- 0
product <- 1
w <- 7
N <- 10
for (i in 1:(N-1)) {
sum <- sum + i + w
product <- product * i
}
cat("Sum:", sum, "\n")
cat("Product:", product, "\n")As flowR directly transforms this AST the output focuses on being human-readable instead of being machine-readable.
You can run any query supported by flowR using the :query command.
For example, to obtain the shapes of all data frames in a given piece of code, you can run:
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.8.9, R grammar v14 (tree-sitter engine)
R> :query @df-shape "x <- data.frame(a = 1:10, b = 1:10)\ny <- x$a"Output
Query: df-shape (2 ms)
╰ 12: (colnames: [{"a", "b"}, {}], cols: [2, 2], rows: [10, 10])
╰ 0: (colnames: [{"a", "b"}, {}], cols: [2, 2], rows: [10, 10])
All queries together required ≈3 ms (1ms accuracy, total 4 ms)
Retrieve the shapes of all data frames in the given code.
To run the linter on a file, you can use (in this example, we just issue the dead-code linter on a small piece of code):
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.8.9, R grammar v14 (tree-sitter engine)
R> :query @linter rules:dead-code "if(FALSE) x <- 2"Output
Query: linter (1 ms)
╰ Dead Code (dead-code):
╰ certain:
╰ Code at 1.11-16
╰ Metadata: consideredNodes: 7, searchTimeMs: 0, processTimeMs: 1
All queries together required ≈1 ms (1ms accuracy, total 2 ms)
Run the linter on the given code, with only the dead-code rule enabled.
For more information on the available queries, please check out the Query API.
As explained in the Overview, you can simply run the TCP server by adding the --server flag (and, due to the interactive mode, exit with the conventional CTRL+C).
Currently, every connection is handled by the same underlying RShell - so the server is not designed to handle many clients at a time.
Additionally, the server is not well guarded against attacks (e.g., you can theoretically spawn an arbitrary number of RShell sessions on the target machine).
Every message has to be given in a single line (i.e., without a newline in-between) and end with a newline character. Nevertheless, we will pretty-print example given in the following segments for the ease of reading.
Note
The default --server uses a simple TCP
connection. If you want flowR to expose a WebSocket server instead, add the --ws flag (i.e., --server --ws) when starting flowR from the command line.
-
Hello Message (
hello)View Details. The server informs the client about the successful connection and provides Meta-Information.
LoadingsequenceDiagram autonumber participant Client participant Server Client-->Server: connects Server->>Client: helloAfter launching flowR, for example, with
docker run -it --rm eagleoutice/flowr --server(🐳️), simply connecting should present you with ahellomessage, that amongst others should reveal the versions of flowR and R, using the semver 2.0 versioning scheme. The message looks like this:{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.8.9", "r": "4.5.0", "engine": "r-shell" } }There are currently a few messages that you can send after the hello message. If you want to slice a piece of R code you first have to send an analysis request, so that you can send one or multiple slice requests afterward. Requests for the REPL are independent of that.
Message schema (
hello)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-hello.ts.-
. object [required]
- type string [required] The type of the hello message. Allows only the values: 'hello'
- id any [forbidden] The id of the message is always undefined (as it is the initial message and not requested).
- clientName string [required] A unique name that is assigned to each client. It has no semantic meaning and is only used/useful for debugging.
-
versions object [required]
- flowr string [required] The version of the flowr server running in semver format.
- r string [required] The version of the underlying R shell running in semver format.
- engine string [required] The parser backend that is used to parse the R code.
-
. object [required]
-
Analysis Message (
request-file-analysis)View Details. The server builds the dataflow graph for a given input file (or a set of files).
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-file-analysis alt Server-->>Client: response-file-analysis else Server-->>Client: error end deactivate ServerThe request allows the server to analyze a file and prepare it for slicing. The message can contain a
filetoken, which is used to identify the file in later slice or query requests (if you do not add one, the request will not be stored and therefore, it is not available for subsequent requests).Please note!
If you want to send and process a lot of analysis requests, but do not want to slice them, please do not pass thefiletokenfield. This will save the server a lot of memory allocation.Furthermore, the request must contain either a
contentfield to directly pass the file's content or afilepathfield which contains the path to the file (this path must be accessible for the server to be useful). If you add theidfield, the answer will use the sameidso you can match requests and the corresponding answers. See the implementation of the request-file-analysis message for more information.Example of the
request-file-analysisMessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.8.9", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
Let's suppose you simply want to analyze the following script:
x <- 1 x + 1
For this, you can send the following request:
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" } -
response-file-analysis(response)Show Details
The
resultsfield of the response effectively contains three keys of importance:-
parse: which contains 1:1 the parse result in CSV format that we received from theRShell(i.e., the AST produced by the parser of the R interpreter). -
normalize: which contains the normalized AST, including ids (see theinfofield and the Normalized AST wiki page). -
dataflow: especially important is thegraphfield which contains the dataflow graph as a set of root vertices (see the Dataflow Graph wiki page).
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"files":[{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]","filePath":"/tmp/tmp-8384-9PryMpLB8gRF-.R"}],".meta":{"timing":4}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8384-9PryMpLB8gRF-.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-8384-9PryMpLB8gRF-.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-8384-9PryMpLB8gRF-.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-8384-9PryMpLB8gRF-.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-8384-9PryMpLB8gRF-.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-8384-9PryMpLB8gRF-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8384-9PryMpLB8gRF-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8384-9PryMpLB8gRF-.R"}],"info":{"id":7}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":3107,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"vdef","id":0}],[2,{"tag":"fcall","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"fcall","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":65}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]],"_unknownSideEffects":[]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],"hooks":[],".meta":{"timing":0}}}} -
The complete round-trip took 11.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.8.9", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filename": "sample.R", "content": "x <-" } -
error(response)Show Details
{ "id": "1", "type": "error", "fatal": false, "reason": "Error while analyzing file sample.R: GuardError: unable to parse R code (see the log for more information) for request {\"request\":\"text\",\"content\":\"x <-\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.8.9%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22text%22%2C%22content%22%3A%22x%20%3C%2D%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A128%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A221%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A182%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A104%3A19%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A192%3A25%29%0A%20%20%20%20at%20async%20FlowrAnalyzerCache.runTapeUntil%20%28%3C%3E%2Fsrc%2Fproject%2Fcache%2Fflowr%2Danalyzer%2Dcache.ts%3A93%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.sendFileAnalysisResponse%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A163%3A52%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09" }
The complete round-trip took 11.9 ms (including time required to validate the messages, start, and stop the internal mock server).
Including the Control Flow Graph
While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add
cfg: trueto its list of options.Requesting a Control Flow Graph
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.8.9", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "if(unknown > 0) { x <- 2 } else { x <- 5 }\nfor(i in 1:x) { print(x); print(i) }", "cfg": true } -
response-file-analysis(response)Show Details
The response looks basically the same as a response sent without the
cfgflag. However, additionally it contains acfgfield. If you are interested in a visual representation of the control flow graph, see the visualization with mermaid.As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"files":[{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]","filePath":"/tmp/tmp-8384-OU3Kqnfg1rxn-.R"}],".meta":{"timing":2}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"type":"RExpressionList","children":[{"type":"RIfThenElse","condition":{"type":"RBinaryOp","location":[1,12,1,12],"lhs":{"type":"RSymbol","location":[1,4,1,10],"content":"unknown","lexeme":"unknown","info":{"fullRange":[1,4,1,10],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.R","index":2,"role":"if-other"}}},{"type":"RForLoop","variable":{"type":"RSymbol","location":[2,5,2,5],"content":"i","lexeme":"i","info":{"additionalTokens":[],"id":16,"parent":31,"role":"for-var","index":0,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.R","index":1,"role":"for-vec"}},"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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.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-8384-OU3Kqnfg1rxn-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8384-OU3Kqnfg1rxn-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8384-OU3Kqnfg1rxn-.R"}],"info":{"id":33}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","cds":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","cds":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","cds":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","cds":[{"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","type":4,"definedAt":7,"cds":[{"id":15,"when":true}],"value":[6]},{"nodeId":11,"name":"x","type":4,"definedAt":13,"cds":[{"id":15,"when":true},{"id":15,"when":false}],"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":3236,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","type":4,"definedAt":7,"cds":[{"id":15,"when":true},{"id":15,"when":false}],"value":[6]},{"nodeId":11,"name":"x","type":4,"definedAt":13,"cds":[{"id":15,"when":true},{"id":15,"when":false}],"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"fcall","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"vdef","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"fcall","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"fcall","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"vdef","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"fcall","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"fcall","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"fcall","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"vdef","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"fcall","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"fcall","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"fcall","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"fcall","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"fcall","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":65}],[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":65}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],"hooks":[],"cfgQuick":{"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["32-exit"],"entryPoints":[32]},".meta":{"timing":2}}}}
The complete round-trip took 10.6 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.8.9", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "n-quads", "cfg": true } -
response-file-analysis(response)Show Details
Please note, that the base message format is still JSON. Only the individual results get converted. While the context is derived from the
filename, we currently offer no way to customize other parts of the quads (please open a new issue if you require this).As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"n-quads","id":"1","cfg":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/exitPoints> \"6-exit\" <unknown> .\n","results":{"parse":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/token> \"exprlist\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/text> \"\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/text> \"x <- 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/token> \"LEFT_ASSIGN\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/text> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/text> \"x + 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/token> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/text> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n","normalize":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/type> \"RExpressionList\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/operator> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lexeme> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/operator> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lexeme> \"+\" <unknown> .\n","dataflow":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/tag> \"vdef\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/tag> \"fcall\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/name> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/nodeId> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/nodeId> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/origin> \"builtin:assignment\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/tag> \"use\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/tag> \"fcall\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/nodeId> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/nodeId> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/origin> \"builtin:default\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"reads\" <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 6.7 ms (including time required to validate the messages, start, and stop the internal mock server).
Retrieve the Output in a Compacted Form
The default response is formatted as JSON. But this can get very big quickly. By specifying
format: "compact", you can retrieve the results heavily compacted (using lz-string). This works with and without the control flow graph as described above.Requesting Compacted Results
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.8.9", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "compact", "cfg": true } -
response-file-analysis(response)Show Details
Please note, that the base message format is still JSON. Only the individual results are printed as binary objects.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾⩬ᰡ暁∠ᰠ䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭埋ℜঋ殍ᯕ獺䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰 ","results":"ᯡࠣ䄬Ԁ朥ᢠڀ■㚑䤦檲ⲐŒ≎ĸó⻀ᬵǸ吠拀ຨ㠠禥Ꮚᐰᨀ㢦瀠‣怫₱⧠ᝪ劭⨡䲂ƴŔƄ¤Ȅ�Ƞ峀˙憮牲凃㮓✾㸢䉧溔㤦⫋㗈L⨠ጳ౬怪ဣࠠ吡稠䄽ຠበเβ嫹籡㉮唦㴵᱀૦ᗨˈâ፼仂晀吮㥳䰚呕睎⽟аⱊᔁ甥⏈兕ਦᬧ䲛敔Ⲱͳ敫玱畖Դ㎿Ⲏ㔊瀍吮❔ٕ垤柺㹃㻲䒦椾†犍倅㦩嬻䛈声←厯⩔ⵖ䏁᭸崹䰸㥍憅䱩玭ᯄ偬ₔଠH₶\"晠ȉᘠ᛬φᥒ#䧅㍢᥊‣堡剌1污ᡈGԧ⊈㈠ຠɱ 待У៲火Ȥ䊡ᙔẶ䄒�ሢ䑶ᕴࠧ䠣泀窐䚠ÜࢄСáᚍ〡Ẁ㏄ζ䥰ᗀ˓䀠振⋲➀硰ᡕ㒚⺿⿶⇫ㅑ嬣ǀ嚾⳦䏚䔐犹䌰偘ඛ㼟〻傏ⓦIJᡋ㱑┇ᗤᡆ劤⪬ኳ䍆㗔杭矲Cᗃ֏宽溏Ɛ桊碗᳐⭩碵威愊夻䉄ൈᗓ楠永خ⢡෮檥慴⃤ㄭ珢≪栣ⱋ戎ˋᄣᨤ湨ੁá䬣Ⴓ䃲媀٤๘˰ޢ⁀➶惚䣴懱匧竬䦰㊨㶴狼徲ੂ屴䫲干⬆䨪䷐皏寓ᒊຠ徔⁀ʢṜ䔓ḷ䬑度伐唔ሖ㻏䯐绿堓怠⠮僀㳑物刮䈞丮媨⨡㇈➷↧儠槸㷰堨ᅐᇤⶰ牼垰ૢ呰䩲噰⩬╕囙ۢ亐ਢᜋ尩㩜䑉ᨶ䶔㉸ᮦׁ㱌ỡ�䨡绤ᕁ䂹᭪‹⳰娨ⱈ剖䲥䡛宣漞䛍ᧂ◷ặ嬕幫嵧璒☐煪⠑犟䵨䄶傢䔬ዱ懖㼮ኤ㚵ᅎ㲯㥴⯭凞↭ᨆ⚋榄ܲ℥勡䣥哔ㅴݵย⻐㙰㘶䶨⺼ⰄᲺ�ㅃ啔布䪑亓嶪皘ć䳋削ᔢㄗ嶜㿰䍀ᤕṍ㱯㕲〽屋䋲㻝ㅨ悿䂊⠮梺⩉呰⚗樐ㄮ⇢⮏妳⛫懔晗䶬冋㦴㏩兞㺯祬㣮ເȈ煈簲⻏熢㡮㗈ᄼ䦗䈴ⱝⅯ㻸祬්㼺℁ࢻ̈́枈द℩䢜窸憶⋶姘⻩Ŭ槨ⷄ㗨儾㪮禔⨶偋♉㊓Ա㭪䗀ُ劑␠▀ॉ箞経氶孍昙ナ♅⦯ᕰዋ╀ᮅ嘕Ⲧ杭㸹䮍⌫ᑿ␒⿍⯘捽䍠Ⓕ抌寳ㆻ䶖斸㭫㶹㮋㮽ᬶ⍯毃ྦྷ渎䤉ᘸᒣᨠ⑬៎勚捘敩監ㄦ㝳↹對搦㥽涾㯋⮿㬶墘♱嘻ᦆ斥ᗓⲰ勴䏙ᅌ寜ᾼ淸䃜窠⤤プ浰㔶卆ễ㜻犂戡ʠ涠ǽẦ悙ఓⵌԒ᳃䀴̪૮䫝♪姍ᴪ㈰ཀ䀩㒊櫩稱ຈ䇪梨㻘ⷙࠚ㺒儇⇁ᕥ㑖ҹ砲樈⸣榰䓑䍏㑠涎䌈ඤ祧!嶤ᝂ䆟ᜡ牙ୠ惣攊䘭‼ᢌਡ㒲㊠〔¨䘨⚭沂痦㕇ۢぅ䈵Ⱨ⣄٤䳎唔䎉庯ƐУ樹䆸ӥ烑ீऱ䄦䉡⤫㨌搡剀jԙ杣ષ䓢ዩኩႤѰࢠⱨ恣偩沼呡ဃ⤸Ꮾ吉䉥剨摩䣸႑⊿ड़䢳ᕅቐ०ၚ⒀♯穼䄉㸰慭ᜲ╒勪╣籤̄ᕫツု⧲ᴳ⍅剪⚅ढ䖔婯ঞ䭀岩夶濣ɀ涺㣅媁曬擫磡乨͡屲┡䤮㍢㱅⑴ⓤ秭㔖俙Ą祏᧳嵗吖湣无I撳俩䊱㧟ᄪ僆牊㥃䭐䈢䡨嵥乹侶娐垒棃ġ␣㚐ᘌ旆ィ䵨呷Ĉ崪⍌狦㌇⦁ᓜ牋崐牪౽⧮䶪ᅅ㋞⦶纇ᔐㅍዽ䣩ੵ䧴剋尸䮒㔄ગ枬牥䫖Ɒ犱斴䴠ဲᣢ宷暚篜䍭⳦⽹智嗺庼站狖㕅ဨᕪ䃩䫋ⷵ෫㗧ც䫈⫕❴涚垴扣䩚䖨垵䗦偊磇犣浮旘慥ʰƭ價疙ᔺॅ᪵͵⚂↦䵨䛼⭕硷䵠崉湉᭫㢇厑㝦皏ᔘ䕨㌣僉妪吙⣗㶙噀⎎㛴楅筳༘䔊搯婻㺴殗㟢礍܄⾨系斥壳㗁ሷⳗૌ㪮䂷⼊汵㡳礫岪/棚⚢ᅹϔ㹪睮俭Ἐ嗬琧㌑䭪祲祲ਢന⪎ㄇ㣆ᘱ罯㶛嬫䫍卯㤷玻㝚廅䴍ᯰ㴩殤⓰ᨕ盄㰌缏滲忸⤟奪ɵ䈵֖㭂䲣ừო⯲㖢叺咁筰紭养璀ࠊ纽籗イㅌ䲘ٓⷅ⤒ᐠᕕೡ崼䛵殉ड़捯娈沋٘术㤏㼿窙ᨳ奘䀲㲪㒲➈港⾉图䉪ᦥ᭣╙䏸㗦㿁ᬘ楕ⴎ䱹孪ᨄ⠠㶃ᶣᱰ䏀㢠㺚杸滮哣丁厼槄渫㝘䎍ᐇ䣀ĩ㺚⛛㹎ဪⲥ涺㸵ᴃ屓捱㗆搫ᜂ灌匒ᐠ㽊⺹紾ۋ泒瓪㾆փ➪恪畿ਙ᪣珷琐㺆ᦌ⚔攮ᔓⶥ繿⧂婭㇙ḛ堶ஙਠ឵㚊翬䜀⿍翔䶷淫四ᮨࠚ䧗㛳⦍֎潅䛹⠾ⰻ㓐ୢ咷㞌ᴿ⛭✁澥孻不椠៘宄㏺ęਠླ㞦憯憘ᵕ䇿ㆹ岓Ꮠ⍩匯嶇寡礵ᶹ呙糌㶧ౕ笨礶䤙朞缽刜ᖃ塝嶡姃⇓䠕㨯⾂㙞渽狺乃槻縆㰧⚑宸筯瞞伾箍մ䃓篽ׂ㴇ኝ朠㵵⾔䠊承歴搠⥚徃嵻槭㯻㚘⠐筏֔係瀍痥洣籋氄⽷ᩥ垗㢊劖嚄緮ွ屛对ㆼ婗࣒㠒瑦‣漙睿淺帘竛ধ㯇枕寘炳ሓ潹穾緯溻䝺߈礯㞘倁琾ںᾥ癞∝⿋䆟殴礇㾞歩噾㲳澵睿䰒ᐩ⏛ं粇㵚潾翗܊廳恜◗㹗寘⽌㯃ཆ㜿疂㹋柿簑港翃俫㶿㠢注弡ʻ⽽捏㠜纝檚〄㰛Ж徚ゞ導ĥぅ㇗䗰瞽㮗渗㼵䢟洈盙甜ᗠ䧟縛㏿㹗瞟▃⿶绢㇂ῳ瓯珿⁹忲Ƙ⁇㻤纄琟ࠢ၍壨ೇおƙ盿ೀṷ㼉だ丘䡈呈ົ㇘毬纴ീ䘚忱䅥♥⇀怦悳䍀司筣䅼ടᾛ㿮⻟琯㼧㡙䄹㜰庚恤壥䈀壘筶ↈް䴤旺廟㓠犦呏ĩᛰ畃ᅼᠸΔ⟡乏烫ᆤ䱐⇈็㿚䑂ⱶঠਲ瑍剮ৠ㉈弾䠠㕐军⟤庚㌐侤汖䄺ə䉎िٺ≝⠾৭ᾫ甡纆ഷ㲙婹ᅁ䄘ᱟ梹ರ恺㉙ખ䂦⩤巼䅢先噧縸యᕤ儰ќ㉈Ⅸ䂱䁰穦ိ刐Ĉ媤橄↕ࢶཤ⌢籑ఫࣤ㩋㹼ྠᒁ䩆㺷熸䛃⩑㻕ୗ☦㡒㣓ਠ䈥ᙃ棥ࣄ⪧晀ᆎ珔■瑙ḫ瘰綥ُᆧໄ⍤筬爒૿㆞ཐ簥զ�ࣞ◥ㆣླྀ悚繝煛ਘ忥珢{ഈ絸慅愠䬟ᨥ噃Ḩ䢤例兜㹼ፒ᱅瓸ᢨᕀ㽥ņ煀䢶ņ煑爐僄甒ቘ䢍䋊ధ憽玗ⴱ䥝灗ⶥ桓↡瞄杇䙈⨢伪↥怳ó⊄䏻䩗䈐凡ӆ灉ॢ।灄㏾⤸Ҵ殦ွ⧳⋿ᨸ礭HϤ氛畐楋໘紤㙔楦䫄縧ⵏỨ䈄㢃ൃᚮ五煄ⵏ䤲掔䙇慧槨厌㐧๕䤹㐬秄啔䤹猬淄ቬᤡ䫔⇀⠥䁎䰫₅ᦖ悙卙ᥑ䮉珰ᤱŬ僉ୃ伨忹䭏ᦨ͌瓤䎪⥂熴抧慳䄭䬄斚㵒夻ඪඅ孏Ἂ䇜অṖ䨯焌嗤⍋ᤲ搼夅Մ㥣乥∩倰⡪ᒌ尤⩇婫䥼䈠㵒㥾倔ᜆ坋⦧䡠㉊‽桛丬䖦˼礻䝌塧䃗䧼囇ữ䷬嘇㹇娿俜书湉禎䃼⺆彈٬礚彦⤁䆠Ძݚ䥰⦢尶睓ᨛ䭀ᬻ⃖מ䨙صḥ䆴⽫惇爤⩂䨴⭑礢╂碳チዴⳜẛάᑊโ䉩ᣊL⽂䐆牌䄌ⴂ囅磙槨厔㐶嵦櫌⮉ࢷଯ欎吜稥䥟桲⬲沴歉╒Ⱆゴ怪䆯ᐖᬄ奚祢儲扊瓜㦠䬌收崫◦⼪⪵ⳟ爺⯄䢶ͅ⇢²戡᳁᥎ⶼ罁▄Ē懁㳖䖲⫲玴㬶㢺ⱂ砈㣝楿䣼籈䓐▒ⵤ劊ዚᘜ⮼䉵㓉ᖱ⭘䜶䩓熉ྤ嚵狍P扴佇㣀ԢℲ楴憳ᕟᗊ䕃狏ṰRᅅ拖⥘⾊牶啉⭢ぶဠ㗘乥གྷ̾ʚ⬘籴繼㕶䒺榷ᅕ䰯᳴ᛁ喌⢺挵圻施⦌泴盗喱䩭Ꮖ约姇⢪嵇ⰻ桭ߘ宷⻖瘇࢘拴੭䑿䗺ᣡऻ⪆⋠Ⱒ㴬ᓡ䓮V㥊⋢àྨҴභ䈑⸒ぁ疗⧌籕ỏṘ䋬Q⛈喚㕦玧凅疵⸒䚛㇛䇌兔ƹҬ⍅盋冴泐❄⫔ᄤ橭ᵖՆକ㖆棅楟⡘湠䵗櫧䷹䑴哘❙㔶ⰶ曄㛃ᄥ䈶燂⋒ʺ䆴ਣ县㠸溌坤䓁ⴰɶ䫔彑䷹ྲ婅㓋ⵚ泅ⶴ攤淪泅➥⁴淊瀆恦淊淊毦卖ෂᅮ淶僶ⷋ涃嗃産煮矲砇慬䉒䀮氁໊㨞䜮撕䙝䶚㎮悖嫞㗡୶䋥巢㘉涖䇔勏盹檨僶ᆬ⩎䚔乃ᙙ濶䃧癙檶佩䝢ප᷍滍楒䶔䥆ᶄ̎䶵㕀㶥䣌⇁⤭昗猾珴篜敜⠲┗䟆夫桐掴礧戵椬恸漽㷙淎徔櫍㵣庙㱍旇樒篕综絺䵞䇧Ⱜ喎⯊璕僀⑯槌吖ే唻桒例䌫緛渎䰕䎿維氞惵䛚☍汊竗櫩楶嚞䫴▮ϰȺ爭㧜劀ـහ㯃ᚸ᧔䀮柚嘀ˡ僵炏ṁ䐔ႇₓᴹチ摈ႂ斔Ạ囅ᢝ禜滁斔潘ⷾ獒弆႟梀נ掖Ҏⶔ䶡ᨳ曗懡溺坵瑂⏐ᑤ䣖碌ⶓ椠㢭䲲⍣⽱焢㒌祶䞔ణ䌣䖀Ȯ箘䏆㔩ጠ㺬磨授ő䌮咊挦᷑綬歉捖ṑ绥楛䂪㜞梔繧捖マ纖ぐᏬ塭珮Ь䂠┘㢓㵢嚩巁溠䎜ᣒ剮抈㔹ᵅ䀥℻䁊璮㇍溙㥵ᒉ㔴ⲑ繬キ捕ᦈ嵄㬳≶䙨粂掎ࢠ㍮媄䏡ᰊ忹᪘ᡝῡ栭㪈㎄Ჩ⢈卐᳟ᓬᲈ䏐⼩抖忾㏨咼⍁峃㍉ᦾ婮咛㍹᳹牊甥øᾩ倕結樘᷹䪭ࢄ獃毅⺏Ḡð倰䧺㭃㚳㳧杲㮓㽈य暦含摱⺔ŌĈ㝋̛捁㟳㬌悔ᙁ㑕䑼䌒ᑣଘᕉ愀ⷱ㦀ᕋ糵⚨㎫㱼㝱ᘼ干区㿙䛞㊖ָ˷傦嘃犵䓸⠻ᖫ䍋積冉㚩㚃㮹㧫爕㌙栜ゲ乽䎦㳥㗉Ż剢ࡘ䕃㌹䤞樲⭋⻤⣯ݠ්ᠣ吲Ѱ⏨ᴤļƂઓ冨槔ろ乖๋倸冾ᕽ晔⌾㠶㭿⬡拠ļ瘋㋳掂㼋䄫ℯlʠ碤〡䭬P۰㚽ᇤ㬫ຽ⇎Ⓔ撹笛篝㸭㴐ᠪ㙝㱋ຼ⁚㛽㪻ʓ笗C㰻Ↄܓ֫㔻⻡䛮甃㈌㿕曲㛕჻哸٦㙇囻˺弱㜣㉻僺奙㚛㥻峦囨Ȃ⣨盶厬ុᢋ剬[㨋囬仲匫ㅻჼ⹙墽⛛棾ᯌ㠃㚞䧼㞜皇㞾Աἇ暵㛲㏼㛪盛㷛㻿瓝瞧㯛漆Ϗ㾻缌矪⚀朕ᜟ㺛៍⼀矷㷸绿⨳皙ɛㇻ㼀㲠磻䜌⇫㜉Ꮐ翹䳭ܢ溧恝弙䧀稼烻Ǯ眝柛㫼恮ະ礋ⅴ刊†㔬磆ᦈ揼ᱴ猙碜⎧涎箯俚⏷澱灜沕⏏⫑淗䉾㷥湕㶯櫙搟⸑篑⑀ᷨ澡瘯揚䬀Ḓ攗䝔揪⹊毃᪫窡畯◜又ṉ絯炝瓣潱柔䚓瘄⩄〵◫湀ׯ䚐㝳掖ᚗ�ό桮ዥ珱ᵮ䍌憗⏉䨐ণ劙ㆮᝰ㗻ᘠㅡ匄嗓㚓ⷠዷ繰披⊊筷䡆伝⿁ࣷᡉಞ㈺䐠᪴䄹ϳ⤨䁴㩐㔶ݏ技ƺ͝㆔䰁ๅ熶协ङ潃̖崴ᮨ祏⦓�干ፎ曕+⺞䫶ⶐ⯗ℵ睷▘㘃珰扃⮣↞Ỏ嚨民玥㯪懦毂᪕瘻电䰩峞㇛掜䚄⫠娠ھ懬Ẑ桴澕/彐熺⦗箹岅昖妘宼彍潎ម⮽ⲵ惷斒㗝屽Ď疐氃ֽ疏យ㲖彚ᨋ簟嶈縏㪶ሗ巙ゾℴߔ庣息愔宮ݣ氋殗ߴ焿㮑窟⋵椏椔氓廕朿垕毄橳曓ᔚ棙燙⸸唝忭碱妛䮺堅搡ㄜ⯖㱃枎✌㼓攎ᤘ㨡㿥ᶒ士曒㌖㳖恲淮ڟ⬨牆ၢ➡ࠅ㽺显ⴑ埝ⶋ拎㬝⮾㼽甎䜕䠓弃筱朙䃇㱇Ɱ㞻㠗曻炪瀩ᬘ巔婞䨐嫅⛛憾⮚堕㺍矾䤕柒ȧ澿ᤚ埐缫眎ዮ倌Ꮝ㻯烋〄縇宠〡䧙㗟渝䈷㵋樾⬙矍⻓柾斝埊怍瓞ܟ柰纻漿መཎ绵爎ฐ絏悓ᥚᮡ㚏昋娙ߦ㰯梱嘫╫ЅṀ㲫㪦ᓕ᪬䡣ₑ⠨繌ヿ㉾⩆寁羛綾搜䟯刋桟ܖ㗢役籃盏伂ᒹἉ䧁䈦ᇨ䦙<ẗ梪xΛ玗忞ྙဆ䕉繐ο榟ⴁ堑悲恛簿珠ێᡩ怪翘⤏秋昏Ɲ␓篼㼴㵇瘯䠡Ⰶ㞸ƄɀᲠ䶄尭Ṯ䥝‾皷仰䧙㐇澡缈ڛঠ娜᠑㗿û縏畑ਞ㈤⠸࠳ङ篣杠冝㬒ぐă㷑烠ᱞ搣栌ᣐ䇫竧摊¢⾓剺㡾ȃ狿佬ᬧ␂䁮㹬穨ኟ㒣㠫Ḧ罢ȴಟ咡绊偧縻㢈ᷗ㴣䀖珰眠χ瘠⡾瘤㏨災䅺䩄ᴏ➥ত䃮澆琨嵁⭳繁掾缎禃滀曝ᨬ珻䋫焯噁̥Ⰱ伮䙯⮢渍䴮䱤䊐㻡堒ၮ擌ҽՄᩀ樣戮ᑆ䃰䉙砗䊞䪥⠎⿋ŀԸᇠ耙㴨瑊N䋕ᔀ巁秈غ䢕䇰Ɣᪿ∡Ꭳ汐ア䋤෯䌎搘⤡炌䇈Θᑠ抣縯ၐɪि䱁ⴤЍᢓƚא⋢Ն᱙漺撮൸㹞㰋瘿x渴䇌ᑐ䮣ࠓ㡊焌ʄ圁ȧ渷炓繯ן曀壣┯㱜僯䋱熸㫁㦥户硦㲇ৌᤠ斠丮⊤塢懚࣫ằ粥攈⡺ǃڟ歠繃ጬか烽ʇ獄㐡ഓᤴ᪨养炎ы॑皢禖斁崁暚㤾ᡯ绥篯⟨䱣⒭呞Ⴤ榅佱伪缪籆㙲䑼搒㨱ͦᩙ悥⍼ເ㥱㱤☰恿繚ڊᡏ㛃撨䑨梿⇝匔⠖⦰急煂ゴ䄈♍Ⴏ喠ⓉĬ⊰㱻攴⡾㻘䗜ᤈ䑢☐橖プ⌬坱䃧⌺౩䩧嬆纃桒䲥ښ㐬⎒峑⸲ߏಛᆩ䟺Ჸ櫂ᔪቛ炡⏽⥔櫦⬳悚灕䟞☴ᮜ湰狨㢢㣹स⇑Ⴄᴼ沁ሚ秖፰嚃䘨ࣰ㢨ɷ瓑䖑垹琪䄧Ӝ旘䧣ⲫ᱖棷䏟眨耙⨲悆㆕Ն䟘眂䂪橮磐⏜㘔ޑ烥瓭恋焯䗶ᅘ愜厪㙌碶指င↑ᯥ绩籵ᆋ䗔䄤球敇㨸挨⍭व䷄硅沃҉懣يᰰ焝➨籊ヶ扠䫴㆑羦傷䶣照寿♤䃼繄丶ɤᎸ疹䷼婇傸㲆১䕆ᮤ䅃确ŕ梳㴥ࡸ⅁㩅ሸ滓╬䃰縃䩫݁⡄䡜㟜燥シ㒟熼┒ᴈ窂⒮幇⣋申Ҳ㧁䬡璶䡭ᆏ䕁ᶻ͢ⱨ⥈礘⎴䧢マ⹆礰⊏ਚܱὰ抁ၯᡇ媓ዤ䰑ᦱ㵆ᤸ䨒䣄笳ත⥉棨䌼䣬⾩Ҵ䵀⨄╡ᢠɳ呫䆲梿ℜ䡘⋱泠㊴ચు❹ኘ嶲橬䕇䔈厼䬢㌢泇ഷ牭竞䘹ᝩ㹍湆匒䭜૩त沵翑⤱◆ᔴ暲ㅩ㥉ᩖ匲䤒㸴准劸ᑀ儔⠉拧⁹卨奘ᓮ剙ॲ㟉哧唰᩵煣♵ᠾ⋳䉪╟㒽䏪⚺㧉升⦊㪛⥍ᥘ液攩ᕟ哒匦䣊㭩Ѻ⚼䗛樋᧲౩䥇娻Ί䨜⥩⋇溷檆楯➍ጔ䟂羄̀甑办⎦㤉⦲✫怶暈斮᎔怂睮牜ಫ掩દ㠁仦憱䚒ↈ暉⌠㮁㍯対㓣ᖼ⬉吡ㆴ呺榀撍ᾬ紂䑭浂ⰳй䬺≎⸋榾్ᇼ氈旳ヒ♫絛睇䓥䥰䦉糇ᦽ䉯⦌枾ገ祲䓫䕏癏ਇ㎶㸹Ɔ⩋ᙤ姨昘䩤䙢湵ᄋ∳㥹岇妶嚓椺枆┲曫癵泫㉉凌┐⨃⦵䢍ᥝ傾�࿓䐧䭃哖ጪ䤂㶉善㒸⚜懮暀吠⇯㥟Ⳡ珝䦼ᑙ潇䀨俇燣䜇ᏝこⅭ㍎沸狖䨘㹙◥ὀ⺉ٕ擻梸ዔ㚧刢硍∜䨵ᵞ垛ᮼサ娕䓻ᗨ䪂旬䍂崞ሳ䰯ϙ✄宻㦽景ὼ斠ᛰ悢+惄䪌怉䜚ᐉᄲ祥ᄗᰘ䭒㣨Ԉ䏵䳎䀁甚㞼年稓枿ᷜ崒௮昰栴䑺䷡䎙氣畃幨ᥱ擋ᢜ昃䏭䕔㲺籿俞㚒Ⓟ侺繣祤ઊࠕᮒ㊬䃍⭫ቃ䬊㐹匇㾰⚏秣ⓛᴠόࣨⒽ桬ଓ捼፰䧡綽ኔ妒䩆̩ᢓ坨⃕㔝犇༂⤙䞄侶哙դᘋᦖ〔ⱉୃͪ癩墑Ḵ⤧憆᧴ᮌ䈓㎨ノᲱ狋䠲ఠĴ把岖։篨埢團祖愸䋵獨嵥ฒᦸ垨䖝擊ᠤ䒪㿯㙝ʭ䖔㶥囩ⱽ亄䨉拾ཋᳳ౨斡拙ュ㸅䑷Ⅳ䥣枸巬翁湊㣈㔰䫄䁨峄狣瀅䰢㉊槙ⴲ禁瓯忼䊗玫䷁ⓥ稵䱺ʋ榡牄嬲䩫㳒╟ጄ䰂⬚㵁ᠥ怾㩧仳䁴咠廔ᡫ䉑˯现ⵑ㔥䂶牱ᙍ☇ੴ喳ᒃ㰨㥭௷ᛅ䚒䨵ᦽ煲娝昘廄禒ᵉ䍓ő䫸⫗ࠄ▷┮ャ៙旱ڨࡧ检唆䫢亮┥亅㒰妀㳛勒䉩ᝎ杒m়⧆㗥ᯩ䚉煢妳ផᵒ晫繌䣍ˀ䬠備㒦垷灰䈬灠䐼ᛘᖭ筌⭓猃ଐ䨙㭅⺆㩿瑄ᖀ哧暼太像ⳙ䣘䭲⺡㸴ᱶ੶䦄㥧ᖟᛲ槪㭮⋌䁢Ⰲ⧌䚵咵呶汄兲杪ᮂ卋䓌᳄崑⾉❅玴▦徠㬚䕛戼�㓁䂹㆜⪞⋠ᨤⰠ夿ų╔帒泪ŋ狘䳬҅⢵㴵ᬷ╾ᕼ售䯲ರడ嫅☪⪤䠹ٕ㓵ڶ墸喈䕿២嫊濫獈櫐ṫ⩭⺅䆶⍴㵺䰼禗為ዪ姃ᙕ寿檮⪵⢕㻩❶ᅶ㦋唠ᙆ宬⇎䗯抈粣˔Ԡ糣廎㕺㻖秆冺娠姍濦ૄ⡥㞵⑷祰ᇎ㗡䐆塺炭嗏⛓᪤紳ߵ䯙䠮䅖ヤøՐ㺒ⷋ樥岭憨ԍ〨Ỵ䐦ඝ喐噦婴珋櫌歊ύ㵻ⰽ⏕堇㭻涂㘝嗖呚䤊每໎㲹放〖㨅眆渀㵤畦ᝮዊ䴋凌勒嬊猳͝⎕٢䝉ॴ摶䋠ᨨ硊俪㫣笑䨬⯕⌕Fᵽ㶙㕑埮堾㰋嬩櫚狖䥀洝㕉Ⓐ¥妖ⅹ櫎堚䇫懊仁璨㎇⣍㙕ᘑ僼妚籽喐啒ફㅑ䨸妌殲丁⊭⩕ୱ祩㕓ᒡ兪瑓碎勖䛐ň洴㎭湔͈䩂ぴ㐼ᆠ»ᘧ凈岲⫙⺃㈉展䃿纗Ể㟱壽ࢻ刖ᙯ⥄র栮㗒䏛僼◅啦娦渋沏羧⛂捓㶅ʻವ綕▦㤐Ά糊幈LJ抨毐椆ォ㥔摵琣䵷៵䶆椺㑮絕⛍䶢淗屭䚴洹፦◠㓩厚嬻悊瓌ᛡᬚⷐ╍㏨歹䵳₹̮ᦶ䆋妏ổ曌ᬑ䢖⩥䀇㳷恃㘙㔅圃Ṻ徠ᗘ猣⃟ॾ⒅ཚ炬殁᜵後沒罊勀⒖嬜毳ႍ㮷㞽⍤㡮㟜匆坻៍䗇ܘ媽䣋ⲍ埨澷Ⓛ傦䊉岚弤ᮎ䋑䜝ᯄ澻⣭ӗ擶⁚浣㗛䚖皓ឌ☿ᬣ䏎泐ᐖॖ㥳ஔ疑㔽壖翣瞌绱嵏嬝ᶍ瓺㽠汎櫿唪䀮琡ųႵ䃨寍䩋㚍埖捧洹玣吮呚䍵⏒ᗸᑔඐ䌲㛶幯攋㘃弦杻ハ䏝曲嬚毝抔洪❭㊔砃喖䜥㓄升䠢㯔⡩ᶍ砡崫䱎䶛㚲嫲佊䤊ドᨾ㫹瀇㳭姷杧ᵌ瑺ᙸ⹋䳉㣐伎㬭ѷ㡐≷ѽᮙᵠ㑃分厳䤏⺪悵滷⭲痖㗼坾㲢䄨傐巚㰒㷓ڪ㩪渋◵䓗紨瞂䔸唜与淛ᴍ㋏溡㮕檃⬕㟖䗽ᆟ慓❫冶ಛ歉⅏愣樭ⷄ䔗䌬侎淁砍帾扛Ẏ᧓滒dz泯㾹嵴ቬ⾀ⷎ䎐䟒涻ǎ⅝斊穣檫㨍敵書㞑祱痂⣾沚寶矝㋿ʅڠᇥᇙ滰翀綦Ⴗώ玚⼏毒众㬇⥛㚽㈕߹ᾅ巫瑯凴Քᩀ㨵匮憲՝笔倭徎細Џ垃᚛同仕溾嬆⡿㯭搖ᴪ㾙縇㒅䤞会怣激缌珿浟ⷪ怖㿺湣甫傆䬻税᷁纳笠ᨺ䀣珧ù綣⭱墡忨䒶�绠ᯢ䷟㱖௹۔Λ着㗉⨧恓創ƥࣀ㏓⎺䈭俹ᶁ痗啮䟛ఎሶ䈄䈈䊣ᐹ㟴羁䜅䈈孾櫚崋㒷缞܀а犍焄䁕ᎎ㸍癐姾䭔⠏⇸ᩑ䉣䬖翿紷用㔒嫛∹ῇ⇓篟漜☽弅懻ύ嶗瘀㫡皧㨽㿐ᘧݬᯰ畉ᜯ翼ㄜͳ監卖疦㠽䧀弛ۜᨠ燚༮硓彩䎈ຘ㔞呧䐾㯚缟ܧ䰨爣群屝ࣷ́ཤㄱ牠儼炀焔䝘ᣠ矣㶗ぜ䣢涂瘝䡱䨭䒏㼚ڒᩐ䛠௩⡗⾖㛟畔㋱䌦㨊ゞ㻛ۀ㏃批棷⑽ഄ㣎䱦㰌䲇懫ܜᭈ攅⣩絓ರ㫑姚稁珆ã篓㛸椡✔䩘惡巬娖缤ܹ矌ຫ䜄Ⓩ⫦ིⅰ㶶đ奛ᜪ恇»䎩Ϙ㟡ሦㄲ偫慝಼㟱垻⟭㲒ᙗుᡪ䧣堍⍬ጐ伴㝑埀刪≓惙ʜเ⟐䞦œ䒈̧㟨㙶䖫Ȅ⊃彵ᔁᤏ壂歖ῃ┌換摂ᨑ牂砭≞ℌ⚴ࠨ㬱禯╲掵์坩囅璡劀ᥨ䤾㨃糩䕞磺ೂᐑ婂缹技ਇ䐑ᶰ矃嬭䅕卫歪㲓λ睰䧅Ộ㹳䪉奐硪卼亴㏩䣚粼⢏癡✻儴溲Ⱑ⒩ⓐ䶰劌㲉淃⚿⊛熫⛑祡啯㥖▝卦砒㶹㟇ᒲ件᧺◩㖜ب橖甠筭唪嚀ㆠ箢ƿ᪗爖➑ᬬ盳࣭䭹ྙ⸟׆㊹囅ᖻ灉䮎+Β姂ۮ絝㊟厒䳒ド旆چ樃䜇泴桃潕᭕䆏崩ጮ㼙ഁ庤ᨤ䴣䋁⪼撺摬ᥚ䓮㐍䶘ᣉ䆇嚼偍⦷尛ᷠ歳⓱杝ᴐժᙀ࢙挀穗Ͳe疇欓樈ⱔ峻㏬䷎㗹翦㶺溜ᨁ㭫ᢔ糓滚潐繉ܟ侯⚙ᨠ啋㒚䭜䱓ẓ⭓䙭䵑泰㐈䗞㧩䠇䖺纐曒晩含刻ベʿ∧߱⌆⚽䪙秬✰年縓₦僖ä㵟亁て儷෴ᆕᔘĭֻ᪭㙌㣜⋿叄Ⲃ㫩炇嶾↚䗞暌᯼炓ቆⅭ拱癲⹙䱅↩ᩐ⊁▥ಅ沫Ō⣑擶ᅈ⺩〱䕧ຼ恨㻥ᛕቒ敫⸐✭᱘疼ⱹ㍘ᯫ刹䆙㧤⍷ὂ楳ⵍ煙納ங畦ゅ桄㙺妝ミⰑ᪉硬᷸ᐲጩ౼៥悇禹ژ◀☩᮰甃纯⏾ଙ፺䢥㕩捳ʦ娬⭐垒宴∓ቍ哟指㎢ⵁ㷅䢷䂽溅ህ䛾䡊搉ۏ䟦ʴ¹ʸႲ䭶浼ࡅ姎势ᵊ愫坎洕⮂㴹祅ᵿ㖆妔灺ᬊ櫡⓬⎬傘反㘹憞勷⩺㦝◒坔娺杫ᇍ瓞箘氞䌊ࣕ䰜⎻៍刳嘡ᨪ樨ᬣ⚎˧他#摵漶╹䖝㧘坊塪絳ၬݚ䣤嚗⼷⠭笥䐮减熾囑琊縋埮⣟ଖ珍眝㹅翷挍㻿烞䱉䈋⺨氱嫳ᐝ⻥㑅執烻㧔㘝សᩭܻ恧㺿䅦劑᭰㟆ᆤ癕掎ַ柪嶦梻ཎड़䬞猣㑕⍖㥗ᒲ䤈➶廹㮞ᩤ䗜朎㐐ⰳㅵ箶㑺玔ᙉ㉻擸◖磽穫窫㊦䙸朶殊⸇ᙔ尺玓⫎ዑ哲ᮕ⿴ⅨǗ櫸ᮝ䅘#啵ܲᛕ䗗匴䡮淎ࢢᒦ呍毊ො晞屆繻嵏䩘㫯䬲悛㒊埗㶒╒ḇ㟝嫸燻⍴ಬ䠤‽⪣埡ኗ栉爵Ḕ݂廬王粎ϗᛱ㍁湌㸅祖羃䞅ᷔ癑櫮曛䓭♧㻪⇙⳽喬㾤ᮋ㖡噗᫂簋ᷮ䧖༅㮸ௗ㫽捚姹㞓嶧㚽巴Փ㯕㏛Ỵ୳㑙䀍䳗䗿㎘ḝ坣壢者媔ៗᩘ筓淭൝凊ⱻ㞋ᷓ癁嵷喛嚌盚㜟㬨泵㙭䌷➈徔ㅚ皽孞攛撣伤᷃稔汽喽瀗悒瞈嶸㛼嵎殛猌㯼Ỹ䉠ḙ沙椆浃䞘ρ㇟婑彦ᠠ䄾㼇寡䍘ⶣ嘖养㶀Ḑྖ孖栋⠍ߒ绾篘Ẁ灣旚姸感ξ۶櫮竉ὢ毖ۻߞ䚐珥殇兹ᄍ䶨ྦ彖焻㇏䏟琼㰌ᾚ俻屟╆⏦砞櫮河Ἑ㢔眊䝫濹㉱世瞎෮㚲婶礻⬌咙⓺䜬ᲈ纃涆䷺枘ൖ咊ι槻笿梟伌௲滿㊍得䓾痛㸚ភ夠๛橙ㇱ嗡Ặ᳃玮㤘搼㺩搱篮浲廠䞋溰羝侮㠋礂帊༢㯑慇栣ệᇴ➠橄碽受ⓕ㒘⇩✰ή狇倿⇔ᇹܯ河ゕ众綋攂厬Ⱛථ歛窿㿚૦㰐凧ㄵ䯷籞ᄍᏆ乒㱑拻焾悑㭨伴璊笝忾䤎ᐄ䇶㱁惛㲎᪗㼗䝓ᶨ紝䁮剝穃緃⯶㼞氶浀࿔燱嗷ṏン悯筘ᤁⷃ༞嫖憇➌Ẑ㼈⟩Ĝ猤ᗮ㰇⤞琀⼘㸊畇伿璑曻染Ἴ燳岗卯ᴟ玽碡㯟Ჳ㮼冞䗥䞎ṙ㯓珮幝㴌巾⚒㥙歛槇㆖ひߕᾲ箞⫯ⱚ㮋䘐ၡ㹕㙫ⓚ熛刑寰序㩃支浙叓吏⫹㺣㻌朏֞⧪柪Ҍ瀩可ፙ㴆ం⽃ᦡ睇ᆽ▘㼄坏硪秓濃㧸洚⏽㾑棻淎ঐ嗴݄彊癫受竝䤗吋⺕㷎簛嶶欁娓圦䋪甫柶㳘儐㸞氵掣᳠嶞嘀㝓䏚纣徂㶬挛壺拦㢥抇佽ϙȏ怘炫振ᇜཹ㐇㟔䠌㰛ᒦ巛圀潅名䓪综䌏⏏⾳㨕淇㓼֒ⷺⵂ忛㽽榎嫜ᵥ䮮濡㲦狗⮒ል㟹Ṻ纻柖杳紐疜澬ቡ·㡬漨ⵧ៝岺緫䶎ϻ圔䮱澳媽滕㭾㞗᷶堔哋傁䢦㓚㮀箯⻋㩭悗嗽ސ儜枲ᶇ㚛䢎柞羒䡡丠㪰䈗冿ና刂睝瀖矕䪎毞༁寯濲廭瘗ⳏ䩧࣍暂猧税緜开ߡ激㷝敷ᔽ公䘜泠ʠ㉠璼挗ࠜậἍ笛忾旑廪瞯滆绛䠿戙榽澭⢃想ᱝ娄ㅡ䑁瓛耏摞引ࠂ⛍㼕㶯ჾ㤜ˣᝦ吱瑓党௹ሁ㮤湏㥎欗橝Ė䏰俤㾐怮㏽㈂⠍⸴㭮栛䰡〮伛知忨玴抮䚝㿯ᷘ溛㡳焯╟ᄟ揥垊㲎翇斿ڙሤ栄⿄㬓磯ሡ㖑拄烳䐟㖭棎․ឥ栄籎澇卿㶒珲垎㷱窝呿↞⌘ឬ庐筙䳯ゔ⟝㦽侄㱙珧刾粙⨆篡ῼ緣礷嚖犄姵ệ力䗮ඟᢛ箴❙㵋槯狞媙ⰕḞ嵨盷嚾῞嬘㟍⾵凟ຓ✓᪄珼㸞癷䭯㹘㠜أ㶻窏ჾ㜟ᯮ༻䇳㸷䮏渁㞪ᾤ㺓拏嗜塝玓㭇㺩犗砗眎䨛仌皤ⵃ梧㣜জ帒依㵽皑䩛⾙濻ଔ硒Ꭷ䱽䈛㏧⾯侱绝秿㶙⸕柊彲绮盷Ꮿ⯐㑃垚㵝㇓也ۛ挅䷥Ὀ稛焿擟መᯥ箠沦环砖㍻ُ睟妊甏㢟᪙䧲⎟㳅〯卞崾吙倏砎Ỳᢝきᬟ⽼㮢罸汿磛䬁៊ᾞ穧涏嘯䘝Ԑ忨屫盏䃟傸洂⾶㿲㡙瘷⎽⢞后彁弋猛浭ᣙ烜厈㾪崛癿濜⼐培Ὢ糽焛浬罞尝寬濌稓珗ᾟ㴘ఞώ㹍珷狾奜琇䶱癓㷭惤徝Оᷠ㼡㵈瀻䄮ᄙԚ㼼繇槿功㽛⏥Ὦ濰綻瘮仛㼐砍ậ⮱గ䳬羒Ⰸ㽙籃焿拟垜緋Ḋ绠窃揟Ἐڙऺ彌嵏濿篾㭚栛埦翣礇旟翟䗸姿㿋瞆硟䦑桝瓓宵羧穕篛㏝娘㧿᠕帷甽嬟姘ೀ⾠ᙹ㯜潿⦼ธ嘞㿠䀏竳⨞罟【㒯᧷犓堟Лࠞ彤徺猏殟崚᫆㳱Υ欶廍᧿箾㏳摧䙷⠢櫛堐ᐁ燨俜Ἡ縫ೇ禓熿潧伜ᰡ泽〦㖓ⴀ痸䁜㽳ḵ給硼灀ᑠ⌟㳎䓝យ倪䠇Ǿ殢䝼瘴ɣ㣺瑀ᠿ䕟ᒮჀ↙ḳ欅恀ჅÙ㹄綻稟皿檃嫷ἡḢⰤ嫧叻Ɇ䑃т粯㣴爩攉Ṡ喆䴝ࠧ㐖‾柵h䄔Ƃˢ㫈౻䕹字Ს挢㙘䶴樨⁺᷁㝍ᬘ࣌ߧ㞅摷䐏ೞ䓼战琫媃㿥坼ɽ尊႐ᎀ∥Հཛྷ嚪㣐㠵姾h㽍绳ᴭ笏灏滗埠桡潥滨䈬崇ᶡ恪㭏㼁ɢքग懀㣷Ξ洢㰘椕怈䡓ၡ傄䃹϶ࡴ৮昏山䪣愛ἑ⅋⡀殴纷粟稡砋瀟坱᭡㒝哙ረ㞌ࡐ䂻㊌僾䇓宻႐Ṑ㇐ᓡ倝瘘截怋翫悙ᾒ䅁Άӽ፰⎀䡰ঢ匤ᨬ၀㖦玪₣䉩ή׆㑎ⴀ⒟⚡㈝䔥戭ᐽ灝ぱ悫⊷ȢҤࣘᖈ儀䩎榢℥ᆐⰿ㟭悘缯Ņ䷰娏皘ᐐ㕀愢⑽弤ದ搶㡖傕₢䆻絹竤ໟ昨⅀欦憢ڣ⨨先桇䡝€䇙˻㤄ీ⁻䁠揞✝ᐙ琫倰ᕳၩႽ䆄䋻㮜ൡ溭İ䡡噢㆛⸨瀆ǫ偹圾䆱綵尔ऄႣ帀愢乢怱ब၏㐼ˉᄄ䁒䋧ፂคᕠ㹿ẞౢ攥ㄨ㠰呌⢜傭─ᗞӦ皀Ứ沞枱氤⤭爂䁓悚僇䆺䉢غཔᔨ❗ւ㍣䨚䘮᫇塎ん₦㻍䢆ښᯣ䥰籾䩢嚦䄯�䑛暲⃭䆳̦Ҡબ ♐䪞⒢ᓛ䰕䶹ប噡䋞空तᚥ屐䛁䣢ฤ匬砂㳣ᢅភ⅑嶞Һঔᆈ⦏ẁ佌䒺帑ᅈࡓᮮ僊懿ϝƌ癔Ჰௐ姮c⸥ီ瀀硕➺惛↤ԛш燴ᥘ㋯㯁棢唦⸑㐸䀾ᢝႝ䅨䏙рైᓐ㯀䨾娢䊤びర䱁㢝⩄剋䋷ҁܘᴸ㯰䤡Ш约圬㘨ృ㢔⇫ȥ؎॑懑༐䓡壢るᜪ縰籉ᡬ惜ẋ䅻偖üύ仠个⁃仺䂫ႮɎ墛䂲䇃䎻҇䊬ᰤ⎲ᐠ០灦挢㨴⏤࣐҆ᇑ䇞ېᓘ⥀䤱䝢ᴦᘩ㸳屉៊悴ᇢ䌨ࡱஔᔈ㦨䶾㧢⊘笫䧶忇⽮䅊䊤ݲ࿂៰ℐ燊ᅝಥ䒪䙂庮Ҥ₾˳ݲ杂ᝄℨ灁⑃㴦䐬縶䡙⒋अᇿɃ̔戌ῄハⷞ埍¥ܫ∲塆桸烂慁ʬ䔊ᦘ㝏กᾨ䁤咯尾䑀墍傻ᆃȾㆶඒḐ‷⊡⏵ع缫簳浦珚䃇戜⌤܇瘰᱄⍨桄拣慦Ẓ㨸桩犊懩R䐮ി摰㢐䞱㩌ᆤ嬩н䩂⑦⤂ᄤ͒䛐ஒᾴ㋨枱歃䕥唳剑䁶Ἱᇖ⍏Ǹ枠⨁ⴽ㻸劖儽翿䢎為∛䍔䘰ᘊᘠᯈ叁⧃嵦⼨☹䩚ᡭ⢫ᆏ䋦䒞౪ᯐ㼐䷰ᵣ䭤⪨ᨆ恅䑯ミầ⏸䔅ෘ឴㖈棱磃稤⚮㏲䑾儧≈ۢྕ杈⃨૱埣坥Ⲩㄺቓ瑳僯儫⌯㬥拘Ⰸ洱ᨣ武㺗種ٗҌ⡫愽沢䕜㚋攸⤸䑑ᇂ瑦纩ष㩒㶵慓ϱ䗝Ⅸ䞼汢ⓥ∕焳ߨ㑿ᄊǮ粎䛲ඦ᭰⠐䒂ᚂ⨛ 䄵孾ੇ㈔拵ߵచ崲ጔⱨ坰硷⨡惵燜䣅ǭ㳉ϵʶᰜᴈ圁ᩃᣥ↬㌾ᩍ檤壘ª揰ᣚ㛶ᯌ⇲Ǒ灃㘧㦩粯ᙒⱩ壞㇊䌂䞃ࡪḉ丰ٹଦ᳠㙙ᄠ䄰㩞䏭䟛ࡔ㫸悱崢㚨㬰噃汽倫崚拣䘛ࢮᒌⅸ廁䩡⛤䊨嬳噁ᱹ㞟檣⋬䖈්ᛔ㡘䱑㈠⧧冔ᨨ乙沜㣔ᡅ拽䜇լ淌⁘汱⅂盦溪欵⹚妭㣪熲拄䅇桼⏘涑⩢䇤᮪㌰⹀汯㣤㓣掶ᇗ৶ኲ䁕ᥑ䍙䏧厢尲㉜㎶㣛䅙択䘫০ᓼ㷘紑匂寤‣緅琠沄м儗⤯䝠攴㚸䂱㬃緧垯嬼㫴粑磱焪抯䟝₾᫊̾㚀壈䮦ய㡯抻ᡣ彼憊⌥ҧ㠘範ᜂ恄㾩ㅦ繉㼹〨I租䐻Ẽ፞ؑ昃ᝧ㺪挻㹑岈㣩ㅈሰ┏൮ჲᔤ岑䦂㘢ょ㛂㹁ⱥҥ㔝⏫㪇఼ᶼ⬈瘩䋃֤⭐ᬻ⅊䉳礒ጏᇟࢿಁܤ㔩䦃Ʉ瀅眺ӏᄼስ䖨丱Ꮲ❸粩ଢߤᖩ䓍Ṗⲝ㶎爅䀷䝳ௗ擢▘䬩疂Ϧ㖫悹ṇ≱ӂʐȗ䘷ෂ≂❸嶩斂⢧گ猻㙇ʀ碡娦挼♠䲶គ⸘䩼ᐠ瞳⮨⬰ैትࢬ৻䋵䑓॑ሢ⢘䡩ᬡŇ熭縸⹔ቪ䓢熼ࢰୄ◲䂐嵄䰢ⲳ㇚ឯ䜁ॕⲋ䔚爎፬⚠䲶ᆲ㹩䬳商橨卧㡬䔡⍆䥔⢼❊প㫰祩墳ჲ婭⯦ࣿ劅檒䣁籰㞉〤䤁畃㡇紥ಲⷃⓔ⋐ᇳ䀽熾ᇭ༁૩➕桄౬悹ٚቯ├熝Ꮆ⛌䶠槒㔄版渡倒㰆岱᥇ᢝダਏ䊮➨יᗉ䱄᪰䆩⌿⽪牾倩भ䌵墜牚悘ఄ僴㾳⋉楆稫㥀烔ᒯ䦗ሠ亹ᰢ㨄屉न媱八枭՟犕ඌ⦥⟹癉ጂ⛸奩椲㏣抴᪲䩶粐哤ጋ爡˄ರᘨ殴乍㓆⦗࣬‱䪓ᔈ㨤厪礲䯆ቪ✘奉Ↄ₱奪敋䩡औ㪝䣥♤䂵ᥨ哉沔珑奮稌㕿㞷ᢰ冦ᦤċ୵ᆙ᪈䁉䞳僤䅯羪啘柚咭礇ފ䫠ఏ䋴䇉ᩲ㫇ᷓ㘬礥ካ灭恢㓨䗒䧺䎈ࢡ᐀偍婠⋵犲灗ᒄ⓲䥢勜寐䵢Ḋⰵ⯉甁滆ͯ橃橿咤概㒨ᇒ们Ԉᝃㇵ曪㍬㨣噎栬⠶⨁᎖▦䰵ᷲ㡴䜑Ŵׇ㍮ᚷ䵆⩳哌楥厓❊䮢Ⲻ⛑⛮ˠᨹɫ济ᾫ炑ځᐟ䔢ྒ㫔帑㈠㛄疩窸ᵇ媙ぐ䥧堧❜䈽╤䴉杳㻆㸭ᰵ畉橯唇䡛厔❡㏏濪⬘坩ャᏆ普亹浐窋惐䈋֏⟼䟝Ḉ凴淉㕳ᡂ洤渭䥏㪛甓⦿变掗⇹ᨺⓄ斉䯳ᇄ摮䚴畃穫ᚏ楹嵯ֺ䳜Н嘬䂐ࢼ報奮ࠧᅬ纣㒶⨝劽⚁仵κⓔ佉㴳♧䭭Ƹ๊婤ഒ⧚䑐撀ˣᑦ㇔搉籓璆ࣩ憼ᥟ棂ೂ⢎刣⚗槚伹晼旄䃮ኹ⍜ٳズ槐拘曆七ᒺ㨬秉⅒氰啮㚸ⵓ㏗Ӝ᧖剻⟉䤽ᰦ⌈䖉煒則⣩ⵕ⚖㓚㋔旉䣓㝴秉രတଧ濏䵁♲ಧᦠ₼柂䴽Ẅ⬤熩䎲⛇僭㦴┽晰甇ᥭ匟◙䳱Ȇ☠㎹孓䤡敥樯㚷穮墤妚䈈⒇൝Ṧⱬ瘑⩓ኅ❭᪴畕ᙫ媅榥㐐秅䣭ᔊ⦞⁰䙓㢇ዬ匍⭝䚁唄⥯ሢ暎䫋፸ی撑ѓᖆ≠㖶浃䙩奚㈬䍨䆓ᮊ€殦ṡ⎄ᅫ຺幕䊑䳉ᥗ剸札䡔ൖ㦬磹噓ᎆ䛫䖰㵊扦䓰㈜㊿⟈䪋ၴ繹䃓㛆目ᶾୖ㪌㓝夵㍎斢厯擆⾬橑ᗳ㊇Ӯ禼慗晡擋椾曽䮌ഖ㹔岹ᯒ寇ǯ窾Ȯᚘ咦⤪剌曒䨋Ὢ㎴屙渲⊇瓨决䭂⚗ᬪ䥫㎍ⓣ乧Ꮖ⥄䒂奲䤆ᥩ妲卑癪㔝⥐ŝ➛ৡ┚㪼傉剒䯥㋨સ㍑墖䤠狗❜䒇ᦆ〼濉㺒㮅滩ֹ獌㙠崇䣂犂料䯳ዌ㭌䘉⍒禇⽨ᖹ❗橴峐娋㉅昦璓ᵎ∌仑浒⎅Д榿坍⚁峊ㅇ匘䙿ഉ⎼熮枳ᯄ෭ⶰ俤噵䴌榆猕枣䮭㭨疳᠃廩㶸呖⺓䓖㦸猵暓俗ှ最怣囅⏮箹〲⡧㓤㧩禁暕伷Ừⵜ捹᧒㺇癨ଷ筇峚⧉爩枇䳷ᦾ㓜罹ྒ櫇嗪缷❅Ҭ䳺祇㉇▽乷ᷮ⛜呹僒၄巫妹େ⺊咊稆叓朻䯕ᙾⰌ憩ΐ稆寯綰ፈ㹵㳐㦊区末䥭ᓾℼ櫙䦓ḅ᳨䂾㉴Ⓣ祪犇敞䵿Ṿ㞌厙㣒櫅坬⺼䙂⦻泀姽厧⟅䣣⟪㖼稉ᮒ䃆ⷕ㖳ፒ繦偂㨞猏枟倁ᅮ⓼禹ײ䀄㏮榰Ñ繬ᖇ戒狿柜焟ᅃ圼瀥ᶃ့秮ᫍ㍔ƀ̄礱㊩⏛䭿᯾㜢叙玓䯺㋭ཁ⺍崀⦨ફ旺䯠幾篙琓皆㟩䖳ᙀ皍粼珂暌皏ᮼ♄撙㰓欅疮疹惈Ⅷ峙榆䉰柳皒ፈ希䀹㡓㰵垨឵杓㩤䌄印旀⭰彁㍢猙㖒ⰴ硏恳杋䆈ⴂᵍ斾仗ᠪ㸢峮岽⨴䗨塱糧Ծ猅⇰䱫ᶞ▋ㅙ勒ḷ䫩枽筏ṻ䔅Ԣ⟘⾍⨁ⴢ硥ᄵ拮榴㵜ź䲤䔡ੇ攤ⵅᵞボ睙碪⿄矁瞾䃛ᩢ⌈㦒勳杄⤿ᾮㆴ牥㒒猇䡋䁷澧❖姥晴⯨幱ⅴ慥囋ᦄ⪵䉖嚝㴅憹反⤔⸧⣁㺌䈙䲪༅َ状䃇檮変䕥୩旣䳠嘁ⷻⰘኒ★䧮ⱺᣏ晨⋯祉琅⟿佽ᚡⷂ懥ⰓЅხ䱴ネ⪅拊䕁獿杸⯈堋兀䲹᮪礷⹊⪰᭛亄惨䕦᠘ⷘ凲䏥⎜伵ㄫ㊷磘器䊽䩗╞䳘剞㞌䷥Ḓڅ䏬偰䃎箲̃ુᖂ⤘刎㭬籅㫒ҵ煉⑻彜Ⲩ禛旬⥄幾㢲潥侫瘵ǭ⺰㨠឵❭ਉ䏾攮䶾栰咲䩅ਫ瀆汈Ԅ擋媗ዖ╺ા擒⧒ˀ䆂䛥ᒒㄷ籋ᑴ棌乤⌟䗨䩑搪⧐弫䁷⍥䖫Ԅ繏ឲ㣏憞灘夳㎿⚎̨Ⳳ敥畫〷ŏ䐵ൖ䚒波᥍ઑ⧨幁⼌留ഓ㮇㵋牱哖全ጐↀ䰗▚⣵ᅉ⪼碅卫ᮆ之tヌ榊̟▖䪭☇ૄ双⅒囥をᦴ`ᱴ┾粫秈玍ᓴ⿔夐⚬娘〓⤅幏᪾❛ŪⲺ⠿咆䒯䮵ᇒ吥ྴ〴䭉♿惍ᦜⲦ斣䖟旌ⵋₒ溅࿒㼄㏬ঽག㥲㋎旭㎭❰⾏ᣆ㪒抙㐪厴Ꮺ➹捌晪˵╩㐚ᑛ仓ᯙ㷒䖎⮒䂷㭏禸峀禙䳃敓ଯᑊ⥔姱㊀禂͠㘡㡤檶ٜও傷斏䯖䣨勁㐒琅ᣀ㾵䇪㹾尻禓⍯◬䰍⟞ⱛᨹ㨪必kፅᅭᶾᣀ֜榨⬒ᗈ⼔埁⩲佅ῳ箵Ὣੲ偶㦝挓旛ᜱⶄ婥├巹ቋĩ瑋䠈Ⓢ䕦ଆᗔ䮫ឱ⾼媹⪪嬵枱墷煼ᣝຼ⳩䇦䩶ᔶ爘䨙㱪瀅縓ᒶ磍媶禈ଝ★㎅䱬哉㬨ڵ䳪䡷湬ℽ拇奢䬂祚⪓ᖣ例᠈ᙒ嘥ⷫ⬅搗⮱Ⴁ劳ւ狨啸⣂怙㑂䃙㭊ط兮慴狞敧岤旪⫍ᓦ⦲嬅ⴒ憵௪ᢴ桊տ㳐㦞籁妤㊄圫䧙氥㧃㧅Ꭳ箄繬牺ೕᖋ猔啖䮣昢⪹᪥㹪瑵溒䁷狉䖺瓐▃泜喏䩒嗜咦㊐㦀纥沷塏埋ὅ啻⫀᧡劎ݴ⬂婵澅ث㵷惭啰⃟㻘欜╣୪ᔲ⮺刉㱊䥵ᜒ桶㳊瑹㋆啰惡䗽ਗ਼ᗶ⹐姅⻌滹䓪究ᅨ᫊䆙⪱╲䪮ᖣ乚嗑⦪䜙缒瘄摍㙮筘纇ᖱ⭈啽⾚傁㯜久㔪栆㩈女噞㖋㧝㉚昵《叨㤪秵嗊敵汏ⱽ⭋㕼ゴ㗰橝ᙝ⫈ᇪ琵䩠䞲㻈䕱㫝᫁ᔤ氂呀➛ᅭ⏼䧥㰪婵敎枆孈䵪櫞ձ⫩噣⯴坡㗂狅ճశ㩍涳⛈憀嫢㕥Ⰱ囉༚刅㟒䣕䪊剴ノ㲣⛎ᅰ拪啀⩧曬⬜嚵⻫ñ别椇ፌ䭶嫗妚媵㖰⫡攻⼢姍⨪垉ㄫ䋷糍㡼嫅ւ᪱嗦⭝杙ⶀ儹⫺殥㢪檇䅱惙Ŧ嫊嗒⮢ᕫ⺖巆⟺清泳懵烏➳㛅᩸糑㘚⩅咳⨴僱⨔妙㽊燵⯮䙰损嗧䬸▰⨺复㌊䝕瓫ⅵ⭋㩱⻚斀泇⦳ˡዝ䬊娙⇚傕璪۷᷏坵ҥ╫㫅㗽ఉ呍Ⰾ呡㗚䒉看㽷᭪౽曇চ嬞㘛⩻♄⪔ౝ⊲叕㈋咴⏍䉿ᛝↀಮ嗹⬴䕞䧰圸䅚姵┊◶䧎廊Ⅿ❩嗦గ喲懒嗎㪼濙㯴㟈㽸廋ຒ竒痦嗽⬬妊㎒涕橫犦ㄒ卞ߝ媤㖌檞嚟ⴡ尣⺲媹汝ྵ᮷⭒ぽʶ㔮歀㒧⥾崩⤦厥淊痶炈箶ዓᥨ紂ආ⭮园䩑᠙㒚栕㈻㝷䯫僶㣛ᶁഐ瘑䪃ᛐ棁宾⾜炕ᨺ柷ᵋ῁懏ᅹ勈疽⛐桌床⎦稭࠺䨵れ罶ᇜ涀㪥禲᬴㔞⽲凶㱦嵹傊Ǵ䃌烸ࣛ䍻㫄㖜᭙咊ñ嫃⓺懅⢋ᙴ䒏浳䋃⪍᳷嘘৾易伡岝㌦漭唊䉴岋兰䋞掅嫡槡⪮啙⬪埃㕂䆭ሊ䙖㲍奺嵙╯䛱╗䯑坽䯦嗺㬌桭㉪悇䏨罼㇋敼㔋殡昄殫ᝊÒᆥ抺卅㣾ᵝ掄⚽▌勪㙆™䞱㻆窄⊺噴Ⓦ䄰潗憎䬉ඎᮄ㒘淉嗳㲦卭㚻ᛷṤ棱ۋ䛣疴ᭇ攐槉吀⨔悭䂊瞄沋彿䏴㠱䋏サᬆ攌⮱嶳㶆姊猒廢䓏癴‣Ẅ悱文ᯖ㕰殲喳⩆中䮺㍤ᢍᩀ䪷央ᬝ攮⺩幙㵔痭妻ٕ溈ೳ秃玞⛏㦉勴槜業ᘵ㥆䱭㣊濶㊍姘疌⚬痞厲啢潥准⡆瑍⋫单㢏ቾ绉暣喵櫏哂槎差㣭䜻甆䫪䳻ۓ㡽拏嗩毕ᑌ濅広⫴侥オ㩖捼୷㔘疬孛⻉含㶶俭甋䭗⾺ᇙ㥢㳯䵯毩䓩䴥怓ⵂ䑭ॻ伵濫⫿⭤ᛑ敩ᬊ敮⯩廋㱆匕扻䃕⛍⓽ⳉڑ洌㗿殲㗧眞嚳㾲悅ݫႅᵉ糲痍ஓ嚭⨟橊啙『兓◺娭类穖ঌ⋺㻄䭺䋩瘄媣㔯⺮尻㚶杭瘓ѕ䶌䛶䓅ᵵ圃֑尐㗆榾囓⬌䬅䠋ᵴ狋⛸ཁ୶㛖ⷺ婋㒶澖師㞬䂍ᅪŕ筬ૺ淀嵮嫡啌婯垆沵厳ゼ塍䇻䵵獉养擂⍲ದᖝ⮹攴䦟ᏻ㱶旍绺盅➈䵿䷊㕪盱䷟ᗽ䦛ᕻひ䶍ც痔Ꮸ㛵巖⥡抺⵿ᨲ堌⭯ძ⚖慉㧻䓶箈ỹౝ㆙目ⷧங園槚楑㏵࠭歴篕㕏味䷖ㅬ挟浃媑埔歖ᝫ㎢僕坺ƶ䭎ℸ孆䅺哸ᷖ媩≋⤦喃㈮囉ಋݔ窊哷槞㎍㚳ᔻᭌ㞉ⴼත㰺䪍ƪ䉴懋廼罈嶜盢ᵺ嬯㐮武圾㚮噕享ဴ揉ླ揘⮝ະ槚欇ᛒ樣哛㾮紙猒ኗ࣫⏒筵禔㩍擳夛↖璍ᳺ櫇夎狵㕺曩䅅᭨㗿䝉別Ἦ仭樺䒖复瘼㏁卺ʣᵆ㮉喁潭僭㫌墍ᅻ入唎ㇸ巘䞝Ⲯ妙寱哇䶓墻㏂揙⧒␡�劯ề扱ʨ嵠೬瓼殹勧☖眅尻㆕埍◰䇟㕲䫖流寒皖棐儛㖺垽൚䯕猋姼ᷓ兼咄渒㬅唒殓塇₊獍佚挶ⴎ◷⯈㵸巡㮇唬ⱚ刻㵺䧵磚Ö㖎秵㏀㞎䫜䘃㪓ឃⶊ岿Ⴊ甽佂朏㕰ϑ熐㋖崣家癿⭽娻⚊歭崊⇗≏旲叐坦܂嶝媜甽檨具㾊伽㥛䫕㩄溷㯉㕼ໝ㗂㭡ᒍ殉壵∔幥柚ᚶ彬瑱ᭃṰẬ洹ᯋ㖩樓刯㳜偝灚⹔➊ክ燈㝦嚫ⵅ㪜瘊䰑峃⤬僙䱺䮔曍䝻畋㝡⒦嶐欳吱榋咷⒩ᐉ䊚⟗⨏dzט歭㋸䵨篭㔲浧喇ヒ籍䲚禴״ᣀ⮟⻞㶲㮹皆濽儯Ⲏ惝ᥛ⛴☋暽䛂筣溽ᵎ殏㝉濱ᣧ㧎滭纺䯕告⳿ේ֊暠ฅ樸擑⡻墵ⴝቅ烺慔䘌DZ篒侟܁ᗅ劤㓦⾸妧ㆂ䚙㚫⮕͊ᔵ̈́掜咯济筺㓗ⵉ岊䯚毽ᅚ俕䘌緷ᔠᾙ㳨絰䦁砚沼床◶烝゛⌗⸊篵᫇歮ጔ㶟橝撣䥖剞⽞囕ز巕ᬊᗾ⟔㞇滢綈ો瞂⋐ᜠᅀκីो䡰渠濓➳㻰㸌獳矍瀘ⰸໞ宝䬠ḕ▁㟿⿑律⩝悰㗒_意健䊞氢⨛aࠎ⟵濊潯㺩ⲓ笀O湀џ㦫ܝ⸚世碯῁缾䀤䪛穯矛椕幹㌢㦀␛ᰔ『䶎㿐щ绣綳筡嫯毟嗟㌞妅ፒҊ䀍⎋忟羚᭦䰸⌨٫睶൦弨堣䜴䘔㋨ᗺ埌徚延帟Ӏခ熠㿭吡娣ᯠ㝺倹嘉�þư綂寮睞楠だ矨畎尦䚲ౄ恑氽煋祁攘ݻ勊䜥䃠桜箽叫ࠬⴈ叼慹䃽Ȑᆈĸඊ╠㿠涡䡊昧校檣び廁Æǩ̩綷盂⼏娏⯑Უ㋉伅ኵ ႅᾶ䇞㙬ݐ䔟㏰㑠榮禝㚛床琺㎋汢ᬺϬޫ楝砈媠绡盩ว⪕㠽峱⿌䃽䆧࠹瓾窠擠㴀灻ᦂ䰦㠂᭨䋂ࢌഅ㶄㈰ල浐㆗㖣⨣傧眖㐸䑓ោēƧϴ㭰ෝ瑰㧉ⶎ䪣ƹᠭ簽䢊¦↣Ͱ唼㥎ൠ㕰梾瑣ᚓㄬ撏䑚ₗ䄅↹恁Ḝཐᯈ㹀惡玒㠸喫ਾۣ扁儌盆䏝᩺ྦྷ欐㟰碁䘣䲧㌮永ᡒݏ冖⇬ϫۂರ⾠㱇㢡擣㔛⨯ᠿⱗᢉㄟ唖楳ႏͺϏ壹䪌䤝瀛仯᱓㢕╕懫䏢⦾յೱ庺㟩ᰓ瘈Ḻ堵氣焛偁⪽窴汈㢅丁䜰䁦弭࿄䉐ҟ∰ᇨ⥬夁༆ե೯䄳ᴌ甛➍㷜ヹỄ͜ݲ劂᭤㯯䓫ृ汦梅縿㱕䢆垆ሲ⏙߭矄楿偰燲忸橦催䨹ẁ撀ࣨᾄ⌷߾ฦ◴ƾ基濣ቦ䊭Ᏽ䁔罈➗㛕㷼ݜෂ✴スᡱ堀窀礽≑ᒄ⣴☡瓂䟓㍮Ӣᡘ圁䳩習ڭ寃⩔扷⣶捑瓩䷐眾睻⍹壱䩉Òຮ洸揃㒝ᦪø۹ՎഐЈ殰殣叛䴮स⩔䴿椅儥暭桃༳儸炠埩埠窯⦇䙞䗰ᴴ刈Ծ㯼ๅ欬㠖ᕑ抃䋑⓳㴻ᤦ䲉凨E䚇◙╬㕸搱繣ྚ沮ぁ噛╈㕓ㆽ⥻఼⏁٬㈇ఔnj೦ᶵ㌻䑚ಌ愇浮捘⍍榮᧚旒Ⱐ㼚Ⳋ㼯㎆乛棫⳥斫䝇̄⩪⛘曤䇑䪄᪳九▽ቸ㝓櫖Ử㠫㝑屔ᷧ䞭橭幖繒䠫櫚⎞䠭䙞Ṽベ㳊憑㟧⨪८ᙁⱯ<ࡤ儋珸乨ࠤ粡㉠၆疯嶉翴䏕⊄夐Ꮰ➻焞ᱢ㤤秞ᰑ䰱ࡇ穌䊝磯૯挦掐䴞ᷢ㜜Ⅰ挣Ჲۥ䢿ぜ⟉䮑⫁搒䙧ಇ䈞ፊ噜羺䩆Ɑ䡩欰冤ᡈ᎘⚬吱ᡶ៤树弳則䈡Ἷ䯼᭲䔘䨞ᐌ樢㤟ল㐘籊 牸ۦࠥŞ劚Ӣຳ⎹ଫ䚉ᨑᏌ㵩少㑑寧ɬ䬲㊏㲌䧈ฒ☭䑹㊙僘嶳乇䛈㨸煤琰䁲囒涧䚏༸⎒㸷⦼湃ٛ嬬䰾๐䢛暱燿Ꭵ剜䷾Ც㼄畛㎳䑇ኺ楞狃⾚潢燩☬䶡ἀФ慉䨸䤈ನ⢸ş䪇䵚㤉⎭㬈䲦ᢂ㘴癤䈳ݢⱨ䘫䰠唊⦔䥶祀䡶ᰀ⹎千㝻婯ᴼ檊Ƚ┖叮➉ᮗࡼㆱ傃籧暔㰼ㅔ䴪㓰ὄ剫⚢ธ䇢㚠ᘡᕀ䴰㺣䕆滛ᬦ槍卅䇾Ϻ㉼╉绕搦䱮ࢼ浑吤甎樒煃㴢愽Ὶ㏔洉右㳇䵮䪾傧ផຬ吕⟽̝᥌ெ⚉灳㥧獬檹嵜⪛瓡栰㏏䆅呙恖ᓴ竰㿆楅㱫㨧㒆反䔌㍶✖㒔珦㔓⩘澩粆ᡬ煀⭫璛ԁ৪㎯ ䷅ᶀ掤溹僐扆⳯䧇繞湇⌬ੰጺ痻Жᥜ圀纩呓嚧୯ޮ獑㒕楘娞㏮♋㎘ṹ旳矚氕䖸⬷᚛㝨ÝᎪ枏埍ᨒ㴠栳左ۯ岸㍝㪍⓷Ꭶ暟༻ᰒ㒸➊斵䈴㋈氧tᣉ洍ᐷ㏪曣瘌ᣌ幝㯂篓★ₗ綼⊁皌㥦娍甧䙵㗿伮㚌梱濓个㨏怅㸭ٯ盫ᕤ⛵唬⩂㲀爹亃ׇ燯痪杜䊎䥱㨘ࣸ歰䵡᪕崒˙熓㲦ね渻㞸寛ᓰᐕ碕疖䧎㙼猶岞濦嗮缽䝕㲔⪙᪠㘍暛䳉᭹囊ⓦ᧴碛ⵓ槀汞ツ瞌榤嶷䠓䲌↳ᕜ毌嘕䨆珮ඉި㧠獷క㜑俾〼珹亓௦⎖垺ཙ惃獡秘⛁暳俿㭕㯂犳垇濮ᒼ彜ᚏᴔⶥ曟䲀ľ㏗⣺䲳㤛䍯ྺ揺洚伟猥服➕᭼墿㒉癕堇礕搗⃓纊哨姉䐉穽喀帕崒ᘙ泝壳晛眾硷罇獡甒ଣ暏亹仁㙢盎ḭÛౌ嵭僝້̞Ỿ㥐័ⱬᴪ㩌愥濅帶棔硾൞⺈ೡ樇畟᭱䳕ᯁ㼢涙債夷╭ގ⣐檜ݧ秈兔⸐塄㵴灥披个㩍儉ぜƗ㳢㲧珮昳痺楼如標溫㧆翬౽彝㗖持絇杗Ǹ尮㯽㫦嘠堤变⡽Ⱶ㷋⚒嬟ఄԵ俨庑モ瀥徫㠠Ŏ≺䯾纜ጀ◭涩极㝇᩶禙瘓Զ⹏ౌ❗爬㨌㘉㜴姶㽰玁挓ࢆ埬刋擓অ涁◂ஹផ並業Ạᤉ篳珆前⎻⛹榍甉榾䭱ᜐⰠ廞垔箉僫俆㿴㩸䳐窃甞槭淢♒⼩ứ㱗㻅瑫楒噽ࣛ窆/చ犀⺇Ἀ嗢涅牝嚚്㙽Ӛ㦄⋴竁䕨ᜲ㑫ỽ崥⾹体堶䙺ࣞ秙独斴䷯ៃ唛⼑㨌捅偋ⰶ痯窹⹝䇘慸ᗣ猷枖⻢岞㐂繶刹擆㏮㊸䋚䪜波ו⦹♬⹅Ắ冼灶撥㐳惯伽罒床猆ዽ姹枖ⲱẗ媃㋪圫ᶅ乼拕㪎ᴁ䖲ᵬ圎⵿⻱夒瞾翓尛檡㶮皑洐嘒Ƀ䶒壺双㤞⬁⥶䥌╻渢ᖓ㮚֬䰀垚信櫥㧪罅滹眷淯ࡻ䋙巆䌓ַ䯞勭㛵㜗㯹櫓澶⧅䚀䖉䋹Ν唪⾺嫱㏮㚥䟫嶧盎數竓㐷櫾囄堍䶘湙㹲絴搫玶ⴕ⎊勓掌㖶䬢埽⾺乹ワ⤬櫫癶⫯䄿擖啇㋧䘌氛㖬汲㟼来溋㭷秎᩺毽纅勧稌㔣ᝆ⹝ᱹㆢ痰坫⦷淍捼寺撓正嗎楍堆⼬尙㜿墕睫俇悖箺曞䏛㹭嗰綐⺂⥣刢疥哵㟧ݎ啣⠱िᜩ昋൛埜筪堭㾲棺戋捜䇬ཿᠴ㶜އ㨋儏⸚報㘒灕秉䟷⇌ό救ʄԇ㏆柘ⳙᶪダ憕代柶㋏畺穷綃嗠ᭆ朢筧⭥㱪秙勋延⨕䄼㙑΅ᖹⷞ利⾗Ỏ㘚瑵球✺䩎ࣾớ狠県ᯃ昨漅ἣ凊皕灋牖ᢎ᩻⪸㖇㝻ඳ⯅ᚗ䲖嶾㙛嫕匋៷ᢍ㭨潔ᷔ✌庻怪၍ⷧ焌ໂ߉奋匚ᓎ牾⻔䶉斌䷉ᮃ埫ⷩ峽匜擵䀻嵖䣌⾸禜۽㖽涛暸渜岍刊⦭䏍⡖䅎Ⓧ䡵燞朓ඡ毒嚐哙峳㬦滹妋徺柭瓻睐㎊拳瘝ୢ㛬滜壓㻦綕䯕⃗⇬㑼䧑檄᭸䚤寎㟏琶岱劶楙窻ⵡ凶䓸Ǘ䮕۫ᆦ掎㞤漴娃㑲澭捅⟳࿌㉿㻜㎟櫥ช⮗㏿⼌寝ウ牥䗋欆ᶌ䋽惚㎒䜑䋕ବ䑊渭嶂捆⒍縋ぇ嶎૽ɟ涍ᜋ歳㠑ⲕ弣党篕䗳ᨇ⮍學嵝ᮞ壵绿絋堟◬岽㏺擥曻ֶᗧ烽糹㎐䗝᭛㠋䴉ὢ别㜍憻⇺⾆泼巔▄ᮖ䋺獀㙢亥尋㓶稪测᱗描傹揺ㆂ⓷䧞䮳ᯟ俵嬣㊚籍旋۶㢏䭻ᣒ宙Ӧ淿嬪㝊倐堧㢮翍䰹㜆罯Ϟ䶎殏方玏ᘥ丷ⷉ㓆掅塻䊗આ繸绗㾠ᶹ毿㜎枞Ί㤪搑栕䆊毌㤋⛹嶂༕ᷮ完皅䴕媑㣮栽濉熖嚎◹獘֓ᜈᗬ寜瞕ⸯᩧ㗆捭䕻泖㪌廾ב䦝盶喼㰂欔⼕塇㝎竭皰䭖ᖌ䷺燒䖁྇䶹珖柍䲋夅㗎榽噝佗ⴍ巽᭑冓䮕淦ᮨ垢沛寭㋦篽皫№冏䵺ྎᜅ淬歼矀唆尛㮼犵䪻皶巅凗妀狺浻ଧ勻夷嶭᪶羍匚ଷ䘎᧵្畚椕┈紒䎿̊ㅔ橢෦䜖ᣠ寿ៗʟ㇍挰橽监焝儏ぞ秝䭼㨄䛵審ᾜử㗨簗啌ï忍⢸Ǎ⻢㍁㬻⦂ᱎ徒纩㻼㬶皅渣塖࣌槣≬搗姨䄱⍢缘ⴾ簇㏏泅嘤⠨嵔竬⸩㟹哊羋A捓措㚐ⰿ嫗㚒я⮬ê㿽⢃䝾ɶਊᵶ畨䃴䥘ᴞᑸט㈸俛❣⻌ϫ㨸༨⛖昦㼞毂⇜嚹穋恜ₚ㜹ǣ䬨筅㙅䈰㥟㏺ڣ皒ᇕ燈ㆧ嵤歳弓灡фv䎠㓙劣峻揍ⰾ䟹ボ䥐⇳Жݖ秅ߐ㪿㥁攑䃐⣝㡟ᕙ垞䋵㔹ߕ擴Ổ═Ⱄ措㿳扖瑱㑙Ⲹ䚃䈜䏎ީ傘Ჟᐳ㢞瘸Ƨᴮ䣯慤塅抖戞੍ܽ䁬〸䇦㳷䇣䬣㜯斣ౘₚㄋ偙䐔䨨眺浱←笳࠾ᶧ愼籙⢾䈮≔ਨ䠎古屨笱濣䊧㌮䨾㷹⢖‾ᇺ⏨䝞䐲Ộ㱈碈䅃窊❂稽婧撑⤃ᇠ⏬價༘ᱷ宣甆ᅧई洿ᅠ!⎒䏱暢㕜႘玑䈀枧椋⤯␘摯䁇兺Ҹ灮ћ⊧⭅㠣屢偉啺㈐䐚墍䅆ᱬ㱀ᡭ⫧漗㌽㟗䲑㈁₅䟹䤖ᴯ婪⇑箃䲡㡄᪢恠㧑槙㢝揹߳ኮᷢᅘ瞀ഃ䃊ឯ窪繞徯ṾRܝ攺䂅Ģ㶘睑歃䋧▯⡦䅟ʗ礐䌴绳䆨Ǯ᳁㦈申悤䡯ļ粗;爞䢚ख⟉㣂㿾᧼嶕Ŧ✅毈廆抐椚ਉ掬礄倜妤㋄矚亲րݓ㦣㣦噞儹卖䑯夼㦉ᾰ㹷䞩悳滰幮婃㥝፡ᔋ䧴᳚䅜ୱ側稿ၳ懧⡯䜽ᙙᏱ泹⧵繟ࡒ䄦‸ԭˈٰڀ睱椈煗檚䠰樏⁵h㻔粉繀ව瀧皼൚硧⨆稊伓悺㳳昴ᩴ䇢置暾䭪⩤ᔈᇯね⟔⟞ᬚ㣔缉曳䢇䃯捚媔㔂栢受➉伳㾘䤂䭓揇佯⚿፞窒I᧿湳䎚伍ᵊ㻌獩浳乇穮弽㕜稧ഏ⧢㐃⟥之Ḁᎌ綹磳巇哯ຼ㍝暚甀㧧厬碹事ኆ㹥͈ᢓ纇╯㎽пڟⴎ䧦右䟭乽˖㵴捓枇獮㶾ݝ媐ⴝᨊ倥枼⃗㴔窙梊ഇᝯ禿ᅧ䓒墊刂'栓晽:ʈ溤೮ក౬ᙰ彝㙝夿ʥ၊扠】祔㮢㻤Ά့⸑打ᇄ熃̂焸東⟈␀崴畜እ粞畜㐛穛䯫➠嘬梐恈Č䂉ڈ掷ؠᰱ瓪㎣䊪ᖣ⡊⸰尤㗐嵪揂砗ȥȰ榣汼ᆟ䨢䘌▊᠇Ⴠ䚑㬮ѥ歸デ缘繀嬃ટ缾䴯崢㈌⾁ᣚ㲌悈絘眷牏䆢⣜协挑所䮽䱂↩㡟䅅憪ᒷ坡䩽࿃ᦘィ⥜僓ឰی峢⑲痥縠༷畎籽煡榔Ⱟ☖塼⠈Ѭ幓㛒焅硡嶷拥㛆场ଅ畊䯾廔ਲ硥滨ិ֮㹼溿֟噋㕘儤ᄛ璿<椐痵♫噷〧⒕ᕄ䖒猚ᘑ㒗᠑⅜尹㰜ವ翀晷⎥վຈ兏⬛ᘑ暬䅍⼨ް៊எ殆䉁໎恭〦熣䬐℩Ⱆ惎廥㷲炵立䤢䥏⡧狘㖐ᬛ嘁ō䵕К嶕㨺盵晨竷䇎幏ៀ熓Ბ㗦毝埃椷健㪒盅沋奷槰ᕿӞ䶙ഈ昌瀳ᝠ䜮待㹚箎羋篒᷏䭾䁂你璧㒊㌠㝏⤁ᯖޚ䁄ܰ㍜Ὲ䚬ᘴⵔ܅榮椃䱗ℾ匶͐¹Ἂ箩⣿ồ䧢܃ầ橞°澨̝⋋侃垈㑮≠僲厄䍬ݥ嬳ব㝯⣑屒柆犭活䙷㲸⠠⸸ᶘ㒳丘噚堌溙巍䀆绒嚎䐠ܨ䗟ἷᎴ㗦䯊倳⼮ূ䞽柅暤Ֆ֎奒嗛㓠烖Ảਂ嵀Ӱƾ᭻珳ⅰ䛽珥-⍼渂樬碶漻加˿䅤姡ޏ榇彚璩紁ί琕❘ᆽṾ䧚០⨱枏窩Ϟ⊧焺䚸㮷吿പ䃞ӂ羴ݠ㸔ڀ╡፠䞘溯扈㯐眧g㩴䔽注ત氠燼Ꮫ夤伏瘶㯁咅澱†Ń㥭⼀乎㮸眥満ϧ㱫䞄˪嗿ᅠ ᎒䏽滛昢椏秼怤ធ漈̿㯍潺ቴ㮏ㅑᣨ绸ഐ暱⸆偟恳ɏ䂉㳋溾㕊₧╷Ԭ㹨⮂ᚡ人嫨㼚ੳ感ԭᎰᅆ㒴䌛嬗ઈ㟽ᭊ⸾䀣㸚ⴍ瞾䆗尷ખႝ眤ࠠ搏䝂保ᴥ⣾練⎤䡯潏峈䳨ʠᙀᬗ橔ၝₜ澑掵緫傗眣㕟崟㼞簝澤䀗羥たₚ橣䈕玙④␣⸿怔⩁瘣灢∯㴱㦣牥澜嘬㥑管媥o帔䷞烝漯㤯☏䑜呩༿Ử宠ᾃ㞹浲䯠㽮-硭ᑾᄿ䟇ὦ檊櫑堰檁࿒ὀ則嘐給峐ኯ稳氕咞ᝪ∪䓦倧Ո⅊△㒀ภ㨨䗌㡃㥟热⨰♃㨺傋ー剫䎳䒃擧庪ᰘᙜⳂ⮤䩠⸽ቤb爚ᔘ紟ƾῧ䶄缾ᓩ徰⊃䚶⢄㮨㨺䄸炑℮㒡歈ἑ ሰƀ࠸ǔԶ䋪তゾ♸⊞㛱吻ဥゆᑰ的桉瑳晊₤䠴ᷦ抜ࡘ纁ᏽ傏⁉Ỳ㲄繷䆅ᚂⅯ汁ᕝ筇ᔕ樆ɼ瘸倖䆚䇂㸩ㅡዠ⌼㷦࿄珞䔞ᨀ洜⟒ީẺ㻄箠ຳ糐᭯唹㌰⚘禲䡝ダ柩传笎ṸPྔ纤㧒ൡ䝝⤥ᴗ⼆㐍⠙俼ຼ㺸稱᳕翻梠⽠㍜羦အ㈫џቚ沴搬⌨䮜稓撈ᘔ繰瑜�汮㨄珺揫碰彎㳇睢ಁഉ幰㲾⤾ᆚ䒢䘀个牤悐�ħ㡹絳炇屯窿ᙜҠ⌗幝௰Կ⊈徱㹲糧߃榐咠̾Გ㡀狯䨨ʻ䟓ܯṼ㾸窪ƅᆷ疯Ⓟ糝珡䠣ܠ炨埡ѐþ熠ץ耓李ᦰῃᙀⴕ昌搓枲⽀ǥ㳶✵祦ᐼ⣏◢⋞凢⩢昌ᐻ弢Ṫ綩䍋淾㳏瞿䫜漦ᤘ稕搏៵ద度凚繥 ಳ毻䪏⼼เZ¦䷡易峀⇠#咘⯴㣯ࠋ曒῏⽿㻟綜ܐ䨄ᰘ㟨潠ᢝ㻦篯 ߫䨼澩庣㶸㥭猠ɗ䠘懱瀠㏧朓ⲿᰒᑼ濴㔋㳝♐䒻憇熏勿嶠䯜恠渑嵎㟺澚怚ᖆ籕煳橘滾ᤁ楇⮪ܰ幟⊩潩炧㻷䒽瑕ڗ䈦兢⠸垚宒暭㯸⍱⇨凸(X⯛恇劈Ͼ㖰ྜྷ˪糗⇬篁⡸廡众䛝翟ᢏ埡ᒣ⏞弡伮簒ᚓ漻劆ᇆ㜁வ結砏埡㿞у弙䲱篵့潿ὰ䐡祫䓚㔐琿 歓徚忔䐅用࿚Ҁ㾿㶖擢°䔯䢲矿熳䋂䲘␀久ߕ⧡屪㩄ĭ簻柴群ར䭝縿␁Ǖᩧ眬椇㵴㎆䊙嗾㤝㽠⁾栍爗戟唦簳籺Ḥ糨Ⓘࠛ窶㊤䣃櫐䨕冾⟺Ⅴ䞛嚷Ԉ晳笙擤Ḍ䕘㍢ၣ引紃㬥䩕ᾚԻ儹缿㝩ᝀκிᒡ⺘᱁㐓➵俋佀㣔耉缌Ȥᝯ栏ढ़ቱ丫y戬吞➀愢㧖ɘℵ॔ᶿ⎾僝ۇؐ琅᾽ₘQ㻼凥祹礷撯羜倠ẻઝ㾇樂ɵ偩悁䁚ဩ羷羂ژⓞজ歃ᘙచ㧰ばࣚ䇘ଦ㧋砽༉濌束⊦榧㨝䘓柢栏ἸƜ紒Ƒ৩恏圀䍡䆟ㇲ⚣ᐱ埢䢎ɺ䡆粑⊋粠媓劐ዮ湰攢⸕洅執๎徎㺙ȉ箋緡柏彿Ǟ粼Ⲛ؛䰌㟿汵忈㏅⓭筻牅㾡⨹俳塂┘秦梱石劔夽㹗ƕ缀瑧ׯ䤌䫔红ᠬ⊨煽LJπ㻐⏝稺䄯歨ォ伨姨䚜㧟Թ砭瘮Ჿ㼀Ν筐簇ရく忞ࡘ䞂⭨䄵堩䏀ై翞楅ፇ翜⍲ⅳ◣唞Ԛ噠檗⧋壦䱵䔯㰬栆摡Ͱ㪔㎢崟䯁㵢嘉珥䞬傾悎㷬繅籏煇倀瓹庢綠㔜䨙㐊柬伻ᾙ纷∉碾㧚ï䬡㤓㬻ᔕ堏倁䞧ή㴫竽k皇兏䝀ጝ洢䰗幖柦俭Ṷ㻔耏仳捰㛟ѯ漜ř縨䠉爌抏㿚漭絚稅瘬ɿ姟宿挝㝦尒娖瀙㑓ܮ縵罛硟䬏狠㿟㖟缝㸞墼䊧俪㿬缡纙ɚ缅盋瑟棟ட亡⸝ဆ「㿠䠑繺㷌禗糏束矀摉㭝ᰛ䅠Ԑ嬹柼ၻ 怫纕爿瓿䦟㪿␘堝瀗Ϻ置耋絇粏秿浿枟༞巑㐛ᄱ吰嬫㾣䀙纭縫窪౿煷租戞昞䠙尕『⿲柚罪缶㇏繿炩綟束⬣嘡㰝䙅⦍縀㿢罆繧↧笷牟撔ᒟ爟嘜㱣昘〛嚙〘‚垉挩b熂去㴡㓂猠攠砡⏃Ⳓ怤礣性歓厪楚储怤⏀値ဤҚ孁〥怦瀧彃⨻穋璹稨ⳃ璻Ҁ墓䦂㒸物䠦啘⠦咀椲㨸嚹ಹ枂༃䶲㠤๙ᠦᚃ㠧嘲㠦ᒘᱣ䬣㘚•ᷙᜪ咛Х怢䐧䑨砦ސⳂ璘搤ᑫᣙ咛ᐤ呫⹛吥♙ἡ㐥搧⾐Ⳃ㐥≁䐧�獂噙㐧ӂ熂畢⤢琤า挱Ⱖ琥歚砥榁氧ଠᰥ禂Ⱖ尥ధ䑪㓀氥ᜩ崠ᰧ䠧搦咃簥㰤吥禀朂䈤周尤Ṃ氤㰤䘻僠〦勁戥࿃ሦᝁ⛩䷀าၠᗡ琤⬐ⳁ㈥䷃གྷ判Ὃ䩡㗁係捺ȧ琦咂䨤歂䨦㱂㑣〳Ἑ㩀弡†ᨤ倃勪ሥ⿃樤㑑䦋⦐娥娥⡩樥䚊ᨥ係㑢啠䘤爥笒ങ䘤稦愘佐娧䘧娥珣䜡㓃ଡ㱢ṙ℉婠嘦䓃嘥ㅛ㏣㘥嘦ᴚᯂฦ⤢瘥判稁峂ၢ⸦☦粑爤礠渦ਦ⸥濙〠攢瀊翲ࢡ帤㠉瘥ᰦᥙ㸧帧✙䉐Ĥ縤帥怣㸧㈤䄧㈦ᰥȥࢀ挠ℤਧĦ帥㒣ⷃ䡑㸦ⅰ縚㘧加ㄤႢ⒚㴢㨦Ꮂ焥䀣क़䀨ᄦㄤၑ㸤渥Ω带Ḥ⨦爦咀ᄦḧᄧ䄧ḧ儦帧㶀結椧䄦㤥捓椥☦ᤥ㸦礧↙奁ԥ嶂㙓ᅣ㘤䌠垘ั┥垛礥渦咁攤爘歃ᔤ䂒埀厨塚㔤殪渥㊓㡙䈛喛嫱㔦ᇁ㔥徫㙁䲻痪╲愦⨦ɚതⳃ剨洦䦻ⴥқ䒚ᬠⷃ㴣Ѡ⟃崤溢㴧㴥甥ቐത䨛喛撙紦兘̥➂紧㴣紤ᥳ漚灲⼠攡䐥㼠ἀ瘛櫠ഠጤ〡ጦ畠匤≲縥愦㊠ᴦ咀㌦㔢ጧጦ匧√ڢ䬥㌧䬥猦☂㌧☁⬤啙攀⍙ଥࢀ䬦⹘佐㬦湙♣㬧㣩ᾘу⣱笥瀀ܤ旨嬧溠䌤ⳃܦˁ⤢ܥ㕀朦䜧烁ᬥ涋ፓ慨าᜤỳ慪洤ᤧ津✧ତ圧笥㜦糋༤䜧༧ᜦ㌧俲Ⱓ池㏲╰㜥伧⊂漤缣値✤༃籛䈚ἦ弣ἧᴦ伥⼥ἤ氡漦劳ܤౢ寻⇹㩀䂥†㔙幙䱙嬥概₤ᤛ匥伦䂦⼧⬧伦ᬥ⼦朧猥洦ଧ眧嬥伥ゥ⸀ࢥ⏃欥傦惂䮊䪙Ⴅ⼧䢧ウ眦炤㼧喛ܤ梥ࢧ⢥摠ܥᤙܥ伦㢤眤ԥ眤ᢧ✧㢧朢Ⴅ瓠㢧Ҧ傥䇀㡒ܳ⦻⤋ܦᭊ燀ᔧ甦悥炧悥伧撥⌹缥傧咤Ή㡨㜣瀐㏰⬧⣲璦ಸ猦ದ碦ᔧ碦㉙ࢃಧ璦猧䜺ᯀ沦欥ࢨ斀瀥倥峂ࠥ岦晘㥁䇛ठ礠搡ࠧ冡匘䞡加䱡ƙ䮀■⇙ᢣᡚƚޢ勁䳡㞳Ꭲ㘡⊦ቨ䊥殠Ⲡ̃糂劥ण⾱ጡ罣縰㲦ဥ߂岤䢥楂瀣榛穋䪦Ӡ毂ߚ⣘ኛ㊘ᾳ㣣ᬠ⪣槂㎢⡡耘搙�⪧䯚沙䪥֛䏛窦矂檦灣㡘᪥ܛᪧ厢媧⪣媥䠚㪧喛䪦⡢叙֛变⪧⤉㏙ᦙ攁壣ڦ䶂ⳃ妚㜠⚤㎡ⲙठ㪦倛暧㪤歃嚦䓡䪤ᚥᣢ㏘溧⩃㚧檥犙᪤㦂Ңڤ交⠚咃嚦ᚥኰ纥⺧䩠籂嚥ὙƧ⪤㤁㚥珙檤ᚙ䚤庤媦旛ਢӢ㺤&ෙ≂纤佒䆥䯃扃窥㗚冤㚦篠↤ᯘ皤憧皦庥⚧庤暤候㺥ࢁƥ冧⦐榤Ƨ䒱甠ㆧ⣱扃〡熧㥂形ầ↧Ấ䦥憥媦ᆦ暦产☧㱂冤֛春ᦦ䖤俀▥ㆧƦ⾚㲳▥妧妤叡㦦䚤禧㒠ລ䦧ਠ⦦Ⱉ⦥概妤怢ڤ䴘ᖤඦ窥ᦁ‥⌒羘ඦ溥簧䶧汣䂩ᖤ締喥䱛ধ喦䦧憧㖧耙�‘涥䖧⦓㶥涥妤ᦤⓚ润ㆤ涧濂Τ䶥䆦㚦㦦↤䚧ᶥ喦Ⱐ㖧嶤㶥暥㊚䎧润榤䀨Υ䎦䶥丹…斧䂧慂த控熥掦থấ皦嶥禥ລ探֦疥兂䮤刧Ⱓ玤䎦宥⢧唺தᶥᶦɘ嶧Ꭵ嶥媥厥֧Ȥ箥綤玤➤槐䱂㮦⎹㩃层箥懣箦㊢ޤ厧禧ᮧᆥ㬰㾫㎦缪ឧΥ䎢瞥枧党ⱃྥ䮤㦥ἠ垧冡Ꭷ垧⚤֦⦧㞦秒枥瞧櫢ឥ室欃扺侦䚚䭁㾤䐡ឦ⾦皥䶚禦⚧嶤ᾤ疥ᾦ㕳羥ⶥ撚恤㾤剻⎤⟀ၦdথߙ⮦䁤殧䁤䞦㶦䌦偦➦ᤚࡦ参偢▤咙參䡥ڧ接দ澧ޥ殦☙�䯁Χூ⡥ㆦྤ塧ၤ⡥䡤斤⾧ᖤ桦て᪥䁥庥㖥灧厦咁㡦ටੳ塦ᖦྤ盃ᦧ䈸〣ᦧ⡦⮧㦧⮥ަ殧座䑥䞥ࢀᑥ⡧簻ᑦ▤根硦غ䱥摤Ầѧ呥て㑤灧澦㞦ᾥ�瑥䱦笰Ⱨၥ㺲兘羥ሚᆱख़偤⮤つ汧ѧて䑦䞦ᮤ⧑籥ࡧ櫢䥘㾤执㱥ṙ执硦ᶧⱦ喤㑥澧䦤瑧䉦憱籦徤ᰰ牦ྤ㥛༚㜣执ㄦ੦╛ብ箤剦Ꭵ剧桧㑦ᱥᡧ喙䩦敛㒢牥巣ᩥܘ㾤㩧㣣䎧穋㩧੧籥⾧⩤ޥ桥㑥䑤ᩧ灦罛紘穥婤㋣穦婤㾥ᥙ恤偒奛ᙦ呦ɦ剦汧剤ᆤ♤⑧愦噦晧᱐ྥᙦ穧⤊书٧ࠣe垥橧䙧殥ᱧ喘≥瓡ṥ珢⯘䩤䊫幦⩧ឧⱤ☘湥䙥䉧ϡ㹥ۀ䅥⯙乥Ὓ幦㦥繦䙧汤㉦癦瑥榁Ⅷṥ巠入珡㯘㹧ྒㅧ㹥f繥㝣繧慤癧湦ᩤⳀ煥ۃ䥧㯘Ⅵ斧慢ㅧⅧ煤䝢०䉦ť䟛⑤佑楤ƥ⠲㱣㱢籣㜢ᷢᯣ㺘䑡က⺣ᝢ䵢₣䕣ᑡ䩡⠰剻ㄘⴠ剱摱ᓡ⌳椁䊣Ժ灢吡堣ả⨠唠㽰ંણ䥚䮁㏛⠠甠✁䠠╦㖢ⲡ㾢瀡堣沠䥢②༡ 澡昡亡庚浤倡琲䱢㊧橥䪠ḧ㴡ఠӛ橚ʦ桠ᥠ䂡䑣䱢桢瓠㒣䍤㡡䪠㣂⇰䠰棘䋀㑦吱ȣ㐠浥䠢䣘ᵧ痚ⵧ䈠㍤ҡ䵦汣䑢ⵤ樣獧ठ㵦ᡡ绢塢猣䇃絧㓚ͦ崣䓘䍤止ঠ捦⍦ᯣ㖡学㡣捧嶐煑፦ဢ犦卤唠䠡⒡略⥘൦瀡∢嵦ʣܡ校⨢ⵧⵥ塣ܢᠢ捤梲ˢ᪠祣ܠᝤ㕡ȡ堣❥㝤₢ⵥ∢སဠ㡢ቃ㐡㏙ᝦ杤䴡╤吠模㏛卧ᝤᙠ睤吡獧ὧ垢彧坧䣠☢佤睦睤ⴡ㊫⾓缡ᢢ㜠溢䤣㘑佤ⴢ瀤⃥幐笣סアᏂ彥嘃㲥熢唣唢㔡眂䁡㞡㬁 "}
The complete round-trip took 48.7 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-file-analysis)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts.-
. object
- type string [required] The type of the message. Allows only the values: 'request-file-analysis'
- id string [optional] You may pass an id to link requests with responses (they get the same id).
- filetoken string [optional] A unique token to identify the file for subsequent requests. Only use this if you plan to send more queries!
- filename string [optional] A human-readable name of the file, only for debugging purposes.
- content string [optional] The content of the file or an R expression (either give this or the filepath).
-
filepath alternatives [optional]
The path to the file(s) on the local machine (either give this or the content).
- . string
-
. array
Valid item types:
- . string
- cfg boolean [optional] If you want to extract the control flow information of the file.
- format string [optional] The format of the results, if missing we assume json. Allows only the values: 'json', 'n-quads', 'compact'
Message schema (
response-file-analysis)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts.-
. alternatives [required]
The response to a file analysis request (based on the
formatfield).-
. object
The response in JSON format.
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in json format. Allows only the values: 'json'
- results object [required] The results of the analysis (one field per step).
- cfg object [optional] The control flow information of the file, only present if requested.
-
. object
The response as n-quads.
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in n-quads format. Allows only the values: 'n-quads'
- results object [required] The results of the analysis (one field per step). Quads are presented as string.
- cfg string [optional] The control flow information of the file, only present if requested.
-
. object
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in bson format. Allows only the values: 'bson'
- results string [required] The results of the analysis (one field per step).
- cfg string [optional] The control flow information of the file, only present if requested.
-
. object
The response in JSON format.
-
-
Slice Message (
request-slice)View Details. (deprecated) The server slices a file based on the given criteria.
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-slice alt Server-->>Client: response-slice else Server-->>Client: error end deactivate ServerWe deprecated the slice request in favor of the
static-sliceQuery.To slice, you have to send a file analysis request first. The
filetokenyou assign is of use here as you can re-use it to repeatedly slice the same file. Besides that, you only need to add an array of slicing criteria, using one of the formats described on the terminology wiki page (however, instead of using;, you can simply pass separate array elements). See the implementation of the request-slice message for more information.Additionally, you may pass
"noMagicComments": trueto disable the automatic selection of elements based on magic comments (see below).Example of the
request-sliceMessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.8.9", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
Let's assume you want to slice the following script:
x <- 1 x + 1
For this we first request the analysis, using a
filetokenofxto slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" } -
response-file-analysis(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"files":[{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]","filePath":"/tmp/tmp-8384-1Y8uKeecQZ7d-.R"}],".meta":{"timing":1}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8384-1Y8uKeecQZ7d-.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-8384-1Y8uKeecQZ7d-.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-8384-1Y8uKeecQZ7d-.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-8384-1Y8uKeecQZ7d-.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-8384-1Y8uKeecQZ7d-.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-8384-1Y8uKeecQZ7d-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8384-1Y8uKeecQZ7d-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8384-1Y8uKeecQZ7d-.R"}],"info":{"id":7}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":3292,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"vdef","id":0}],[2,{"tag":"fcall","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"fcall","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":65}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]],"_unknownSideEffects":[]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],"hooks":[],".meta":{"timing":1}}}} -
request-slice(request)Show Details
Of course, the second slice criterion
2:1is redundant for the input, as they refer to the same variable. It is only for demonstration purposes.{ "type": "request-slice", "id": "2", "filetoken": "x", "criterion": [ "2@x", "2:1" ] } -
response-slice(response)Show Details
The
resultsfield of the response contains two keys of importance:-
slice: which contains the result of the slicing (e.g., the ids included in the slice inresult). -
reconstruct: contains the reconstructed code, as well as additional meta information. The automatically selected lines correspond to additional filters (e.g., magic comments) which force the unconditiojnal inclusion of certain elements.
{ "type": "response-slice", "id": "2", "results": {} } -
The complete round-trip took 6.6 ms (including time required to validate the messages, start, and stop the internal mock server).
The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the
filetokenis unknown, flowR will respond with an error.Within a document that is to be sliced, you can use magic comments to influence the slicing process:
-
# flowr@include_next_linewill cause the next line to be included, independent of if it is important for the slice. -
# flowr@include_this_linewill cause the current line to be included, independent of if it is important for the slice. -
# flowr@include_startand# flowr@include_endwill cause the lines between them to be included, independent of if they are important for the slice. These magic comments can be nested but should appear on a separate line.
Message schema (
request-slice)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts.-
. object
- type string [required] The type of the message. Allows only the values: 'request-slice'
- id string [optional] The id of the message, if you passed one in the request.
- filetoken string [required] The filetoken of the file to slice must be the same as with the analysis request.
-
criterion array [required]
The slicing criteria to use.
Valid item types:
- . string
- direction string The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
Message schema (
response-slice)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts.-
. object
The response to a slice request.
- type string [required] The type of the message. Allows only the values: 'response-slice'
- id string [optional] The id of the message, if you passed one in the request.
- results object [required] The results of the slice (one field per step slicing step).
-
-
REPL Message (
request-repl-execution)View Details. Access the read evaluate print loop of flowR.
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-repl-execution alt Server-->>Client: error else loop Server-->>Client: response-repl-execution end Server-->>Client: end-repl-execution end deactivate Server[!WARNING] To execute arbitrary R commands with a request, the server has to be started explicitly with
--r-session-access. Please be aware that this introduces a security risk.The REPL execution message allows to send a REPL command to receive its output. For more on the REPL, see the introduction, or the description below. You only have to pass the command you want to execute in the
expressionfield. Furthermore, you can set theansifield totrueif you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of theidfield to link answers with requests as you can theoretically request the execution of multiple scripts at the same time, which then happens in parallel.[!WARNING] There is currently no automatic sandboxing or safeguarding against such requests. They simply execute the respective R code on your machine. Please be very careful (and do not use
--r-session-accessif you are unsure).The answer on such a request is different from the other messages as the
response-repl-executionmessage may be sent multiple times. This allows to better handle requests that require more time but already output intermediate results. You can detect the end of the execution by receiving theend-repl-executionmessage.The semantics of the error message are similar to that of the other messages.
Example of the
request-sliceMessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.8.9", "r": "4.5.0", "engine": "r-shell" } } -
request-repl-execution(request)Show Details
{ "type": "request-repl-execution", "id": "1", "expression": ":help" } -
response-repl-execution(response)Show Details
The
streamfield (eitherstdoutorstderr) informs you of the output's origin: either the standard output or the standard error channel. After this message follows the end marker.Pretty-Printed Result
If enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away: R> 1 + 1 [1] 2 Besides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. There are the following basic commands: :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) :dataflowascii Returns an ASCII representation of the dataflow graph (alias: :df!) :dataflowsilent Just calculates the DFG, but only prints summary info (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. This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r) :help Show help information (aliases: :h, :?) :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) :quit End the repl (aliases: :q, :exit) :version Prints the version of flowR as well as the current version of R Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command. :benchmark Benchmark the static backwards slicer :export-quads Export quads of the normalized AST of a given R code file :slicer Static backwards executable slicer for R :stats Generate usage Statistics for R scripts :summarizer Summarize the results of the benchmark You can combine commands by separating them with a semicolon ;.{ "type": "response-repl-execution", "id": "1", "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n :dataflowascii Returns an ASCII representation of the dataflow graph (alias: :df!)\n :dataflowsilent Just calculates the DFG, but only prints summary info (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. This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n :help Show help information (aliases: :h, :?)\n :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)\n :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)\n :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)\n :quit End the repl (aliases: :q, :exit)\n :version Prints the version of flowR as well as the current version of R\n\nFurthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.\n :benchmark Benchmark the static backwards slicer\n :export-quads Export quads of the normalized AST of a given R code file\n :slicer Static backwards executable slicer for R\n :stats Generate usage Statistics for R scripts\n :summarizer Summarize the results of the benchmark\n\nYou can combine commands by separating them with a semicolon ;.\n", "stream": "stdout" } -
end-repl-execution(response)Show Details
{ "type": "end-repl-execution", "id": "1" }
The complete round-trip took 1.1 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-repl-execution)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts.-
. object
- type string [required] The type of the message. Allows only the values: 'request-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
ansi boolean [optional]
Should ansi formatting be enabled for the response? Is
falseby default. - expression string [required] The expression to execute.
Message schema (
response-repl-execution)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts.-
. object
- type string [required] The type of the message. Allows only the values: 'response-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
- stream string [required] The stream the message is from. Allows only the values: 'stdout', 'stderr'
- result string [required] The output of the execution.
Message schema (
end-repl-execution)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts.-
. object
- type string [required] The type of the message. Allows only the values: 'end-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
-
Query Message (
request-query)View Details. Query an analysis result for specific information.
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-query alt Server-->>Client: response-query else Server-->>Client: error end deactivate ServerTo send queries, you have to send an analysis request first. The
filetokenyou assign is of use here as you can re-use it to repeatedly query the same file. This message provides direct access to flowR's Query API. Please consult the Query API documentation for more information.Example of the
request-queryMessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.8.9", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
Let's assume you want to query the following script:
library(ggplot) library(dplyr) library(readr) # read data with read_csv data <- read_csv('data.csv') data2 <- read_csv('data2.csv') m <- mean(data$x) print(m) data %>% ggplot(aes(x = x, y = y)) + geom_point() plot(data2$x, data2$y) points(data2$x, data2$y) print(mean(data2$k))
.
For this we first request the analysis, using a dummy
filetokenofxto slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "library(ggplot)\nlibrary(dplyr)\nlibrary(readr)\n\n# read data with read_csv\ndata <- read_csv('data.csv')\ndata2 <- read_csv('data2.csv')\n\nm <- mean(data$x) \nprint(m)\n\ndata %>%\n\tggplot(aes(x = x, y = y)) +\n\tgeom_point()\n\t\nplot(data2$x, data2$y)\npoints(data2$x, data2$y)\n\t\nprint(mean(data2$k))" } -
response-file-analysis(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"files":[{"parsed":"[1,1,1,15,10,0,\"expr\",false,\"library(ggplot)\"],[1,1,1,7,1,3,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[1,1,1,7,3,10,\"expr\",false,\"library\"],[1,8,1,8,2,10,\"'('\",true,\"(\"],[1,9,1,14,4,6,\"SYMBOL\",true,\"ggplot\"],[1,9,1,14,6,10,\"expr\",false,\"ggplot\"],[1,15,1,15,5,10,\"')'\",true,\")\"],[2,1,2,14,23,0,\"expr\",false,\"library(dplyr)\"],[2,1,2,7,14,16,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[2,1,2,7,16,23,\"expr\",false,\"library\"],[2,8,2,8,15,23,\"'('\",true,\"(\"],[2,9,2,13,17,19,\"SYMBOL\",true,\"dplyr\"],[2,9,2,13,19,23,\"expr\",false,\"dplyr\"],[2,14,2,14,18,23,\"')'\",true,\")\"],[3,1,3,14,36,0,\"expr\",false,\"library(readr)\"],[3,1,3,7,27,29,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[3,1,3,7,29,36,\"expr\",false,\"library\"],[3,8,3,8,28,36,\"'('\",true,\"(\"],[3,9,3,13,30,32,\"SYMBOL\",true,\"readr\"],[3,9,3,13,32,36,\"expr\",false,\"readr\"],[3,14,3,14,31,36,\"')'\",true,\")\"],[5,1,5,25,42,-59,\"COMMENT\",true,\"# read data with read_csv\"],[6,1,6,28,59,0,\"expr\",false,\"data <- read_csv('data.csv')\"],[6,1,6,4,45,47,\"SYMBOL\",true,\"data\"],[6,1,6,4,47,59,\"expr\",false,\"data\"],[6,6,6,7,46,59,\"LEFT_ASSIGN\",true,\"<-\"],[6,9,6,28,57,59,\"expr\",false,\"read_csv('data.csv')\"],[6,9,6,16,48,50,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[6,9,6,16,50,57,\"expr\",false,\"read_csv\"],[6,17,6,17,49,57,\"'('\",true,\"(\"],[6,18,6,27,51,53,\"STR_CONST\",true,\"'data.csv'\"],[6,18,6,27,53,57,\"expr\",false,\"'data.csv'\"],[6,28,6,28,52,57,\"')'\",true,\")\"],[7,1,7,30,76,0,\"expr\",false,\"data2 <- read_csv('data2.csv')\"],[7,1,7,5,62,64,\"SYMBOL\",true,\"data2\"],[7,1,7,5,64,76,\"expr\",false,\"data2\"],[7,7,7,8,63,76,\"LEFT_ASSIGN\",true,\"<-\"],[7,10,7,30,74,76,\"expr\",false,\"read_csv('data2.csv')\"],[7,10,7,17,65,67,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[7,10,7,17,67,74,\"expr\",false,\"read_csv\"],[7,18,7,18,66,74,\"'('\",true,\"(\"],[7,19,7,29,68,70,\"STR_CONST\",true,\"'data2.csv'\"],[7,19,7,29,70,74,\"expr\",false,\"'data2.csv'\"],[7,30,7,30,69,74,\"')'\",true,\")\"],[9,1,9,17,98,0,\"expr\",false,\"m <- mean(data$x)\"],[9,1,9,1,81,83,\"SYMBOL\",true,\"m\"],[9,1,9,1,83,98,\"expr\",false,\"m\"],[9,3,9,4,82,98,\"LEFT_ASSIGN\",true,\"<-\"],[9,6,9,17,96,98,\"expr\",false,\"mean(data$x)\"],[9,6,9,9,84,86,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[9,6,9,9,86,96,\"expr\",false,\"mean\"],[9,10,9,10,85,96,\"'('\",true,\"(\"],[9,11,9,16,91,96,\"expr\",false,\"data$x\"],[9,11,9,14,87,89,\"SYMBOL\",true,\"data\"],[9,11,9,14,89,91,\"expr\",false,\"data\"],[9,15,9,15,88,91,\"'$'\",true,\"$\"],[9,16,9,16,90,91,\"SYMBOL\",true,\"x\"],[9,17,9,17,92,96,\"')'\",true,\")\"],[10,1,10,8,110,0,\"expr\",false,\"print(m)\"],[10,1,10,5,101,103,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[10,1,10,5,103,110,\"expr\",false,\"print\"],[10,6,10,6,102,110,\"'('\",true,\"(\"],[10,7,10,7,104,106,\"SYMBOL\",true,\"m\"],[10,7,10,7,106,110,\"expr\",false,\"m\"],[10,8,10,8,105,110,\"')'\",true,\")\"],[12,1,14,20,158,0,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y)) +\\n\\tgeom_point()\"],[12,1,13,33,149,158,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y))\"],[12,1,12,4,116,118,\"SYMBOL\",true,\"data\"],[12,1,12,4,118,149,\"expr\",false,\"data\"],[12,6,12,8,117,149,\"SPECIAL\",true,\"%>%\"],[13,9,13,33,147,149,\"expr\",false,\"ggplot(aes(x = x, y = y))\"],[13,9,13,14,120,122,\"SYMBOL_FUNCTION_CALL\",true,\"ggplot\"],[13,9,13,14,122,147,\"expr\",false,\"ggplot\"],[13,15,13,15,121,147,\"'('\",true,\"(\"],[13,16,13,32,142,147,\"expr\",false,\"aes(x = x, y = y)\"],[13,16,13,18,123,125,\"SYMBOL_FUNCTION_CALL\",true,\"aes\"],[13,16,13,18,125,142,\"expr\",false,\"aes\"],[13,19,13,19,124,142,\"'('\",true,\"(\"],[13,20,13,20,126,142,\"SYMBOL_SUB\",true,\"x\"],[13,22,13,22,127,142,\"EQ_SUB\",true,\"=\"],[13,24,13,24,128,130,\"SYMBOL\",true,\"x\"],[13,24,13,24,130,142,\"expr\",false,\"x\"],[13,25,13,25,129,142,\"','\",true,\",\"],[13,27,13,27,134,142,\"SYMBOL_SUB\",true,\"y\"],[13,29,13,29,135,142,\"EQ_SUB\",true,\"=\"],[13,31,13,31,136,138,\"SYMBOL\",true,\"y\"],[13,31,13,31,138,142,\"expr\",false,\"y\"],[13,32,13,32,137,142,\"')'\",true,\")\"],[13,33,13,33,143,147,\"')'\",true,\")\"],[13,35,13,35,148,158,\"'+'\",true,\"+\"],[14,9,14,20,156,158,\"expr\",false,\"geom_point()\"],[14,9,14,18,151,153,\"SYMBOL_FUNCTION_CALL\",true,\"geom_point\"],[14,9,14,18,153,156,\"expr\",false,\"geom_point\"],[14,19,14,19,152,156,\"'('\",true,\"(\"],[14,20,14,20,154,156,\"')'\",true,\")\"],[16,1,16,22,184,0,\"expr\",false,\"plot(data2$x, data2$y)\"],[16,1,16,4,163,165,\"SYMBOL_FUNCTION_CALL\",true,\"plot\"],[16,1,16,4,165,184,\"expr\",false,\"plot\"],[16,5,16,5,164,184,\"'('\",true,\"(\"],[16,6,16,12,170,184,\"expr\",false,\"data2$x\"],[16,6,16,10,166,168,\"SYMBOL\",true,\"data2\"],[16,6,16,10,168,170,\"expr\",false,\"data2\"],[16,11,16,11,167,170,\"'$'\",true,\"$\"],[16,12,16,12,169,170,\"SYMBOL\",true,\"x\"],[16,13,16,13,171,184,\"','\",true,\",\"],[16,15,16,21,179,184,\"expr\",false,\"data2$y\"],[16,15,16,19,175,177,\"SYMBOL\",true,\"data2\"],[16,15,16,19,177,179,\"expr\",false,\"data2\"],[16,20,16,20,176,179,\"'$'\",true,\"$\"],[16,21,16,21,178,179,\"SYMBOL\",true,\"y\"],[16,22,16,22,180,184,\"')'\",true,\")\"],[17,1,17,24,209,0,\"expr\",false,\"points(data2$x, data2$y)\"],[17,1,17,6,188,190,\"SYMBOL_FUNCTION_CALL\",true,\"points\"],[17,1,17,6,190,209,\"expr\",false,\"points\"],[17,7,17,7,189,209,\"'('\",true,\"(\"],[17,8,17,14,195,209,\"expr\",false,\"data2$x\"],[17,8,17,12,191,193,\"SYMBOL\",true,\"data2\"],[17,8,17,12,193,195,\"expr\",false,\"data2\"],[17,13,17,13,192,195,\"'$'\",true,\"$\"],[17,14,17,14,194,195,\"SYMBOL\",true,\"x\"],[17,15,17,15,196,209,\"','\",true,\",\"],[17,17,17,23,204,209,\"expr\",false,\"data2$y\"],[17,17,17,21,200,202,\"SYMBOL\",true,\"data2\"],[17,17,17,21,202,204,\"expr\",false,\"data2\"],[17,22,17,22,201,204,\"'$'\",true,\"$\"],[17,23,17,23,203,204,\"SYMBOL\",true,\"y\"],[17,24,17,24,205,209,\"')'\",true,\")\"],[19,1,19,20,235,0,\"expr\",false,\"print(mean(data2$k))\"],[19,1,19,5,215,217,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[19,1,19,5,217,235,\"expr\",false,\"print\"],[19,6,19,6,216,235,\"'('\",true,\"(\"],[19,7,19,19,230,235,\"expr\",false,\"mean(data2$k)\"],[19,7,19,10,218,220,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[19,7,19,10,220,230,\"expr\",false,\"mean\"],[19,11,19,11,219,230,\"'('\",true,\"(\"],[19,12,19,18,225,230,\"expr\",false,\"data2$k\"],[19,12,19,16,221,223,\"SYMBOL\",true,\"data2\"],[19,12,19,16,223,225,\"expr\",false,\"data2\"],[19,17,19,17,222,225,\"'$'\",true,\"$\"],[19,18,19,18,224,225,\"SYMBOL\",true,\"k\"],[19,19,19,19,226,230,\"')'\",true,\")\"],[19,20,19,20,231,235,\"')'\",true,\")\"]","filePath":"/tmp/tmp-8384-h6ry5RFG1eGy-.R"}],".meta":{"timing":4}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[6,1,6,28],"additionalTokens":[{"type":"RComment","location":[5,1,5,25],"lexeme":"# read data with read_csv","info":{"fullRange":[6,1,6,28],"additionalTokens":[]}}],"id":17,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}},{"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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}},{"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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":2,"role":"call-arg"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}},{"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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}},{"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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.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-8384-h6ry5RFG1eGy-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8384-h6ry5RFG1eGy-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8384-h6ry5RFG1eGy-.R"}],"info":{"id":91}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":3469,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"fcall","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"fcall","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"fcall","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"fcall","id":16,"environment":{"current":{"id":3319,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"vdef","id":12}],[17,{"tag":"fcall","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"fcall","id":22,"environment":{"current":{"id":3334,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"vdef","id":18}],[23,{"tag":"fcall","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"fcall","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"fcall","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"vdef","id":24}],[32,{"tag":"fcall","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"fcall","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"fcall","id":48,"environment":{"current":{"id":3391,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"fcall","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"fcall","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"fcall","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"fcall","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"fcall","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"fcall","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"fcall","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"fcall","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"fcall","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"fcall","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"fcall","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"fcall","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"fcall","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":65}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":65}],[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":65}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],"hooks":[],"cfgQuick":{"graph":{"rootVertices":[90,0,3,"3-exit",2,1,"2-exit",4,7,"7-exit",6,5,"6-exit",8,11,"11-exit",10,9,"10-exit",12,13,16,"16-exit",15,14,"15-exit",17,"17-exit",18,19,22,"22-exit",21,20,"21-exit",23,"23-exit",24,25,31,"31-exit",30,26,29,28,27,"28-exit","29-exit","30-exit",32,"32-exit",33,36,"36-exit",35,34,"35-exit",37,52,"52-exit",39,38,"39-exit",51,40,50,"50-exit",49,41,48,"48-exit",44,42,43,"44-exit",47,45,46,"47-exit","49-exit","51-exit",53,54,"54-exit",55,"55-exit",56,67,"67-exit",61,57,60,59,58,"59-exit","60-exit","61-exit",66,62,65,64,63,"64-exit","65-exit","66-exit",68,79,"79-exit",73,69,72,71,70,"71-exit","72-exit","73-exit",78,74,77,76,75,"76-exit","77-exit","78-exit",80,89,"89-exit",88,81,87,"87-exit",86,82,85,84,83,"84-exit","85-exit","86-exit","88-exit","90-exit"],"vertexInformation":[[90,{"id":90,"type":"expr","end":["90-exit"]}],[0,{"id":0,"type":"expr"}],[3,{"id":3,"type":"stm","mid":[0],"end":["3-exit"]}],["3-exit",{"id":"3-exit","type":"end","root":3}],[2,{"id":2,"type":"expr","mid":[2],"end":["2-exit"]}],[1,{"id":1,"type":"expr"}],["2-exit",{"id":"2-exit","type":"end","root":2}],[4,{"id":4,"type":"expr"}],[7,{"id":7,"type":"stm","mid":[4],"end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],[6,{"id":6,"type":"expr","mid":[6],"end":["6-exit"]}],[5,{"id":5,"type":"expr"}],["6-exit",{"id":"6-exit","type":"end","root":6}],[8,{"id":8,"type":"expr"}],[11,{"id":11,"type":"stm","mid":[8],"end":["11-exit"]}],["11-exit",{"id":"11-exit","type":"end","root":11}],[10,{"id":10,"type":"expr","mid":[10],"end":["10-exit"]}],[9,{"id":9,"type":"expr"}],["10-exit",{"id":"10-exit","type":"end","root":10}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr"}],[16,{"id":16,"type":"expr","mid":[13],"end":["16-exit"]}],["16-exit",{"id":"16-exit","type":"end","root":16}],[15,{"id":15,"type":"expr","mid":[15],"end":["15-exit"]}],[14,{"id":14,"type":"expr"}],["15-exit",{"id":"15-exit","type":"end","root":15}],[17,{"id":17,"type":"expr","end":["17-exit"]}],["17-exit",{"id":"17-exit","type":"end","root":17}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr"}],[22,{"id":22,"type":"expr","mid":[19],"end":["22-exit"]}],["22-exit",{"id":"22-exit","type":"end","root":22}],[21,{"id":21,"type":"expr","mid":[21],"end":["21-exit"]}],[20,{"id":20,"type":"expr"}],["21-exit",{"id":"21-exit","type":"end","root":21}],[23,{"id":23,"type":"expr","end":["23-exit"]}],["23-exit",{"id":"23-exit","type":"end","root":23}],[24,{"id":24,"type":"expr"}],[25,{"id":25,"type":"expr"}],[31,{"id":31,"type":"expr","mid":[25],"end":["31-exit"]}],["31-exit",{"id":"31-exit","type":"end","root":31}],[30,{"id":30,"type":"expr","mid":[30],"end":["30-exit"]}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"expr","mid":[26],"end":["29-exit"]}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["29-exit",{"id":"29-exit","type":"end","root":29}],["30-exit",{"id":"30-exit","type":"end","root":30}],[32,{"id":32,"type":"expr","end":["32-exit"]}],["32-exit",{"id":"32-exit","type":"end","root":32}],[33,{"id":33,"type":"expr"}],[36,{"id":36,"type":"stm","mid":[33],"end":["36-exit"]}],["36-exit",{"id":"36-exit","type":"end","root":36}],[35,{"id":35,"type":"expr","mid":[35],"end":["35-exit"]}],[34,{"id":34,"type":"expr"}],["35-exit",{"id":"35-exit","type":"end","root":35}],[37,{"id":37,"type":"expr"}],[52,{"id":52,"type":"expr","mid":[37],"end":["52-exit"]}],["52-exit",{"id":"52-exit","type":"end","root":52}],[39,{"id":39,"type":"expr","mid":[39],"end":["39-exit"]}],[38,{"id":38,"type":"expr"}],["39-exit",{"id":"39-exit","type":"end","root":39}],[51,{"id":51,"type":"expr","mid":[51],"end":["51-exit"]}],[40,{"id":40,"type":"expr"}],[50,{"id":50,"type":"expr","mid":[40],"end":["50-exit"]}],["50-exit",{"id":"50-exit","type":"end","root":50}],[49,{"id":49,"type":"expr","mid":[49],"end":["49-exit"]}],[41,{"id":41,"type":"expr"}],[48,{"id":48,"type":"expr","mid":[41],"end":["48-exit"]}],["48-exit",{"id":"48-exit","type":"end","root":48}],[44,{"id":44,"type":"expr","mid":[42],"end":["44-exit"]}],[42,{"id":42,"type":"expr"}],[43,{"id":43,"type":"expr"}],["44-exit",{"id":"44-exit","type":"end","root":44}],[47,{"id":47,"type":"expr","mid":[45],"end":["47-exit"]}],[45,{"id":45,"type":"expr"}],[46,{"id":46,"type":"expr"}],["47-exit",{"id":"47-exit","type":"end","root":47}],["49-exit",{"id":"49-exit","type":"end","root":49}],["51-exit",{"id":"51-exit","type":"end","root":51}],[53,{"id":53,"type":"expr"}],[54,{"id":54,"type":"expr","mid":[53],"end":["54-exit"]}],["54-exit",{"id":"54-exit","type":"end","root":54}],[55,{"id":55,"type":"expr","end":["55-exit"]}],["55-exit",{"id":"55-exit","type":"end","root":55}],[56,{"id":56,"type":"expr"}],[67,{"id":67,"type":"stm","mid":[56],"end":["67-exit"]}],["67-exit",{"id":"67-exit","type":"end","root":67}],[61,{"id":61,"type":"expr","mid":[61],"end":["61-exit"]}],[57,{"id":57,"type":"expr"}],[60,{"id":60,"type":"expr","mid":[57],"end":["60-exit"]}],[59,{"id":59,"type":"expr","mid":[59],"end":["59-exit"]}],[58,{"id":58,"type":"expr"}],["59-exit",{"id":"59-exit","type":"end","root":59}],["60-exit",{"id":"60-exit","type":"end","root":60}],["61-exit",{"id":"61-exit","type":"end","root":61}],[66,{"id":66,"type":"expr","mid":[66],"end":["66-exit"]}],[62,{"id":62,"type":"expr"}],[65,{"id":65,"type":"expr","mid":[62],"end":["65-exit"]}],[64,{"id":64,"type":"expr","mid":[64],"end":["64-exit"]}],[63,{"id":63,"type":"expr"}],["64-exit",{"id":"64-exit","type":"end","root":64}],["65-exit",{"id":"65-exit","type":"end","root":65}],["66-exit",{"id":"66-exit","type":"end","root":66}],[68,{"id":68,"type":"expr"}],[79,{"id":79,"type":"stm","mid":[68],"end":["79-exit"]}],["79-exit",{"id":"79-exit","type":"end","root":79}],[73,{"id":73,"type":"expr","mid":[73],"end":["73-exit"]}],[69,{"id":69,"type":"expr"}],[72,{"id":72,"type":"expr","mid":[69],"end":["72-exit"]}],[71,{"id":71,"type":"expr","mid":[71],"end":["71-exit"]}],[70,{"id":70,"type":"expr"}],["71-exit",{"id":"71-exit","type":"end","root":71}],["72-exit",{"id":"72-exit","type":"end","root":72}],["73-exit",{"id":"73-exit","type":"end","root":73}],[78,{"id":78,"type":"expr","mid":[78],"end":["78-exit"]}],[74,{"id":74,"type":"expr"}],[77,{"id":77,"type":"expr","mid":[74],"end":["77-exit"]}],[76,{"id":76,"type":"expr","mid":[76],"end":["76-exit"]}],[75,{"id":75,"type":"expr"}],["76-exit",{"id":"76-exit","type":"end","root":76}],["77-exit",{"id":"77-exit","type":"end","root":77}],["78-exit",{"id":"78-exit","type":"end","root":78}],[80,{"id":80,"type":"expr"}],[89,{"id":89,"type":"stm","mid":[80],"end":["89-exit"]}],["89-exit",{"id":"89-exit","type":"end","root":89}],[88,{"id":88,"type":"expr","mid":[88],"end":["88-exit"]}],[81,{"id":81,"type":"expr"}],[87,{"id":87,"type":"expr","mid":[81],"end":["87-exit"]}],["87-exit",{"id":"87-exit","type":"end","root":87}],[86,{"id":86,"type":"expr","mid":[86],"end":["86-exit"]}],[82,{"id":82,"type":"expr"}],[85,{"id":85,"type":"expr","mid":[82],"end":["85-exit"]}],[84,{"id":84,"type":"expr","mid":[84],"end":["84-exit"]}],[83,{"id":83,"type":"expr"}],["84-exit",{"id":"84-exit","type":"end","root":84}],["85-exit",{"id":"85-exit","type":"end","root":85}],["86-exit",{"id":"86-exit","type":"end","root":86}],["88-exit",{"id":"88-exit","type":"end","root":88}],["90-exit",{"id":"90-exit","type":"end","root":90}]],"bbChildren":[],"edgeInformation":[[3,[[90,{"label":0}]]],[0,[[3,{"label":0}]]],[1,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[2,[[0,{"label":0}]]],["3-exit",[["2-exit",{"label":0}]]],[7,[["3-exit",{"label":0}]]],[4,[[7,{"label":0}]]],[5,[[6,{"label":0}]]],["6-exit",[[5,{"label":0}]]],[6,[[4,{"label":0}]]],["7-exit",[["6-exit",{"label":0}]]],[11,[["7-exit",{"label":0}]]],[8,[[11,{"label":0}]]],[9,[[10,{"label":0}]]],["10-exit",[[9,{"label":0}]]],[10,[[8,{"label":0}]]],["11-exit",[["10-exit",{"label":0}]]],[17,[["11-exit",{"label":0}]]],[13,[[16,{"label":0}]]],[14,[[15,{"label":0}]]],["15-exit",[[14,{"label":0}]]],[15,[[13,{"label":0}]]],["16-exit",[["15-exit",{"label":0}]]],[16,[[12,{"label":0}]]],[12,[[17,{"label":0}]]],["17-exit",[["16-exit",{"label":0}]]],[23,[["17-exit",{"label":0}]]],[19,[[22,{"label":0}]]],[20,[[21,{"label":0}]]],["21-exit",[[20,{"label":0}]]],[21,[[19,{"label":0}]]],["22-exit",[["21-exit",{"label":0}]]],[22,[[18,{"label":0}]]],[18,[[23,{"label":0}]]],["23-exit",[["22-exit",{"label":0}]]],[32,[["23-exit",{"label":0}]]],[25,[[31,{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],[29,[[30,{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[30,[[25,{"label":0}]]],["31-exit",[["30-exit",{"label":0}]]],[31,[[24,{"label":0}]]],[24,[[32,{"label":0}]]],["32-exit",[["31-exit",{"label":0}]]],[36,[["32-exit",{"label":0}]]],[33,[[36,{"label":0}]]],[34,[[35,{"label":0}]]],["35-exit",[[34,{"label":0}]]],[35,[[33,{"label":0}]]],["36-exit",[["35-exit",{"label":0}]]],[55,[["36-exit",{"label":0}]]],[37,[[52,{"label":0}]]],[38,[[39,{"label":0}]]],["39-exit",[[38,{"label":0}]]],[39,[[37,{"label":0}]]],[40,[[50,{"label":0}]]],[41,[[48,{"label":0}]]],[42,[[44,{"label":0}]]],[43,[[42,{"label":0}]]],["44-exit",[[43,{"label":0}]]],[44,[[41,{"label":0}]]],[45,[[47,{"label":0}]]],[46,[[45,{"label":0}]]],["47-exit",[[46,{"label":0}]]],[47,[["44-exit",{"label":0}]]],["48-exit",[["47-exit",{"label":0}]]],[48,[[49,{"label":0}]]],["49-exit",[["48-exit",{"label":0}]]],[49,[[40,{"label":0}]]],["50-exit",[["49-exit",{"label":0}]]],[50,[[51,{"label":0}]]],["51-exit",[["50-exit",{"label":0}]]],[51,[["39-exit",{"label":0}]]],["52-exit",[["51-exit",{"label":0}]]],[53,[[54,{"label":0}]]],["54-exit",[[53,{"label":0}]]],[54,[["52-exit",{"label":0}]]],[52,[[55,{"label":0}]]],["55-exit",[["54-exit",{"label":0}]]],[67,[["55-exit",{"label":0}]]],[56,[[67,{"label":0}]]],[57,[[60,{"label":0}]]],[58,[[59,{"label":0}]]],["59-exit",[[58,{"label":0}]]],[59,[[57,{"label":0}]]],["60-exit",[["59-exit",{"label":0}]]],[60,[[61,{"label":0}]]],["61-exit",[["60-exit",{"label":0}]]],[61,[[56,{"label":0}]]],[62,[[65,{"label":0}]]],[63,[[64,{"label":0}]]],["64-exit",[[63,{"label":0}]]],[64,[[62,{"label":0}]]],["65-exit",[["64-exit",{"label":0}]]],[65,[[66,{"label":0}]]],["66-exit",[["65-exit",{"label":0}]]],[66,[["61-exit",{"label":0}]]],["67-exit",[["66-exit",{"label":0}]]],[79,[["67-exit",{"label":0}]]],[68,[[79,{"label":0}]]],[69,[[72,{"label":0}]]],[70,[[71,{"label":0}]]],["71-exit",[[70,{"label":0}]]],[71,[[69,{"label":0}]]],["72-exit",[["71-exit",{"label":0}]]],[72,[[73,{"label":0}]]],["73-exit",[["72-exit",{"label":0}]]],[73,[[68,{"label":0}]]],[74,[[77,{"label":0}]]],[75,[[76,{"label":0}]]],["76-exit",[[75,{"label":0}]]],[76,[[74,{"label":0}]]],["77-exit",[["76-exit",{"label":0}]]],[77,[[78,{"label":0}]]],["78-exit",[["77-exit",{"label":0}]]],[78,[["73-exit",{"label":0}]]],["79-exit",[["78-exit",{"label":0}]]],[89,[["79-exit",{"label":0}]]],[80,[[89,{"label":0}]]],[81,[[87,{"label":0}]]],[82,[[85,{"label":0}]]],[83,[[84,{"label":0}]]],["84-exit",[[83,{"label":0}]]],[84,[[82,{"label":0}]]],["85-exit",[["84-exit",{"label":0}]]],[85,[[86,{"label":0}]]],["86-exit",[["85-exit",{"label":0}]]],[86,[[81,{"label":0}]]],["87-exit",[["86-exit",{"label":0}]]],[87,[[88,{"label":0}]]],["88-exit",[["87-exit",{"label":0}]]],[88,[[80,{"label":0}]]],["89-exit",[["88-exit",{"label":0}]]],["90-exit",[["89-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["90-exit"],"entryPoints":[90]},".meta":{"timing":2}}}} -
request-query(request)Show Details
{ "type": "request-query", "id": "2", "filetoken": "x", "query": [ { "type": "compound", "query": "call-context", "commonArguments": { "kind": "visualize", "subkind": "text", "callTargets": "global" }, "arguments": [ { "callName": "^mean$" }, { "callName": "^print$", "callTargets": "local" } ] } ] } -
response-query(response)Show Details
{ "type": "response-query", "id": "2", "results": { "call-context": { ".meta": { "timing": 0 }, "kinds": { "visualize": { "subkinds": { "text": [ { "id": 31, "name": "mean", "calls": [ "built-in" ] }, { "id": 87, "name": "mean", "calls": [ "built-in" ] } ] } } } }, ".meta": { "timing": 0 } } }
The complete round-trip took 24.5 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-query)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-query.ts.-
. object
Request a query to be run on the file analysis information.
- type string [required] The type of the message. Allows only the values: 'request-query'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
-
query array [required]
The query to run on the file analysis information.
Valid item types:
-
. alternatives
Any query
-
. alternatives
Supported queries
-
. object
Call context query used to find calls in the dataflow graph
- type string [required] The type of the query. Allows only the values: 'call-context'
- callName string [required] Regex regarding the function name!
-
callNameExact boolean [optional]
Should we automatically add the
^and$anchors to the regex to make it an exact match? -
kind string [optional]
The kind of the call, this can be used to group calls together (e.g., linking
plottovisualize). Defaults to. -
subkind string [optional]
The subkind of the call, this can be used to uniquely identify the respective call type when grouping the output (e.g., the normalized name, linking
ggplottoplot). Defaults to. -
callTargets string [optional]
Call targets the function may have. This defaults to
any. Request this specifically to gain all call targets we can resolve. Allows only the values: 'global', 'must-include-global', 'local', 'must-include-local', 'any' - ignoreParameterValues boolean [optional] Should we ignore default values for parameters in the results?
-
includeAliases boolean [optional]
Consider a case like
f <- function_of_interest, do you want uses offto be included in the results? -
fileFilter object [optional]
Filter that, when set, a node's file attribute must match to be considered
- fileFilter string [required] Regex that a node's file attribute must match to be considered
-
includeUndefinedFiles boolean [optional]
If
fileFilteris set, but a nodesfileattribute isundefined, should we include it in the results? Defaults totrue.
-
linkTo alternatives [optional]
Links the current call to the last call of the given kind. This way, you can link a call like
pointsto the latest graphics plot etc.-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName alternatives [required]
Test regarding the function name of the last call. Similar to
callName, strings are interpreted as a regular expression, and string arrays are checked for containment.- . string
- . array Valid item types:
- . string
- ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. array
Valid item types:
-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName alternatives [required]
Test regarding the function name of the last call. Similar to
callName, strings are interpreted as a regular expression, and string arrays are checked for containment. - . string
- . array Valid item types:
- . string
- ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. object
-
. object
-
. object
The config query retrieves the current configuration of the flowR instance and optionally also updates it.
- type string [required] The type of the query. Allows only the values: 'config'
- update object [optional] An optional partial configuration to update the current configuration with before returning it. Only the provided fields will be updated, all other fields will remain unchanged.
-
. object
The control flow query provides the control flow graph of the analysis, optionally simplified.
- type string [required] The type of the query. Allows only the values: 'control-flow'
-
config object [optional]
Optional configuration for the control flow query.
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
- . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
-
. object
A query to compute the Call Graph of the analyzed project.
- type string [required] The type of the query. Allows only the values: 'call-graph'
-
. 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
Either returns all function definitions alongside whether they are recursive, or just those matching the filters.
- type string [required] The type of the query. Allows only the values: 'does-call'
- queryId string [optional] An optional unique identifier for this query, to identify it in the output.
- call string The function from which calls are being made. This is a slicing criterion that resolves to a function definition node.
- calls object [required] The constraints on which functions are being called. This can be a combination of name-based or id-based constraints, combined with logical operators (and, or, one-of).
-
. 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 file query finds files in the project based on their roles and path patterns.
- type string [required] The type of the query. Allows only the values: 'files'
-
roles array [optional]
Optional roles of the files to query. If not provided, all roles are considered.
Valid item types:
- . string Allows only the values: 'description', 'namespace', 'news', 'vignette', 'test', 'data', 'license', 'source', 'other'
- matchesPathRegex string [optional] An optional regular expression to match the file paths against.
-
. object
The id map query retrieves the id map from the normalized AST.
- type string [required] The type of the query. Allows only the values: 'id-map'
-
. object
The normalized AST query simply returns the normalized AST, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'normalized-ast'
-
. object
The cluster query calculates and returns all clusters in the dataflow graph.
- type string [required] The type of the query. Allows only the values: 'dataflow-cluster'
-
. object
Slice query used to slice the dataflow graph
- type string [required] The type of the query. Allows only the values: 'static-slice'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
- noReconstruction boolean [optional] Do not reconstruct the slice into readable code.
- noMagicComments boolean [optional] Should the magic comments (force-including lines within the slice) be ignored?
- direction string [optional] The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
-
. object
The dependencies query retrieves and returns the set of all dependencies in the dataflow graph, which includes libraries, sourced files, read data, and written data.
- type string [required] The type of the query. Allows only the values: 'dependencies'
- ignoreDefaultFunctions boolean [optional] Should the set of functions that are detected by default be ignored/skipped? Defaults to false.
-
libraryFunctions array [optional]
The set of library functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
sourceFunctions array [optional]
The set of source functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
readFunctions array [optional]
The set of read functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
writeFunctions array [optional]
The set of write functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
visualizeFunctions array [optional]
The set of visualize functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
testFunctions array [optional]
The set of test 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', 'test'
- 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
Query to inspect which functions throw exceptions.
- type string [required] The type of the query. Allows only the values: 'inspect-exception'
-
filter array [optional]
If given, only function definitions that match one of the given slicing criteria are considered. Each criterion can be either
line:column,line@variable-name, or$id, where the latter directly specifies the node id of the function definition to be considered. Valid item types:- . string [required]
-
. object
Either returns all function definitions alongside whether they are higher-order functions, or just those matching the filters.
- type string [required] The type of the query. Allows only the values: 'inspect-higher-order'
-
filter array [optional]
If given, only function definitions that match one of the given slicing criteria are considered. Each criterion can be either
line:column,line@variable-name, or$id, where the latter directly specifies the node id of the function definition to be considered. Valid item types:- . string [required]
-
. object
Either returns all function definitions alongside whether they are recursive, or just those matching the filters.
- type string [required] The type of the query. Allows only the values: 'inspect-recursion'
-
filter array [optional]
If given, only function definitions that match one of the given slicing criteria are considered. Each criterion can be either
line:column,line@variable-name, or$id, where the latter directly specifies the node id of the function definition to be considered. Valid item types:- . string [required]
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'resolve-value'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
-
. object
The project query provides information on the analyzed project.
- type string [required] The type of the query. Allows only the values: 'project'
- withDf boolean [optional] Whether to include Dataflow information in the result.
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'origin'
- criterion string [required] The slicing criteria to use
-
. object
The linter query lints for the given set of rules and returns the result.
- type string [required] The type of the query. Allows only the values: 'linter'
-
rules array
The rules to lint for. If unset, all rules will be included.
Valid item types:
- . string Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'network-functions', 'dataframe-access-validation', 'dead-code', 'useless-loop'
-
. object
- name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'network-functions', 'dataframe-access-validation', 'dead-code', 'useless-loop'
- config object
-
. object
Call context query used to find calls in the dataflow graph
-
. alternatives
Virtual queries (used for structure)
-
. object
Compound query used to combine queries of the same type
- type string [required] The type of the query. Allows only the values: 'compound'
- query string [required] The query to run on the file analysis information.
- commonArguments object [required] Common arguments for all queries.
-
arguments array [required]
Arguments for each query.
Valid item types:
- . object
-
. object
Compound query used to combine queries of the same type
-
. alternatives
Supported queries
-
. alternatives
Any query
Message schema (
response-query)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-query.ts.-
. object
The response to a query request.
- type string [required] Allows only the values: 'response-query'
- id string [optional] The id of the message, will be the same for the request.
- results object [required] The results of the query.
-
If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.
-
Using Netcat
Without Websocket
Suppose, you want to launch the server using a docker container. Then, start the server by (forwarding the internal default port):
docker run -p1042:1042 -it --rm eagleoutice/flowr --server
Now, using a tool like netcat to connect:
nc 127.0.0.1 1042
Within the started session, type the following message (as a single line) and press enter to see the response:
{"type":"request-file-analysis","content":"x <- 1","id":"1"} - Using Python
Without Websocket
In Python, a similar process would look like this. After starting the server as with using netcat, you can use the following script to connect:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('127.0.0.1', 1042)) print(s.recv(4096)) # for the hello message s.send(b'{"type":"request-file-analysis","content":"x <- 1","id":"1"}\n') print(s.recv(65536)) # for the response (please use a more sophisticated mechanism)
When running flowR, you may want to specify some behaviors with a dedicated configuration file.
By default, flowR looks for a file named flowr.json in the current working directory (or any higher directory).
You can also specify a different file with --config-file or pass the configuration inline using --config-json.
To inspect the current configuration, you can run flowr with the --verbose flag, or use the config Query.
Within the REPL this works by running the following:
:query @configThe following summarizes the configuration options:
-
ignoreSourceCalls: If set totrue, flowR will ignore source calls when analyzing the code, i.e., ignoring the inclusion of other files. -
semantics: allows to configure the way flowR handles R, although we currently only supportsemantics/environment/overwriteBuiltIns. You may use this to overwrite flowR's handling of built-in function and even completely clear the preset definitions shipped with flowR. See Configure BuiltIn Semantics for more information. -
solver: allows to configure how flowR resolves variables and their values (currently we support:disabled,alias,builtin), as well as if pointer analysis should be active. -
engines: allows to configure the engines used by flowR to interact with R code. See the Engines wiki page for more information. -
defaultEngine: allows to specify the default engine to use for interacting with R code. If not set, an arbitrary engine from the specified list will be used. -
abstractInterpretation: allows to configure how flowR performs abstract interpretation, although we currently only support data frame shape inference through abstract interpretation.
So you can configure flowR by adding a file like the following:
Example Configuration File
{
"ignoreSourceCalls": true,
"semantics": {
"environment": {
"overwriteBuiltIns": {
"definitions": [
{
"type": "function",
"names": [
"foo"
],
"processor": "builtin:assignment",
"config": {}
}
]
}
}
},
"repl": {
"quickStats": false,
"dfProcessorHeat": false
},
"project": {
"resolveUnknownPathsOnDisk": true
},
"engines": [
{
"type": "r-shell"
}
],
"solver": {
"variables": "alias",
"evalStrings": true,
"pointerTracking": true,
"resolveSource": {
"dropPaths": "no",
"ignoreCapitalization": true,
"inferWorkingDirectory": "active-script",
"searchPath": []
},
"instrument": {},
"slicer": {
"threshold": 50
}
},
"abstractInterpretation": {
"wideningThreshold": 4,
"dataFrame": {
"maxColNames": 20,
"readLoadedData": {
"readExternalFiles": true,
"maxReadLines": 1000000
}
}
}
}Configure Built-In Semantics
semantics/environment/overwriteBuiltins accepts two keys:
-
loadDefaults(boolean, initiallytrue): If set totrue, the default built-in definitions are loaded before applying the custom definitions. Setting this flag tofalseexplicitly disables the loading of the default definitions. -
definitions(array, initially empty): Allows to overwrite or define new built-in elements. Each object within must have atypewhich is one of the below. Furthermore, they may define a string array ofnameswhich specifies the identifiers to bind the definitions to. You may useassumePrimitiveto specify whether flowR should assume that this is a primitive non-library definition (so you probably just do not want to specify the key).Type Description Example constantAdditionally allows for a valuethis should resolve to.{ type: 'constant', names: ['NULL', 'NA'], value: null }functionIs a rather flexible way to define and bind built-in functions. For the time, we do not have extensive documentation to cover all the cases, so please either consult the sources with the default-builtin-config.tsor open a new issue.{ type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }replacementA comfortable way to specify replacement functions like $<-ornames<-.suffixesdescribes the... suffixes to attach automatically.{ type: 'replacement', suffixes: ['<-', '<<-'], names: ['[', '[['] }
Full Configuration-File Schema
-
. object
The configuration file format for flowR.
- ignoreSourceCalls boolean [optional] Whether source calls should be ignored, causing {@link processSourceCall}'s behavior to be skipped.
-
semantics object
Configure language semantics and how flowR handles them.
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
- loadDefaults boolean [optional] Should the default configuration still be loaded?
-
definitions array [optional]
The definitions to load/overwrite.
Valid item types:
- . object
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
repl object
Configuration options for the REPL.
- quickStats boolean [optional] Whether to show quick stats in the REPL after each evaluation.
- dfProcessorHeat boolean [optional] This instruments the dataflow processors to count how often each processor is called.
-
project object
Project specific configuration options.
- resolveUnknownPathsOnDisk boolean [optional] Whether to resolve unknown paths loaded by the r project disk when trying to source/analyze files.
-
engines array
The engine or set of engines to use for interacting with R code. An empty array means all available engines will be used.
Valid item types:
-
. alternatives
-
. object
The configuration for the tree sitter engine.
- type string [required] Use the tree sitter engine. Allows only the values: 'tree-sitter'
- wasmPath string [optional] The path to the tree-sitter-r WASM binary to use. If this is undefined, this uses the default path.
- treeSitterWasmPath string [optional] The path to the tree-sitter WASM binary to use. If this is undefined, this uses the default path.
- lax boolean [optional] Whether to use the lax parser for parsing R code (allowing for syntax errors). If this is undefined, the strict parser will be used.
-
. object
The configuration for the R shell engine.
- type string [required] Use the R shell engine. Allows only the values: 'r-shell'
- rPath string [optional] The path to the R executable to use. If this is undefined, this uses the default path.
-
. object
The configuration for the tree sitter engine.
-
. alternatives
- defaultEngine string [optional] The default engine to use for interacting with R code. If this is undefined, an arbitrary engine from the specified list will be used. Allows only the values: 'tree-sitter', 'r-shell'
-
solver object
How to resolve constants, constraints, cells, ...
- variables string How to resolve variables and their values. Allows only the values: 'disabled', 'alias', 'builtin'
- evalStrings boolean Should we include eval(parse(text="...")) calls in the dataflow graph?
-
pointerTracking alternatives
Whether to track pointers in the dataflow graph, if not, the graph will be over-approximated wrt. containers and accesses.
- . boolean
-
. object
- maxIndexCount number [required] The maximum number of indices tracked per object with the pointer analysis.
-
instrument object
- dataflowExtractors any [optional] These keys are only intended for use within code, allowing to instrument the dataflow analyzer!
-
resolveSource object [optional]
If lax source calls are active, flowR searches for sourced files much more freely, based on the configurations you give it. This option is only in effect if
ignoreSourceCallsis set to false.- dropPaths string Allow to drop the first or all parts of the sourced path, if it is relative. Allows only the values: 'no', 'once', 'all'
- ignoreCapitalization boolean Search for filenames matching in the lowercase.
- inferWorkingDirectory string Try to infer the working directory from the main or any script to analyze. Allows only the values: 'no', 'main-script', 'active-script', 'any-script'
-
searchPath array
Additionally search in these paths.
Valid item types:
- . string
- repeatedSourceLimit number [optional] How often the same file can be sourced within a single run? Please be aware: in case of cyclic sources this may not reach a fixpoint so give this a sensible limit.
-
applyReplacements array
Provide name replacements for loaded files
Valid item types:
- . object
-
slicer object [optional]
The configuration for the slicer.
- threshold number [optional] The maximum number of iterations to perform on a single function call during slicing.
-
abstractInterpretation object
The configuration options for abstract interpretation.
-
dataFrame object
The configuration of the shape inference for data frames.
- maxColNames number The maximum number of columns names to infer for data frames before over-approximating the column names to top.
- wideningThreshold number The threshold for the number of visitations of a node at which widening should be performed to ensure the termination of the fixpoint iteration.
-
readLoadedData object
Configuration options for reading data frame shapes from loaded external data files, such as CSV files.
- readExternalFiles boolean Whether data frame shapes should be extracted from loaded external files, such as CSV files.
- maxReadLines number The maximum number of lines to read when extracting data frame shapes from loaded files, such as CSV files.
-
dataFrame object
The configuration of the shape inference for data frames.
flowR can be used as a module and offers several main classes and interfaces that are interesting for extension writers (see the Visual Studio Code extension or the core wiki page for more information).
Using the RShell to Interact with R
The RShell class allows interfacing with the R ecosystem installed on the host system.
Please have a look at flowR's engines for more information on alterantives (for example, the TreeSitterExecutor).
Important
Each RShell controls a new instance of the R interpreter,
make sure to call RShell::close() when you are done.
You can start a new "session" simply by constructing a new object with new RShell().
However, there are several options that may be of interest (e.g., to automatically revive the shell in case of errors or to control the name location of the R process on the system).
With a shell object (let's call it shell), you can execute R code by using RShell::sendCommand,
for example shell.sendCommand("1 + 1").
However, this does not return anything, so if you want to collect the output of your command, use
RShell::sendCommandWithOutput instead.
Besides that, the command RShell::tryToInjectHomeLibPath may be of interest, as it enables all libraries available on the host system.
Nowadays, instances of FlowrAnalyzer should be used as central frontend to get analysis results from flowR.
For example, a program slice can be created like this:
const analyzer = await new FlowrAnalyzerBuilder(requestFromInput('x <- 1\ny <- x\nx')).build();
const result = await analyzer.query([
{
type: 'static-slice',
criteria: ['3@x']
}
]);
//console.log(result['static-slice']);Once, in the beginning, flowR was meant to produce a dataflow graph merely to provide program slices.
However, with continuous updates, the dataflow graph repeatedly proves to be the more interesting part.
With this, we restructured flowR's originally hardcoded pipeline to be far more flexible.
Now, it can be theoretically extended or replaced with arbitrary steps, optional steps, and what we call 'decorations' of these steps.
In short, a slicing pipeline using the PipelineExecutor looks like this:
const slicer = new PipelineExecutor(DEFAULT_SLICING_PIPELINE, {
parser: new RShell(),
request: requestFromInput('x <- 1\nx + 1'),
criterion: ['2@x']
})
const slice = await slicer.allRemainingSteps()
// console.log(slice.reconstruct.code)More Information
If you compare this, with what you would have done with the old (and removed) SteppingSlicer,
this essentially just requires you to replace the SteppingSlicer with the PipelineExecutor
and to pass the DEFAULT_SLICING_PIPELINE as the first argument.
The PipelineExecutor...
- Provides structures to investigate the results of all intermediate steps
- Can be executed step-by-step
- Can repeat steps (e.g., to calculate multiple slices on the same input)
See the in-code documentation for more information.
Adding a New Feature to Extract
In this example, we construct a new feature to extract, with the name "example". Whenever this name appears, you may substitute this with whatever name fits your feature best (as long as the name is unique).
-
Create a new file in
src/statistics/features/supported
Create the fileexample.ts, and add its export to theindex.tsfile in the same directory (if not done automatically). -
Create the basic structure
To get a better feel of what a feature must have, let's look at the basic structure (of course, due to TypeScript syntax, there are other ways to achieve the same goal):const initialExampleInfo = { /* whatever start value is good for you */ someCounter: 0 } export type ExampleInfo = Writable<typeof initialExampleInfo> export const example: Feature<ExampleInfo> = { name: 'Example Feature', description: 'A longer example description', process(existing: ExampleInfo, input: FeatureProcessorInput): ExampleInfo { /* perform analysis on the input */ return existing }, initialValue: initialExampleInfo }
The
initialExampleInfotype holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resultingExampleInfotype holds the structure of the data that is to be counted. Due to the vast amount of data processed, information like the name and location of a function call is not stored here, but instead written to disk (see below).Every new feature must be of the
Feature<Info>type, withInforeferring to aFeatureInfo(likeExampleInfoin this example). Next to anameand adescription, each Feature must provide:- a processor that extracts the information from the input, adding it to the existing information.
- a function returning the initial value of the information (in this case,
initialExampleInfo).
-
Add it to the feature-mapping
Now, in thefeature.tsfile insrc/statistics/features, add your feature to theALL_FEATURESobject.
Now, we want to extract something. For the example feature created in the previous steps, we choose to count the amount of COMMENT tokens.
So we define a corresponding XPath query:
const commentQuery: Query = xpath.parse('//COMMENT')Within our feature's process function, running the query is as simple as:
const comments = commentQuery.select({ node: input.parsedRAst })Now we could do a lot of further processing, but for simplicity, we only record every comment found this way:
appendStatisticsFile(example.name, 'comments', comments, input.filepath)We use example.name to avoid duplication with the name that we’ve assigned to the feature. It corresponds to the name of the folder in the statistics output.
'comments' refers to a freely chosen (but unique) name, that will be used as the name for the output file within the folder. The comments variable holds the result of the query, which is an array of nodes. Finally, we pass the filepath of the file that was analyzed (if known), so that it can be added to the statistics file (as additional information).
Currently maintained by Florian Sihler and Oliver Gerstl at Ulm University
Email | GitHub | Penguins | Portfolio
- 🧑💻 Developer Onboarding
- 💻 Setup
- 👓 Overview
- 🪟 Interfacing with flowR
- 🌋 Core
- 🧹 Testing & Linting (Benchmark Page)
⁉️ FAQ- ℹ️ Extra Information