-
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-28, 10:49:51 UTC presenting an overview of flowR's interface (v2.8.11, 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.11, 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.11, 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.11, 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.11, 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 (1 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.11, 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: 1, processTimeMs: 0
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.11", "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.11", "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-8688-7OzZg8bhGdji-.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-8688-7OzZg8bhGdji-.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-8688-7OzZg8bhGdji-.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-8688-7OzZg8bhGdji-.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-8688-7OzZg8bhGdji-.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-8688-7OzZg8bhGdji-.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-8688-7OzZg8bhGdji-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8688-7OzZg8bhGdji-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8688-7OzZg8bhGdji-.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 12.5 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.11", "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.11%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.2 ms (including time required to validate the messages, start, and stop the internal mock server).
Including the Control Flow Graph
While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add
cfg: 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.11", "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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8688-UXTyh1DoSNfQ-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8688-UXTyh1DoSNfQ-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.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-8688-UXTyh1DoSNfQ-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8688-UXTyh1DoSNfQ-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8688-UXTyh1DoSNfQ-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8688-UXTyh1DoSNfQ-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8688-UXTyh1DoSNfQ-.R"}],"info":{"id":33}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","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":1}}}}
The complete round-trip took 10.7 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.11", "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.3 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.11", "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₶\"晠ȉᘠ᛬φᥒ#䝥㍹ᤠເɘ傺=樴ㄔ傩䝰Ô㈠ຠɱ 待У៲火Ȥ䊡ᙔẶ䀠瘠㦲Ĵ⬵⨨�Ȍ傚㡦䀠帨㈤ 悶㛄Ӑ¾〫刣䭩⡕倢姠�⟒楇⠤Ỗ㷎濟歁旑ơ僶䇌捠㵤䒒䳣ࡰᰠ澯㶞䂎⩒࿄挡स㗂ᣆ獵戸፲䉊䘲䧠叕窇∗椠ᇕ冣㙛㞡㢈ᕤ㞼奋攘䛹焀畹ጭᑕ嘉₌ద݈䆭ដ䌁⩀扑ڥ欓慂ⶈǍᖱ眢哰⤨䃸㠭×⧉㑣ᘦ⇍㓠ತᲐ◈㖨༤䅠䇍䆕㇉䊃☠ඹፀ攰等撙㽄ᑥᣁᗅ㳄呍ࠥƧ៎浛㰃泪ᪧ℧ἀ㴰ࠡ↯NJ㷯☍㶏ᇏ㱊㴤籿ᰍ浟ဇ紐‼ψᠱⰭ㊅স洀ഀ䷈䉸䨲ð䘸䅔瘱甭ূȨ䰸Ꭸ然摙ᝇ搥ナᗥᓋᐵጺ䴋㇇ᰥƫ܁ͽNJર⚾崹ᘭ恢塱ର⯯だ㷅Ɵㄪ䢀♣劰♾㕍Ⱦⷆↄ⼍戗�⭰梶㵽㲏Ḍ巴㽯✼原Ǐ練搵参䌥㒐嶿䎩℻╨殾≜唽玈徰掺稴㰼纴獦ἤ䌫▣ၫᦈ拈ໆᴤ綈泀㎊浍㬸峘埨㥔ℊ捧᪃㩇㔋ḇܽ洐ǯᑼ⬤刄簘䂍߬䭾ቚ咿㵡欉㖿㽴剐᠄ᩦ樼ϔ㣹ڊỸ㐀戼䉤盻渿㍠沀嬹ዾ獈垳⎜細સ榶户✲ڦ㩇搊䂴ቤ墶橄杽እ硄ᤚ抱粑䪼䅔䇢ㅜ䵩琾➬䲧曖施㏆帻媹玸孨宱⍜申猈羴啍ၾ䵲唎ୂ亽ୠⱿ☂旈䫠㉹矝䙹奍䨪兼䵪匱⫀ᕾ䩠㛧⨺夡侺哚䂅䩔ᘶ⋑䘴䃺圑䛞㎠楘⁆旇⚆旟ᯍ䭛㞶筘矶睝❭吰㋨ไ㩝⧺ⱐ⤮㔠扚畑狐㔦檻浦戩ᬻ䗘晻䠢珻子盶坒砛绸䷃ɓ♠奷Ս╻䤲摛弙枽䌼喓歺 刨慏嫁哕ઃ橆熀䰌‴䄠⠽夥௰氡厞හਣ⎴㠢䄁⥸ᆮᢷ始⬭叁♦ŝើ熄橕䐔暲瓍灭㡗Ч଼畁ᝦ㑊䶈㘹ᨐኧ⢍᧰屒ኗ㑠涎䌈ඥ祷╍!嶤ᝂ䇟ᜠ᪑ୠრ㔊䤭•ᢌਣ㓒㊟⅐䑦Ɇ㬆凵歔厦慐ዡૌ⁈刦≌坴穫㑞䞡㠤Ȋೡ䰤悐缫偡ॡ䍢ෘ時抄ჲၛ䚘䒪䢷▪⯫∂椲䒷̀ἦ惙䒀৷ӄ乴₦燉坧疜㋱Ѡ⚨穭Ԍ䡉梱䃲ᢠ煃2⁒爭⚐橮İĩ䲶द䄲ቴ⁎∴挪′䤠㊲ᅡᥲ㵛ቦ⢲⑽⛤䒶㓒ר䖰湴ᇲ獋ጚ㎆䚀曘歮④⓼楅éْ㹏掤ぇɦ⠌罫㓙殻⨕ᣳ歐╮㴅恛杄仫ⓡᜉ枷福ḵ坘琒㥀⭐䂜瞮嵩亹姝ጓ烃^␣ᙷ旌嗁炭䵨㡷(吪屔ા⌶乶ᝢ抣擳䤮擈䕥ገ⣟抆㈅⩡撲獉瀼⯥喿ত墲糚梲䁴⦎敲佉㴞⼀穸斜奩倢Ã溒ᗼ祭䳹⾹幼䡅䛊᫊状♅ၗ暪䭩⪳⳼㍽妴嗳哚劭㕴叉啊僬⏈墥嗥Ꮚ峝⟵継哌涬ᐿ䤠ヿ疮卋从⬃⥰ᦗ否筊۔⿵枸䠱彲癆ᬓ⅔䅲㐺戣暸⾨咦ず༺䣐᭪㎷㍹㝜疍團淥༘䶊搽嬋㩶䭸ᒂ䄏竊棭䴵Ꮋ⏟ፈ掜℮杩༐乽ᡰ�䧵㈱૨䷞犇㗔㆖眧ẇₛၬ㉿䩷䪰倨楢䮐䜽䕑ᄨٳ澉懲疝ᷚデ᰻◰乞畬玊ổ氉ؾ峂⚡៙䗏㕂澝癞亶㻢䖝≸ሬኲ忎⩓䘴搮甡䈍欎⽍ɖ㷰㬧烆穐༔ᾊ䙸⨻墔ἶ牙緋帛ࠠ䚁‡⤨澗ऐ㛮硫熪ᣝ⽭⌨㭦䢁䚸渠壠㊩笹۞䰃ᡳ├㰧⣌ݘ捭䓬౩簼√⣼捑埇䪘✚⍬慠Ȋ㔀䳖砼‧ῳ⩔㏲㊆⢌栄晕峵伾硨㦸⠠䉧ᤣ䏷啡㟳憝本稑⓽ཁ挽禥ᭀ㣘㸶ダȘᆛ⟂旯猜⻚Ⓘᦴ害瓘ቅ㖷Ჟម瑬Ĝ⠩摹ᆵᱠṔ印㹆斓枲癭勬㖕䬈疱妥+悻˚ͥ㧦厇涚欖ዥ⸭戡㺸桻ዱ排僖憚㙴ප嫶仭椾㳰塛ဣ欦㟶⮋杊梍简䡽棾姤ƛᡰ�᧕இㆫ徔垶暬܉俍娹䚠㯋㥽筐啀㾝图渾Ǽ䡙秐㽓⟜⣏㌷ໞ意ᬎ璽濸痯峛毑珈獇℃㛑粼燫䱓汜Ꮓ幇❓厒啀ᔜ窎栽ይῃ嵛㺺哛汓尅巯⧏ሠᒦ、桮燼幍彙␀㰷哑䞞㖯䬛㙚祼慬峲㳜ḑ侇㛘坎㒎✊瞙檿嘗事烘憰ۗ䚙掎碎㲄溩梬⸓䲛矙Ⱋ㠷䞕⭑华䈏牟昁帺㏟㱋㿞॒炿䈁ᘽ戍㘕⻛䚞䟅㣯ᡸ翣䨔癚瓞清ඇ梙标㼶欞絎䍂夾埾嫪㲕䞜査廯㗘漡䟿望昷恏။䂛䫉耏纚寔縮夞㻧环栄締⽆ˌ㌝㨵穮澊㾗狐忷儙⾱㰲吗怎睟尌绋ஜ砐䈆ী᾿剟қ䟇爞㱆⏙⸎涞䲕徨 Ỹ䏙㓀᨞㜕㢴粅ຒᨔ玼ϗ抡拆�ⱕ渾嘔悊Ϸ攞幢悇傁⒈ᠡ場烰㥴傕ɏ戡㒒㮭籽惡ᨮ႙㑘ᢡဤにୡ唓瓟˰ࡁᰮ厸㴾愡儯ࢌξ⭁橡䊤ぐ༈ᑂ瞩ᴟ挆ᔫ⡳ΐᕁ崑䚮䊀ڄᜓ㷑䊐̪埧刻痴ᒾ演垻淌ᮁ㴬䡣㳸Ṍ朩烉䎡ⅎ枲碚兌ᚺ圷橞籔ᇮ㨯ᛈ⍼ᡞ昗k巂ᗡ架䑬ᘍബ炯篚βᄠ碄厽㲷摎༨غ⌿攱Ჭ炟撨Ըℨ病␀൱भ䒁␂Ṍ㪬䙉磬ᮮ㚮咄緈ἠ棠摯㱯柱ൡ䑵紂᷎ࠪ側爚ᩱ架䲌捲ᅨ焬ಃ䎑澈䬣䡾∧湑暬䱢⎶ᵨ⒨抦挤ᥞ幢䀠搌ᧁ䮐澥捯䷑䘕d挓挠箫䱦ᓾᦑ帨䀬把徫捏恱嘩㑠ㄡሑ炴䉬ᑣଢ刦翀఼Პ岓䉡倱◑ʓ挖ើ㑨抇⏧櫢瑭炄൴䑮ᶤ⎤ᆴ盠劆፵泡㰮䡫峩Ὡ䉬熻ቂ䳁㠤怬楉Ẏ↭掦ԙጡ恪㉡䎧晠ᅨ恟ᐄᆪᥩ䵄粀悈㐡 搟拉㕫ಈᐐᕑⵯ⪑揢⎸⍥⪚劁Ⲩ͠䘦剼榉歬㒎拡ῑ熃婴ጚ⬉ᡷ㘷絶ኩᝒ穮劑ᔉ㴗穱匚〉佮娱偈ˠ᭬熷參္ᘫ橫布ጹ僬⁊㎘ᘉࢥ䙼嗓ᢹ晬ᡶḓẹ糭璀㠥ᰞ宫侼⠽ᯉᙯଵɋὉ捫䕊⋩☱殮剧ⷵˬ䩱⋨௹縑㙿▧ᯡ堳⁏ᇄ⥹摪梇േᵙУ嚀㎳Ṍ䗩予猰ǙС䋄]Ὧ乼嘗᧘绯㢘የઙ旪溕玘ᶙ㓪ẕ㏫ℙ珫�刣ଙ瓭㺌Ꮟ⍈࣡䁘䖓Ṻ橗纀૿ᣵŠઠ庹桏Ŭᔫ͈䚶Ɠ撰劥ᗪ♣㈣ລृ㪂Ɛ喘帨ݘ⣤᪥ᅴè妥䋪䪀䥈嵥ⷨ㆕劁⼈翯㫚嘍桩䁛⸌ᩈ猤䛥捰窷௳ᩅํ掘怒䮶煿⓸彅ň㉨㸋ᑹ⦄ᑂ䥅㥉榌䪅؉ㄮࡂ䬰ۥ捌瘼焤写ဥ䭃ኅ歊湣䪭ԅ䍎ㅹ䫸娅㹾㷜多⩏婫䮘娅噍煦拈庱⻬撄⎾⛥䣋⁎⌍澱嗮憝䩂全⣏慢⫒咵帪䀱䠱ᔙ娑ű⩀宩⡏ᕼ௪匪ٔ͡և᎑勎㳝⯍ࣵ㕍╶匎㛈畧ጅ⟵扏⹕䩪喱⪣ጺ⭨͚㎆坘୯崳℮ᚅ次稪歖ᒑ仍㨴燸丘䈃ఱᅵ⺩Ⱕ䀷凢䈸㔄嶝Ꭴⱀద㣀䤎喘朴弤϶姕㤨㑞嫕ᡱ扖ㆡ䓵滫㶠ᩬᐭ᷊㲗⬈傔૧Ͳ燳ᘭ᳢⸬ᒤԸ੫ർ⩑⚭䬧劘吔ᮅ㴑掛ᇶ抎犐⏒䡸᳢�᪉Ὲ炋੪⪖ᇅᢈ㍭旙皊⪅嘢䵡䨪s䂘悍䕭ጙ帢䆎୭琑圁㽉䚤娥呍≳楬则儠⦊ኵ䍅峍ᆋ卧ⷵ姍ᆌ䎖Ꮑ塙䅄ᮎ媏ḕ缩殔宨凍ॳ㸹䰇䍈➈㲓᫁孥玌ኻ尕DZ劋㷋寽偵盉㢈媥ᑩ䐶硴櫷ㄉ䝼ਲ਼報މ❤㫶ጆ焉᭤匩单䔊ㅬ㪁⮈瑅榞嫾汽啍䭳⏆單楶猋喹䫢ᨵწ埞ᜎ浵㬽㈧㞋㭫圍ㅡ冼⺽彬燍照嶽ʏ䭶ᵇ厵ል炕䋬峝彌䅶ᵷ嗙昊ⲕ䈒噝揫ᒎ箲孾ᚋ╯⯥䢵碁孩挒咘攮啹㮥ᵵ樋䮚穀ᄸ栎徘嚤懏㪫嫤嬽瓏冀ࠆ堣㷮၁匿匆〤䃰߯娙㠾繼ځ⨸罦穬⭃姦㐸˜ځ厣亊罿㾙媌惦㭘映⚉ί媤垅䅂儁ܣ宮䘽炀僰仵㬫᮵㉺冪瘿⊇ܐ㐍績၀䟳ቃ䄻溕偝̠典Îᷣ㧮㺓擠ൃ䙓䣺4㑃慏Z䞄㽃Ċ㪬ࠔ㧃洹䋗Ǥ濝ᔸ担䘬曝䫊掽䚸㲃乖㤏̀䃨ࠤ矙ߧ坊伿婃桿嵽Ἅʻ焢㾥¾礝狤᧘棊⤓⯦帲〥䓦࠼㍽ࠩⓦ哏峣ᠽ⓽等姸┶婒ↀ㔣弸ᾓ撪㈸劺ℐ⟛尣⯐䁑➊㢉ⷮ哩⛪㯡䁈惢♡怞焴獷㭹名ế慸暁╘䙣ᥴ暢㱓㐉䎌杂㵓୫⪙✚㙍໕横ú㽓㎍椖曺㑣痓ⴏȠǁ₁፸瞧慁㧋俴撇㩗㨜昵厽kɚ೫潙㣏俄瑆‣积倁⠶彚䇗恩㨧塑ת皛㓻廻凰惢绛䝔䗫Ƒ⋲歳刚ྚἫ搻期⇺௫Ӝ泝䱂朷幞આ朼状䓛Ҫ敢湴䓘ݜ❲睇ᲇ◪㑁Ꭸ属⾅濅峝汀◢畴〧⡘ࡀ䃰㨤ɘˤއ洷ጸ拺̤璂᱗ℱ⽜䋗䰿ۘ湵嫞噅䖠ᑙ⏸旒䜺戊᠁㊎¸ԡ焫ň挣ឈ濋㘛㎨ⰿ浚䄼䙕Œ㘜ᘚ狶ダわယ笆䥗椰決檛䂽㗷ⱚ灹仓憘濚篑Ộኘ䎚痸夅ැ涎㝖䇙⛵ݦ淛⇙㘄㧦滶瘋ፆ櫗⧗䲔沠ፖ㻜Ⳓ浯㤇䗟痩篖泪〫涪濂➠⧘病慹ᧄ⏑疭㦚痖匰᷍栖擖ドᄲ澦欻慂巜滦梖㛟ⷱ洖ᛗ檩ᷔ潮捖姗佭澶殓៚竪㖸�曜禛滎擻ᗖ瘝洧䟘淳潖紖㇌緜漼瀯ח䤽^拆㙞ঐ᳞算孭綣汮澖变眹澆戢ゔЖⷪ匯ₔᤠLj℃㍸᮵ℾ愎ஏ廍夎ྎ(㪍䮏儅溄㫣廏䭹䞘㶑ᄽ禑ᐋ婲礼梌糣幣収小奣䩹償敏姅匎⧓⣋岝䙈ᔋ㬴㧽䈽䚥毢㨝樽侖㭎煳嘏ຐ柗審≡㤐缜墭䖋枎ݢ㼳䢽ᄁ杚㲳庾ᤜⴆ㦳瘿䭳柽峆弡ࡉ⟩᫂瘧⟒悺ᘺ⤽ᮬ慵尡喞敤Ⳕᣌ▞ʁ榵稳斕ɱ䄼᭘䀶⦐ᆰ⹕Ⴝ桇⋒玷䬓㈢☠㧁珠េ㹙絿熏ኡဍ峑垞䷹䂠㭽䌂ᝐʫ敀挙⭰յ縋喞痧⾔⩽▃ធ塵乽㴿䌙㱔㠁ଚ桅㤾㥿ା畵㦔ൽ廁ᅽ㨋燮嬛埛䳆惃‵⦄ṃ䔭敲睰ۛ僭憂夁㲛罿⌔篑㤻籽䜑⥫擏化⭹㱵拿⺹㞥㹋檦㜂㟡懻䘻眏ḯ㪛縴切䶙ᅧ妵㈇Ə㲫柾甛矃㳀翾✜⭠籡⳾䈁㟿ž圚࿅㵚ᱝ磛㻴捧ཻ䫧戶ᆣ埕ဇ潿开㝣㹄ᱼጄ╩㤠⁝匒佀羻曙猞例㣻奼娒垨紇噘伬礉䷷縇嬱⏼䀉䰭ข织䈛擜㖀ཱི㣇瓌ᘛᝪ筗㝐罷瓞㘚基糩租㽜澛䩗爵怱啡㰉⢑ጤἽ⸤旟ਜ㟲綷䳾Ḍ࿔縎䫾嘃濬笗䉜縀砂撯斣␟֥繏䖬怴ᰡፒ眠Ⰰ坒殥岞缄佲緗祝昁澹㱷湼帅⾬綧亝娋〙箦Ⱍᥕ糏瘲硂ጢ箛ജ䷑忶禇疡䥲急➨ǀ囈䖍❵ۃረ桴⸢⮪呋汷䜖ⲫጎ瀍竇垟䈇瓎糯卝㜞ྣ篯庛栄矱Ṱ暫䑰禰㠵戠ᩂ䀷缫㱅琛䗞㸳慦徬;福杘༜ᡄ堿㽣紐߫堂㠡倁ਥ繒祿沿➜伖矩㝾緽犟䍾崙看瞫屠Ҡẹ㔣枓撯⡓峬咀⟎夙䀼澭庰ۏ滟✜᎐⁏㼣糟䘌ഡ吙仈࠳ࡩ笣澠檝䬐柯彯㱊着⎾戙䠢悕嫾㧁⾈᳑ፖ娷䂟㷣瑠ڐ㴥ጪu开ڐᜌᐢ㰫䁜硽粰ర⤞ᄤ〶႖Ʋ߫浀䵝㈪䏤䄞紴ඟ䊡ᔦ䅫傁㺱ᬤᠿ╕≒浣猵璳̲䏺ŚにẎҗ杗Ģ砓叮₿ȴ忡攥珩ࡼ∘⨴Ἂ㍼䍂側⑈ৢ䄨㚞耒恦Ⓚ僵ࠛ惟㬢ਕ㟺㝉˲র⟞ⲥ嘍便䄸ϓ沠┣භ告僈�ࡽ䲁盉ᨲや曰ôႀ唀ମ㑍䃓ɘ䫡ᠦ砽忊�݀ᑀ爝栬恜⃫系珠⯁伤稽灿⇯竓桐儜稆ⱂㄆ䎮㚘⑁Ḋᘿ翕主੬ᛐ粝└塛䄍䊌က㻡ᐧв㿓䈇硨ᮠ杣唖㯨䃾䋓珘㯾§态⑄憿穸Ȑ敕▢ᘶ傷ᨑྨ⬲䒤㘸侼ሎټᢨ䑝䐭屌䃜䎦న♾揃烌⒗⚻䁒渐漽ࠠṴ䬦絺త✡玧愻㾺㺢⇲ከ䍂༫㿦ᩞ⏦㔄⦚㿡弪㗗ᅔ䯁ૃ☨ɂÓ䉚ૄℱ䈦椼䒉ģ磪Ẩ䲈᪩昷梂䎵㊜䜱ጩ䀼≢曈䝸〤㩊䠷≉²䗁疥娶⟞凉غᆰ窜㜪䩌棁䊱玴⯱杦崺勑暾䞲⸈䊂ᓳ撪ټ㕔⍒卑嘳每硳㺡䘊ᾏฝ椯ੁ羙К෨㳱粥ు尾㈘⬆ᶸ弅慠埬敢⳻ಱ⋧ԼಉㇽՂᄸ槂̮䙄ワ敻凎১亇偉ᄚߚ᧭㎭ⱀ⢠报२㿑⮦ܶ矝ᅱ䙜ጺጂ玩ᡝᥣ揢௩ᮠ㽣朻㮿䜅偾᠐欂㪨塗墲扳狼㣱⇦簽Ⲉ燬䗾ᬐ䚣㙔幎リ㑝ޱ䰁毦⪉磎稶嬾 搃䤬剄ᣑ⋜ৼ㉑ᇧ眺弴ॸ䠞☲枪ಪ㡡⃠䥗历㟐ࢿ㱢↢䜊ᴘ瘝⾩剞罩⎧ଜ㴩ࠩ䢷粋ዑᐤ幩ᄪṘ潫Ი睴⥐幇㔸Ⲛ焨⚎ᝤ晢ᾩ摅缺抹ࡈ⡩㙆።猯ঘ⛘䤰儳籭᯳䘭ቷࣂⶑ⩄㜻≱刔Ⓔᨘ河徨⥇ࣅነ杍ᝩ⹅٬⒐䦤䚑䔄庳⒬光磃ቜಲ㱑ᑆᢱ㊓ॎ燙ጤ燬Ⅻᑝⓛ⊝ڒ⃡⭤唼犌ূ☹Ṅ熲憨䩌撹ᐎ㋱⣄ኼ㦼⧞䌩ᜓ掷䠤别䊱ᅤഴ䊕戞➹ᖴ偳拧ᕆ擟ё▊⇩圲礫摆䥟煹揨佳摨祀擏ቲ䨒ⓩ⥄᪹䩺ᇕ䖃䑔孲ᶀⵋ哠ⵚ䰂㿉Ņᚶ婨䥵⟔ጘ䓲楨噛挢䶴㺉淇千橱⦴椸ቴ砲傓璶甗፵朌Ⱪ᫆ႶⲒয穕᭔粲㇂㵔ᔌጾ䷰㬉㲱✫怬昰斖ᨄ簳潨䥒㓟Ꮮ䦺⥡㿅ڄ煠昸ᄬ硴〠瘯哄╖䠤䓢㲇ẻ͋槩◣᪴禂౩絅ಸ指噆≐ⱇ墱䔺䉄操ᤂ㾌户捊䤲ᚱ姆⚆䦾㰬᧵☖ᕬ埳ᖭ≎䳑抧ံ㮹䗅栏ᙰ奋⒡ᗃᅢ侪ҭ㌲䷺⡑緇⤰䚚⧲Ⓗᓴ姲匶歔傥␄㉈㔺㳦伮ḯᦢ䧽湺⨁ᩀ㭘䂁剾䴶⾉ᩄຽ♦⧆朝Ὤ䐤滪䀣洆㎴䴄廹姢㶶劘á硾Ỹ抒㇐㹉ᓑ卉倖㉹揇▸摨㥎犷撼䂜划❈Ὀ絍矄ጐⵢ㖲糐㸵敷Ꮤ剢拨᭔ᢠ牭䷮約ఇ⺍債曈≿ྒ皠㝌峂粤₠ጐ痄ঽ剩狡禯ᅜ掓播筂烶珓䷼玄Ṫԃ暄䁜咜班潄㳕㗐Ŵ奙縄侺㒢祝䞙ᢌ懲㓮⍏᳹㈸㋾⓲ᇪᬂ纉禳犊ຕඓ猶罄⮝ጀ于⿹尅宽ᩰ㥒杒ለ㐡㫒䝋Ⲹ፰⧡ᶳ懕乨☌奒㻯歄ʵ琊䩦∥䠇ᤱ䅪֪未Ⓒ☫燫2䡵粇灐⚥㨷⊍ڈ槐枫ᖼ䄪勮䩛ᓌ㤸⣄О䲅硵燋コ烄涤⨪ͩ剢张䣐⤶㖥怷ិ⪖熤ᒗᏢ哤手䀲ᐆჱ㜱㲲碲丽烜妉䮸ى⌠ʱ加⩾㑱俆㡳亗␦ຂ冫硱㣚⑀䔒Ğ波⍌ᚹ䫾ᗣ⮬䈜瑂彍甖ୠ㔩♄㞾ᙀ◞ᒤ囫慇䓘䳤䩜ㅬ⺡ᦺ㉳翝㺠ះᛢ䮒䩏㹜˵઼ⶢ݅性吼䦐᧑܄嵟ބቌ፝ㅦ䮥䮊ܥ拥灼⦉䨍晘嬲煥ⵌ͆勤ƧᏱ⢄䔰Ⴅ㲑ॄ㮶䅒沫浏䣆拺匌⮥㷧究‼昄ᓙ䗒䫳ဢ⢸抭叇䦜姆 疴湲政ቲ䪪絈婗䋳䮀⻱⌴綷仌傢࣓䌾ႀ笀橓㓕.䯈䱱▅᮵噾庝昏梜巒朸㽌糂ᒶ≝Б㑅怄ㅬ⒂ᘜ䠄埌杪䃎峇勲䬎⮺∢呷剾䲱ᘞᚨ廸ᝃ睨V弩⣢⣆≅簶噰熚昀哛䍪剪灋䁲ὠ煝ፅሤ冫ᅾश0ᆀɨ矓୍惛掑ⷙ▵ɴ升斈嘘⬪忪届ದ␦u⣳е㷲穠㕵啾╶ᐴ僂涪㣊䵖⫐Ⰵ⦔併䵶⦇䖭唦嘻撸⼙⪪勚杢籽⯅⍙ٷ㩾㖈ᕑᛒ巼珊䚔ࣈ潯⩧丬ᐠଠ㪮喨ȷ椺璊栥䛜狥獅ⵕ㩵㽷㖊ᦞ礩ሸኊ⧏㽟᫈檃⪕㋠箱èᄆౠච匣ὂ嫝䳼ᢠ嫵 浨䁾嘴嗲灊㋏竔瓠歟動围歲㺝㖭圷ᳺ喊淈益㬎橧丼儅⨆䱹↱幋唖劊狪曌⍐㫓㎧⫝̸厕Ṿ檒♇图ਂ僩嚥翥烏䭪䦓᜕妥䕽䅤啸咆射燒磋䫗᪷㦿⣦乷Ṡ旎ᇣ፫䝎㲢ۘ犀䳊⌅瓶睹䶞痹否喊䤙Ꮚ棜竞䦀欣♾☵䀣ᐮ㊑困忢瞭䒎滒猘㌏䰮ⳅබҦ⎐䖴㒲塦攻Ẳ┩ᠲᨬ࣠Ꭽ䬠䣺䶕稃♤徂嬓梋络Ȿᬫ瀳㏖㹔獌咼Ѱ㟎坞૽獏糝章⭟⩖⤉ㅕݱ䍹T殞ඦ䟃⪏䝎ᎋሿ⮕➱獕哾ឦ䵗晒刪娺窈䧀ᠻ᫁⮵ᷭᗅఽ᎖◦ࠑ啦刺坉⇛窫⯤欎ヨゥ㣺࢟丒㠙恺䲊䴤搽墤害⩫きჵ絮䷱ᓙ儶嘅⦎總ᜏ攪潫㖆ሉᓳᦓ擘∡ᬚ岫噊׆䛐ૢ毫⨙潢ഫ⭾ᘽ㠁娼┓㳪嗅狽牸⢋㍍惗㋿㹱ֽ旕寶䄒烊ᨨ桪婽亙ẍ字䦽畱☝喆密戋窌थ㚯ᯘၻ㹙緕ጮⶡ䅇㙸֛Ⱥ槍囈䨢䧻㗭㈠⻲ඐ敏㚹摒㳺⇗庱塱唿ⴃ校峏ḥ⺉暂姆噻媈䷞䛃欖橔ᰍ悖䳎䳀ᵟ㒣寡㳻殢梱㚻掶橔ጽ䁔㋱ݸ浰痱循叺焏揘曗塑淔½ਪ⡆╎ᤦ䎃儤硩玏䀽桜慶栥⇭彶僽宐㦍㟓壮坚ލ揃仆㰐澻⍱狡其㋔嶵䋫屪悻慈淏㫰娯ⰷ㦱֗兂巧ᤋ哎奋ᓵ爾䌟嬅╗㦥ᖗ楶坨ⵙ㑝嗎庙ᜈ捘㌇㮘ᘊ⪅ጴ۾ध帐㖣墦淺ይৗᛧ尒氲⁗ṳ瞞ෳ䦨⒆柚䝎⧜婸穃ޯϴ❽淡瑛夢叛晅⟊仒别歯⸵爆燂杣樆⧐䥒窚䛏ϗ仭尙椯ㇽֈ毴⽫䴅盷坖戜㊦䀰挖差渏㿝䌃ۼ㖕ൡ畒偎庚㇀㡏廍१櫼亝ሕ㪪䛂䒮䊴槸㉠灤埀´Ƿ泿∠渕㒇祽䵃㖇奞去后䴣章˿➝㆗㇇㽣絇瓍῞叁ࠋᥣ纭簏滎㫽痕签垝巔擿区ယ怏♢ǟ筩ᆟ⤝怉捽ö紨ఠ㯺哋掍Ꮧ竐箩Π瘄ɪㆴ䄜̈́䧏娞怛䤤䢴嶓㭽䷠抣䊖᯼Ĕᶄ瞀㡡礧倧慥䇺٨⃦㠢㑰佺痾瘔䄡伦簻埜⬓簈ᯗㆣⰭ嫼ჼ䛜ಗ姩Ț∿懂Țⅿ淿㫮㔬㑚㽺消ඉ学潪㈾㉛⇃笿樹㠭栖㿾價䎏痢媁砚ࠉ墎䈁ᬼ栽㧭儖摔焇ㄌ㗈ᜧ䤡墏ǧߌṠ撲㈔烿ᴺ璘㫾噙☾Ҋǟޢᠨ桃娮ၜ䤚⏈എ屮憦㿉曙䇬䛸ᩨ瑃␖㡙⚤͊ࣸ�┦嚉割凚䢊ᦐ獙ᅕ⟲潬縑ి啱卦┸濛冬ⱊᡟ♽Ⴌ㟼ᣤ⎹癨ㆡ冦Ժ碓绑䛗Ⴀ碃窕⡌�䍜䟓吟㝛皊䒉庸䟏檻㭽ت噔罻ᵧྨ䏶痁杅⻟囅婾Ⳙ柬熬滽琶懐ؐ័戢ܬ㡊ࢳ䍼৸憣䰬晜摺䙷ಷ澑橹ⱳ浬㼣ΞᏏ傽ᘘ⤭ほ揤䐌ᄀ樣弹㡖ࢶ䛼㷃〭柉Ӵ纲⠲㽠僩璧敒⚘ϋↅ琗慝�換݂㈑橇Ⴎ᱃ৠ穘⮈睝㱬⁉┗±甁剒祇ẰҺ爇㊑棥ໞ䬷䑞ίĨ䲢ᒩ婔Ȩ䉈烱ʁऄ痃Ⱆ煐㤐㋂佊埉䗄咻槧䚛焳䙭ᕞҁ慮Ԝ㦩俋㬹�粽⚃❄絒慭Ղ嶍榚㸱癧乷᪁⧫♱ᥴ盳癬⿹擶叼䳚㱹⿇砾ೋ�ᆨᾳ丐ᡁ捻呅润哪㸮悆ಿ䁝爅⚍ὤ絳࣮㕞焞掊ᐹ檹畫ᘿңᦸᅸ圀ა⽉᭝ᓻ痔䳜㏐纆䲼ᚋ燖♫Ჸ撽榯䋶歮⋭乩⫹縅㎡稨栤㐸⺼皓ᇫ㔇㏀䐶㶉徆檺恞槻㫆Ῠ撓ᝐ䛍牧仟倇㔇ဧ睾㦧問ᴎ忽➮獕洍䇬亦㱹眆᪾抙弈杋ᡏ䌓ᰂ䅓㴟玛䧀ࠟᵦᶁ⓫ᨖ枅ᨤ㹳㳯Ὓ泺ᐝ俞㩹栆笾檇积摠奏䬫忨ᩀづ〭చ㝉絆侻ɓ燤ᛗᵘ┫梭ᵙ᭦1ぉ澙洶瓠夃⾠ࣰ癍࣓˩䴖㇙䔷傮←㧜䙺洐樥㙎䳮䳇ண㋑◂傸⦐⡖栊溢稃恥惖⋫Ꮚ伩㕥梷䶌毃凍ᖴ孝⏌编⒌ʄ灓䎖凥疷㎥⦆䨕 櫳牎奙⌏捸䳱㵁恇⼷妖斥氢廝㯉幢慗൯⨁ⴑ㇅氷⑿⺝旽ᜍᤜ柫lཔ睸⮃禎⤵喜潕爦梆Ⱜਊ㽋瑷毹佫䮪䲦㑹刷穻粊⇴坺溄⣋弄䆇䬓⯐䪵渴♠娭ƚ㋻䙲⤊樠⻍ᠺ㓰刅⼦㌙啷ṹ溈ǚ垧ᢊ漲Ǎۜ㯆᥉惴㓕䥇⹅樴ᲃ䋥᭡㫭ᐔ盗Ԋ猵Ɑ㧙庶幸㪟燙噄寯澭䳖笽殧⻢⎀⽭㵸䪅ዷ嚮峲湋Ōዖೠ珕⸎㹅屦ဵ堥捺析欚抢ᐥ捺䓨歴▭㷹家㩸΄◀㚧ῼ纋娖懔彪Śߤ漕歛䃮ὴ喧枮强愫ཏ仝ᬚθ沣㲅䯘䘩䗑˹⒜㌢糢㚏㻛ଋ䮵ⶽ㒵男ຽ禍ᗃә巀⮻侥䅛嬄䕝䪂ᕍ睖籹ᶊ䷤埣ᡒ缍倬捛擼孀俆Ⱀ糖㯲䪂䦪ℭ塦樑⒏惘ጕᬢ淋㎾䛗瑼णㄳ㛙噖想䪋⒡ᔱ哤䨕幉煗ࠧ㮏⬕憀⛄絭绛有止⽻ㆭ墶䙹犝䅘]尮懎䲇緙盰㰈瑇㟊冱䤠䐸啊泮礝͠珑䓒珃ⱳ㲭彗ᇽ⮚ᷣគᲆ籸唏㏛伞੭渺ɽ䚖Ỹ埥⒙㬫弎砐ⵙ⻤㭶泷㸅僗畹嶖㻞直〾礽ᨌ篑㯚䇆㺖猗獥ᮓバ皵峖敻䂏䟕㫶᭳涃䪽䬖㖺䟏剳砆䉾揻䙎篛㻫潫溍皷⾾喂痽栉嶮獻礌Ῐ⋡嶥淿㎝廊ហ㛳央㞑敮琧ῐ㬶瀝㜙䵶߽䶈緰㞟夡檮㠄变⼔ޢ挠璊ࢀ☶㱞綠皨㦠ҧ堿ࣔỢ߈浀爝䳷䃾羞涰ų宱婦ਿ征㰌ἰ盡䄮թ稥巘㜫就硧棌忟૽ࠏ滳め嶖ᖿᓏ㛱ໂ伱性ྍ䒑ḻ宥波㔩纖ᣅ➇⏢♄㾡瘛䧌槜䫤篷⿀磽皯䒽㞖揸☨㧚僊抭埑眓䞴Ἰ緝敗㯻⎙ϫ坰㢆湛ᬿ岐勫䝈夀稳嗴㤌ᐇ䊮᎑潵༿‧㳦㸄澘籝狖繘ㄎ䶸砋帩恐唏ኒ扝䝱Ỻ༳枖立⋭梨敮竇塹劒峦⟔ᷟ㕕䖯ߺԇ綰今㹥哇庿再瘡ࠁ⹄篞♶旼⎄揉㽑灻亿ᢘ刋ޥ浥㛃廋๚椝⏈卨㹨ၧ䈍͙䨏䠔Ứ礮幮㇉㏭何㺛䮿ⴱ箋䓉濜揄ܗ⍚㴌緝仔庹泧⤌傔戞⟽Ḵ硽寮᯾焃渀⸻潵ệ㚝ߜ⳰窃罖揸ԏ珓侁棙樷樐溙䘅⟩ĕᙓ慇⽙澪ᖩ仭媹瀋椿媗ᨀ✫ᾼ礓煏ⴏ⻇灁癫ࡀ䒕滴䯁㪲痝佖㯼℆⎮争䀙斧唏妜任涝澒睖狯䜮洛熯侞奦暇ᾼ冕缈垫ệ㣋癏㰇䬀⏈剛崅潵䄽ඕ爟Ḫ畫䷖岻宋Ⰵ໎㨔♾䶒满ܳᐵ淓䟏ڢ⬜᷌亮㸵男瑏涑眗埸ᵪ稻溁Ộᄉ壺䚩嫏竧㌷⮪湺祫泮㛚䚎毚⺘㩭扇ࣼϟ与㠐㎑䟷ប寑ۀ姬粷ᕿ㺜䘇篇ἦ箻䟗嗚㆚今滂涵煛㧊䚙᪪㞲ᱲ立厏ౘ欍婑㴖秪♾⛀⇾櫗䋦婓挎灅笀⮬滵㺍繧囿冔漊䊋弊竛䇴ѝዉ૱仯㥊筓㋏殕⼈簛濊狻砆⇛櫒簞侲Ν甗ᆽ璖极㮴䂲羙獮ᛘᴊ毬澋彶秳ㅽ羒娄⟏忌瞲Ư烆洜ҟ箙㺞眗ል矞䜏朳弎畛戾擇㼅⺀Š᥀㝮䚚␙ཆ侺皻䠿ᯛ༗Ꮍ澿㮍曵㉝嵚䀒㉧岃孞♉椕濳㴽戗淼℗⋫眺嘑篋䂾䏴䌛䠏㜖姄唛ᩝ儗ǫ➨彷㩇礎俙朏㰅皈窅揳ќᶗ㨎㯩²֠ẗ㕘ϔ枵⏬糓撠⅟椒ᐖྯ彑矇績皝稡柬Ì羝捧ଢ଼純珡ݴ⥮͘㠯燘U᷐幂纓症䛿㔔搘佐疙箝娡憞ẉ䯸幱垳璯繞皈Й㬺㶜璫剾牙☉䇁㬛婙嘯൷䵏ᐝ䦪㳫㗻窮䦢沔ḀḲ筋淯ㅞ淙Є佭㰥绷燻㡘嘷唉柖㨶宜徶厴樑⽽㺉羛潾㪘稀㟶Ṍ缻皏矿✑ᯧ尾⻭呿嚗ଓ㡙䲪粹擏ᇾጒ尒〝㱩燗懿濚㸀䏓㪌翀僛稙唝∞柽㶉算䕿瞝☜伉渤ⱍ灃〛攔㉐䝋帺ใ矿烝縉㟌“㰋盷痟甞淼‑乣㠍喏夝挜ญ亩稽振罽֝◰㝌㺃矊䥟Მ䊺นὶ姉礏疮�ᬜ羄粓湦殘㸆俘⡙緵禿↿攜Ӯ䠣甕㘎彷ᗘ箜》ķ桧畗Ѿ䬟簊Ή㹵粁庙⧿䰒〗澕籎§禟㚜㠉ί㱖珷竞瞟␟俔引ⵗ线掞侖䦥瞉狏痿攐ྻ㾡绠畛娴犎ࠀ㿘廦琷娝嚝㐙⟜溔䏬㱟罝丘尊快㵻琏皎ᤛ尓淸罔➯槯嵽䐘理䝆㿖笃倏㌚枋䏅㾧㣗浿澜亗柿念㲷灻湞䷿焞⠑য়㾛箢䌎㰞᧥澄徻瞛䩞瘝琓ះ崭是炝簚昜侕程粋䅏ᕢ由Ὶ祯璟洖縕Ⱆ巫ᰤ䣟絞జᰞ⟌䪷筟緿⒟ᐒ`Ώ翇箏䡞江哟‚䪭耜榟寮㨝䀗ᾡ弁絯暟‚疔耄㟴禩彰Ƌ籝磷瓿殟匝㦆㱝ယ丈峿⿈Ö⺄㲕㩱睠Ὃ䈠嘞依㘘怬䚇_羢Î癸ͯ獝獀ᆠ圷⯎戡㨚␖䰁ⷯ朵≅洈֟珠ᴠ㠟⺾ജ䶔ᬋ珢ᾠ⾞ǔ̫筰പื姡㛮竵厢䐷〵F羷¦绛緕窨眰ᭀ㝷㒡ण攗₤儥ℴ彤窢ಸՄ狔䟀ⵓ☞侼ᰤᐬ吇翳柏Ą䃚ɦ玸અ椀㽠䝂槻ᡍũ²㮀皇疼妳瑙慯䭗ᄡ㬣堸簬砹淿繆偿ž淼Հᗹ懥噀仮ⶼ㠦Ⱟ䠳翦悗§縱ɲՄࡽ侰⮇᠒༣姸䐖⡝巙₫Ǫ嶧禄നᎩ墠幡䪣䗻⨪♂䡌偦࠲䅨ֻ寰ፏ垱ݡ眍焘ࠓ猎快侠㞌䅪˕秪ሸᱽ啧♒䢣㴤ረ櫊ਧᐳ坃ႝ塲Ֆ❸ᑽ习嵡䦢ഥ㽗ж歲ၮ惆悛ʄ完ᆐ㎀睡㎰᪨㍕㫅梪᷎⳯㣴క氰㫷㠾䨦昨砾硉灢兀↯˕ඥ渀╀汎⾢ᯚ崕⠏㾨嬬ሾߔᵞἀ冰犣傤娮吵ႈཌྷ渺縞ӬᏰヰ᭡䖢猤䐖戳淫ら₦∉Ίځ矈᠐➟㥁䲧糵ȳ桁䢝惜椑ՀሴᲙ傰儞㙣ܤ㤯怈濪ʪ⃑∁嶑穤ዐ⇰☒ઢ䠫唪⺊ᡝ߄儒㻟ʐ礄ழᬑՀ盁㹣䤣䴯尰⿸ឿ₡أ͂Ӻరየ㰀煁䙜標䈩瀼桎႖㽋䣂ˎҘઔ 开秡節䛘䔭ⰿと愙康㲳祸྄ᒈ㪀䔞ᆧ〈搁㻰で䃰慮峽㬡ᆤያ䃠緁䘣ᄧ熐ȋ㿜レ䇲䊳݂檸Ⳑ捎ᩣᢧ᠑ⰻ䡯僌挙䖕߉狌႐⑀䳁佣㤦丩汀ᢇウ挗ʝńࢬᵘⵀ屁慜㞚ᄫဆ⑅ᢗჄʓ䌽㡺ន䖀亁⼙䰒昴䁿㡡Ⴞ慟㱒ࠖἇ仐爖痢榤⸮刼ᥬ灭惐憔䐓ކගᑃ仰禎後⾥〉㘣ౌ䶰ྑ䇿粋Ӿർከ㼐亁֣侧⸨Ŀ㨯䆄㷷̷⒌᩻㍪ᝐ⡦㷗ℿḳҞ惉℣䎋١࿌ᴤ㔨祄⠡⾠ࢫ䘮ᱞ垾ऊᄸ⌃ϼীᛠ㍰橡䝽Ⱗ紨⸲珩㡶罸ƭɮߪऐᛤ➨䙁䒣䈥堩ؽᏢᢌ佴仠∶窡Ḥⴿⳁc⦧撨娵剕䑪䜿慞泋橤ࣱ摤⃰堾剃Ქ圫㋄⡑毌अ⇶⋬礷睈⊰㉐ሬଐ嘶ᡒu烓ᄰ≌䕡ሀ㷨䗁惂↧嚁㰲㼻で䣥ᆑ䎴䝶ू᠄㵨坁䃂➦欓䄽䱁埒ࢸℭ喾㫏㉜᩸❈篮ᝣ炧碨ံ⳨⑷傱憈䌪䒢炲ឫ䛈䑎ⳂḤ着瘼䠥咑⣥慾糪䛁㗂抈〰刢盃ԧ᪭⩤岥ねö刃≚䘑ଊᣀ㜐疮à䙧Ш娾ᩞ炓䅍ഐź䗍ଠǔ⪈䜞欢䜥僒㐵⩉¶梽兣≮䕾ݺᇕ刢㰱疣ⵤ猩ᤳ硗摺䣁憝⍔䖞ሔ㝨䶱ᄣ㚤⚫椾扗䑾棤憩⍾䒉ᠷ屨玁䥂㽧⒨縹ឣß憓̾䗚ཋ撨Ⲩ币ᓃᜧ享氲ౖ夼䣺摠扆хচᅴ㢐䢱Ꮲ䓥檪㙧屖㶱ヿ憦⏖߳൦ყ崸䬁罃摧ㆯ瞎㻰⦹悶ㇸ䈩碑ວ橽崐扞䯣䑧⼫ጼ㡒咅ᣂ盖⍓Ռࡇ樉ሲᐙ䏔п呉瑩ᄋ㹩⍌䙩啶ᗙᵸ漤⩠ൣ䡔岏剉➶智ଊ䁍䖟ቬ⩸楁亂壤嵅嬷>汦メ⚆挍䞨䓖⏸甾ɤت綬笹䉟恾䍝↝䍅䝝খῌ⁈篑玂ᇥ熂ܲ乂椰㣰䒬Ԟ殗盋⦼ヰ㚑嚂ࢤҬှ♍璛檜燊䨍ˮ瓦☼ぃƑ欃ǧ䶭䩤㐲䡓⾌ᆼㄋ䓗எᑼ㓈泱䲃獥䠢眳̧岛區燽拵⢛䕜ㇸ報劃燥䆮┴乘浑义焹揭䝩ގᴦ奮႑七㷤暪䰷ᩁ嶻䵽焢哗ᇷỜ䡪枢䣥⯰弲丮㞬⣪憑⊜䜋औᙼ㰸䆼布厨漻繊粇壐ࣙ⇇䞻มኺ䉰䲑千濤ㆭ㬸Ṑ㤐ট挍䕀䰡ᒊؾ筩⇥Ψ塨抲ʋ磸煐䑇ଆ᳜㏸温惉⯧䶨傴湎汽㺒怰ã焾ቂಜㆃ䬚瀯䔼癏Ⲃ碣ㅇ掻䞴䎁Ტ㏸紩愲桄氥䃭ɽ壩ਜ楀姉㏍淌ⴸ䁞堲⑅嶨ࢻᅊ≹牑爆挄❨䭡ᇾᕢبᤳụ౭濯幟�㣘১抧䔧དኂ㝤巑ܳ坤ᾫ䀫㹟傃×९描㯄犡Ꮜ㷰媩㸳০㑬笳煣孍㢿爎ᎈ⚛ࡂ⪂㮝㬩佃凤䂸क़䊐⓲ুሲ⒨仩ᚢ㱎ਠᴳ塇Ꭹ堠⥁≳䭅ਞቴ❎憲⍤嶩抳╄牯撶㲭ɪ掑ࣁࠤ儴䯖ᛲ⏄瞁⒳㶤剨Ҿ晆劇磅煹ኚ燩ᅒ㬨㪂↰湸ダᡏ᥏Ռ碵ሓ掘⚬倁ᙠ瓜掹孆ᛀ咅⻱ǁ攂㆓折⒟শᅬ⢺嶲嗺凇汈ᐥᰱ潛熛瘎♜䳑᧠ㄘ䄑嬲佲幪寃㥃熣擨㼇䑯獷愥ዒ㮤岑疲ᝇ䮩㮭怬੶牘⧟ঘᇢ䯴ਪ㔴硉㠂楄䙮䊵繜Ⱚᒮ⪹䐑✐∔ت⃡ॉ⑲ᣆࡪ抸ቇ擒Ą単ᆎ₅ᱪ㙲╊ࣃ㤀䥯⊲㥕㉹擀䤻ቢ⟲䶅ᾥᎴ佊恄噲䑨Ү憸䀵ႄ䄘⊱殘༵᳟䩴䳉㥳ℋ穨帺摕ነ撺⦧⎤䛜⑵ᥴ敀奲䱥凱䦀㕒⩰࠵⧆卬副䑵ᦇ䍵᧾ⱃ寧േ媷珱檆䔭ㄡɊ☬䫉ቼ㳈浉䶲码嵪帡畛㒘昰槸儮碥㒠䣊⒊ⷀ搥侠䃑椭捿ᑼ㓯䩷ၢ⫞˼F弤瞱⩳嫆䮬ڰᕘ᪐䂒ह匳➆䥭ᄺⳔ䴎Ӳ姇፨ׇ㕖婮ょ‰綂䏪䭭ዺ⧰⟑筠᷅啮㼵牋䊆ᓢ椡厕⛫᷺ⷔ徉㗅〠櫃浝媌甆樓吃┇疜ϡ僄垉嗳Ὃ坬ᘯყ⊗ᒨ⥤Ꮡ➮䳙ᝈ嵔简㷳ᯆ禨穉㵎ᾦ璣槷⎄㋶侭ᖒᠰ囂ํ矇彯ȹ硏᪐璢槊Ᏺ⠒䳩ႆ尔䏡ⷡῄជƱ絞梸哺椮印⇺˼৲㮔柑䑒哐僫璸ᵙኞ㓍⥠㍯✕ე㉔䖾䱓㻠尔⬺⍉٣㻨⌵✨ǁ⒞䚔枉崃ἰᣨ怤捉㩲ᵃ楃刨攊䩃ᝪ㓔紉䙓⫃㣩圼籃䙷ಶᨛᐈ摁侕ჺ⎷ˉ祓⇆ᓩ猁慚徿ഊ䤢㎥媡丳ẦⅬ䪐⫳儤炭ᆶ华ફ甙槍加❨䬝ᕚ⛬戉翲ዧ烮榴ⵌ穬ᓦ撪双攌痓ᴦ㻬侹ᚳ炇杨㪸儰罁ろ窝奨暥䨢ึㆴ厹䵲䍇磫㦸ፈ㒵᧸凂撎䢫Ẋ㵌礦┰ㆄ怠䖲嵓沂命ₚ棰杄Ջៈೄ曑ὲ碆ይ㦶ᵅᙩ㓔娓勊擏౸ᣊ㷌琉୳塡ʧহୖ婽㺞奒㏾⠍఼ሦ⻄纹昜⎆漥亳䭞㪐泺怣㎪智ഃᙆ⣨ࢨ䇒⊇园墀㐫㚅ᒷ᨞劚䜉䪻㏸梹㷒ޅ糩涵捓㙨⽀娅叻ʆ䣌Ȃ㣐态灓慅䛩̽ᙝ暑剋▝䡻ᔖ㻔毹溹矄琗ᦽ孔᳃叞曉ࡾᥖ㸤秹㫲焅፨猃㭖泬㧥ⅶ昺䫕㹤䱙╲䔄˩喽畆篒䓖ㅩ㊺暽䵧ᦆ≴瘰⍲ᔅ杮㎺ྼ乩ᳵ妏勣ⓠխᛦ㗴恙柒紆獨榴亃ⲳ妳洹枡亭ፆ双烙ӳ猄⇪⮵㤳ᚌⳲ㧜牕昵䮫Ṏ⚼熑滂⥹Ⲗ粶䝛⺞Ⳍ妬劳䧷ᑶ㈌䌉㛳瞅ⶩ㘏缫暂瓇㦨狶➼䰛ᑆⴼ瞹ྒ℄ᷭ䒸㐫㙯様玬晃ሖ⥼䙙䤓ἆ祮Ƽⵏ♹崐禵医╊ૃᬾ≜䚙喓ஆ䪼㕔㙽䴜祌珩朷七ᠦ⩼燙㐽✅᧫Ꮈ⽀㚀㳢㦭獦曍䤫ᆎ㱌嘩ḅ䋬ᖼાᚋ僩㧧㊋斔熁潾㟜䅹⍱洇搓斷潚㺛㴗⧥玴朥䩿➬愙ዂߤຮ㖲佂㹺紞楓爽◗俗Ẏ㺜瞙䆒絃毫ὀ㺞峪䧣犭晸痏ၳ䀼伉ᆓ㜆⡬⮾罁᪇糜礦㍣♞䶛䃬⃨畊剒䀴㔤厵เ㊝ⳟ⥯理㪊睙濞〢缉怪䠇嵨䁸♵䳥榸य़ⷔ帥ԓჇ㷭澶㭞店䲲֡珈ᛀⲠ怞㚜䂙ᘒ7ㅠ⽈皜ʱ⺳屡筀⮀刾⽟㙙☪ȶᲪ庁ⴇ㤽指推⾿ᩌ㵴磑Ӓ瀷Ɐ⢻ᚍ崏㆗叴ᑨ⧹棡ⶔ忁牒ⴛṮ姭㽍ṭೌᧄ੯┉䦷㈼䆥摒ᒄ柯桶⍁慠掌׀珵攈⪰匊⬜䷙⼫ᘷ⥮▰杖慺峙祳獔ᘰ凁ㆢ拈礲文灉㮺㍖媌⌊欑ਢᚮ亷㘜瓹ᒫᮡ剌䣃⡕⳦㎀旝䲆ᘡ㿬奥璪甆㉉㾰纇売䗟剂♩䫈勱ㆢ䮙ᥳ唴䯨玺杇內ʦ奃玿斯䱹潾⯂燉ƫ圅ۨួ棃冊泻⬞䁭⓱ඃỪ⥂喹͵䬶绱命⽄ㆍបୖᛊ䦿ᣑ㏸燥ʓ㌷৯偵嵒纏ᅾ妼猻擰ⰸ峁㐄䶩沪椄♉洍㣖窄⋲礯અ⒰Ɀᨺ㤂潥娒₷Ṍ㾲僖剺䋵秠䪍⑩乴ᩦ㴂緙❽礴塎䓘冁況䕼ૉ稊䣝᭺㌲䝹㚫珅ॉ疺ࣄচዾ㨀䭗暕ᬑ㕢䡥‒坃䅎䱼擋ㅺᴥ䖫卉ᑵ伓፩㼜濉䡪ಷ⅊㉴棛䦜ኳ䘂䩶ᛩ佈➁Ⰲ涰Ꭵ₷᱈溲廬⃖䕛玢ៜⵐ喚⬄ૅ惝ᒅ禫䩿哄炥拒禯୲ᖂ⽤娑⹂噅܅ⅉ⎺ᓁ幠ያ◤䬱ᓬ⽔嬉⽂煥嗓ង⃨簾⣔ũ䋉ᦂ㈦ᛲ⺺Ὡ㍲䶥浫↷恐瑸ཟ榕⋐祂珃▋䣍ᚹ㵲僅棪头ᩎ䶻杓ᥰ䊢敮匸⧀庩Ⳓ知ᶫ䌴၉灱ࡎᦜ勇楓獋ᓾ䲀儊Ⓖ桅盫㺄⍎̴䝊੯峴妜ૹ昧䬌喡㙲牥剰矈皯≸唢場狈Ԡ啔敷䧌巡㸠綅৪玶嬱籺睃㥼�斍䬬昃䳐Ծ㸌憱㍓焅㜡樰僓䊓䲼▮䮳晰⽜咙㍜凅峓暅佗㡴ག乺ዾ◘૽ᑎ⣳ⓙ㎢縅Ǫⶅ⡋繳瓝楶㲼פటᙐ⪕榸僰ච嘱仅䱨啁զ灄ᕈ⯋ᜂⷐᅚ₲楅ⴝ㡣咃ὓ֓杸偘⩳ᗧ瓬啩ⵜ憅Ừ以䡋犰糆८᳞㥮ਸ咶⧂埉㤈Dž瓪⌄䵋⩿㓏岐勇◑䭢ᜩⱬ⸞⏢糅啪璇䝉羳俧䦍抽░縙⨢垙㱪嬵杫丶奍䥾䝅䥤勵奮嶍឵䭲冥㰒巅♋❄壊➺ˏ㺕䪫ᗻ䯶᚛དྷ圥Ⳳ䛀旓斴⫪ⶴ壉煽䪾⤮⬨斊⯬刑⁄㽹➪沴㧮䕵Ⳇ䕮㽻㦼ਈ圊⬨妎㜪䠵ਫ汷╹坐ẓ䌄嗅䮖擹Ⳓ囑⎜΅坋瓊㥸糖婹㋘ᖩ䩪啵⬯ᥥ㒪慹ẫ瑵嫉ⅰೄࡶ㊧╕⯒堉⫢啥㫃⽵⡓ㅷ࣎慶ᦝ岧⥳䁋ɔᎭ沁➱ᄅ−᪑憳Àڐૡ嘁⯧暱佺哕㴢梉⏋ੵ䑉㚹壓喏ዋ唩䭤垏䢻ៅ㉪䛥䩹捶㸬䵺㣍疝杴祢⫋ᕊ⣍ᐵ氥泫ྲྀ櫉敻杆ᕱ䪨㔩⭯旇䰟―ⵊ籕篊冶䇊ർ竃䕲喥⪔ᓑ⟗ဵ㏸痵⭋Ẵ糊Ȿೈ൮檽ᕙ䰊ᐽ⹆忶⪂况粊彵瑋➹␦㥊⫘绌樠嚕琴偕⪺棥状㧊煶䫈䫶㧬జ噼⩎涖㡊爉䂫甄捈䕾ᣊ˩喿朑⤝曭⋌潙↋絵䓋獿壊㯚䫋䢚檫ᑶ䴶徎㐊戵凋⡵బᱺ竆涛⬊喦欰ᐼ⬓᧑⧺丵娫Ỵ䛎㭸䫓慼䋡ᖑ緂᠋⢚庄ㆲ穕峋⇷䷌⍿烋䥻㓏㖄⭡យ䩮嘊㨢䛉∓㳶减浶ᣈ䆙㔎嗩檤ᛇⰖ嵥㘺䣙昒㫴⭨垻ᛋ♪狜┤⭷採䣏ᖭ㫚笙ᥪ滫泂妓⬎昄殏ᒊ⧮壍⚺垕␔ᶵш㕶᳓嵧䪭⬏ॡᕚ猘䤼㆒䓙洊ᇴ䕊䝸廞㵰䋍痿࠶ᚌ⢶呭☊勥瘫㗷ᝋ慼㑟皔泯嗊檬哿⤰剱⟔楙歒ߍ智Ọ⦓偩╿歕垸Ⲑ傭⅔怕㽤柶盍㭷Ⳕ炘ೀ⩩ᗩ⪡孒⚚嶉⮱凄佈呲ᆒ۷瘋橄啋⮷ᔊ☒嚥癪ᡔᏈ嶴䏥ᶂ甂ẁ橱喀檚厣㿬䔭挋摕ᄓᛏῚክ䄯歈㒜䬡囙∦慅ᘺᄴ睊ᅱ囅ঃ㋔ԫ此㑐ⴁ幖㪦塕杫晵绉潱ᇚ㵺ᴟ▉歩曈济命␦敕㠋哵珏啲⫍⍳⫎ᦊ᪡គ䉑庩⇴冭撊屖璏獾盗ᚕ䛩啶᭔㓦乶埶㦌䖭䦊ṕᙎ壽凈㵬䛔㗔ᬞ᠕䪑僭⩊枭圻䳵勉⮰LJῌ⚻ෲ᭡䞀椞宵ⅆ殕ᢺ仅拴繼哑喛ᬕ榭⬲㔝乧፣㕆湭䡊湴⫎枺⫝̸䦒䪷姱ጂ㟴樑᭻媼䐙㘋䥖䪏棷⧙£⛸疑糞曍䱵হᐲ僭䣨⒎ᓿ泈ᎊ⛱䵱䣳ᄨⶹ傹ႆ劭ҫ刵恂疲姓ͧ⛹൱殂ᑈ沺埓㗒曕⼺䟵擋磰ỉⅨ䷙樥嚤⬩匣ㄦ哵宋ష嶥ɺ秈卿㌒ᨼ㟮侙奕㷸㌭䷪䐢䧪㬄璟䛋䷻ᯆ㖔涾嘫㋆䲥㸺烗⊏瓱㳚媃✔祙勖㜝亥宓㯆禹֒བྷᱏ拼䗏⥾⛊畢⬪㑢澉嶫㰆燕灒啴ૈ͵狜嵢㒾瘄孹㠗⫲嫝嶭⎋㰷榍禱䧃䮒䜚禪偮㞵⡥囶⨆珕ὖ壉泼ৄ嚔圏㔫᮵㖱⠮哾㽆嗨ᬊ㏉狽㧄㵬啍櫁嗇䥟ᨙ⇴煍仫೫வ旀溞囈ⷔ尙㗞ⵥ倶䒒䷍䛳奕ᓍび槈ᥡˡෞ审撜欗Ὃ✶俭愄㶍⦾݃⭦ܔ⸑婣㙇䬪墋㜶䜵䓺䋗抋惼䗇῁窩⸋ᯊ㚿ⷵ嗞⪦反哺ᇖ狍彸◍Ẑ䚼䴵匓㓍⪱⸦⣖緍㚻໔榏ᛷ◔ᅵ㚯☌䮋㔚沙弙㡚亙䯪壔䪈⫶⧈圜ෟ售棵囫㔆湵ਊ哗宏宗⚩疹孩㒪漠忥ㅲ断పߔ䓍໌宛竃⸍䩯㝠渍尋㩪簭Ὴ愅ཎ䗝⚋㚾㖋嫆㝚潼廩㨼捍ᆓ儅䗏Ꮎᗑ孡۞䕀㫂㛪洭夅⎖䯍㾫ⴇ溋廲瓘檉䛋㖮味咁橭娵㫢昍㓻竉浱筷㕬捶嫵䵞ᜅ䭖嚛㓖䞍㱚ᗔᵫ᭼燝檅嫯昘歩旑溣岻㜮庭籚Ვыㇱ嗐䶞㜔ᗵ咞渦嵫㶖倍帻嵗槎囶䫖㖇狜ֺ婊杉槵幇⊺䁭௺㲔⮋⧾滆㹾代祄㪤疡涽孞Ɱ囵䴊◖沈⏓㮏囙ᷨ㨽♉栽唋墆嬭帐捗暎凳㏛➝䜛ᴸ䭜痬潂吷⦆幕ࢺ⟴㢎婱ẞ泡՞㪲㛱槳倷ㆺ侍桊煷ᛯ盰䇟湨䋫⇄ᯱᔅ殫孠㺦䉽䦺彖㮏䇹绖ᝨ䑜嶤㶈៛䷫屧妦挍慛沅碉ⷎ䦏仄帞㭊瘥滽咅㏪弍৪⏫Ṳᯃ䎖໋ա眞橵嚷㘒响Ⳛ缆㙋祴巓疀᪭ᶣ歁㔕氅块₮恵綺矶圉䍷ⷍᕹ欅喃㭊ប棛噛㰖泽ᥚᱶ漈Ƿ瞒暶巆㬣㙵丼啗㹺嵥廛箖侴ߕ㚒亳ᵷ㫰㟮䬧垕㓎峍塛劕⁴⪽ߒڛ櫃ᗨ笣᜵⪃ể㞌巽狚皕笌嶼泇ཀྵ䵧季⑄涧匧╖繝線劊⟋፩ᜍ窫⭰敎渇ᴗ㠎䙥划箖Ἄ㳹柈摗嶓⩐ᖲ橽婙⣂燔䪚岔有号柂⾞⋁Ԫ箝េ涚好㶎曥畛ᚖᑋ櫾㷗㝻媠嶿⩭㑜橗忇⍶栽࢛敏ᳵ寒玄伛嶒笱睴橣康㝊娽俫纶响㗴ᝌ㵧ክ禽㭃ផ檳儗⧾濝䍊བ㸍ோ楢➏ฟ䜘䤢ᅇⰖ幝據綔♉侱俙㍲竲㦪傓皑槣孏ⵞ恝㨋弰੍៱㍔䚜㛒㵱叓㐷溻働ㇾ攉填㘖㵩仵篑佻㻦ؐ玳埂⨏庽▚䏍㶛䈕ᰌᅶㅉᩱ㫩嘝筣勤ࢰળ᧬µᑊ㜧俿擱㾝㻟嵜稭璣焬ୟ㖞斠瘚宲砎囏忑㾏牧ࣟ秒ȿ板徥徐㐊Ⱊ䁢ဎ䯸⿑徑㻖娵䁏痠�屠ᄞ燬ရ砗〈ᕧ㿒羁繝!ᖠඟ洠㮯ⱖ䉝㱨ု䀋Wʾôȓ素ؽ䛿洟帟㨡籝ᄚ瀮〽掇翙÷碗䫥槨稸取偐由㈦埋〾叶翄䊵ࣺĪ緵䋰ኀ㍠烶Ⅼ瘧禙捲偛⁇䃷Ỻ䕻篠㙐ᵀ礆ἣ竝ࡋ堼瘩㢤粿㉾͒ٞ㏨巏✒川ᔚ〮瀻噊ₖ℆ࣔ*ߺㅈ᮰㎸࿒ण樧栣檦硶䋁⥛ǫБ㨣眖⫇巧‾孺䤧瘬Ҏ桧らᔣ沬抖ۥ宜堐㗃ມ䮣庛∬ⰻゔ䄄Ҁ䐆ވӇ圜ܗ対彨䤦भ㼔㡜拁徟滐䎙煲ಷ匧殯佁岚ࢸ焬ᰯ㳣乙ᄀƖϻ爆昨᷸孹➦硣娢㔬磨䡝⢜儔䇲ͩݞ疘ᬈ㖎娞噣愧മ爿ぐ⢓ᢄ䆲䍼ݨ༜問殑㉡䳣汓ਕᒮ⟼῁潣Ʊ䏳އƐ玈㧐畢␍দ໒搋䱚ᢐ烨⇂緎ںฤ㕘㛠毁槣劧焆噉瑝ս䃣憡楫ނ䓌ᧃ剟㶁亣樧⼮ᬱ㱔䵖檏姫竨瓸Ấ䨨皞姣堚ᜯ糂䉘ᗓ್瀻⃰䞧僂ᦚҊ᫃⹔㙲伭敦≜忛塆ᆤ⩷屺㘘䴝嫐畞屃ֈࢮ㢢ቝ䒁㵚ᇺ⌺ᆩജ⇄㡨摿◽只+焽䐾撈⾽√瘘⯯◯⎄㞸ၿསᝉ⊯ௐ牚撑䤁ሎ䎶篥兪ᢧ溗图滝⾦欭⤹ᒌ⣸懡♜䙑ᯩ�皱埄嵡⨈⠼〲㒐䣹凘稣笠垒棄㗀璞盃ɦ抮洸婐撍椑㬯⏿䂃⓮ۂ孅₃㎴̮㠋汽忛Ơㆲ琯ⶑ捦ᨬ㽮廓㡃⌣玉ጹ䉝䢒ᣰ崶瓵䵻宆ᳬ毡Ꮰᘊ慢䞦଼橎ᑃᄝ䫡䌱䙤ง䕌㲭ᷞ䮸㫧䃣绅瀫㰶䂋ᓗ悶䞝媶ᾌ㐢ᕌܝ溛喯ع䚣沌㏟婸掭䝻࿂⌼㧸惑唃縧担䳅๔杝ᣰ懃凬䖷๎ᱦ佘捵⌃晃傢癐䷠磽ࢡ⌷殳ӕ䢝ୋʑ䁚Ꮶ㇆ū-彿殂⋮ᠯ䚿໎ᨼ㻘社⏩矧扐缺中竎岎⓶ڬԡᶼČⴑ噵堧⺹ήřʊ䊗⒨Ꮒħೄƞ㋁嶑瑆ᾬᨺ繛ʜ沖ো提䷀䨀Ƣ᬴碲摬〶⊀㣰䇯搘䫑懷ໂㅤ瑞噇㑯墻₺䄩䊍拚燜⚐从⯢㳤桘悳≆撇₿偁┒ৢ啴ᦞᨐ桞曃Ყ硭涩䥐沓屮ҥፑᎲÉ㔬༲ラ傳܋䊬⮯ᬲ㊂ⓩ䨉ᏢP伂ᨚ䎢⻩榳Ⅶẅ㉪奥罘㊽㢯ᐚ✨Ϥ䰒㽤绁炳♆᙭涨՞㹈᱿䧔ॐ㆟䟆㈮ጴ戠㍭䔳ⵗ䤸橙⒝┈䨓ㄩ❺ᜃ珎ᶴ罩瀳栠㷆栨ஹ䊎Ӷ懊ᓮ䁪䳙᳞導㰩廣拆㧹♨啘檛殆歀燌⛈侐݂㍴挑䪙ᙇ嵭⠨䥙檔䓴ే㑁掸⒕ᬺロᦚ䏃√楯ᴹ籙䪎沄ぜ愃♬攉ὖ曰ೳˇㄧ⮳䥘畜ɏ⧃爏ઠ倍᪹ᆔ洤䋃嚑殯咚枂⼏䍺䝢伖䰙ᤲ㳸凃↰ɭ倥翥≏偾Ⓧ拗䑢ᾔ䙄瀉䛀勡ᜰ紦͚ṊӾ欍ϫ☬栝Ầ㐬撘䛳佔ხ冼͛ڃഞ䨍吋☬亶ǘ噴殉瓳揁䓭弢獵噍孳冼͎䛾䱘ࣆ㈈હ戉䑇Ủহ䵖暕扰㤅䋳䭆侻ဆ㍬滌暽ᷚ⽬㊺㍜ᚇኔ妾Ꮴ䨙匶 㙄繹䯰Ꮖ彅亾⭟ҵⳤ䧗㌈䥵䷀䩔*㱩䎆ᶣ派獲劙瓺䧬揬䑏䔻㖬掘緓彆涭娋ፖક洂懲⍩童俻潪㎌看⑳來㥆•緞哱⧊向ጪ乵ᢐ㤔毎嗓羆㖬㒺㑲檊᳤䦸珥♪ᚌⱊ䛠㐕ᴆス䥧杘ઐ⤍⧡放歾圇Ṏ㊑ベ廴ᬆ⒖䎹ᝪ❁橳㧭啪⚧➍氖㣔瘉孊剒淮൏ǻὀ㴖㧷嘂☪皌⼲ガ箦䢳⦩ᗭᙊ佑竒㴗শⵙ絘䷱儀ら嬳䒲樯㓊槿埙ᳳ㬊下柸䳝歾㷜殩咳嘇⛷沼⩔ẙ憁ਉ珜娣䶯淪唜枖䠎岊ᛗ嵨⣯淧序秼㒏ߝ佌Ḗ㧀憹勳㨇㦅羸≺矕峰֣救媯ᑤ݃摼粙ஓ佺㧆偿坞䆔崙燳厪宇栂满㞼攊癈户嗯偿潸盙攆຺ସď柧ᰯ墼柙擓㼇桼祜䏚涓䦲㴷⟍㞳瀁㴜目搫瘶⸕ຼ樦ↂ⌟䌻獄ᚋ係況㉼硥徽㘷ẇ⪌⣜ᛎᾦ䘓㴹利᪡ᢔᶏ㝥䅼礪篮ᴸⵑƗ峺䘎䶏匔⺈姯掂磥獝ἢݯ妊ᆌᤀ燼ፁ⛤ⷩ⺑㧂淥燳ൺ峮夷⋼ঀ䣒䗣珣䞯侔欩㦬惖䱫ᚇᘖ僓⿈橍֨䬲板佤帕各穖禭帶⌕ၾᦷᆗ̊☓᥅ᚴⲘ墂㘂燚含焷敌㑻擖緉Ö䗵㷞̟恝濂擐紓祆箴〳㙖嚍熁؋㔽ᘦ⸚㉾㤍ⲅ坫暚⏬�岧ᦃጕ姃玕ᜄ噌尷婳ᡙ䛍㦷ᯮᙺ哔ઌ擻䧦䗙⯶⺺歪剜砚摓�ロ憽͟㛒͵旔㎘晡䴬岮塢瞼稠ᲆ㝏熹㷷瑑猎᧻䯬竌俓⫙ք榅劓⢷⭎ẋˑ妆擻◆䘜ᙇ仝Ⱁ㞢稩剓⡷ὴ兾壏拦図㏦柱㠂彖㭬畉檳ࡷ㏬籽整▎挆㔇㏧᭼㑴嶝嚽ㆵ橋䒇೮⥽玼斑勿⛋䡼困〇姴恥癈ⅷ惎塺擕ց檈嗆᷁剦䳒桐埤狁䧕䥇⽌㟏㳑ⵑ㳹无ോ杸瓥溱㻧⽵噋綶旭窻啲㙶ᗕ㖦囎俢孀㿘ᵰգ݆⊗࿏ܱ翁權喴䵦孞哏抬ᑔ笵喓㝶否㗌㓒օ䫸喫ொᙨ暤⼅㇒病姽Ӳ์ၕۘ䶏槑嘜ఊ柵ⲫ䥭㨀櫆筅泷ࡏ䲊ᣔ䶀̈㔜毌嚇侘嫑㎲棕䓫ڛ滇獻䛸䖝䭶㜃吅噿䳌夅㷥㗕彭ᛷቌ䤎˒ਸᗔ殈培嶿ጪ滕梉㡷燏汹ⓜ涗䬚▱殌坤⾮庐宲柕挋ض㧕繺糞䚅猚ᛯ䭰昡ⴜ弭㽠狥咋溺䟏滟ړ紕症䮠器瘱ᵩ㔜禕䖋媷ᓌᤊ烗ƙ䞗禡淶櫬࠘䉫䒪矦倻䭜Ỏ㪏懸Ή悐㪺᚛⼣㠇䃕圓牆埬ぽ䫙㺎䓹痰䌲囟䵞㿵ક䣋汖㫌ވᙶ井䎋䖭⩴㙬ⲗᷣᘢ纹程䣷䝎⣸㕞亇䬍ථᯞو汶䨵㨺瑵簋盷㭹ᖋ⫵摙⯓囄澏Ḯ农柉宋ᄶ៍壻➱❼㾉ᬣ娽⒦尽㘺硭犻噗厄瓿狕ᆎณ䬨៱㓠岣ㅛ⣶玥᭗柬ᙸ⃞㟖硄䒙᮫嘴⋁烌㈵⫑䵫獆抍搔瘥玆䫺▰宺橈⺹徹㳲攥睋͖⩏烻⻕ᷙ˸㖭䮱㚐Ⱚ嶱㦼絙朓泖燮䱿䵖▜⫧㗄孑ᬈ溥寫㊤絪岙⽺Ⳏ㞿◚↉⛢ⶲ宷噘呕徱㧚晍捋ቛ䆏峾ஏ圎ณ䍦㛱數殓䀞䙵繫烗狎䪂姚එ曰淸⍃㞵ⱍ壹㎆獺儻埻ᮍ䓑▔团㔍孼㝖沍屩㗖甍任䲶ⶎ哿㮈眉淡Ⰷ㝲⻤巓㜧㚾愻寗ᎏᦻⵛ媄䝣疳欧坲⸝弙゚熍䚃⯗䚏嵪ϛ㶎ጓ嗿⵰瞾ⴗ㜋⻍䌋暷窌系䭹熘ᔇ瘝孕㛗˅嫵㞮杨㝻夷揮出佟㜅㗶寙⭕ⲉ姯桄礆紋皚ᗄ㝼叙㮔✞淍歟嘰湜樒㰖洙恛㐇ℍ圾叜㦃ڑට䴲睰潲怋㭎摽挳Ზ㔎ⶎ㭔榚䬆媷歔㛿ⲃ寎庺碅攍ᆒ΅⓺罜柖⼈㘙㰌瞶⺓姇㯮㹽婻㩶㎎竹㣒枋ᬘ涷子⟒⸓宗㰒悍䲫磶⏗৽槒瞙箑◘孚矯嚮嵽㎎祍梛⣖岌᧒⟜土ⷪ導矱ⰱ彇岾楾築唖㶌ߔ喔䙿ᖬ安盧⽋忍㾾湝査挗㖈ໜ྇ῐ瘐節ᩤ渍庯㚵㊕絛偶〡ಹ䎄㳑Μ嶄㮏卫浧庛捔殖爗侇凳ᲁ畳泧Ⱇ柉櫯嬭⽞捾㎛ᴻڎዼᔂ徙檺綽䥉涗涊জÞ糕ㅺش䜓૰⯟玈猓祄恷瞫⩸͋⎔䷑嫦ᩩ䬫兀瘂▒泹⼂寶瞀䋟奘椔倣瞺ᖥ冉捷㱄㞮歡ⷚ㐆ᙸ澏堠砦䂶湞䠯冊⚆偯⺍继ⱓँ㳐Ɵ崶㗼簥簧炗仂灝ࢃރਮϬߧ㔭伨䮦歡熤䘘奨厠㠅禬ᮢ⇋㷑㮐琸♫嶏惡笙幨ྙ║䮖ٳ摨∍䶆ߌ໕提㽲戚恍懑嚇ਹ獅ᗬᄅ㒭ⵙ筏䃶厕啿㧁礼⒧ỡׁ⧪㲇ᄖ缛婚ຓ⺙困矞獣傜搗嵎緕痉㑗⇩媝ތຬᴩ勿㉡槣晐姕丼傻⡀㊊䕉ᧇ⬸儢ᱜ仆㓡捏ᒧ䌮᧶⏹⧘ሼሐ␘⸅傲Ṥ㱢䷵䵅䊬䴱䦬جҙ氻ᇥえ䝌ฬὦ䄐竎䎽宛唥ਜ਼㷢䤓₹湌䞕ີந䠜七ᧃ岊瑁ⴾ橙撜⤆ᇹ⏘䝋嘲Ს䜈绱矃窄⺮派ਫ਼崹ᤊ⣰䠁ᆆᴌ搈穱毀㥧ᮕᔽ㡙ಖ皹揝敛དྷ䔬䀠Ŧ㊤爎Ṟ峂磞爇䍘痙ԃ䒄柠淳ⴠ㲜䜠旌⏪ዘČ⎀Ⴀ仸ᨃ燑➮⡬繞ᗲΈ碀Ᏻ筏ྋ姜㡒∑烀៧ᓩ缽䅛粜簴绶籫¢䀼ḹࣴک挜⯧Ư漾㹝㱩䔒懦ɴ❵㙕êޠ൦浪奇੯璎惡抖夜䳔ᏛÐ伻፲㸀摩纂ᭇ幗⹀朦ာ粍㍧ॊࡩ❽ϲ㫪ࣩ缳翲Ⅿ℩祝ቫ湺㫂擙➡ⶡኪ㦰祏尠᙮Ơ⮶什壱⧬㓪惁㌓Q䉼ヂᣆનⲓ䪼⅝投Ԃ⧶ᰣ➆侭ṃ╔糂ᣳ䱈ᥠ㘩捷㪞往✪吕䠊乵̮猔緟ᗤೀ嚰أ絡⨣ᐳᡝ呔㫢գỄܬ篰ᕰ፠吥熾䚟࠶栫Ǵ极乃ὒሬ缦揌Ƈ帨冿祗Ԧ㕀惉㎸栞窝ᵺ㢄瞩昳仝⑭䖽捝暔䴊娙㏳ᓍ丳ᱦ㳔༉杓侇盯ᦾ⹄ᣀᴝ᨞㐈枽伫ᷝ䄌礗ᠱ幨绯Ẽ卟ʔ䱒৮冟❭伹ᣖ㤬盹牓攇㧯瀨睜ນഅᨗ㐔枝侧ᾆ㭜瞹潜⌇ⷩ綽嵜庚ᴓ槳珣ζ佷ὺ㽼稑玓瞆淯⪢睛皟崖᧱琓柩仧㵴ଙ殨䀇揯禽⃟慣ᐾ؟檅䡫䙰帮拈溤᧮⤶ᢈ箶娼捋䌃嵳♛䮴ى͔㚋䀞灨ܰ䛥⑾⟧ュ媯嬽்䐷㸝Ờ⒂緕॑ᬷ…礓䀾熞㤄⼡ṷ᳀⁃Àߒৄ᫃㱼ᠡᇈてፆ丬ਪ┭‱㧼犁嘂璟Ⅻ揼ࡡ㘬榜䜼◡⡉ᖄ嵜䇢ⷅ欌ࢷⶁ⪿䀴燤⊳⧡䴪稪䕔屢㋬瘅Q羡嵏ቼ䌦䦛䙰日䒃នᣬ尨䃒糿૫崀≰峙敮ଙ⅌剫∁⾘ཥ㸘䔅杫簠㵎Ṽ沫猘塟䰍ガ佘થ㫛༵癋筬ˎ乼㎨㕭Ṍ嗲⮩⺄必㫟ច硘ᙷ䃏羢狜ݑ⬂ᓹ⯏爨⇗楂㶙崨⯋狢昦探⫙░氭ᗮ㐬圭「䎅㾘狵皀罷Ỏ䍾ਯ䶘ᬍᡇ⯧挣⸼ր�䢋彷痎䢼〰㔨ྑ㘐៵⻜廵㰸ኅ硫哷⛏⠨✃斐䕿㘓⇍堘眞㓲秕椋䭫㇠歿㫙㶝笅縧㩍⻞徍㰎䂿㘬᧷哎㕿䛛喝㬑嗿叹圸╞帽㼦硝ᶫ䟷傎棿燸䎚㙞琺樢㟨焖傖Z䡄ܰ⓼又䆭ᤵ㪄✜籡ᯅ吻⤮ᆸҬ䡭榻围ᚏ侐ԁ佰甿j㟤î厗暑桜ేᅀ柉ᛑễ緄බ痒檆㟌濽᧫㤆竭涋嫄ᑦ嗙圁枮㗪☴Ċ滎сӶ眪嶊䐠旼䞤䷘䂷ֺจ毸㟍凢⁻㳪羄Ფᩒ硰䗊ㆰ㮗⪤榡䆌ၜ㶱惽㩠ীཛྷ࿗ਯ慃ϝ灪.᪤㯨㒙烃弼攠फ़ད⎩漣৾⧬ᨡ䌎6௰⊋乓廮ʡɴᎀ⯤ᔏ捑䊪焮᪹㮳㒔䲪䋞ڲ灴ݠ⼔╠捠垜㦵扉㯒眦w㸤䕽紲ᢤ氠痼ᯟ夤漋ื㰜ᒃ溁†ŃᥭἙ๏㮺眣満Ϸ㤫侄غⴗⷩ叼慠 ፒ䏝溛吢欏緼怤ྒ弑匾篍摛漰召㩿㗱ᩈ彘㴑媳瘄Ლ焭⤦ġ㏗弘ßЮ寞ᐸ亰⧦ⴥ䍞喨ϰᑒV䁎䄋敡؝樛尗毃校㾙⢞Ќࠏ砀״∆ࠞ玤ࢰ䅀 㙣Ė㰤懇篓凛Ꭸ㽽೨ʠᙀ㐯̤ᑝ⢟˷֧緷偟督拐㸠糡Ƞ༧攨Ⱦၜ⁅儝ȋ㤿ޭ具潖幀硸矲൲ࢯ䪓崦ㄙ⌃ϼ碌ဌἌ⊠稙ᘝ禱үᐾ俾⒘枌⌑䁾碶ⳳ汣并玥ⳡ敘ᅗṔᦙ䲞ઓ⮦ᩉ䟆愚䰶埸縜䬾䣃岊燝時岞䞕ʦ僲䒚䜸凼㼘縀䓴áन恩䆍ణ䀬䄻㖦҃✨ᢊ䇑䙙䭴ኌᦴẐʓ䊜䔗惷㽌➸㒂煑䭭䅏૮ᜂ戠咾䮁珦ᔟ䊼叮ᥳ犑哴፴糎琮䍰ℼ⩈䗯屟娣琠$䈠〜̡㚡䍫⨃⡨⩷狌ⵌ΄ӌ༙淳嗊᪡䚙䲷䅎ୗ祭煭Ḭᶉ碴珇睯庿ጐ懇瑫ᨂ㐘昹倃Ả催籃䈤琔瞡䚾ຣ窦夝琡吅䂅位ῄᾅݹ痳渠ૡ孞䚄崖㨕ྒྷ焏佑㌀杁ࣴ�ਹ唨㻹䃞䆝劘宮珣柵佯ῲ㵤繑ḕ罛澈䖿⌲崢ģ娫ыኌ泘敔₸䣥籠ވ⢼伩᳀ᒜ䦉〤௵ၐ⽒ⱁ㽲祢㺤ᕢⱓ糁惰㔭䕀ᦙ䯡⢁俨燇ᅆΠπࣛ可㑿睝઼㴓ڱ䰂⧠䣌忔䷪䂵秫穷偯悾䞥␥ԗ֪䅁ᙎ⽊䧒㶴㡥禳晇瑰ᢈ⫝̸ኜ捄㘗䄬䀠㠦㱿䆠গఠÏ籿熓兇᧯㴽ఁ䏽⿱ᾱ㷤簲絒ᗏ籑ᾀḾ㘒๐ን、⅕㺺⛵监曷瞬签圑ᶛ崞焝毲ៈ潘妣䀁❭猪 ᤶ㟓ᑙ庸ᱠҔकუ䄷㥡䎣㤥僊备㠔攙忓㸆硍瑻緣榏狿ᗞ᪅望⸗䄠?ត㍈㷞ᮞ⤅寬*瀇炛⏠ϯ絒㾏ᡱ㷝捳会焐尀矕䟣彧㴖ľ無Ɨ燬廿㏞Ν屵渄ᰇ婩澰燗㳣䓆䍎ᐌ⊘宪ៜ淤㱧伦簞ਧ濈棐㮟冝炃繃ᰏ֬慧〠ဠ惏瞥碙瀠翆‣眓ᤪ䡧ᰎ⺂禜㦷ֺ߳㹪壼䃿ɲێ禄Фಈ㡞⃓䄞㺷梣ᦻѼ䝅䊐緞ϣ熞ฯ劄䑞咠儚挚碰䠘⺖㎫ʈ缱粹䆧戣猿ᎉ⒝灇ሜ䐇㭆ࡇ䋌㻾ࢁ碬䖅ሃ傿撑剞䀠᪘ḹ槱ဪ㠄溮卒ᚚ൙眼ʿ奯Ხ傉牉㞰̲࠘㓣ᑔ缞⠔淧暪嘙㇠瞬㐉Ğ俘⫂ऒ䛼⻓獶㤾ᤐ㼿慁洚⽭㐭刐ᏻ䗂᧼缠嬔१ధ⳰堰炝ボ㓥琎烞⥗ύ㢁⌄˄敫犰൏̥冟祕䘓☕筚亍ᱝ䅠䈥竣簷樇屔姡䀑ⱦ㪔㔚ᑋޖ惫Զ僦䑫祫爷縴⫟䦜傻启>培䩦徏Ẋ纩筡瓓亇痄┽嶝द娥᰼ᡕ≡ဣ㺦羰⏯秏窄䧞㖝嵞ا沒䨹ℓ䀝前簽伧ᵏ䁿͠䆜徝昝䀿᠊␣ᄭᾺ㲦悏淉ᣱ䮝⣅⸓⁾秪濥၀ӽῧʼ瓗昏䈇⭸榜猜昝尛濣ޙ㹐5穛瑷甏眀⍠斞⼚掣ᐽ矹唛某耇ᴬ䓈䒦㴤㸿徍䤝偢婩❋ូ徦໔熁㪍䟠ˈᜱ祉وㅃ㢕瘁ౝ吴㽸耐傃绲ʂ⫢Გ繯撔弥⧠Ꭷဆ灜㾅༜粞摠ɫ皮㩿⛹˲恣㘭ऊ寡ℶ㿥ׅ粪ズ㮑㙲㡫㯿㙜䉾ᬺ摹℮ㄳ椻ࢬ缮䆓礒纔タ㞠⊜⌕䨚ᑂ瑻低幥㽔箥熏绰 ჸ㺡㶣ⴑ樕琛柞使ḭ緇⁽䇈עੇ巘䞯⥰樠ဂ繒㟓㾰恍缪綥甄槗㞿९Ḛ㴖樃㏻柍倀Җ㼧翮䒸卟䪔ᑯ㾢娛͛摣⡞㿰翦繒㲚綩礿昷棏实凣ẘ㰐倅桁䐄美绳罗惯禀ӟ浏伟充琟㢻ʿ〞㿸ᑆ棣耊碯睿機䶟ᤞ瘟渟䠔砉忹⎶羻Ṟ㿇紗瑟愇侟ὠ䁰兞嫮ؗЭᡟ㞅罭綯确ş竟䷟樟㷂栜㰘候快栅缾羔㐔◿緿瞟伟᷸П犪ᑱ耔忡倳㾚彝㳋糍緃簷₇紃粏簷糶Ჷ絳籷緻絝緍ㆧ緓縗粘Ǘ綠䨟䇱ㅴ絤᳄⧰όƟ縟籋緭糯綠ˇ絠ˏ締̻籽米緽絞㲿粐̧䱯愈ϚゝƘ儓��ƽ儌塸ȭøʻեḜ壘ʘɘʢ夤ϸ́⠢䰸⥋祥ㄋᲑ㇢䴺燻礒ₑআ䷢䷿᷼碁傴ЈΑ慔Ϛぶ焛ㄔɷᷴͦ〬ȷㄔμ㱜㴀#絀³岯Т㱋ÌɌ┬ϗ㢁儌͌Ϝᇌʼ綐梜㸌ϼɌ☎ᶨ<ʌȵ縞ᴢ͉昘Ό㱢Μ̼┱ᰢ˂ώ䖝৵ⅉŢ˜凱ㄲβʼͶ稚㵲ɫDzɼ凒ʲ̂΄凲ρᨚ焪ɒʸ稚㵪̢ၜʒ僊ϐ�划ɲ͕¸嶋ᱟᶔ〲˞傱ʁↀ愃⤚ɵ偭凢ˑ愦ˀ唥ᣦʆᵻⶂ䧛μʝ凵冪ढⱂࢴ∟Ⴠࣱ糋楿Àöͷ烢ʄȪॶЄᤱඦ⣖ʖȬ⑶Ιⷶɷ傴ℨ㦖ϑḖ͍ࢎʮ̈籮ʾˎʁ⁇Ƙ偫ļ⇱ᰠफ़ϸ傞ЎϺʑ㈞Ϟɲ綮ㅡ͉ġΚȭȉ烬冀℁Ϫ̄㢁倱ɬήㅱ˷㥱儨䂅ȟ璈श◑Α̖Ρʩ倩ɀᥩ͟畩ᅩКБː�͋¦̆͒ʝ冃ȉКȶᧉ˕偊᧑ʞ⠫粬չΙʡʬΔ〥Ȱ䂒䵓եˠǞ啹̱Ή̀¬偬ʹɊɹϑ̱ə̉́ˑ̉ͣ㇝ᤰ᧑ʕͳⷄΩϠᨕέ㆕ϵЅȭɰ丞ͣÿ㰬ࢍ͟㲵αʝ倽М緳ᅽɟ條ã䓔ᱧ傝ʱЋ礬ᵉ籔ɚ樝ϯ䕣˷䘄焀䰥⤮䶆ဣΙ碣Ʌ紺゠䳯䑙䱕⥦ၥ㸎䃵傝¨兌㲻�̓Ѓʺ椳ɪᴺㄌ㷓̙ᶫ˵糓ʝ«͢⤙燀⣏�njϟî焣緌焭ƻɐŻϵ⇻ɜ⢥І˶ᶣʝ凛͕{˻ɛЉ綦䁇Λˇ̧ʻ̇θইϝ᳑ᆝᵧΔɹ熮㇗ϔиॷʹ撰紸ᄃ⤗Ϩ̕擺Υ˒䅗ʑワЗ灏ʇʛȿˉĸႷЎ偿ͩ⒯؏˼兎桉▦ʄʾ䂳ˉ粟ͳ᨟Η̯ϯ̟ʈᇿͮ哿ìⅳ梃ϟ̀䎯楌0䎟Ę̠䎶燫ɠ䉰䍜ㇰ䍳͑䨏А䊌İ䌁⨏͔ℷ泆㲉၈䋀�籥᳐䎏ȿ屰䍈䊿̇˺䔈䉊ၰ䎟ɷοʘ䉫ˉ䣫К᳗Ϙ䎤ɀ䌘䎽冀䋃◤⁰㓐̥熿̠儴䴉ᴸ䎠䊁刏̴䋸䉟ɔ䋄䍜瑤簬ਏδ簤䐝䢤䍅粃䈷Ĵ籼懬䊤粔䋇ᔵ䵊ฏ̌䏫Χʏʹ䋧ɰ䊼䊅㵲ᵜ䍻刔╗Ŗ槇Ȧϔ╝䐷ͯಽ̣˪Ჸ䊃™䉂䐛͢䋗ဲ䎢䈧ɸ䓙㇘ˤˬ典ϒ䉾ᷩჩ嶩-�Ē䋽Ś粄綔⃑㱧ഄ絫䆠䅊䍟ピ偼ᰯ䥯綜¸䁀⃘儩㶩㰵兪☋冺䋲憹䎘А儦䍄䍉冐µ㶎ᗦ䋸惋儯巄巼ᰦ㳡类Ŋ䆑僳䁨⇏籈ˉ糆䏧岲㳦䍭㷫崖䎢ㆆ䍐ℬᰶ䈸悶䉳䁶䊊䃶䏨Ї紺䉨ⅻ嵭㷻屆䍊嵵㰤燈悮䊵ヽDž㳮䌩ㅳ䈂㲩Ƕ䎎䍖䋖䏳ჾ䏘惦䐎䏨慛巁䊂პ䐆䎞䋗Ǯ䈡䌤䀮䎡䎏粝僾䈾䍑䧑䍁䌒ၾ䋤㰺⇜ᇾ䋑ᅞ䌛崆䊾㵮䎱䐞䍎䋱䋸恑䍀ʑㄩ䎭㶦⥹䍳凐Ė䏝嵩䋩䌹ᇏ‱䏉䊱䊔䁱䐉䎪ǎ䈻籡䊁儩䊑䏹䎙䐑䊦•კ䊁䊯ҵ䊀ę䐍愥䉮䎥䍌ť䏊䀹䊡䊎䍑䎔ヵ䎅䎑祭䈵䏴䤕�䉵䍜緍䐅䐁䍉䎮䋪䉥䌉䐕䏥䌹䊭䎹䈮ʌွ䉆ḍ䌢Ⴞ䎙偐ɒ礐緵䎍䍊ඝ秣䉕䋓惕䉽䊕䌕䍶䋝䍅䎭䉉ㅣ䋬⅐䓭䍓׃䋣䏓䍍䋽œ䎃䊩䍀籇冫䏓䌃䈧怳䋶ᵽ䎕䏽䍶䉅䌇緳䐜偋䋙䊓䐕䏵䊖䎭ͫ䏈䏬夛䏆䉾瀥䊽䏞䌋䎳䌡䏃䇝䌺㇃䉛䌧䏌�䊦ℇ䐛䋴緥儛䋋䊡悋䋒䁇䈻䋎䍳䎻䊝䈵偗䋹䎑硷䌫䉌ᅷ䌄䍙壴ᅗ䋵懗䉑䂳䌗䈭䏇䋳䊯䋑慏䍯䏦Ⓑ䍼⅏䋏䈣㗔႟䌏䉉䈷巧䊿䎶䉝䏱䊇䋉縟䋟䌥ᤀ⊻党ⱃ䊝ᦰ≠⍧䋠⌱䍿䤞䍀≳䌭䋿䉋КⱤȇ䋾懆Ɒ⎙⣰∠≿ഓႨ⏛䎧䉞䉐⊯峐⋕㶉䎐␗䐐⌯䌨⍈␀≚惨⎣䋜⦳况䊷痃傣䐈⏩䌸⋉䏕䏐⍸≎䋀∯䉀̺〺偙䊳偤⊤⎁ᄤ⌈⎤⊍䌽䍐⊥䏄⋽䋸⋱䊻䈴⋉粴␝䊯瑔␘⊦冴⌢ƴ⌮䋧䎸⍃㲄⍱䎪Ȅ≖䊁傌⍩䊘⏬ᆇY䏾⨌␝䌌⏔⌺ဿ䊞䐔␋䌬⍝䉘≬⋜␜⏬⋺ಢ⊣䎟䋚₥∥ᵈᷲ⋤␙䎿Ǣ⎗䏂⎬⍜⊝写Ოh⌃ි≒⤙ᷙ䏭已⏰⌒⊼⌔≸∬⎄⌻䉜⋅䉪⌊⎜≊⏊⍲␍ᱽ᳗R⏨瘚⎪粔䈊⎨Ȓ≀⍺⋇䐋絘⋉籦⋡緪⌻ൡ簸愚≶⌦⊦⌫簶⍶⏦⍆⍂⍇䊬⏺≻䉧⋦⊶⍘懖≖⌫䏕ᶨ⍃䎩䊎≰⋢⌺⋄⎺⋂⏆≿䎆⌂≹ᷮ̕⌅‾⍲␞⍖␙ʞ⎖⎾⌳䐖⎿䊂⍿䌆⊁儡⏚≼愁⎘ᅇ岡∦ֱ⊒⍕䌺≍簪⏾⏼⎂⎪⎔ヱ␐儩⋇岊⎎ᖱ⍡⎔⋑⋆⋼⏀∨⋉緩␁⍘怹⎘თ山⌸չ⏱␃䍑⌋緑⊉⊮⏿䉀ၙ␐傥⏗嵩⍊൹≉⊸⏧㲗䏉⋥䎉⊁⊝偅⌹⌅₵⏅懐࠼₼⁼ₗŭ惬ᇑ㴑┘⇎䇇ℕ℔䂥₄→⇐Ⲙ絍b⢈⡄恳ਐ燢䇭ⅴøþ䇊uď⤂オ䇕ᴳホ巈�ǚ煖⡍⅕䃌䃿䆐ø#␌䆑₤↯Ơ䁠℆H⅕Ã≰Ďࢤथ粆⌓>催¬峋㱑䅌帝䄣兠䈘⅔Ǩ⍉⅔䆫⎸⇪䃈冡楰ऄ岴傕䏤ࢢǔŃ⋨Ǥ嶃∣峣⏢Ż⌤䅭≣⍢ã⊊�⎩ų⊈⃑怸⅓⊝Ǔ⊜嶓⋪䊢峫⊅₩䅋≍7≡⇕䆷≸₋⊝㦤⌰Ě䎄⃘ƨDŽ䇝⌅ᶝ⎐Âĝ⌳⎋gĈÊã≃⌸ĸË⊙ᵘ悺䃹ȏ∹₢øÏ⍟⍭ã⋂ 戥緭≴ǔÛ崿⊢䁧Hà掐�Û屻⊿≆⇟≴Ǜ⎰扷䅰拿⎐恆`揟⊟⍍ú䗗㠠䂸䃗Ȏ䅩áᣦ䃤Ɉ扡ᦛù惐䄣兰抅瀪䐑䅵ǵńⴠⅢ္䆊炠 "}
The complete round-trip took 42.1 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.11", "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-8688-N5T7fXJFzwDu-.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-8688-N5T7fXJFzwDu-.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-8688-N5T7fXJFzwDu-.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-8688-N5T7fXJFzwDu-.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-8688-N5T7fXJFzwDu-.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-8688-N5T7fXJFzwDu-.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-8688-N5T7fXJFzwDu-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8688-N5T7fXJFzwDu-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8688-N5T7fXJFzwDu-.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":0}}}} -
request-slice(request)Show Details
Of course, the second slice criterion
2:1is redundant for the input, as they refer to the same variable. It is only for demonstration purposes.{ "type": "request-slice", "id": "2", "filetoken": "x", "criterion": [ "2@x", "2:1" ] } -
response-slice(response)Show Details
The
resultsfield of the response contains two keys of importance:-
slice: which contains the result of the slicing (e.g., the ids included in the slice inresult). -
reconstruct: contains the reconstructed code, as well as additional meta information. The automatically selected lines correspond to additional filters (e.g., magic comments) which force the unconditiojnal inclusion of certain elements.
{ "type": "response-slice", "id": "2", "results": {} } -
The complete round-trip took 6.5 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.11", "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.11", "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-8688-4Ht0VFTZYjSR-.R"}],".meta":{"timing":3}},"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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":2,"role":"call-arg"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.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-8688-4Ht0VFTZYjSR-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8688-4Ht0VFTZYjSR-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8688-4Ht0VFTZYjSR-.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 23.7 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, all dependency types are searched for.
Valid item types:
- . string
- 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