diff options
Diffstat (limited to 'docs/src')
| -rw-r--r-- | docs/src/api/overview/discovery.md | 49 | ||||
| -rw-r--r-- | docs/src/api/overview/getconfig.md | 52 | ||||
| -rw-r--r-- | docs/src/gettingstarted/README.md | 4 | ||||
| -rw-r--r-- | docs/src/gettingstarted/building/README.md | 2 | ||||
| -rw-r--r-- | docs/src/gettingstarted/building/go.md | 8 | ||||
| -rw-r--r-- | docs/src/gettingstarted/building/packageformats.md | 1 | ||||
| -rw-r--r-- | docs/src/gettingstarted/debugging/README.md | 2 | ||||
| -rw-r--r-- | docs/src/gettingstarted/debugging/fsm.md | 36 | ||||
| -rw-r--r-- | docs/src/gettingstarted/debugging/fsm_example.svg | 2 | ||||
| -rw-r--r-- | docs/src/gettingstarted/testing.md | 6 |
10 files changed, 43 insertions, 119 deletions
diff --git a/docs/src/api/overview/discovery.md b/docs/src/api/overview/discovery.md index 0999912..4004ec4 100644 --- a/docs/src/api/overview/discovery.md +++ b/docs/src/api/overview/discovery.md @@ -4,7 +4,7 @@ Name: `Get Disco Servers` and `Get Disco Organizations` Arguments: None -Returns: `JSON string for servers/organizations` and `Error for servers/organizations` +Returns: `structure for servers/organizations` and `Error for servers/organizations` Note: Depending on the wrapper they may be combined into one function, the return value of this function is then the following: `organizations, error for organizations, servers, errors for servers` @@ -13,51 +13,6 @@ Used to obtain the servers and organizations list from the discovery server. ## Detailed information Discovery is the aspect of eduVPN that allows a client to gather all the servers and organizations it can connect to. For this a discovery server is used, which is registered as `https://disco.eduvpn.org` in the library. We refer to the [official eduVPN documentation](https://github.com/eduvpn/documentation/blob/v3/SERVER_DISCOVERY.md) to learn more about the exact way that these organizations and servers are structured. -The JSON data that this returns must be used by the client to build an UI. It is common for clients that the discovery functions get called on startup of the client. Note that there can be an error in retrieving the newest version of the servers/organizations. However, this library's goal is to ensure that a version is always available. Thus, a local copy is distributed with this library in the future. +The data that this returns must be used by the client to build an UI. It is common for clients that the discovery functions get called on startup of the client. Note that there can be an error in retrieving the newest version of the servers/organizations. However, this library's goal is to ensure that a version is always available. Thus, a local copy is distributed with this library in the future. This library also internally looks at the version of the servers and organizations such that rollbacks attacks are prevented. The client does not have to do any additional checks for this. - -The structure of the JSON data is the structure in the [official eduVPN documentation](https://github.com/eduvpn/documentation/blob/v3/SERVER_DISCOVERY.md) without the `v` (version) field. So, for example, the servers list has a possible JSON structure of this: - -```json -[ - { - "server_type": "institute_access", - "base_url": "https://hku.eduvpn.nl/", - "display_name": { - "en-US": "Utrecht School of the Arts", - "nl-NL": "Hogeschool voor de Kunsten Utrecht" - }, - "keyword_list": "hku" - }, - { - "server_type": "secure_internet", - "base_url": "https://eduvpn.rash.al/", - "country_code": "AL", - "support_contact": [ - "mailto:helpdesk@rash.al" - ] - } -] -``` - -And the organizations list has a possible JSON structure of the following: - -```json -[ - { - "display_name": { - "nl": "SURFnet bv", - "en": "SURFnet bv" - }, - "org_id": "https://idp.surfnet.nl", - "secure_internet_home": "https://nl.eduvpn.org/", - "keyword_list": { - "en": "SURFnet bv SURF konijn surf surfnet powered by", - "nl": "SURFnet bv SURF konijn powered by" - } - } -] -``` - - diff --git a/docs/src/api/overview/getconfig.md b/docs/src/api/overview/getconfig.md index 4e1e9fb..2a05784 100644 --- a/docs/src/api/overview/getconfig.md +++ b/docs/src/api/overview/getconfig.md @@ -1,11 +1,11 @@ # Getting an OpenVPN/Wireguard config ## Summary -name: `Get Config Institute Access` and `Get Config Secure Internet` +name: `Get Config Institute Access`, `Get Config Custom Server` and `Get Config Secure Internet` -| Arguments | Description | type | -| --------- | ---------------------------------------- | -------- | -| URL | The url of the VPN server to connect to | string | -| Prefer TCP | Whether or not to prefer the use of TCP | string | +| Arguments | Description | type | +| --------- | ----------------------------------------------- | -------- | +| Identifier | The url/org ID of the VPN server to connect to | string | +| Prefer TCP | Whether or not to prefer the use of TCP | string | Returns: `OpenVPN/Wireguard config (string)` `wireguard/openvpn type (string)`, `Error` @@ -13,10 +13,10 @@ Used to obtain the OpenVPN/Wireguard config ## Detailed information -To get a configuration that is used to actually establish a tunnel with the VPN server, we have the Get Config function for Institute Access and Secure Internet (the exact name depends on the language you're using) function in the library. This function has two parameters *URL* and *Prefer TCP*. +To get a configuration that is used to actually establish a tunnel with the VPN server, we have the Get Config function for Institute Access, Custom Servers and Secure Internet (the exact name depends on the language you're using) function in the library. This function has two parameters *URL* and *Prefer TCP*. -*URL* is the base url of the server to connect to -e.g. `nl.eduvpn.org`. Use the correct function to indicate if it is an Institute Access server or a Secure Internet server. A user configured server is often an Institute Access server. In case of a Secure Internet server and no Secure Internet was configured previously, this URL is set as the home server. This means that this server is set as the authorization server for all secure internet servers. +*URL/OrgID* is the base URL of the server to connect to +e.g. `nl.eduvpn.org` in case of Institute Access or a Custom Server. In case of Secure Internet, the identifier is the Organization ID. Use the correct function to indicate if it is an Institute Access server or a Secure Internet server. The *Prefer TCP* flag is a boolean that indicates whether or not we want to prefer TCP to connect over the VPN. This flag is useful if the user has enabled e.g. a setting that prefers the use of TCP, which is only supported by OpenVPN. Note that this setting may be ignored by the server. @@ -38,39 +38,5 @@ This callback can be cancelled by using a `Cancel OAuth` function. ### Callback: Selecting a profile (Ask_Profile) -Another aspect that needs to be taken into account is the fact that there can be multiple profiles that a client can connect to. When the function gets called for obtaining an OpenVPN/Wireguard configuration, it asks the client which profile it wants to connect to using the callback that gets triggered on the Ask Profile state. The data is the list of profiles in JSON format, e.g. - -```json -{ - "info": { - "profile_list": [ - { - "profile_id": "internet", - "default_gateway": true, - "display_name": "IPv4 (NAT) IPv6 (GUA) Access", - "vpn_proto_list": [ - "openvpn" - ] - }, - { - "profile_id": "adblock", - "default_gateway": true, - "display_name": "Malware/Tracking-Blocker IPv4 (NAT) IPv6 (GUA)", - "vpn_proto_list": [ - "openvpn" - ] - }, - { - "profile_id": "dnsonly", - "default_gateway": false, - "display_name": "DNS-Only & Malware/Tracking-Blocker (experimental)", - "vpn_proto_list": [ - "openvpn" - ] - } - ] - } -} -``` - +Another aspect that needs to be taken into account is the fact that there can be multiple profiles that a client can connect to. When the function gets called for obtaining an OpenVPN/Wireguard configuration, it asks the client which profile it wants to connect to using the callback that gets triggered on the Ask Profile state. The data is the list of profiles For actually selecting the profile, there is a separate function which takes care of this. This function takes as only argument the profile ID as a string. diff --git a/docs/src/gettingstarted/README.md b/docs/src/gettingstarted/README.md index f73a736..252c8b1 100644 --- a/docs/src/gettingstarted/README.md +++ b/docs/src/gettingstarted/README.md @@ -1,6 +1,6 @@ # Getting started This chapter contains the steps to get started with the Go library and the Python wrapper. You will learn how to build the library/wrapper, how to run the test suite and how to debug possible errors. -Note that the Python wrapper is the most up to date wrapper. For now, we only document the Python wrapper in this documentation and in the future document the other wrappers as well. +Note that the Python wrapper is currently the only wrapper. So for now, we only document the Python wrapper in this documentation and in the future document the other wrappers as well. -The documentation on how to use this library will be given in the next chapter: [API](../api/index.html). +The documentation on how to use this library in your own code will be given in the next chapter: [API](../api/index.html). diff --git a/docs/src/gettingstarted/building/README.md b/docs/src/gettingstarted/building/README.md index 70df2b7..00295bf 100644 --- a/docs/src/gettingstarted/building/README.md +++ b/docs/src/gettingstarted/building/README.md @@ -1,2 +1,2 @@ # Building -This section contains the instruction on how to build the library and associated wrappers. We first explain how to build the Go library and then further explain the wrapper specific building process. As the Python wrapper is the only stable wrapper at the moment, this only consists of this wrapper language for now. +This section contains the instruction on how to build the library and associated wrappers. We first explain how to build the Go library and then further explain the wrapper specific building process. As the Python wrapper is the only wrapper at the moment, this only consists of this wrapper language for now. diff --git a/docs/src/gettingstarted/building/go.md b/docs/src/gettingstarted/building/go.md index 65f62a5..84c39fd 100644 --- a/docs/src/gettingstarted/building/go.md +++ b/docs/src/gettingstarted/building/go.md @@ -5,17 +5,17 @@ To build the Go library, you need the dependencies for your system installed. We ### Linux To build the Go shared library using Linux you need the following dependencies: -- [Go](https://go.dev/doc/install) 1.15 or later +- [Go](https://go.dev/doc/install) 1.18 or later - [Gcc](https://gcc.gnu.org/) - [GNU Make](https://www.gnu.org/software/make/) -- Dependencies for each wrapper you are interested in +- Dependencies for each wrapper you are interested in (read next sections) ### Windows On Windows, you can install gcc and make (or even Go) via MinGW or Cygwin or use WSL. For MinGW: 1. [Install MinGW](https://www.msys2.org/#installation) (you don't need to install any extra packages yet) and open some MSYS2 terminal (e.g. from the start menu or one of the installed binaries) -2. Install the [`make`](https://packages.msys2.org/package/make?repo=msys) package (`pacman -S make`) (or +2. Install the [`make`](https://packages.msys2.org/package/make?repo=msys) package (or e.g. [`mingw-w64-x86_64-make`](https://packages.msys2.org/package/mingw-w64-x86_64-make?repo=mingw64) and use `mingw32-make` in the command line) 3. To compile for x86_64: @@ -57,7 +57,7 @@ make GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc For example, you can cross compile for Windows from Linux using [MinGW-w64](https://www.mingw-w64.org/downloads/). -This shared library gets loaded by the different wrappers. To build the actual wrapper code, you need other build commands. This will be explained now +This shared library gets loaded by the different wrappers. To build the actual wrapper code, you need other build commands. This will be explained now. ### Cleaning To clean build the library and wrapper, issue the following command in the root directory: diff --git a/docs/src/gettingstarted/building/packageformats.md b/docs/src/gettingstarted/building/packageformats.md index 70516d9..02c9be9 100644 --- a/docs/src/gettingstarted/building/packageformats.md +++ b/docs/src/gettingstarted/building/packageformats.md @@ -39,3 +39,4 @@ make rpm-mock MOCK_TARGET=centos-stream-8-aarch64 A list of targets can be found in ```/etc/mock/*.cfg```. The default target is `fedora-36-x86_64` # Linux: Deb +The debian files can be found on a different [GitHub repository](https://github.com/jwijenbergh/python-eduvpn-common.deb). The debian packages for this repository are then build with [nbuilder.deb](https://git.sr.ht/~fkooman/nbuilder.deb). diff --git a/docs/src/gettingstarted/debugging/README.md b/docs/src/gettingstarted/debugging/README.md index e3a1ecd..0b402a9 100644 --- a/docs/src/gettingstarted/debugging/README.md +++ b/docs/src/gettingstarted/debugging/README.md @@ -3,4 +3,4 @@ To debug this library, e.g. to discover bugs or to see how it works internally, the library comes with a few nice additions. ## The debug variable -To enable debugging, set debugging to True in the method that registers the code with the library (see [API](../api/index.html)). This sets the logging level to `INFO` (meaning show all messages), and generates a Finite State Machine (FSM) PNG file. We explain in more detail what these two components (logging and FSM) exactly are and how they can be used. +To enable debugging, set debugging to True in the method that registers the code with the library (see [API](../api/index.html)). This sets the logging level to `INFO` (meaning show all messages), and generates a Finite State Machine (FSM) `.graph` file. We explain in more detail what these two components (logging and FSM) exactly are and how they can be used. diff --git a/docs/src/gettingstarted/debugging/fsm.md b/docs/src/gettingstarted/debugging/fsm.md index 8479a92..15b1a12 100644 --- a/docs/src/gettingstarted/debugging/fsm.md +++ b/docs/src/gettingstarted/debugging/fsm.md @@ -3,11 +3,11 @@ The eduvpn-common library uses a finite state machine internally to keep track of which state the client is in and to communicate data callbacks (e.g. to communicate the Authorization URL in the OAuth process to the client). ## Viewing the FSM -To view the FSM in an image, set the debug variable to `True`. This outputs the graph with a `.graph` extension in the client-specified config directory (See [API](../../api/index.html)). The format of this graph is from [Mermaid](https://mermaid-js.github.io/mermaid/#/). - -If you have the [Mermaid command line client](https://github.com/mermaid-js/mermaid-cli) installed, the Go library will automatically provide a PNG file in the same directory of the `.graph` file. We recommend to use an image viewer that has auto-reload capabilities, such as [feh](https://feh.finalrewind.org/)[^1] for Linux. - -If you do not want to install additional tools to view the graph, you can submit the contents of the `.graph` file to the [Mermaid Live Editor](https://mermaid.live/) to see the image. +To view the FSM in an image, set the debug variable to `True`. This +outputs the graph with a `.graph` extension in the client-specified +config directory (See [API](../../api/index.html)). The format of this +graph is from [Mermaid](https://mermaid-js.github.io/mermaid/#/). You +can convert this to an image using the [Mermaid command-line client](https://github.com/mermaid-js/mermaid-cli) installed or from the Mermaid web site, the [Mermaid Live Editor](https://mermaid.live) ## FSM example The following is an example of the FSM when the client has obtained a Wireguard/OpenVPN configuration from an eduVPN server @@ -18,15 +18,17 @@ The current state is highlighted in the <span style="color:cyan">cyan</span> col ## State explanation The states mean the following: - -- `Deregistered`: The client has not registered with the library yet, the state variables are not initialized -- `No_Server`: The client is registered, but has not chosen a server yet -- `Chosen_Server`: The client has chosen a server to connect to -- `OAuth_Started`: The OAuth process has been started. This means that the client needs to redirect to the browser so that the user can login and approve the application -- `Authorized`: The OAuth process has finished. The client now has tokens and is thus authorized -- `Request_Config`: The client is in the process of requesting an OpenVPN/Wireguard configuration from the server -- `Ask_Profile`: The server has multiple profiles for which a config can be obtained, the client must show an UI of the profiles. The user then selects one of these profiles to exit this state -- `Has_Config`: The client now has a configuration that it can use to connect using OpenVPN/Wireguard -- `Connected`: The client is connected to the VPN - -[^1]: We recommend the following arguments for feh: `feh --auto-reload --keep-zoom-vp directory/example.png`. This auto reloads the feh image viewer and keeps the zoom level when reloading +- `Deregistered`: the app is not registered with the wrapper +- `No_Server`: means the user has not chosen a server yet +- `Ask_Location`: the user selected a Secure Internet server but needs to choose a location +- `Search_Server`: the user is currently selecting a server in the UI +- `Loading_Server`: means we are loading the server details +- `Chosen_Server`: means the user has chosen a server to connect to +- `OAuth_Started`: means the OAuth process has started +- `Authorized`: means the OAuth process has finished and the user is now authorized with the server +- `Request_Config`: the user has requested a config for connecting +- `Ask_Profile`: the go code is asking for a profile selection from the UI +- `Disconnected`: the user has gotten a config for a server but is not connected yet +- `Disconnecting`: the OS is disconnecting and the Go code is doing the /disconnect +- `Connecting`: the OS is establishing a connection to the server +- `Connected`: the user has been connected to the server. diff --git a/docs/src/gettingstarted/debugging/fsm_example.svg b/docs/src/gettingstarted/debugging/fsm_example.svg index cc0e33a..8e20808 100644 --- a/docs/src/gettingstarted/debugging/fsm_example.svg +++ b/docs/src/gettingstarted/debugging/fsm_example.svg @@ -1 +1 @@ -<svg viewBox="0 0 1424.5 902" style="max-width: 1424.5px; background-color: white;" height="902" aria-labelledby="chart-title-mermaid-1657014027196 chart-desc-mermaid-1657014027196" role="img" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="100%" id="mermaid-1657014027196"><title id="chart-title-mermaid-1657014027196"></title><desc id="chart-desc-mermaid-1657014027196"></desc><style>#mermaid-1657014027196 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-1657014027196 .error-icon{fill:#552222;}#mermaid-1657014027196 .error-text{fill:#552222;stroke:#552222;}#mermaid-1657014027196 .edge-thickness-normal{stroke-width:2px;}#mermaid-1657014027196 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-1657014027196 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-1657014027196 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-1657014027196 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-1657014027196 .marker{fill:#333333;stroke:#333333;}#mermaid-1657014027196 .marker.cross{stroke:#333333;}#mermaid-1657014027196 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-1657014027196 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-1657014027196 .cluster-label text{fill:#333;}#mermaid-1657014027196 .cluster-label span{color:#333;}#mermaid-1657014027196 .label text,#mermaid-1657014027196 span{fill:#333;color:#333;}#mermaid-1657014027196 .node rect,#mermaid-1657014027196 .node circle,#mermaid-1657014027196 .node ellipse,#mermaid-1657014027196 .node polygon,#mermaid-1657014027196 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-1657014027196 .node .label{text-align:center;}#mermaid-1657014027196 .node.clickable{cursor:pointer;}#mermaid-1657014027196 .arrowheadPath{fill:#333333;}#mermaid-1657014027196 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-1657014027196 .flowchart-link{stroke:#333333;fill:none;}#mermaid-1657014027196 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-1657014027196 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-1657014027196 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-1657014027196 .cluster text{fill:#333;}#mermaid-1657014027196 .cluster span{color:#333;}#mermaid-1657014027196 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-1657014027196 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><g class="output"><g class="clusters"></g><g class="edgePaths"><g style="opacity: 1;" id="L-Deregistered-No_Server" class="edgePath LS-Deregistered LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead130)" d="M515.6875,46L515.6875,51.666666666666664C515.6875,57.333333333333336,515.6875,68.66666666666667,515.6875,80C515.6875,91.33333333333333,515.6875,102.66666666666667,515.6875,108.33333333333333L515.6875,114" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead130"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-No_Server-Chosen_Server" class="edgePath LS-No_Server LE-Chosen_Server"><path style="fill:none" marker-end="url(#arrowhead131)" d="M467.4453125,138.9787175739861L404.2096354166667,146.81559797832176C340.9739583333333,154.6524783826574,214.50260416666666,170.3262391913287,151.26692708333334,186.99645292899768C88.03125,203.66666666666666,88.03125,221.33333333333334,88.03125,239C88.03125,256.6666666666667,88.03125,274.3333333333333,99.07598761792453,288.8333333333333C110.12072523584906,303.3333333333333,132.21020047169813,314.6666666666667,143.25493808962264,320.3333333333333L154.29967570754718,326" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead131"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-No_Server-Search_Server" class="edgePath LS-No_Server LE-Search_Server"><path style="fill:none" marker-end="url(#arrowhead132)" d="M467.4453125,143.43972694503813L434.6666666666667,150.53310578753178C401.8880208333333,157.62648463002543,336.3307291666667,171.81324231501273,309.2337853773585,184.57328782417304C282.13684158805034,197.33333333333334,293.50024567610063,208.66666666666666,299.1819477201258,214.33333333333334L304.8636497641509,220" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead132"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Search_Server-Chosen_Server" class="edgePath LS-Search_Server LE-Chosen_Server"><path style="fill:none" marker-end="url(#arrowhead133)" d="M323.9140625,258L323.9140625,263.6666666666667C323.9140625,269.3333333333333,323.9140625,280.6666666666667,309.7386251965409,292C295.56318789308176,303.3333333333333,267.2123132861635,314.6666666666667,253.0368759827044,320.3333333333333L238.86143867924528,326" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead133"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Search_Server-No_Server" class="edgePath LS-Search_Server LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead134)" d="M387.2734375,220.73423423423424L407.3541666666667,214.9451951951952C427.4348958333333,209.15615615615616,467.5963541666667,197.57807807807808,488.52491155660374,186.12237237237238C509.45346894654085,174.66666666666666,511.14912539308176,163.33333333333334,511.9969536163522,157.66666666666666L512.8447818396227,152" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead134"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Chosen_Server-Authorized" class="edgePath LS-Chosen_Server LE-Authorized"><path style="fill:none" marker-end="url(#arrowhead135)" d="M256.91796875,363.60640655710284L277.1236979166667,369.33867213091906C297.3294270833333,375.0709377047353,337.7408854166667,386.5354688523676,357.9466145833333,397.93440109285046C378.15234375,409.3333333333333,378.15234375,420.6666666666667,378.15234375,426.3333333333333L378.15234375,432" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead135"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Chosen_Server-OAuth_Started" class="edgePath LS-Chosen_Server LE-OAuth_Started"><path style="fill:none" marker-end="url(#arrowhead136)" d="M172.07016509433961,364L166.325397995283,369.6666666666667C160.5806308962264,375.3333333333333,149.0910966981132,386.6666666666667,143.3463295990566,401.1666666666667C137.6015625,415.6666666666667,137.6015625,433.3333333333333,137.6015625,451C137.6015625,468.6666666666667,137.6015625,486.3333333333333,137.6015625,504C137.6015625,521.6666666666666,137.6015625,539.3333333333334,137.6015625,557C137.6015625,574.6666666666666,137.6015625,592.3333333333334,163.04361979166666,607.4217237151262C188.48567708333334,622.510114096919,239.36979166666666,635.0202281938379,264.8118489583333,641.2752852422974L290.25390625,647.5303422907568" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead136"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-OAuth_Started-Authorized" class="edgePath LS-OAuth_Started LE-Authorized"><path style="fill:none" marker-end="url(#arrowhead137)" d="M394.1627358490566,644L406.38691529088055,638.3333333333334C418.61109473270443,632.6666666666666,443.0594536163522,621.3333333333334,455.2836330581761,606.8333333333334C467.5078125,592.3333333333334,467.5078125,574.6666666666666,467.5078125,557C467.5078125,539.3333333333334,467.5078125,521.6666666666666,457.95408313679246,507.1666666666667C448.40035377358487,492.6666666666667,429.2928950471698,481.3333333333333,419.73916568396226,475.6666666666667L410.1854363207547,470" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead137"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-OAuth_Started-No_Server" class="edgePath LS-OAuth_Started LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead138)" d="M416.09765625,650.6061727857382L450.4563802083333,643.8384773214485C484.8151041666667,637.0707818571587,553.5325520833334,623.5353909285794,587.8912760416666,607.9343621309564C622.25,592.3333333333334,622.25,574.6666666666666,622.25,557C622.25,539.3333333333334,622.25,521.6666666666666,622.25,504C622.25,486.3333333333333,622.25,468.6666666666667,622.25,451C622.25,433.3333333333333,622.25,415.6666666666667,622.25,398C622.25,380.3333333333333,622.25,362.6666666666667,622.25,345C622.25,327.3333333333333,622.25,309.6666666666667,622.25,292C622.25,274.3333333333333,622.25,256.6666666666667,622.25,239C622.25,221.33333333333334,622.25,203.66666666666666,610.8565251572327,189.16666666666666C599.4630503144654,174.66666666666666,576.6761006289308,163.33333333333334,565.2826257861635,157.66666666666666L553.8891509433962,152" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead138"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Authorized-OAuth_Started" class="edgePath LS-Authorized LE-OAuth_Started"><path style="fill:none" marker-end="url(#arrowhead139)" d="M334.79318985849056,470L321.8615123820755,475.6666666666667C308.92983490566036,481.3333333333333,283.0664799528302,492.6666666666667,270.13480247641513,507.1666666666667C257.203125,521.6666666666666,257.203125,539.3333333333334,257.203125,557C257.203125,574.6666666666666,257.203125,592.3333333333334,267.46435239779873,606.8333333333334C277.72557979559747,621.3333333333334,298.248034591195,632.6666666666666,308.5092619889937,638.3333333333334L318.77048938679246,644" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead139"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Authorized-Request_Config" class="edgePath LS-Authorized LE-Request_Config"><path style="fill:none" marker-end="url(#arrowhead140)" d="M426.40234375,458.3547763759535L476.310546875,465.96231364662793C526.21875,473.56985091730235,626.03515625,488.7849254586511,681.4818076847484,502.0591293959922C736.9284591194969,515.3333333333334,748.0053557389938,526.6666666666666,753.5438040487421,532.3333333333334L759.0822523584906,538" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead140"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Request_Config-Ask_Profile" class="edgePath LS-Request_Config LE-Ask_Profile"><path style="fill:none" marker-end="url(#arrowhead141)" d="M819.1154186320755,576L831.481598860063,581.6666666666666C843.8477790880503,587.3333333333334,868.5801395440252,598.6666666666666,890.384360259434,610C912.1885809748428,621.3333333333334,931.0646619496856,632.6666666666666,940.502702437107,638.3333333333334L949.9407429245283,644" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead141"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Request_Config-Has_Config" class="edgePath LS-Request_Config LE-Has_Config"><path style="fill:none" marker-end="url(#arrowhead142)" d="M746.0071491745283,576L736.5691086871069,581.6666666666666C727.1310681996856,587.3333333333334,708.2549872248428,598.6666666666666,698.8169467374214,613.1666666666666C689.37890625,627.6666666666666,689.37890625,645.3333333333334,689.37890625,663C689.37890625,680.6666666666666,689.37890625,698.3333333333334,744.6087239583334,714.8057733149839C799.8385416666666,731.2782132966341,910.2981770833334,746.5564265932684,965.5279947916666,754.1955332415855L1020.7578125,761.8346398899026" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead142"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Request_Config-No_Server" class="edgePath LS-Request_Config LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead143)" d="M829.3183962264151,538L844.7275697720125,532.3333333333334C860.1367433176101,526.6666666666666,890.9550904088051,515.3333333333334,906.3642639544024,500.8333333333333C921.7734375,486.3333333333333,921.7734375,468.6666666666667,921.7734375,451C921.7734375,433.3333333333333,921.7734375,415.6666666666667,921.7734375,398C921.7734375,380.3333333333333,921.7734375,362.6666666666667,921.7734375,345C921.7734375,327.3333333333333,921.7734375,309.6666666666667,921.7734375,292C921.7734375,274.3333333333333,921.7734375,256.6666666666667,921.7734375,239C921.7734375,221.33333333333334,921.7734375,203.66666666666666,862.1328125,187.0493821222673C802.4921875,170.432097577868,683.2109375,154.86419515573598,623.5703125,147.08024394466997L563.9296875,139.29629273360396" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead143"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Request_Config-OAuth_Started" class="edgePath LS-Request_Config LE-OAuth_Started"><path style="fill:none" marker-end="url(#arrowhead144)" d="M710.27734375,565.5983671319462L652.2903645833334,572.9986392766219C594.3033854166666,580.3989114212975,478.3294270833333,595.1994557106487,419.3609718946541,608.2663945219911C360.39251670597486,621.3333333333334,358.42956466194966,632.6666666666666,357.4480886399371,638.3333333333334L356.4666126179245,644" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead144"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Has_Config-Connected" class="edgePath LS-Has_Config LE-Connected"><path style="fill:none" marker-end="url(#arrowhead145)" d="M1039.2466833726414,788L1029.3103871855344,793.6666666666666C1019.3740909984276,799.3333333333334,999.5014986242137,810.6666666666666,999.5014986242137,822C999.5014986242137,833.3333333333334,1019.3740909984276,844.6666666666666,1029.3103871855344,850.3333333333334L1039.2466833726414,856" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead145"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Has_Config-Request_Config" class="edgePath LS-Has_Config LE-Request_Config"><path style="fill:none" marker-end="url(#arrowhead146)" d="M1109.307783018868,750L1120.2669025157231,744.3333333333334C1131.2260220125786,738.6666666666666,1153.1442610062893,727.3333333333334,1164.1033805031445,712.8333333333334C1175.0625,698.3333333333334,1175.0625,680.6666666666666,1175.0625,663C1175.0625,645.3333333333334,1175.0625,627.6666666666666,1120.056640625,611.4975607039065C1065.05078125,595.3284547411463,955.0390625,580.6569094822926,900.033203125,573.3211368528657L845.02734375,565.9853642234389" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead146"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Has_Config-No_Server" class="edgePath LS-Has_Config LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead147)" d="M1124.3671875,756.4623452606044L1152.2317708333333,749.7186210505037C1180.0963541666667,742.9748968404028,1235.8255208333333,729.4874484202014,1263.6901041666667,713.9103908767675C1291.5546875,698.3333333333334,1291.5546875,680.6666666666666,1291.5546875,663C1291.5546875,645.3333333333334,1291.5546875,627.6666666666666,1291.5546875,610C1291.5546875,592.3333333333334,1291.5546875,574.6666666666666,1291.5546875,557C1291.5546875,539.3333333333334,1291.5546875,521.6666666666666,1291.5546875,504C1291.5546875,486.3333333333333,1291.5546875,468.6666666666667,1291.5546875,451C1291.5546875,433.3333333333333,1291.5546875,415.6666666666667,1291.5546875,398C1291.5546875,380.3333333333333,1291.5546875,362.6666666666667,1291.5546875,345C1291.5546875,327.3333333333333,1291.5546875,309.6666666666667,1291.5546875,292C1291.5546875,274.3333333333333,1291.5546875,256.6666666666667,1291.5546875,239C1291.5546875,221.33333333333334,1291.5546875,203.66666666666666,1170.2838541666667,186.54924261495034C1049.0130208333333,169.43181856323403,806.4713541666666,152.86363712646803,685.2005208333334,144.57954640808504L563.9296875,136.29545568970204" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead147"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Ask_Profile-Has_Config" class="edgePath LS-Ask_Profile LE-Has_Config"><path style="fill:none" marker-end="url(#arrowhead148)" d="M981.5859375,682L981.5859375,687.6666666666666C981.5859375,693.3333333333334,981.5859375,704.6666666666666,991.3129913522013,716C1001.0400452044026,727.3333333333334,1020.4941529088051,738.6666666666666,1030.2212067610064,744.3333333333334L1039.9482606132076,750" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead148"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Ask_Profile-No_Server" class="edgePath LS-Ask_Profile LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead149)" d="M1013.2311320754717,644L1022.6691725628931,638.3333333333334C1032.1072130503144,632.6666666666666,1050.9832940251572,621.3333333333334,1060.4213345125786,606.8333333333334C1069.859375,592.3333333333334,1069.859375,574.6666666666666,1069.859375,557C1069.859375,539.3333333333334,1069.859375,521.6666666666666,1069.859375,504C1069.859375,486.3333333333333,1069.859375,468.6666666666667,1069.859375,451C1069.859375,433.3333333333333,1069.859375,415.6666666666667,1069.859375,398C1069.859375,380.3333333333333,1069.859375,362.6666666666667,1069.859375,345C1069.859375,327.3333333333333,1069.859375,309.6666666666667,1069.859375,292C1069.859375,274.3333333333333,1069.859375,256.6666666666667,1069.859375,239C1069.859375,221.33333333333334,1069.859375,203.66666666666666,985.5377604166666,186.76896598716178C901.2161458333334,169.8712653076569,732.5729166666666,153.74253061531377,648.2513020833334,145.6781632691422L563.9296875,137.61379592297064" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead149"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g><g style="opacity: 1;" id="L-Connected-Has_Config" class="edgePath LS-Connected LE-Has_Config"><path style="fill:none" marker-end="url(#arrowhead150)" d="M1105.8783166273586,856L1115.8146128144656,850.3333333333334C1125.7509090015724,844.6666666666666,1145.6235013757862,833.3333333333334,1145.6235013757862,822C1145.6235013757862,810.6666666666666,1125.7509090015724,799.3333333333334,1115.8146128144656,793.6666666666666L1105.8783166273586,788" class="path"></path><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead150"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"></path></marker></defs></g></g><g class="edgeLabels"><g style="opacity: 1;" transform="translate(515.6875,80)" class="edgeLabel"><g class="label" transform="translate(-53.3515625,-9)"><rect height="18" width="106.703125" ry="0" rx="0"></rect><foreignObject height="18" width="106.703125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Deregistered' L-LE-No_Server" id="L-L-Deregistered-No_Server">Client registers</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(88.03125,239)" class="edgeLabel"><g class="label" transform="translate(-80.03125,-9)"><rect height="18" width="160.0625" ry="0" rx="0"></rect><foreignObject height="18" width="160.0625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-No_Server' L-LE-Chosen_Server" id="L-L-No_Server-Chosen_Server">User chooses a server</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(270.7734375,186)" class="edgeLabel"><g class="label" transform="translate(-162.7421875,-9)"><rect height="18" width="325.484375" ry="0" rx="0"></rect><foreignObject height="18" width="325.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-No_Server' L-LE-Search_Server" id="L-L-No_Server-Search_Server">The user is trying to choose a Server in the UI</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(323.9140625,292)" class="edgeLabel"><g class="label" transform="translate(-101.8046875,-9)"><rect height="18" width="203.609375" ry="0" rx="0"></rect><foreignObject height="18" width="203.609375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Search_Server' L-LE-Chosen_Server" id="L-L-Search_Server-Chosen_Server">User clicks a server in the UI</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(507.7578125,186)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"></rect><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Search_Server' L-LE-No_Server" id="L-L-Search_Server-No_Server">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(378.15234375,398)" class="edgeLabel"><g class="label" transform="translate(-80.5,-9)"><rect height="18" width="161" ry="0" rx="0"></rect><foreignObject height="18" width="161"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Chosen_Server' L-LE-Authorized" id="L-L-Chosen_Server-Authorized">Found tokens in config</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(137.6015625,504)" class="edgeLabel"><g class="label" transform="translate(-90.28125,-9)"><rect height="18" width="180.5625" ry="0" rx="0"></rect><foreignObject height="18" width="180.5625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Chosen_Server' L-LE-OAuth_Started" id="L-L-Chosen_Server-OAuth_Started">No tokens found in config</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(467.5078125,557)" class="edgeLabel"><g class="label" transform="translate(-103.1484375,-9)"><rect height="18" width="206.296875" ry="0" rx="0"></rect><foreignObject height="18" width="206.296875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-OAuth_Started' L-LE-Authorized" id="L-L-OAuth_Started-Authorized">User authorizes with browser</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(622.25,398)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"></rect><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-OAuth_Started' L-LE-No_Server" id="L-L-OAuth_Started-No_Server">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(257.203125,557)" class="edgeLabel"><g class="label" transform="translate(-87.15625,-9)"><rect height="18" width="174.3125" ry="0" rx="0"></rect><foreignObject height="18" width="174.3125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Authorized' L-LE-OAuth_Started" id="L-L-Authorized-OAuth_Started">Re-authorize with OAuth</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(725.8515625,504)" class="edgeLabel"><g class="label" transform="translate(-83.6015625,-9)"><rect height="18" width="167.203125" ry="0" rx="0"></rect><foreignObject height="18" width="167.203125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Authorized' L-LE-Request_Config" id="L-L-Authorized-Request_Config">Client requests a config</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(893.3125,610)" class="edgeLabel"><g class="label" transform="translate(-156.546875,-9)"><rect height="18" width="313.09375" ry="0" rx="0"></rect><foreignObject height="18" width="313.09375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Request_Config' L-LE-Ask_Profile" id="L-L-Request_Config-Ask_Profile">Multiple profiles found and no profile chosen</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(689.37890625,663)" class="edgeLabel"><g class="label" transform="translate(-145.859375,-9)"><rect height="18" width="291.71875" ry="0" rx="0"></rect><foreignObject height="18" width="291.71875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Request_Config' L-LE-Has_Config" id="L-L-Request_Config-Has_Config">Only one profile or profile already chosen</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(921.7734375,345)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"></rect><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Request_Config' L-LE-No_Server" id="L-L-Request_Config-No_Server">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(362.35546875,610)" class="edgeLabel"><g class="label" transform="translate(-45.8046875,-9)"><rect height="18" width="91.609375" ry="0" rx="0"></rect><foreignObject height="18" width="91.609375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Request_Config' L-LE-OAuth_Started" id="L-L-Request_Config-OAuth_Started">Re-authorize</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(979.62890625,822)" class="edgeLabel"><g class="label" transform="translate(-77.8203125,-9)"><rect height="18" width="155.640625" ry="0" rx="0"></rect><foreignObject height="18" width="155.640625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Has_Config' L-LE-Connected" id="L-L-Has_Config-Connected">OS reports connected</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1175.0625,663)" class="edgeLabel"><g class="label" transform="translate(-96.4921875,-9)"><rect height="18" width="192.984375" ry="0" rx="0"></rect><foreignObject height="18" width="192.984375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Has_Config' L-LE-Request_Config" id="L-L-Has_Config-Request_Config">User chooses a new profile</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1291.5546875,451)" class="edgeLabel"><g class="label" transform="translate(-124.9453125,-9)"><rect height="18" width="249.890625" ry="0" rx="0"></rect><foreignObject height="18" width="249.890625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Has_Config' L-LE-No_Server" id="L-L-Has_Config-No_Server">User wants to choose a new server</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(981.5859375,716)" class="edgeLabel"><g class="label" transform="translate(-72.921875,-9)"><rect height="18" width="145.84375" ry="0" rx="0"></rect><foreignObject height="18" width="145.84375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Ask_Profile' L-LE-Has_Config" id="L-L-Ask_Profile-Has_Config">User chooses profile</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1069.859375,398)" class="edgeLabel"><g class="label" transform="translate(-99.625,-9)"><rect height="18" width="199.25" ry="0" rx="0"></rect><foreignObject height="18" width="199.25"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Ask_Profile' L-LE-No_Server" id="L-L-Ask_Profile-No_Server">Done but no profile selected</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1165.49609375,822)" class="edgeLabel"><g class="label" transform="translate(-88.046875,-9)"><rect height="18" width="176.09375" ry="0" rx="0"></rect><foreignObject height="18" width="176.09375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Connected' L-LE-Has_Config" id="L-L-Connected-Has_Config">OS reports disconnected</span></div></foreignObject></g></g></g><g class="nodes"><g style="opacity: 1;" transform="translate(515.6875,27)" id="flowchart-Deregistered-63" class="node default"><rect style="fill:white;" class="label-container" height="38" width="111.609375" y="-19" x="-55.8046875" ry="5" rx="5"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-45.8046875,-9)"><foreignObject height="18" width="91.609375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Deregistered</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(515.6875,133)" id="flowchart-No_Server-65" class="node default"><rect style="fill:white;fill:white;" class="label-container" height="38" width="96.484375" y="-19" x="-48.2421875" ry="5" rx="5"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-38.2421875,-9)"><foreignObject height="18" width="76.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">No_Server</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(191.33203125,345)" id="flowchart-Chosen_Server-68" class="node default"><rect style="fill:white;fill:white;" class="label-container" height="38" width="131.171875" y="-19" x="-65.5859375" ry="5" rx="5"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-55.5859375,-9)"><foreignObject height="18" width="111.171875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Chosen_Server</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(323.9140625,239)" id="flowchart-Search_Server-71" class="node default"><rect style="fill:white;fill:white;" class="label-container" height="38" width="126.71875" y="-19" x="-63.359375" ry="5" rx="5"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-53.359375,-9)"><foreignObject height="18" width="106.71875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Search_Server</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(378.15234375,451)" id="flowchart-Authorized-80" class="node default"><rect style="fill:white;fill:white;" class="label-container" height="38" width="96.5" y="-19" x="-48.25" ry="5" rx="5"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-38.25,-9)"><foreignObject height="18" width="76.5"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Authorized</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(353.17578125,663)" id="flowchart-OAuth_Started-83" class="node default"><rect style="fill:white;fill:white;" class="label-container" height="38" width="125.84375" y="-19" x="-62.921875" ry="5" rx="5"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-52.921875,-9)"><foreignObject height="18" width="105.84375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">OAuth_Started</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(777.65234375,557)" id="flowchart-Request_Config-95" class="node default"><rect style="fill:white;fill:white;fill:white;fill:white;" class="label-container" height="38" width="134.75" y="-19" x="-67.375" ry="5" rx="5"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-57.375,-9)"><foreignObject height="18" width="114.75"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Request_Config</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(981.5859375,663)" id="flowchart-Ask_Profile-98" class="node default"><rect style="fill:white;fill:white;" class="label-container" height="38" width="100.921875" y="-19" x="-50.4609375" ry="5" rx="5"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-40.4609375,-9)"><foreignObject height="18" width="80.921875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Ask_Profile</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(1072.5625,769)" id="flowchart-Has_Config-101" class="node default"><rect style="fill:cyan;fill:cyan;fill:cyan;" class="label-container" height="38" width="103.609375" y="-19" x="-51.8046875" ry="5" rx="5"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-41.8046875,-9)"><foreignObject height="18" width="83.609375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Has_Config</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(1072.5625,875)" id="flowchart-Connected-110" class="node default"><rect style="fill:white;" class="label-container" height="38" width="97.390625" y="-19" x="-48.6953125" ry="5" rx="5"></rect><g transform="translate(0,0)" class="label"><g transform="translate(-38.6953125,-9)"><foreignObject height="18" width="77.390625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Connected</div></foreignObject></g></g></g></g></g></g></svg>
\ No newline at end of file +<svg viewBox="0 0 3237.51953125 1220" style="max-width: 3237.52px; background-color: white;" aria-labelledby="chart-title-mermaid-1672864142462 chart-desc-mermaid-1672864142462" role="img" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="100%" id="mermaid-1672864142462"><title id="chart-title-mermaid-1672864142462"/><desc id="chart-desc-mermaid-1672864142462"/><style>#mermaid-1672864142462 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-1672864142462 .error-icon{fill:#552222;}#mermaid-1672864142462 .error-text{fill:#552222;stroke:#552222;}#mermaid-1672864142462 .edge-thickness-normal{stroke-width:2px;}#mermaid-1672864142462 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-1672864142462 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-1672864142462 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-1672864142462 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-1672864142462 .marker{fill:#333333;stroke:#333333;}#mermaid-1672864142462 .marker.cross{stroke:#333333;}#mermaid-1672864142462 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-1672864142462 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-1672864142462 .cluster-label text{fill:#333;}#mermaid-1672864142462 .cluster-label span{color:#333;}#mermaid-1672864142462 .label text,#mermaid-1672864142462 span{fill:#333;color:#333;}#mermaid-1672864142462 .node rect,#mermaid-1672864142462 .node circle,#mermaid-1672864142462 .node ellipse,#mermaid-1672864142462 .node polygon,#mermaid-1672864142462 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-1672864142462 .node .label{text-align:center;}#mermaid-1672864142462 .node.clickable{cursor:pointer;}#mermaid-1672864142462 .arrowheadPath{fill:#333333;}#mermaid-1672864142462 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-1672864142462 .flowchart-link{stroke:#333333;fill:none;}#mermaid-1672864142462 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-1672864142462 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-1672864142462 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-1672864142462 .cluster text{fill:#333;}#mermaid-1672864142462 .cluster span{color:#333;}#mermaid-1672864142462 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-1672864142462 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><g class="output"><g class="clusters"/><g class="edgePaths"><g style="opacity: 1;" id="L-Deregistered-No_Server" class="edgePath LS-Deregistered LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead311)" d="M1539.1640625,46L1539.1640625,51.666666666666664C1539.1640625,57.333333333333336,1539.1640625,68.66666666666667,1539.1640625,80C1539.1640625,91.33333333333333,1539.1640625,102.66666666666667,1539.1640625,108.33333333333333L1539.1640625,114" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead311"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-No_Server-No_Server" class="edgePath LS-No_Server LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead312)" d="M1587.40625,123.49923070693984L1595.4453125,121.91602558911654C1603.484375,120.33282047129323,1619.5625,117.16641023564661,1629.611328125,115.58320511782331C1639.66015625,114,1643.6796875,114,1647.69921875,117.16666666666667C1651.71875,120.33333333333333,1655.73828125,126.66666666666667,1655.73828125,133C1655.73828125,139.33333333333334,1651.71875,145.66666666666666,1647.69921875,148.83333333333334C1643.6796875,152,1639.66015625,152,1629.611328125,150.41679488217667C1619.5625,148.83358976435338,1603.484375,145.66717952870678,1595.4453125,144.08397441088346L1587.40625,142.50076929306016" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead312"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-No_Server-Loading_Server" class="edgePath LS-No_Server LE-Loading_Server"><path style="fill:none" marker-end="url(#arrowhead313)" d="M1490.921875,139.50536191697228L1433.4563802083333,147.25446826414358C1375.9908854166667,155.00357461131486,1261.0598958333333,170.50178730565742,1213.267160475629,183.91756031949538C1165.4744251179245,197.33333333333334,1184.819943985849,208.66666666666666,1194.4927034198113,214.33333333333334L1204.1654628537735,220" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead313"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-No_Server-Chosen_Server" class="edgePath LS-No_Server LE-Chosen_Server"><path style="fill:none" marker-end="url(#arrowhead314)" d="M1490.921875,137.60600388436964L1406.4440104166667,145.67166990364137C1321.9661458333333,153.7373359229131,1153.0104166666667,169.86866796145657,1068.5325520833333,186.76766731406164C984.0546875,203.66666666666666,984.0546875,221.33333333333334,984.0546875,239C984.0546875,256.6666666666667,984.0546875,274.3333333333333,984.0546875,292C984.0546875,309.6666666666667,984.0546875,327.3333333333333,984.0546875,345C984.0546875,362.6666666666667,984.0546875,380.3333333333333,1002.3531593946541,394.8333333333333C1020.6516312893082,409.3333333333333,1057.2485750786163,420.6666666666667,1075.5470469732704,426.3333333333333L1093.8455188679245,432" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead314"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-No_Server-Search_Server" class="edgePath LS-No_Server LE-Search_Server"><path style="fill:none" marker-end="url(#arrowhead315)" d="M1490.921875,134.88994952819837L1273.4856770833333,143.40829127349863C1056.0494791666667,151.92663301879892,621.1770833333334,168.96331650939945,403.7408854166667,186.31499158803308C186.3046875,203.66666666666666,186.3046875,221.33333333333334,186.3046875,239C186.3046875,256.6666666666667,186.3046875,274.3333333333333,186.3046875,292C186.3046875,309.6666666666667,186.3046875,327.3333333333333,186.3046875,345C186.3046875,362.6666666666667,186.3046875,380.3333333333333,186.3046875,398C186.3046875,415.6666666666667,186.3046875,433.3333333333333,186.3046875,451C186.3046875,468.6666666666667,186.3046875,486.3333333333333,186.3046875,504C186.3046875,521.6666666666666,186.3046875,539.3333333333334,186.3046875,557C186.3046875,574.6666666666666,186.3046875,592.3333333333334,186.3046875,610C186.3046875,627.6666666666666,186.3046875,645.3333333333334,186.3046875,663C186.3046875,680.6666666666666,186.3046875,698.3333333333334,186.3046875,716C186.3046875,733.6666666666666,186.3046875,751.3333333333334,186.3046875,769C186.3046875,786.6666666666666,186.3046875,804.3333333333334,186.3046875,822C186.3046875,839.6666666666666,186.3046875,857.3333333333334,186.3046875,875C186.3046875,892.6666666666666,186.3046875,910.3333333333334,186.3046875,928C186.3046875,945.6666666666666,186.3046875,963.3333333333334,186.3046875,981C186.3046875,998.6666666666666,186.3046875,1016.3333333333334,396.2259114583333,1033.5769293989922C606.1471354166666,1050.8205254646512,1025.9895833333333,1067.6410509293025,1235.9108072916667,1076.051313661628L1445.83203125,1084.4615763939537" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead315"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-No_Server-Connected" class="edgePath LS-No_Server LE-Connected"><path style="fill:none" marker-end="url(#arrowhead316)" d="M1587.40625,135.77449272413602L1732.9576822916667,144.1454106034467C1878.5091145833333,152.51632848275736,2169.6119791666665,169.2581642413787,2315.1634114583335,186.46241545402268C2460.71484375,203.66666666666666,2460.71484375,221.33333333333334,2460.71484375,239C2460.71484375,256.6666666666667,2460.71484375,274.3333333333333,2460.71484375,292C2460.71484375,309.6666666666667,2460.71484375,327.3333333333333,2460.71484375,345C2460.71484375,362.6666666666667,2460.71484375,380.3333333333333,2460.71484375,398C2460.71484375,415.6666666666667,2460.71484375,433.3333333333333,2460.71484375,451C2460.71484375,468.6666666666667,2460.71484375,486.3333333333333,2460.71484375,504C2460.71484375,521.6666666666666,2460.71484375,539.3333333333334,2460.71484375,557C2460.71484375,574.6666666666666,2460.71484375,592.3333333333334,2460.71484375,610C2460.71484375,627.6666666666666,2460.71484375,645.3333333333334,2460.71484375,663C2460.71484375,680.6666666666666,2460.71484375,698.3333333333334,2460.71484375,716C2460.71484375,733.6666666666666,2460.71484375,751.3333333333334,2460.71484375,769C2460.71484375,786.6666666666666,2460.71484375,804.3333333333334,2460.71484375,822C2460.71484375,839.6666666666666,2460.71484375,857.3333333333334,2460.71484375,875C2460.71484375,892.6666666666666,2460.71484375,910.3333333333334,2460.71484375,928C2460.71484375,945.6666666666666,2460.71484375,963.3333333333334,2460.71484375,981C2460.71484375,998.6666666666666,2460.71484375,1016.3333333333334,2484.162109375,1031.728670338208C2507.609375,1047.124007343083,2554.50390625,1060.2480146861658,2577.951171875,1066.8100183577073L2601.3984375,1073.3720220292487" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead316"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-No_Server-Ask_Location" class="edgePath LS-No_Server LE-Ask_Location"><path style="fill:none" marker-end="url(#arrowhead317)" d="M1490.921875,135.14122149890412L1299.9453125,143.61768458242008C1108.96875,152.09414766593608,727.015625,169.04707383296804,536.0390625,186.35687024981735C345.0625,203.66666666666666,345.0625,221.33333333333334,345.0625,239C345.0625,256.6666666666667,345.0625,274.3333333333333,381.8190104166667,290.15985640968114C418.5755208333333,305.9863794860289,492.0885416666667,319.9727589720579,528.8450520833334,326.96594871507233L565.6015625,333.9591384580868" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead317"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Ask_Location-Chosen_Server" class="edgePath LS-Ask_Location LE-Chosen_Server"><path style="fill:none" marker-end="url(#arrowhead318)" d="M681.6640625,352.0110414588973L745.1067708333334,359.6758678824144C808.5494791666666,367.34069430593155,935.4348958333334,382.6703471529658,1008.8080532625786,396.0018402431495C1082.181210691824,409.3333333333333,1102.0421088836479,420.6666666666667,1111.9725579795597,426.3333333333333L1121.9030070754718,432" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead318"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Ask_Location-No_Server" class="edgePath LS-Ask_Location LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead319)" d="M681.6640625,332.1324072560876L711.8294270833334,325.44367271340633C741.9947916666666,318.7549381707251,802.3255208333334,305.3774690853625,832.4908854166666,289.8554012093479C862.65625,274.3333333333333,862.65625,256.6666666666667,862.65625,239C862.65625,221.33333333333334,862.65625,203.66666666666666,967.3671875,186.62991042386025C1072.078125,169.5931541810539,1281.5,153.18630836210778,1386.2109375,144.98288545263475L1490.921875,136.77946254316169" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead319"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Ask_Location-Search_Server" class="edgePath LS-Ask_Location LE-Search_Server"><path style="fill:none" marker-end="url(#arrowhead320)" d="M623.6328125,364L623.6328125,369.6666666666667C623.6328125,375.3333333333333,623.6328125,386.6666666666667,623.6328125,401.1666666666667C623.6328125,415.6666666666667,623.6328125,433.3333333333333,623.6328125,451C623.6328125,468.6666666666667,623.6328125,486.3333333333333,623.6328125,504C623.6328125,521.6666666666666,623.6328125,539.3333333333334,623.6328125,557C623.6328125,574.6666666666666,623.6328125,592.3333333333334,623.6328125,610C623.6328125,627.6666666666666,623.6328125,645.3333333333334,623.6328125,663C623.6328125,680.6666666666666,623.6328125,698.3333333333334,623.6328125,716C623.6328125,733.6666666666666,623.6328125,751.3333333333334,623.6328125,769C623.6328125,786.6666666666666,623.6328125,804.3333333333334,623.6328125,822C623.6328125,839.6666666666666,623.6328125,857.3333333333334,623.6328125,875C623.6328125,892.6666666666666,623.6328125,910.3333333333334,623.6328125,928C623.6328125,945.6666666666666,623.6328125,963.3333333333334,623.6328125,981C623.6328125,998.6666666666666,623.6328125,1016.3333333333334,760.666015625,1033.367998364968C897.69921875,1050.4026633966025,1171.765625,1066.8053267932053,1308.798828125,1075.0066584915064L1445.83203125,1083.2079901898078" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead320"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Search_Server-Loading_Server" class="edgePath LS-Search_Server LE-Loading_Server"><path style="fill:none" marker-end="url(#arrowhead321)" d="M1572.55078125,1076.038723908858L1613.0501302083333,1069.0322699240483C1653.5494791666667,1062.0258159392386,1734.5481770833333,1048.0129079696192,1775.0475260416667,1032.1731206514762C1815.546875,1016.3333333333334,1815.546875,998.6666666666666,1815.546875,981C1815.546875,963.3333333333334,1815.546875,945.6666666666666,1815.546875,928C1815.546875,910.3333333333334,1815.546875,892.6666666666666,1815.546875,875C1815.546875,857.3333333333334,1815.546875,839.6666666666666,1815.546875,822C1815.546875,804.3333333333334,1815.546875,786.6666666666666,1815.546875,769C1815.546875,751.3333333333334,1815.546875,733.6666666666666,1815.546875,716C1815.546875,698.3333333333334,1815.546875,680.6666666666666,1815.546875,663C1815.546875,645.3333333333334,1815.546875,627.6666666666666,1815.546875,610C1815.546875,592.3333333333334,1815.546875,574.6666666666666,1815.546875,557C1815.546875,539.3333333333334,1815.546875,521.6666666666666,1815.546875,504C1815.546875,486.3333333333333,1815.546875,468.6666666666667,1815.546875,451C1815.546875,433.3333333333333,1815.546875,415.6666666666667,1815.546875,398C1815.546875,380.3333333333333,1815.546875,362.6666666666667,1815.546875,345C1815.546875,327.3333333333333,1815.546875,309.6666666666667,1730.1360677083333,293.0143871462532C1644.7252604166667,276.36210762583977,1473.9036458333333,260.7242152516795,1388.4928385416667,252.90526906459937L1303.08203125,245.08632287751922" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead321"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Search_Server-No_Server" class="edgePath LS-Search_Server LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead322)" d="M1572.55078125,1079.1570309007473L1633.3509114583333,1071.630859083956C1694.1510416666667,1064.1046872671648,1815.7513020833333,1049.0523436335825,1876.5514322916667,1032.692838483458C1937.3515625,1016.3333333333334,1937.3515625,998.6666666666666,1937.3515625,981C1937.3515625,963.3333333333334,1937.3515625,945.6666666666666,1937.3515625,928C1937.3515625,910.3333333333334,1937.3515625,892.6666666666666,1937.3515625,875C1937.3515625,857.3333333333334,1937.3515625,839.6666666666666,1937.3515625,822C1937.3515625,804.3333333333334,1937.3515625,786.6666666666666,1937.3515625,769C1937.3515625,751.3333333333334,1937.3515625,733.6666666666666,1937.3515625,716C1937.3515625,698.3333333333334,1937.3515625,680.6666666666666,1937.3515625,663C1937.3515625,645.3333333333334,1937.3515625,627.6666666666666,1937.3515625,610C1937.3515625,592.3333333333334,1937.3515625,574.6666666666666,1937.3515625,557C1937.3515625,539.3333333333334,1937.3515625,521.6666666666666,1937.3515625,504C1937.3515625,486.3333333333333,1937.3515625,468.6666666666667,1937.3515625,451C1937.3515625,433.3333333333333,1937.3515625,415.6666666666667,1937.3515625,398C1937.3515625,380.3333333333333,1937.3515625,362.6666666666667,1937.3515625,345C1937.3515625,327.3333333333333,1937.3515625,309.6666666666667,1937.3515625,292C1937.3515625,274.3333333333333,1937.3515625,256.6666666666667,1937.3515625,239C1937.3515625,221.33333333333334,1937.3515625,203.66666666666666,1879.02734375,187.0701976403495C1820.703125,170.47372861403232,1704.0546875,154.94745722806468,1645.73046875,147.18432153508084L1587.40625,139.421185842097" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead322"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Loading_Server-Chosen_Server" class="edgePath LS-Loading_Server LE-Chosen_Server"><path style="fill:none" marker-end="url(#arrowhead323)" d="M1236.59765625,258L1236.59765625,263.6666666666667C1236.59765625,269.3333333333333,1236.59765625,280.6666666666667,1236.59765625,295.1666666666667C1236.59765625,309.6666666666667,1236.59765625,327.3333333333333,1236.59765625,345C1236.59765625,362.6666666666667,1236.59765625,380.3333333333333,1227.8946786556605,394.8333333333333C1219.1917010613208,409.3333333333333,1201.7857458726414,420.6666666666667,1193.082768278302,426.3333333333333L1184.3797906839623,432" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead323"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Loading_Server-Ask_Location" class="edgePath LS-Loading_Server LE-Ask_Location"><path style="fill:none" marker-end="url(#arrowhead324)" d="M1170.11328125,244.5689247504337L1075.7376302083333,252.47410395869474C981.3619791666666,260.37928316695576,792.6106770833334,276.1896415834779,700.349167158019,289.7614874584056C608.0876572327044,303.3333333333333,612.3159394654089,314.6666666666667,614.430080581761,320.3333333333333L616.5442216981132,326" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead324"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Loading_Server-No_Server" class="edgePath LS-Loading_Server LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead325)" d="M1269.0298496462265,220L1278.7026090801887,214.33333333333334C1288.375368514151,208.66666666666666,1307.7208873820755,197.33333333333334,1344.7028916077045,184.84249897170503C1381.6848958333333,172.35166461007668,1436.3033854166667,158.70332922015336,1463.6126302083333,151.8791615251917L1490.921875,145.05499383023005" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead325"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Chosen_Server-Authorized" class="edgePath LS-Chosen_Server LE-Authorized"><path style="fill:none" marker-end="url(#arrowhead326)" d="M1181.9067659198113,470L1189.8721747248428,475.6666666666667C1197.837583529874,481.3333333333333,1213.7684011399372,492.6666666666667,1238.026127653302,504.24750960929623C1262.2838541666667,515.8283525519258,1294.8684895833333,527.6567051038518,1311.1608072916667,533.5708813798146L1327.453125,539.4850576557776" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead326"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Chosen_Server-OAuth_Started" class="edgePath LS-Chosen_Server LE-OAuth_Started"><path style="fill:none" marker-end="url(#arrowhead327)" d="M1108.6640625,470L1094.78515625,475.6666666666667C1080.90625,481.3333333333333,1053.1484375,492.6666666666667,1039.26953125,507.1666666666667C1025.390625,521.6666666666666,1025.390625,539.3333333333334,1025.390625,557C1025.390625,574.6666666666666,1025.390625,592.3333333333334,1025.390625,610C1025.390625,627.6666666666666,1025.390625,645.3333333333334,1025.390625,663C1025.390625,680.6666666666666,1025.390625,698.3333333333334,1025.390625,716C1025.390625,733.6666666666666,1025.390625,751.3333333333334,1025.390625,769C1025.390625,786.6666666666666,1025.390625,804.3333333333334,1025.390625,822C1025.390625,839.6666666666666,1025.390625,857.3333333333334,1025.390625,875C1025.390625,892.6666666666666,1025.390625,910.3333333333334,1058.0104166666667,925.8510340522362C1090.6302083333333,941.3687347711392,1155.8697916666667,954.7374695422783,1188.4895833333333,961.4218369278478L1221.109375,968.1062043134175" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead327"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-OAuth_Started-Authorized" class="edgePath LS-OAuth_Started LE-Authorized"><path style="fill:none" marker-end="url(#arrowhead328)" d="M1346.953125,964.7230886558627L1370.61328125,958.6025738798857C1394.2734375,952.4820591039085,1441.59375,940.2410295519543,1465.25390625,925.2871814426438C1488.9140625,910.3333333333334,1488.9140625,892.6666666666666,1488.9140625,875C1488.9140625,857.3333333333334,1488.9140625,839.6666666666666,1488.9140625,822C1488.9140625,804.3333333333334,1488.9140625,786.6666666666666,1488.9140625,769C1488.9140625,751.3333333333334,1488.9140625,733.6666666666666,1488.9140625,716C1488.9140625,698.3333333333334,1488.9140625,680.6666666666666,1488.9140625,663C1488.9140625,645.3333333333334,1488.9140625,627.6666666666666,1476.809748427673,613.1666666666666C1464.7054343553457,598.6666666666666,1440.4968062106918,587.3333333333334,1428.3924921383648,581.6666666666666L1416.2881780660377,576" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead328"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-OAuth_Started-No_Server" class="edgePath LS-OAuth_Started LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead329)" d="M1346.953125,972.0157958431992L1398.3313802083333,964.6798298693326C1449.7096354166667,957.3438638954661,1552.4661458333333,942.671931947733,1603.8444010416667,926.5026326405332C1655.22265625,910.3333333333334,1655.22265625,892.6666666666666,1655.22265625,875C1655.22265625,857.3333333333334,1655.22265625,839.6666666666666,1655.22265625,822C1655.22265625,804.3333333333334,1655.22265625,786.6666666666666,1655.22265625,769C1655.22265625,751.3333333333334,1655.22265625,733.6666666666666,1655.22265625,716C1655.22265625,698.3333333333334,1655.22265625,680.6666666666666,1655.22265625,663C1655.22265625,645.3333333333334,1655.22265625,627.6666666666666,1655.22265625,610C1655.22265625,592.3333333333334,1655.22265625,574.6666666666666,1655.22265625,557C1655.22265625,539.3333333333334,1655.22265625,521.6666666666666,1655.22265625,504C1655.22265625,486.3333333333333,1655.22265625,468.6666666666667,1655.22265625,451C1655.22265625,433.3333333333333,1655.22265625,415.6666666666667,1655.22265625,398C1655.22265625,380.3333333333333,1655.22265625,362.6666666666667,1655.22265625,345C1655.22265625,327.3333333333333,1655.22265625,309.6666666666667,1655.22265625,292C1655.22265625,274.3333333333333,1655.22265625,256.6666666666667,1655.22265625,239C1655.22265625,221.33333333333334,1655.22265625,203.66666666666666,1642.8138757861634,189.16666666666666C1630.405095322327,174.66666666666666,1605.5875343946543,163.33333333333334,1593.1787539308177,157.66666666666666L1580.7699734669811,152" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead329"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-OAuth_Started-Search_Server" class="edgePath LS-OAuth_Started LE-Search_Server"><path style="fill:none" marker-end="url(#arrowhead330)" d="M1284.03125,1000L1284.03125,1005.6666666666666C1284.03125,1011.3333333333334,1284.03125,1022.6666666666666,1310.998046875,1034.6809938527551C1337.96484375,1046.695321038844,1391.8984375,1059.3906420776877,1418.865234375,1065.7383025971096L1445.83203125,1072.0859631165317" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead330"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Authorized-OAuth_Started" class="edgePath LS-Authorized LE-OAuth_Started"><path style="fill:none" marker-end="url(#arrowhead331)" d="M1327.453125,567.6538211170421L1295.4895833333333,574.711517597535C1263.5260416666667,581.7692140780281,1199.5989583333333,595.884607039014,1167.6354166666667,611.7756368528403C1135.671875,627.6666666666666,1135.671875,645.3333333333334,1135.671875,663C1135.671875,680.6666666666666,1135.671875,698.3333333333334,1135.671875,716C1135.671875,733.6666666666666,1135.671875,751.3333333333334,1135.671875,769C1135.671875,786.6666666666666,1135.671875,804.3333333333334,1135.671875,822C1135.671875,839.6666666666666,1135.671875,857.3333333333334,1135.671875,875C1135.671875,892.6666666666666,1135.671875,910.3333333333334,1151.5341981132076,924.8333333333334C1167.396521226415,939.3333333333334,1199.1211674528302,950.6666666666666,1214.9834905660377,956.3333333333334L1230.8458136792453,962" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead331"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Authorized-Request_Config" class="edgePath LS-Authorized LE-Request_Config"><path style="fill:none" marker-end="url(#arrowhead332)" d="M1423.953125,560.5086395403679L1537.3854166666667,568.7571996169733C1650.8177083333333,577.0057596935786,1877.6822916666667,593.5028798467893,1996.6530316430817,607.4181065900613C2115.623771619497,621.3333333333334,2126.700668238994,632.6666666666666,2132.239116548742,638.3333333333334L2137.7775648584907,644" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead332"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Authorized-No_Server" class="edgePath LS-Authorized LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead333)" d="M1414.6959758254718,538L1426.3254225628932,532.3333333333334C1437.9548693003144,526.6666666666666,1461.2137627751572,515.3333333333334,1472.8432095125784,500.8333333333333C1484.47265625,486.3333333333333,1484.47265625,468.6666666666667,1484.47265625,451C1484.47265625,433.3333333333333,1484.47265625,415.6666666666667,1484.47265625,398C1484.47265625,380.3333333333333,1484.47265625,362.6666666666667,1484.47265625,345C1484.47265625,327.3333333333333,1484.47265625,309.6666666666667,1484.47265625,292C1484.47265625,274.3333333333333,1484.47265625,256.6666666666667,1484.47265625,239C1484.47265625,221.33333333333334,1484.47265625,203.66666666666666,1490.3201650943395,189.16666666666666C1496.1676739386792,174.66666666666666,1507.8626916273586,163.33333333333334,1513.710200471698,157.66666666666666L1519.5577093160377,152" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead333"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Request_Config-Ask_Profile" class="edgePath LS-Request_Config LE-Ask_Profile"><path style="fill:none" marker-end="url(#arrowhead334)" d="M2156.34765625,682L2156.34765625,687.6666666666666C2156.34765625,693.3333333333334,2156.34765625,704.6666666666666,2168.13288620283,716C2179.9181161556603,727.3333333333334,2203.488576061321,738.6666666666666,2215.273806014151,744.3333333333334L2227.0590359669814,750" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead334"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Request_Config-Disconnected" class="edgePath LS-Request_Config LE-Disconnected"><path style="fill:none" marker-end="url(#arrowhead335)" d="M2223.72265625,670.5939457375932L2290.8645833333335,678.1616214479944C2358.0065104166665,685.7292971583955,2492.2903645833335,700.8646485791978,2559.4322916666665,717.2656576229323C2626.57421875,733.6666666666666,2626.57421875,751.3333333333334,2626.57421875,769C2626.57421875,786.6666666666666,2626.57421875,804.3333333333334,2664.1432291666665,820.1804859926248C2701.7122395833335,836.0276386519163,2776.8502604166665,850.0552773038326,2814.4192708333335,857.0690966297907L2851.98828125,864.0829159557488" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead335"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Request_Config-No_Server" class="edgePath LS-Request_Config LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead336)" d="M2174.9177476415093,644L2180.456195951258,638.3333333333334C2185.994644261006,632.6666666666666,2197.071540880503,621.3333333333334,2202.609989190252,606.8333333333334C2208.1484375,592.3333333333334,2208.1484375,574.6666666666666,2208.1484375,557C2208.1484375,539.3333333333334,2208.1484375,521.6666666666666,2208.1484375,504C2208.1484375,486.3333333333333,2208.1484375,468.6666666666667,2208.1484375,451C2208.1484375,433.3333333333333,2208.1484375,415.6666666666667,2208.1484375,398C2208.1484375,380.3333333333333,2208.1484375,362.6666666666667,2208.1484375,345C2208.1484375,327.3333333333333,2208.1484375,309.6666666666667,2208.1484375,292C2208.1484375,274.3333333333333,2208.1484375,256.6666666666667,2208.1484375,239C2208.1484375,221.33333333333334,2208.1484375,203.66666666666666,2104.69140625,186.63699443341508C2001.234375,169.60732220016348,1794.3203125,153.214644400327,1690.86328125,145.01830550040873L1587.40625,136.82196660049047" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead336"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Request_Config-OAuth_Started" class="edgePath LS-Request_Config LE-OAuth_Started"><path style="fill:none" marker-end="url(#arrowhead337)" d="M2088.97265625,666.9089202560496L1947.9485677083333,675.0907668800413C1806.9244791666667,683.272613504033,1524.8763020833333,699.6363067520165,1383.8522135416667,716.6514867093416C1242.828125,733.6666666666666,1242.828125,751.3333333333334,1242.828125,769C1242.828125,786.6666666666666,1242.828125,804.3333333333334,1242.828125,822C1242.828125,839.6666666666666,1242.828125,857.3333333333334,1242.828125,875C1242.828125,892.6666666666666,1242.828125,910.3333333333334,1247.2334905660377,924.8333333333334C1251.6388561320755,939.3333333333334,1260.449587264151,950.6666666666666,1264.8549528301887,956.3333333333334L1269.2603183962265,962" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead337"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Ask_Profile-Disconnected" class="edgePath LS-Ask_Profile LE-Disconnected"><path style="fill:none" marker-end="url(#arrowhead338)" d="M2317.03515625,774.9048366509124L2384.1119791666665,782.7540305424269C2451.1888020833335,790.6032244339416,2585.3424479166665,806.3016122169707,2674.5013020833335,820.2792834444368C2763.66015625,834.2569546719031,2807.82421875,846.5139093438062,2829.90625,852.6423866797577L2851.98828125,858.7708640157093" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead338"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Ask_Profile-No_Server" class="edgePath LS-Ask_Profile LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead339)" d="M2290.5818838443397,750L2297.74206466195,744.3333333333334C2304.90224547956,738.6666666666666,2319.2226071147797,727.3333333333334,2326.38278793239,712.8333333333334C2333.54296875,698.3333333333334,2333.54296875,680.6666666666666,2333.54296875,663C2333.54296875,645.3333333333334,2333.54296875,627.6666666666666,2333.54296875,610C2333.54296875,592.3333333333334,2333.54296875,574.6666666666666,2333.54296875,557C2333.54296875,539.3333333333334,2333.54296875,521.6666666666666,2333.54296875,504C2333.54296875,486.3333333333333,2333.54296875,468.6666666666667,2333.54296875,451C2333.54296875,433.3333333333333,2333.54296875,415.6666666666667,2333.54296875,398C2333.54296875,380.3333333333333,2333.54296875,362.6666666666667,2333.54296875,345C2333.54296875,327.3333333333333,2333.54296875,309.6666666666667,2333.54296875,292C2333.54296875,274.3333333333333,2333.54296875,256.6666666666667,2333.54296875,239C2333.54296875,221.33333333333334,2333.54296875,203.66666666666666,2209.1868489583335,186.53644340196334C2084.8307291666665,169.40622013726002,1836.1184895833333,152.81244027452001,1711.7623697916667,144.51555034315004L1587.40625,136.21866041178004" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead339"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Ask_Profile-Search_Server" class="edgePath LS-Ask_Profile LE-Search_Server"><path style="fill:none" marker-end="url(#arrowhead340)" d="M2216.11328125,774.0915378265622L2136.978515625,782.0762815221351C2057.84375,790.0610252177081,1899.57421875,806.0305126088541,1820.439453125,822.8485896377603C1741.3046875,839.6666666666666,1741.3046875,857.3333333333334,1741.3046875,875C1741.3046875,892.6666666666666,1741.3046875,910.3333333333334,1741.3046875,928C1741.3046875,945.6666666666666,1741.3046875,963.3333333333334,1741.3046875,981C1741.3046875,998.6666666666666,1741.3046875,1016.3333333333334,1713.1790364583333,1031.5887873535169C1685.0533854166667,1046.8442413737005,1628.8020833333333,1059.6884827474012,1600.6764322916667,1066.1106034342515L1572.55078125,1072.5327241211019" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead340"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Disconnected-Connecting" class="edgePath LS-Disconnected LE-Connecting"><path style="fill:none" marker-end="url(#arrowhead341)" d="M2851.98828125,886.8640747663551L2818.1959635416665,893.7200623052959C2784.4036458333335,900.5760498442368,2716.8190104166665,914.2880249221183,2694.0589008451257,926.8106791277258C2671.298791273585,939.3333333333334,2693.36320754717,950.6666666666666,2704.3954156839623,956.3333333333334L2715.427623820755,962" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead341"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Disconnected-Request_Config" class="edgePath LS-Disconnected LE-Request_Config"><path style="fill:none" marker-end="url(#arrowhead342)" d="M2917.3923938679245,856L2919.458505306604,850.3333333333334C2921.524616745283,844.6666666666666,2925.6568396226417,833.3333333333334,2927.722951061321,818.8333333333334C2929.7890625,804.3333333333334,2929.7890625,786.6666666666666,2929.7890625,769C2929.7890625,751.3333333333334,2929.7890625,733.6666666666666,2812.111328125,716.769477595231C2694.43359375,699.8722885237953,2459.078125,683.7445770475906,2341.400390625,675.6807213094884L2223.72265625,667.616865571386" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead342"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Disconnected-No_Server" class="edgePath LS-Disconnected LE-No_Server"><path style="fill:none" marker-end="url(#arrowhead343)" d="M2945.4442806603774,856L2955.8767443003144,850.3333333333334C2966.309207940252,844.6666666666666,2987.1741352201257,833.3333333333334,2997.6065988600626,818.8333333333334C3008.0390625,804.3333333333334,3008.0390625,786.6666666666666,3008.0390625,769C3008.0390625,751.3333333333334,3008.0390625,733.6666666666666,3008.0390625,716C3008.0390625,698.3333333333334,3008.0390625,680.6666666666666,3008.0390625,663C3008.0390625,645.3333333333334,3008.0390625,627.6666666666666,3008.0390625,610C3008.0390625,592.3333333333334,3008.0390625,574.6666666666666,3008.0390625,557C3008.0390625,539.3333333333334,3008.0390625,521.6666666666666,3008.0390625,504C3008.0390625,486.3333333333333,3008.0390625,468.6666666666667,3008.0390625,451C3008.0390625,433.3333333333333,3008.0390625,415.6666666666667,3008.0390625,398C3008.0390625,380.3333333333333,3008.0390625,362.6666666666667,3008.0390625,345C3008.0390625,327.3333333333333,3008.0390625,309.6666666666667,3008.0390625,292C3008.0390625,274.3333333333333,3008.0390625,256.6666666666667,3008.0390625,239C3008.0390625,221.33333333333334,3008.0390625,203.66666666666666,2771.2669270833335,186.29011272090318C2534.4947916666665,168.9135587751397,2060.9505208333335,151.8271175502794,1824.1783854166667,143.28389693784928L1587.40625,134.74067632541912" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead343"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Disconnected-OAuth_Started" class="edgePath LS-Disconnected LE-OAuth_Started"><path style="fill:none" marker-end="url(#arrowhead344)" d="M2851.98828125,876.986092023941L2601.654296875,885.4884100199507C2351.3203125,893.9907280159606,1850.65234375,910.9953640079802,1593.266767393868,925.1643486706568C1335.881191037736,939.3333333333334,1321.7780070754718,950.6666666666666,1314.7264150943397,956.3333333333334L1307.6748231132076,962" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead344"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Disconnecting-Disconnected" class="edgePath LS-Disconnecting LE-Disconnected"><path style="fill:none" marker-end="url(#arrowhead345)" d="M2955.9446491745284,1174L2965.7422857704405,1168.3333333333333C2975.539922366352,1162.6666666666667,2995.1351955581763,1151.3333333333333,3004.9328321540884,1136.8333333333333C3014.73046875,1122.3333333333333,3014.73046875,1104.6666666666667,3014.73046875,1087C3014.73046875,1069.3333333333333,3014.73046875,1051.6666666666667,3014.73046875,1034C3014.73046875,1016.3333333333334,3014.73046875,998.6666666666666,3014.73046875,981C3014.73046875,963.3333333333334,3014.73046875,945.6666666666666,3003.5825717374214,931.1666666666666C2992.4346747248433,916.6666666666666,2970.1388806996856,905.3333333333334,2958.990983687107,899.6666666666666L2947.8430866745284,894" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead345"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Disconnecting-Disconnected" class="edgePath LS-Disconnecting LE-Disconnected"><path style="fill:none" marker-end="url(#arrowhead346)" d="M2983.34375,1179.4780084360268L3012.6608072916665,1172.8983403633556C3041.9778645833335,1166.3186722906846,3100.6119791666665,1153.1593361453422,3129.9290364583335,1137.7463347393377C3159.24609375,1122.3333333333333,3159.24609375,1104.6666666666667,3159.24609375,1087C3159.24609375,1069.3333333333333,3159.24609375,1051.6666666666667,3159.24609375,1034C3159.24609375,1016.3333333333334,3159.24609375,998.6666666666666,3159.24609375,981C3159.24609375,963.3333333333334,3159.24609375,945.6666666666666,3127.5286458333335,930.0762938073107C3095.8111979166665,914.4859209479546,3032.3763020833335,900.9718418959092,3000.6588541666665,894.2148023698865L2968.94140625,887.4577628438639" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead346"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Connecting-Disconnected" class="edgePath LS-Connecting LE-Disconnected"><path style="fill:none" marker-end="url(#arrowhead347)" d="M2802.89453125,964.0730103806228L2820.8229166666665,958.0608419838524C2838.7513020833335,952.0486735870818,2874.6080729166665,940.0243367935409,2892.5364583333335,928.3455017301038C2910.46484375,916.6666666666666,2910.46484375,905.3333333333334,2910.46484375,899.6666666666666L2910.46484375,894" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead347"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Connecting-Connected" class="edgePath LS-Connecting LE-Connected"><path style="fill:none" marker-end="url(#arrowhead348)" d="M2752.41796875,1000L2752.41796875,1005.6666666666666C2752.41796875,1011.3333333333334,2752.41796875,1022.6666666666666,2741.4776434748424,1034C2730.5373181996856,1045.3333333333333,2708.656667649371,1056.6666666666667,2697.7163423742136,1062.3333333333333L2686.7760170990564,1068" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead348"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g><g style="opacity: 1;" id="L-Connected-Disconnecting" class="edgePath LS-Connected LE-Disconnecting"><path style="fill:none" marker-end="url(#arrowhead349)" d="M2650.09375,1106L2650.09375,1111.6666666666667C2650.09375,1117.3333333333333,2650.09375,1128.6666666666667,2685.5520833333335,1141.2171855921856C2721.0104166666665,1153.7677045177045,2791.9270833333335,1167.535409035409,2827.3854166666665,1174.4192612942613L2862.84375,1181.3031135531135" class="path"/><defs><marker orient="auto" markerHeight="6" markerWidth="8" markerUnits="strokeWidth" refY="5" refX="9" viewBox="0 0 10 10" id="arrowhead349"><path style="stroke-width: 1; stroke-dasharray: 1, 0;" class="arrowheadPath" d="M 0 0 L 10 5 L 0 10 z"/></marker></defs></g></g><g class="edgeLabels"><g style="opacity: 1;" transform="translate(1539.1640625,80)" class="edgeLabel"><g class="label" transform="translate(-53.3515625,-9)"><rect height="18" width="106.703125" ry="0" rx="0"/><foreignObject height="18" width="106.703125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Deregistered' L-LE-No_Server" id="L-L-Deregistered-No_Server">Client registers</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1659.7578125,133)" class="edgeLabel"><g class="label" transform="translate(-37.3515625,-9)"><rect height="18" width="74.703125" ry="0" rx="0"/><foreignObject height="18" width="74.703125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-No_Server' L-LE-No_Server" id="L-L-No_Server-No_Server">Reload list</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1146.12890625,186)" class="edgeLabel"><g class="label" transform="translate(-101.8046875,-9)"><rect height="18" width="203.609375" ry="0" rx="0"/><foreignObject height="18" width="203.609375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-No_Server' L-LE-Loading_Server" id="L-L-No_Server-Loading_Server">User clicks a server in the UI</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(984.0546875,292)" class="edgeLabel"><g class="label" transform="translate(-101.3984375,-9)"><rect height="18" width="202.796875" ry="0" rx="0"/><foreignObject height="18" width="202.796875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-No_Server' L-LE-Chosen_Server" id="L-L-No_Server-Chosen_Server">The server has been chosen</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(186.3046875,610)" class="edgeLabel"><g class="label" transform="translate(-178.3046875,-9)"><rect height="18" width="356.609375" ry="0" rx="0"/><foreignObject height="18" width="356.609375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-No_Server' L-LE-Search_Server" id="L-L-No_Server-Search_Server">The user is trying to choose a new server in the UI</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2460.71484375,610)" class="edgeLabel"><g class="label" transform="translate(-107.171875,-9)"><rect height="18" width="214.34375" ry="0" rx="0"/><foreignObject height="18" width="214.34375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-No_Server' L-LE-Connected" id="L-L-No_Server-Connected">The user is already connected</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(345.0625,239)" class="edgeLabel"><g class="label" transform="translate(-138.7578125,-9)"><rect height="18" width="277.515625" ry="0" rx="0"/><foreignObject height="18" width="277.515625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-No_Server' L-LE-Ask_Location" id="L-L-No_Server-Ask_Location">Change the location in the main screen</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1062.3203125,398)" class="edgeLabel"><g class="label" transform="translate(-58.265625,-9)"><rect height="18" width="116.53125" ry="0" rx="0"/><foreignObject height="18" width="116.53125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Ask_Location' L-LE-Chosen_Server" id="L-L-Ask_Location-Chosen_Server">Location chosen</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(862.65625,239)" class="edgeLabel"><g class="label" transform="translate(-59.1328125,-9)"><rect height="18" width="118.265625" ry="0" rx="0"/><foreignObject height="18" width="118.265625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Ask_Location' L-LE-No_Server" id="L-L-Ask_Location-No_Server">Go back or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(623.6328125,716)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"/><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Ask_Location' L-LE-Search_Server" id="L-L-Ask_Location-Search_Server">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1815.546875,663)" class="edgeLabel"><g class="label" transform="translate(-101.8046875,-9)"><rect height="18" width="203.609375" ry="0" rx="0"/><foreignObject height="18" width="203.609375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Search_Server' L-LE-Loading_Server" id="L-L-Search_Server-Loading_Server">User clicks a server in the UI</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1937.3515625,610)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"/><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Search_Server' L-LE-No_Server" id="L-L-Search_Server-No_Server">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1236.59765625,345)" class="edgeLabel"><g class="label" transform="translate(-64.9296875,-9)"><rect height="18" width="129.859375" ry="0" rx="0"/><foreignObject height="18" width="129.859375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Loading_Server' L-LE-Chosen_Server" id="L-L-Loading_Server-Chosen_Server">Server info loaded</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(603.859375,292)" class="edgeLabel"><g class="label" transform="translate(-238.796875,-9)"><rect height="18" width="477.59375" ry="0" rx="0"/><foreignObject height="18" width="477.59375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Loading_Server' L-LE-Ask_Location" id="L-L-Loading_Server-Ask_Location">User chooses a Secure Internet server but no location is configured</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1327.06640625,186)" class="edgeLabel"><g class="label" transform="translate(-59.1328125,-9)"><rect height="18" width="118.265625" ry="0" rx="0"/><foreignObject height="18" width="118.265625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Loading_Server' L-LE-No_Server" id="L-L-Loading_Server-No_Server">Go back or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1229.69921875,504)" class="edgeLabel"><g class="label" transform="translate(-80.5,-9)"><rect height="18" width="161" ry="0" rx="0"/><foreignObject height="18" width="161"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Chosen_Server' L-LE-Authorized" id="L-L-Chosen_Server-Authorized">Found tokens in config</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1025.390625,716)" class="edgeLabel"><g class="label" transform="translate(-90.28125,-9)"><rect height="18" width="180.5625" ry="0" rx="0"/><foreignObject height="18" width="180.5625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Chosen_Server' L-LE-OAuth_Started" id="L-L-Chosen_Server-OAuth_Started">No tokens found in config</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1488.9140625,769)" class="edgeLabel"><g class="label" transform="translate(-103.1484375,-9)"><rect height="18" width="206.296875" ry="0" rx="0"/><foreignObject height="18" width="206.296875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-OAuth_Started' L-LE-Authorized" id="L-L-OAuth_Started-Authorized">User authorizes with browser</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1655.22265625,557)" class="edgeLabel"><g class="label" transform="translate(-59.1328125,-9)"><rect height="18" width="118.265625" ry="0" rx="0"/><foreignObject height="18" width="118.265625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-OAuth_Started' L-LE-No_Server" id="L-L-OAuth_Started-No_Server">Go back or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1284.03125,1034)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"/><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-OAuth_Started' L-LE-Search_Server" id="L-L-OAuth_Started-Search_Server">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1135.671875,769)" class="edgeLabel"><g class="label" transform="translate(-87.15625,-9)"><rect height="18" width="174.3125" ry="0" rx="0"/><foreignObject height="18" width="174.3125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Authorized' L-LE-OAuth_Started" id="L-L-Authorized-OAuth_Started">Re-authorize with OAuth</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2104.546875,610)" class="edgeLabel"><g class="label" transform="translate(-83.6015625,-9)"><rect height="18" width="167.203125" ry="0" rx="0"/><foreignObject height="18" width="167.203125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Authorized' L-LE-Request_Config" id="L-L-Authorized-Request_Config">Client requests a config</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1484.47265625,345)" class="edgeLabel"><g class="label" transform="translate(-150.75,-9)"><rect height="18" width="301.5" ry="0" rx="0"/><foreignObject height="18" width="301.5"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Authorized' L-LE-No_Server" id="L-L-Authorized-No_Server">Client wants to go back to the main screen</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2156.34765625,716)" class="edgeLabel"><g class="label" transform="translate(-156.546875,-9)"><rect height="18" width="313.09375" ry="0" rx="0"/><foreignObject height="18" width="313.09375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Request_Config' L-LE-Ask_Profile" id="L-L-Request_Config-Ask_Profile">Multiple profiles found and no profile chosen</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2626.57421875,769)" class="edgeLabel"><g class="label" transform="translate(-145.859375,-9)"><rect height="18" width="291.71875" ry="0" rx="0"/><foreignObject height="18" width="291.71875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Request_Config' L-LE-Disconnected" id="L-L-Request_Config-Disconnected">Only one profile or profile already chosen</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2208.1484375,398)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"/><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Request_Config' L-LE-No_Server" id="L-L-Request_Config-No_Server">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1242.828125,822)" class="edgeLabel"><g class="label" transform="translate(-45.8046875,-9)"><rect height="18" width="91.609375" ry="0" rx="0"/><foreignObject height="18" width="91.609375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Request_Config' L-LE-OAuth_Started" id="L-L-Request_Config-OAuth_Started">Re-authorize</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2719.49609375,822)" class="edgeLabel"><g class="label" transform="translate(-72.921875,-9)"><rect height="18" width="145.84375" ry="0" rx="0"/><foreignObject height="18" width="145.84375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Ask_Profile' L-LE-Disconnected" id="L-L-Ask_Profile-Disconnected">User chooses profile</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2333.54296875,451)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"/><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Ask_Profile' L-LE-No_Server" id="L-L-Ask_Profile-No_Server">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1741.3046875,928)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"/><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Ask_Profile' L-LE-Search_Server" id="L-L-Ask_Profile-Search_Server">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2649.234375,928)" class="edgeLabel"><g class="label" transform="translate(-113.828125,-9)"><rect height="18" width="227.65625" ry="0" rx="0"/><foreignObject height="18" width="227.65625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Disconnected' L-LE-Connecting" id="L-L-Disconnected-Connecting">OS reports it is trying to connect</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2929.7890625,769)" class="edgeLabel"><g class="label" transform="translate(-58.25,-9)"><rect height="18" width="116.5" ry="0" rx="0"/><foreignObject height="18" width="116.5"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Disconnected' L-LE-Request_Config" id="L-L-Disconnected-Request_Config">User reconnects</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(3008.0390625,504)" class="edgeLabel"><g class="label" transform="translate(-124.9453125,-9)"><rect height="18" width="249.890625" ry="0" rx="0"/><foreignObject height="18" width="249.890625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Disconnected' L-LE-No_Server" id="L-L-Disconnected-No_Server">User wants to choose a new server</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(1349.984375,928)" class="edgeLabel"><g class="label" transform="translate(-87.15625,-9)"><rect height="18" width="174.3125" ry="0" rx="0"/><foreignObject height="18" width="174.3125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Disconnected' L-LE-OAuth_Started" id="L-L-Disconnected-OAuth_Started">Re-authorize with OAuth</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(3014.73046875,1034)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"/><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Disconnecting' L-LE-Disconnected" id="L-L-Disconnecting-Disconnected">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(3159.24609375,1034)" class="edgeLabel"><g class="label" transform="translate(-70.2734375,-9)"><rect height="18" width="140.546875" ry="0" rx="0"/><foreignObject height="18" width="140.546875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Disconnecting' L-LE-Disconnected" id="L-L-Disconnecting-Disconnected">Done disconnecting</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2910.46484375,928)" class="edgeLabel"><g class="label" transform="translate(-54.2421875,-9)"><rect height="18" width="108.484375" ry="0" rx="0"/><foreignObject height="18" width="108.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Connecting' L-LE-Disconnected" id="L-L-Connecting-Disconnected">Cancel or Error</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2752.41796875,1034)" class="edgeLabel"><g class="label" transform="translate(-60.046875,-9)"><rect height="18" width="120.09375" ry="0" rx="0"/><foreignObject height="18" width="120.09375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Connecting' L-LE-Connected" id="L-L-Connecting-Connected">Done connecting</span></div></foreignObject></g></g><g style="opacity: 1;" transform="translate(2650.09375,1140)" class="edgeLabel"><g class="label" transform="translate(-86.71875,-9)"><rect height="18" width="173.4375" ry="0" rx="0"/><foreignObject height="18" width="173.4375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml"><span style="" class="edgeLabel L-LS-Connected' L-LE-Disconnecting" id="L-L-Connected-Disconnecting">App wants to disconnect</span></div></foreignObject></g></g></g><g class="nodes"><g style="opacity: 1;" transform="translate(1539.1640625,27)" id="flowchart-Deregistered-234" class="node default"><rect style="fill:white;" class="label-container" height="38" width="111.609375" y="-19" x="-55.8046875" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-45.8046875,-9)"><foreignObject height="18" width="91.609375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Deregistered</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(1539.1640625,133)" id="flowchart-No_Server-236" class="node default"><rect style="fill:white;fill:white;fill:white;fill:white;fill:white;fill:white;" class="label-container" height="38" width="96.484375" y="-19" x="-48.2421875" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-38.2421875,-9)"><foreignObject height="18" width="76.484375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">No_Server</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(1236.59765625,239)" id="flowchart-Loading_Server-242" class="node default"><rect style="fill:white;fill:white;fill:white;" class="label-container" height="38" width="132.96875" y="-19" x="-66.484375" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-56.484375,-9)"><foreignObject height="18" width="112.96875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Loading_Server</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(1155.19921875,451)" id="flowchart-Chosen_Server-245" class="node default"><rect style="fill:white;fill:white;" class="label-container" height="38" width="131.171875" y="-19" x="-65.5859375" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-55.5859375,-9)"><foreignObject height="18" width="111.171875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Chosen_Server</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(1509.19140625,1087)" id="flowchart-Search_Server-248" class="node default"><rect style="fill:white;fill:white;" class="label-container" height="38" width="126.71875" y="-19" x="-63.359375" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-53.359375,-9)"><foreignObject height="18" width="106.71875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Search_Server</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(2650.09375,1087)" id="flowchart-Connected-251" class="node default"><rect style="fill:white;" class="label-container" height="38" width="97.390625" y="-19" x="-48.6953125" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-38.6953125,-9)"><foreignObject height="18" width="77.390625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Connected</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(623.6328125,345)" id="flowchart-Ask_Location-254" class="node default"><rect style="fill:white;fill:white;fill:white;" class="label-container" height="38" width="116.0625" y="-19" x="-58.03125" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-48.03125,-9)"><foreignObject height="18" width="96.0625"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Ask_Location</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(1375.703125,557)" id="flowchart-Authorized-281" class="node default"><rect style="fill:white;fill:white;fill:white;" class="label-container" height="38" width="96.5" y="-19" x="-48.25" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-38.25,-9)"><foreignObject height="18" width="76.5"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Authorized</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(1284.03125,981)" id="flowchart-OAuth_Started-284" class="node default"><rect style="fill:white;fill:white;fill:white;" class="label-container" height="38" width="125.84375" y="-19" x="-62.921875" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-52.921875,-9)"><foreignObject height="18" width="105.84375"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">OAuth_Started</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(2156.34765625,663)" id="flowchart-Request_Config-299" class="node default"><rect style="fill:white;fill:white;fill:white;fill:white;" class="label-container" height="38" width="134.75" y="-19" x="-67.375" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-57.375,-9)"><foreignObject height="18" width="114.75"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Request_Config</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(2266.57421875,769)" id="flowchart-Ask_Profile-305" class="node default"><rect style="fill:white;fill:white;fill:white;" class="label-container" height="38" width="100.921875" y="-19" x="-50.4609375" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-40.4609375,-9)"><foreignObject height="18" width="80.921875"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Ask_Profile</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(2910.46484375,875)" id="flowchart-Disconnected-308" class="node default"><rect style="fill:cyan;fill:cyan;fill:cyan;fill:cyan;" class="label-container" height="38" width="116.953125" y="-19" x="-58.4765625" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-48.4765625,-9)"><foreignObject height="18" width="96.953125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Disconnected</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(2752.41796875,981)" id="flowchart-Connecting-326" class="node default"><rect style="fill:white;fill:white;" class="label-container" height="38" width="100.953125" y="-19" x="-50.4765625" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-40.4765625,-9)"><foreignObject height="18" width="80.953125"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Connecting</div></foreignObject></g></g></g><g style="opacity: 1;" transform="translate(2923.09375,1193)" id="flowchart-Disconnecting-336" class="node default"><rect style="fill:white;fill:white;" class="label-container" height="38" width="120.5" y="-19" x="-60.25" ry="5" rx="5"/><g transform="translate(0,0)" class="label"><g transform="translate(-50.25,-9)"><foreignObject height="18" width="100.5"><div style="display: inline-block; white-space: nowrap;" xmlns="http://www.w3.org/1999/xhtml">Disconnecting</div></foreignObject></g></g></g></g></g></g></svg>
\ No newline at end of file diff --git a/docs/src/gettingstarted/testing.md b/docs/src/gettingstarted/testing.md index 62abfaf..079c052 100644 --- a/docs/src/gettingstarted/testing.md +++ b/docs/src/gettingstarted/testing.md @@ -1,5 +1,5 @@ # Testing -The Go library right now has tests defined for server interaction and signature verification tests. +The Go library right now has various tests defined. E.g. server interaction, oauth, discovery and signature verification tests. To run the test suite, issue the following command in a shell @@ -13,7 +13,7 @@ Note that this runs the tests without any server interaction (so for now only th SERVER_URI="eduvpn.example.com" PORTAL_USER="example" PORTAL_PASS="example" make test-go ``` -This needs [python3-selenium](https://selenium-python.readthedocs.io/) and [geckodriver](https://github.com/mozilla/geckodriver/releases) (extract and put in your `$PATH`). +This needs [python3-selenium](https://selenium-python.readthedocs.io/) and [geckodriver](https://github.com/mozilla/geckodriver/releases) (extract and put in your `$PATH`). Note that testing with a server assumes it uses a default portal, due to it needing to click on buttons on the web page. You can add your own portal by customizing the [called Selenium script](https://github.com/eduvpn/eduvpn-common/blob/main/selenium_eduvpn.py). If you have [Docker](https://www.docker.com/get-started/) installed and [Docker-compose](https://docs.docker.com/compose/install/) you can use a convenient helper script which starts up two containers - An eduVPN server for testing @@ -47,4 +47,4 @@ make test This accepts the same environment variables as we have explained before. -[^1]: For now, this is only the Python wrapper as the other wrappers do not implement the newest API just yet. +[^1]: For now, this is only the Python wrapper. |
