delete IPFS-specific pages
This commit is contained in:
parent
b2cb57c86d
commit
b4d4979815
|
@ -1,40 +0,0 @@
|
|||
---
|
||||
title: "Content Identifiers (CIDs)"
|
||||
menu:
|
||||
guides:
|
||||
parent: concepts
|
||||
---
|
||||
|
||||
A *content identifier*, or CID, is a label used to point to material in IPFS. It doesn't indicate _where_ the content is stored, but it forms a kind of address based on the content itself. CIDs are short, regardless of the size of their underlying content.
|
||||
|
||||
CIDs are based on the content’s [cryptographic hash]({{< relref "./hashes.md" >}}). That means:
|
||||
|
||||
* Any difference in content will produce a different CID and
|
||||
* The same piece of content added to two different IPFS nodes using the same settings will produce _exactly the same CID_.
|
||||
|
||||
## CID formats
|
||||
|
||||
CIDs can take a few different forms with different encoding bases or CID versions. Many of the existing IPFS tools still generate v0 CIDs, although the `files` ([MFS]({{< relref "./mfs.md" >}})) and `object` operations now use CIDv1 by default.
|
||||
|
||||
### Version 0
|
||||
|
||||
When IPFS was first designed, we used base 58-encoded multihashes as the content identifiers (This is simpler, but much less flexible than newer CIDs). CIDv0 is still used by default for many IPFS operations, so you should generally try to support v0.
|
||||
|
||||
If a CID is 46 characters starting with "Qm", it's a CIDv0 (for more details, check the [decoding algorithm](https://github.com/ipld/cid/blob/ef1b2002394b15b1e6c26c30545fd485f2c4c138/README.md#decoding-algorithm) in the CID specification).
|
||||
|
||||
### Version 1
|
||||
|
||||
CID v1 contains some leading identifiers that clarify exactly which representation is used, along with the content-hash itself. These include:
|
||||
|
||||
* A [multibase](https://github.com/multiformats/multibase) prefix, specifying the encoding used for the remainder of the CID
|
||||
* A CID version identifer, which indicates which version of CID this is
|
||||
* A [multicodec](https://github.com/multiformats/multicodec) identifier, indicating the format of the target content — it helps people and software to know how to interpret that content after the content is fetched
|
||||
|
||||
These leading identifiers also provide forward-compatibility, supporting different formats to be used in future versions of CID.
|
||||
|
||||
You can use the first few bytes of the CID to interpret the remainder of the content address and know how to decode the content after it's fetched from IPFS. For more details, check out the [CID specification](https://github.com/ipld/cid). It includes a [decoding algorithm](https://github.com/ipld/cid/blob/ef1b2002394b15b1e6c26c30545fd485f2c4c138/README.md#decoding-algorithm) and links to existing software implementations for decoding CIDs.
|
||||
|
||||
You might also want to check out the [CID inspector](http://cid-utils.ipfs.team/#zb2rhiVd5G2DSpnbYtty8NhYHeDvNkPxjSqA7YbDPuhdihj9L) for an interactive breakdown of differently-formatted CIDs.
|
||||
|
||||
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
---
|
||||
title: "DNSLink"
|
||||
menu:
|
||||
guides:
|
||||
parent: concepts
|
||||
---
|
||||
|
||||
DNSLink uses [DNS TXT](https://en.wikipedia.org/wiki/TXT_record) records to map
|
||||
a domain name (like `ipfs.io`) to an IPFS address. Because you can edit your
|
||||
DNS records, you can use them to always point to the latest version of an
|
||||
object in IPFS (remember that an IPFS object’s address changes if you modify
|
||||
the object). Because DNSLink uses DNS records, the names it produces are also
|
||||
usually easy to type and read.
|
||||
|
||||
A DNSLink address looks like an [IPNS](/guides/concepts/ipns) address, but it
|
||||
uses a domain name in place of a hashed public key:
|
||||
|
||||
```
|
||||
/ipns/ipfs.io
|
||||
```
|
||||
|
||||
Just like normal IPFS addresses, they can include links to other files:
|
||||
|
||||
```
|
||||
/ipns/ipfs.io/media/
|
||||
```
|
||||
|
||||
When an IPFS client or node attempts to resolve that address, it looks for a `TXT` record for `ipfs.io` with content like:
|
||||
|
||||
```
|
||||
dnslink=/ipfs/<CID for your content here>
|
||||
```
|
||||
|
||||
For example, if you look up `ipfs.io`’s DNS records, you’ll see its DNSLink entry:
|
||||
|
||||
```sh
|
||||
$ dig +noall +answer TXT ipfs.io
|
||||
ipfs.io. 59 IN TXT "dnslink=/ipfs/QmYNQJoKGNHTpPxCBPh9KkDpaExgd2duMa3aF6ytMpHdao"
|
||||
```
|
||||
|
||||
Based on that, this address:
|
||||
|
||||
```
|
||||
/ipns/ipfs.io/media/
|
||||
```
|
||||
|
||||
Will get you this block:
|
||||
|
||||
```
|
||||
/ipfs/QmYNQJoKGNHTpPxCBPh9KkDpaExgd2duMa3aF6ytMpHdao/media/
|
||||
```
|
||||
|
||||
|
||||
## Publishing via a Subdomain
|
||||
|
||||
You can also publish DNSLink records using a special subdomain named `_dnslink`. This is useful when you want to improve the security of an automated setup or delegate control over your DNSLink records to a third-party without giving away full control over the original DNS zone.
|
||||
|
||||
For example, [`docs.ipfs.io`](https://docs.ipfs.io) does not have a TXT record, but the page still loads
|
||||
because a TXT record exists for `_dnslink.docs.ipfs.io`:
|
||||
|
||||
```sh
|
||||
$ dig +noall +answer TXT _dnslink.docs.ipfs.io
|
||||
_dnslink.docs.ipfs.io. 34 IN TXT "dnslink=/ipfs/QmeveuwF5wWBSgUXLG6p1oxF3GKkgjEnhA6AAwHUoVsx6E"
|
||||
```
|
||||
|
||||
<!-- TODO: Once IPNS is more reliable, describe combining it with DNSLink.
|
||||
### Linking to IPNS
|
||||
|
||||
DNSLink can point at [IPNS](/guides/concepts/ipns) paths as well. IPNS path is
|
||||
a mutable pointer which enables you to update your website by publishing
|
||||
to a PeerID without the need for updating TXT record every time hash changes.
|
||||
-->
|
|
@ -1,50 +0,0 @@
|
|||
---
|
||||
title: "Hashes"
|
||||
menu:
|
||||
guides:
|
||||
parent: concepts
|
||||
---
|
||||
|
||||
Hashes are functions that take some arbitrary input and return a fixed-length value. The particular value depends on the given hash algorithm in use, such as [SHA-1](https://en.wikipedia.org/wiki/SHA-1) (used by Git), [SHA-256](https://en.wikipedia.org/wiki/SHA-2), or [BLAKE2](https://en.wikipedia.org/wiki/BLAKE_(hash_function)#BLAKE2), but a given hash algorithm always returns the same value for a given input. Have a look at the [full list of hash functions](https://en.wikipedia.org/wiki/List_of_hash_functions) for more.
|
||||
|
||||
As an example, the input:
|
||||
|
||||
```
|
||||
Hello world
|
||||
```
|
||||
|
||||
would be represented by **SHA-1** as:
|
||||
|
||||
```
|
||||
0x7B502C3A1F48C8609AE212CDFB639DEE39673F5E
|
||||
```
|
||||
|
||||
However, the exact same input generates the following output using **SHA-256**:
|
||||
|
||||
```
|
||||
0x64EC88CA00B268E5BA1A35678A1B5316D212F4F366B2477232534A8AECA37F3C
|
||||
```
|
||||
|
||||
Notice that the second hash is longer than the first one. This is because SHA-1 creates a 160 bit hash, while SHA-256 creates a 256 bit hash. Also, the prepended `0x` is just an indicator that tells us that the following hash is represented as a base 16 (or hexadecimal) number.
|
||||
|
||||
Hashes can be represented in different bases (`base2`, `base16`, `base32`, etc.). In fact, IPFS makes use of that as part of its [Content Identifiers]({{< relref "cid.md" >}}) and supports mulitiple base representations at the same time, using the [Multibase](https://github.com/multiformats/multibase) protocol.
|
||||
|
||||
For example, the SHA-256 hash of "Hello World" from above can be represented as base 32 as:
|
||||
|
||||
```
|
||||
mtwirsqawjuoloq2gvtyug2tc3jbf5htm2zeo4rsknfiv3fdp46a
|
||||
```
|
||||
|
||||
## Characteristics of cryptographic hashes
|
||||
|
||||
Cryptographic hashes come with a couple of very important characteristics:
|
||||
|
||||
- **deterministic** - the same input message always returns exactly the same output hash
|
||||
- **uncorrelated** - a small change in the message should generate a completely different hash
|
||||
- **unique** - it's infeasible to generate the same hash from two different messages
|
||||
- **one-way** - it's infeasible to guess or calculate the input message from its hash
|
||||
|
||||
It turns out these features also mean we can use a cryptographic hash to identify any piece of data: the hash is unique to the data we calculated it from and it’s not too long (a hash is a fixed length, so the SHA-256 hash of a 1 Gigabyte video file is still only 32 bytes), so sending it around the network doesn't take up a lot of resources.
|
||||
|
||||
That's critical for a distributed system like IPFS, where we want to be able to store and retrieve data from many places. A computer running IPFS can ask all the peers it's connected to whether they have a file with a particular hash and, if one of them does, they send back the whole file. Without a short, unique identifier like a cryptographic hash, that wouldn't be possible. This technique is called “content addressing” — because the content itself is used to form an address, rather than information about the computer and disk location it's stored at.
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
---
|
||||
title: "IPNS"
|
||||
menu:
|
||||
guides:
|
||||
parent: concepts
|
||||
---
|
||||
|
||||
Inter-Planetary Name System (IPNS) is a system for creating and updating mutable links to IPFS content. Since objects in IPFS are content-addressed, their address changes every time their content does. That’s useful for a variety of things, but it makes it hard to get the latest version of something.
|
||||
|
||||
A name in IPNS is the hash of a public key. It is associated with a record containing information about the hash it links to that is signed by the corresponding private key. New records can be signed and published at any time.
|
||||
|
||||
When looking up an IPNS address, use the `/ipns/` prefix:
|
||||
|
||||
```
|
||||
/ipns/QmSrPmbaUKA3ZodhzPWZnpFgcPMFWF4QsxXbkWfEptTBJd
|
||||
```
|
||||
|
||||
<!-- TODO: more description of creating and publishing a name -->
|
||||
|
||||
IPNS is not the only to create mutable addresses on IPFS. You can also use [DNSLink](/guides/concepts/dnslink) (which is currently much faster than IPNS and also uses more readable names). Other community members are exploring ways to use blockchains to store common name records.
|
|
@ -1,16 +0,0 @@
|
|||
---
|
||||
title: "Mutable File System (MFS)"
|
||||
menu:
|
||||
guides:
|
||||
parent: concepts
|
||||
---
|
||||
|
||||
Because files in IPFS are content-addressed and immutable, they can be complicated to edit. Mutable File System (MFS) is a tool built into IPFS that lets you treat files like you would a normal name-based filesystem — you can add, remove, move, and edit MFS files and have all the work of updating links and hashes taken care of for you.
|
||||
|
||||
MFS is accessed through the [`files`](/api/cli/#ipfs-files) commands in the IPFS CLI and API.
|
||||
|
||||
<!-- TODO: add some examples to demonstrate how to use MFS, e.g. creating a directory, adding a file, checking the hash, editing the file, and checking the hash again. -->
|
||||
|
||||
This video also provides a good overview of MFS:
|
||||
|
||||
{{< youtube FX_AXNDsZ9k >}}
|
|
@ -1,24 +0,0 @@
|
|||
---
|
||||
title: "Pinning"
|
||||
menu:
|
||||
guides:
|
||||
parent: concepts
|
||||
---
|
||||
|
||||
IPFS nodes treat the data they store like a cache, meaning that there is no guarantee that the data will continue to be stored. Pinning a CID tells an IPFS server that the data is important and mustn't be thrown away.
|
||||
|
||||
You should pin any content you consider important, to ensure that content is retained long-term. Since data important to someone else may not be important to you, pinning lets you have control over the disk space and data retention you need.
|
||||
|
||||
## Context
|
||||
|
||||
Your IPFS node can store data based on different kinds of user events. For instance, you can add a file with `ipfs add ...`. It will also store data you request, such as by loading a web page through the gateway (`http://localhost:8080/ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco`) or with `ipfs cat ...`. Your node will consult with other IPFS peers to find these requested data, and will store the results in the local cache. `ipfs add` will automatically pin the content, but other IPFS commands do not include automatic pinning.
|
||||
|
||||
When garbage collection is triggered on a node, any pinned content is automatically exempt from deletion. Non-pinned data may be deleted; if you request it again later, the data can be retrieved from another node.
|
||||
|
||||
## Pinning Services
|
||||
|
||||
To ensure that your important data is retained, you may want to use a pinning service. Such a service normally trades money for the service of guaranteeing they'll keep your data pinned. Some cases where this might be important to you:
|
||||
|
||||
* You don’t have a lot of disk space, but you want to ensure some data sticks around.
|
||||
* Your computer is a laptop, phone, or tablet that will have intermittent connectivity to the network, but you want to be able to access your data on IPFS from anywhere at any time, even when the device you added it from is offline.
|
||||
* You want a backup that ensures your data is always available from another computer on the network in case you accidentally delete or garbage-collect on your own computer.
|
|
@ -1,14 +0,0 @@
|
|||
---
|
||||
title: "UnixFS"
|
||||
menu:
|
||||
guides:
|
||||
parent: concepts
|
||||
---
|
||||
|
||||
A file in IPFS isn’t just content. It might be too big to fit in a single block, so it needs metadata to link all its blocks together. It might be a symlink or a directory, so it needs metadata to link to other files. UnixFS is the data format used to represent files and all their links and metadata in IPFS, and is loosely based on how files work in Unix. When you add a *file* to IPFS, you are creating a block (or a tree of blocks) in the UnixFS format.
|
||||
|
||||
UnixFS is a [protocol-buffers](https://developers.google.com/protocol-buffers/)-based format. You can find the definitions for it at: https://github.com/ipfs/go-ipfs/blob/master/unixfs/pb/unixfs.proto.
|
||||
|
||||
<!-- TODO: fill in and link to the UnixFS v1 spec or fill in more details about how it works here. -->
|
||||
|
||||
*Note: we are currently designing an updated version of UnixFS that will be [IPLD](https://ipld.io)-compatible. You can follow along or participate [on GitHub](https://github.com/ipfs/unixfs-v2).*
|
|
@ -1,62 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
|
||||
"github.com/ipfs/go-ipfs/core"
|
||||
"github.com/ipfs/go-ipfs/core/coreunix"
|
||||
"github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
func CountChars(r io.Reader) map[byte]int {
|
||||
m := make(map[byte]int)
|
||||
buf := bufio.NewReader(r)
|
||||
for {
|
||||
b, err := buf.ReadByte()
|
||||
if err != nil {
|
||||
return m
|
||||
}
|
||||
m[b]++
|
||||
}
|
||||
}
|
||||
|
||||
func SetupIpfs() (*core.IpfsNode, error) {
|
||||
// Assume the user has run 'ipfs init'
|
||||
r, err := fsrepo.Open("~/.ipfs")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cfg := &core.BuildCfg{
|
||||
Repo: r,
|
||||
Online: true,
|
||||
}
|
||||
|
||||
return core.NewNode(context.Background(), cfg)
|
||||
}
|
||||
|
||||
func main() {
|
||||
nd, err := SetupIpfs()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Println("Please pass in an argument!")
|
||||
return
|
||||
}
|
||||
keytofetch := os.Args[1]
|
||||
|
||||
read, err := coreunix.Cat(context.Background(), nd, keytofetch)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println(CountChars(read))
|
||||
}
|
|
@ -1,102 +0,0 @@
|
|||
---
|
||||
draft: true
|
||||
---
|
||||
|
||||
## Ipfs Demo Application
|
||||
Lets take a look at making an application that uses ipfs. Lets say that our
|
||||
fictional application needs to read in a file, and count all the letters in
|
||||
it. But, being tech savvy as we are, we want the program to be able to take the
|
||||
files in from ipfs, so that users from around the world need only send them a
|
||||
hash in order for their files to be processed!
|
||||
|
||||
To Start off, lets get some imports:
|
||||
```
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
|
||||
"code.google.com/p/go.net/context"
|
||||
"github.com/ipfs/go-ipfs/core"
|
||||
"github.com/ipfs/go-ipfs/core/coreunix"
|
||||
"github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
Now, lets make a quick function to do a frequency count on characters:
|
||||
|
||||
```
|
||||
func CountChars(r io.Reader) map[byte]int {
|
||||
m := make(map[byte]int)
|
||||
buf := bufio.NewReader(r)
|
||||
for {
|
||||
b, err := buf.ReadByte()
|
||||
if err != nil {
|
||||
return m
|
||||
}
|
||||
m[b]++
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Alright, now for the ipfs goodness:
|
||||
|
||||
```
|
||||
func SetupIpfs() (*core.IpfsNode, error) {
|
||||
// Assume the user has run 'ipfs init'
|
||||
r, err := fsrepo.Open("~/.ipfs")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cfg := &core.BuildCfg{
|
||||
Repo: r,
|
||||
Online: true,
|
||||
}
|
||||
|
||||
cfg := new(core.BuildCfg)
|
||||
cfg.Repo = r
|
||||
cfg.Online = true
|
||||
|
||||
return core.NewNode(context.Background(), cfg)
|
||||
}
|
||||
```
|
||||
|
||||
We've got our node construction out of the way now, lets move on to actually
|
||||
doing something.
|
||||
|
||||
```
|
||||
func main() {
|
||||
nd, err := SetupIpfs()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Println("Please pass in an argument!")
|
||||
return
|
||||
}
|
||||
keytofetch := os.Args[1]
|
||||
|
||||
read, err := coreunix.Cat(nd, keytofetch)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println(CountChars(read))
|
||||
}
|
||||
```
|
||||
|
||||
And thats it, the user passes in a file, and we read it from ipfs. If no such
|
||||
file exists, we will error out from the `Cat` method. `Cat` returns a reader
|
||||
that will manage retrieving the file specified by the given hash, whether its
|
||||
stored locally on disk or if its pieces are split apart on multiple different
|
||||
machines across the planet.
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
|
@ -1,53 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
u "github.com/ipfs/go-ipfs-util"
|
||||
"github.com/ipfs/go-ipfs/core"
|
||||
"github.com/ipfs/go-ipfs/core/coreunix"
|
||||
"github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
)
|
||||
|
||||
var gnode *core.IpfsNode
|
||||
|
||||
func ServeIpfsRand(w http.ResponseWriter, r *http.Request) {
|
||||
read := io.LimitReader(u.NewTimeSeededRand(), 2048)
|
||||
|
||||
str, err := coreunix.Add(gnode, read)
|
||||
if err != nil {
|
||||
w.WriteHeader(504)
|
||||
w.Write([]byte(err.Error()))
|
||||
} else {
|
||||
w.Write([]byte(str))
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
r, err := fsrepo.Open("~/.ipfs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Make our 'master' context and defer cancelling it
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
cfg := &core.BuildCfg{
|
||||
Repo: r,
|
||||
Online: true,
|
||||
}
|
||||
|
||||
node, err := core.NewNode(ctx, cfg)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Set the global node for access in the handler
|
||||
gnode = node
|
||||
|
||||
http.HandleFunc("/ipfsobject", ServeIpfsRand)
|
||||
http.ListenAndServe(":8080", nil)
|
||||
}
|
|
@ -1,91 +0,0 @@
|
|||
---
|
||||
draft: true
|
||||
---
|
||||
|
||||
## Random Ipfs Objects
|
||||
During the development, ive frequently found the need to just get a hash of some
|
||||
random ipfs object. At first, I would just ask in irc "can someone give me a
|
||||
hash?". But I decided I could do better, So I decided to make it a service. In
|
||||
this article, im going to go over how I did that (hint: its really simple!)
|
||||
|
||||
First, lets get some imports:
|
||||
```
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
u "github.com/ipfs/go-ipfs-util"
|
||||
"github.com/ipfs/go-ipfs/core"
|
||||
"github.com/ipfs/go-ipfs/core/coreunix"
|
||||
"github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
)
|
||||
```
|
||||
|
||||
This just pulls in some basic ipfs packages, and the default golang http server.
|
||||
Now, since im lazy, im going to have a global for our ipfsnode.
|
||||
|
||||
```
|
||||
var gnode *core.IpfsNode
|
||||
```
|
||||
|
||||
Now, lets write the http handler func for generating our random objects.
|
||||
|
||||
```
|
||||
func ServeIpfsRand(w http.ResponseWriter, r *http.Request) {
|
||||
read := io.LimitReader(u.NewTimeSeededRand(), 2048)
|
||||
|
||||
str, err := coreunix.Add(gnode, read)
|
||||
if err != nil {
|
||||
w.WriteHeader(504)
|
||||
w.Write([]byte(err.Error()))
|
||||
} else {
|
||||
w.Write([]byte(str))
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
And now, lets tie it all together in a main function.
|
||||
|
||||
Set up our node configuration, and use the users standard ipfs configuration directory.
|
||||
|
||||
```
|
||||
func main() {
|
||||
r, err := fsrepo.Open("~/.ipfs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
```
|
||||
|
||||
Now we need to set up our context
|
||||
|
||||
```
|
||||
// Make our 'master' context and defer cancelling it
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
```
|
||||
|
||||
Then create a configuration and finally create our node!
|
||||
|
||||
```
|
||||
cfg := &core.BuildCfg{
|
||||
Repo: r,
|
||||
Online: true,
|
||||
}
|
||||
|
||||
node, err := core.NewNode(ctx, cfg)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Set the global node for access in the handler
|
||||
gnode = node
|
||||
|
||||
http.HandleFunc("/ipfsobject", ServeIpfsRand)
|
||||
http.ListenAndServe(":8080", nil)
|
||||
}
|
||||
```
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
|
@ -1,74 +0,0 @@
|
|||
---
|
||||
draft: true
|
||||
---
|
||||
|
||||
## Basic API usage
|
||||
using ipfs within your code is really quite simple!
|
||||
|
||||
At its simplest, you only need to create a node:
|
||||
```
|
||||
import "github.com/ipfs/go-ipfs/core"
|
||||
.
|
||||
.
|
||||
// setup ctx
|
||||
// setup cfg
|
||||
.
|
||||
|
||||
node, err := core.NewNode(ctx, cfg)
|
||||
```
|
||||
|
||||
The above code snippet is the simplest way to create an ipfs node. Below is explained how to get the context and the configuration objects in place.
|
||||
|
||||
### Configuration
|
||||
Lets create a Node's build configuration:
|
||||
|
||||
```
|
||||
cfg := &core.BuildCfg{
|
||||
Repo: r,
|
||||
Online: true,
|
||||
Routing: myRoutingOption,
|
||||
}
|
||||
```
|
||||
|
||||
A node created in 'Online' mode will start up bootstrapping, bitswap exchange,
|
||||
and other network interfaces.
|
||||
|
||||
#### Repo
|
||||
The ipfs 'repo' or repository represents all data that persists past a single
|
||||
instance. This currently includes the configuration file and the local
|
||||
datastore. By default, you will be given a blank config and an in memory
|
||||
datastore. To set your own, call `SetRepo` with your own repo object.
|
||||
The normal way to go about doing this is with an `FSRepo`, which represents
|
||||
an on disk 'repository'. This looks a bit like:
|
||||
```
|
||||
import "github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
.
|
||||
.
|
||||
.
|
||||
r := fsrepo.Open("/path/to/.ipfs")
|
||||
if err != nil {
|
||||
// Deal with the error
|
||||
}
|
||||
```
|
||||
|
||||
#### SetRouting
|
||||
ipfs by default will use our DHT network for getting provider information and
|
||||
ipns entries. If you wish to implement a separate routing system for your node
|
||||
to get this information through, just make an object that implements the
|
||||
IpfsRouting interface and pass the build configuration a RoutingOption for it.
|
||||
|
||||
### Context
|
||||
If you have never dealt with contexts before, I highly recommend you first go read
|
||||
[this wonderful explanation](https://blog.golang.org/context). Now, the context
|
||||
we pass into the new `Node` we are creating is the "master" context to the entire
|
||||
ipfs node, cancelling that context will shut down every single subprocess that ipfs
|
||||
runs.
|
||||
|
||||
The easiest way to set up a context for an ipfs node is something like this:
|
||||
```
|
||||
ctx, cancel := context.WithCancel(context.Background)
|
||||
```
|
||||
This creates a context, and an anonymous function that can be called to cancel
|
||||
the context, and by extension, all of the ipfs node.
|
||||
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
|
||||
core "github.com/ipfs/go-ipfs/core"
|
||||
corenet "github.com/ipfs/go-ipfs/core/corenet"
|
||||
// If this import breaks, have a look at the go-ipfs repository what they use
|
||||
// instead: `cd <go-ipfs-src-dir> && grep '\<peer\s\+\"' * -rI`
|
||||
peer "gx/ipfs/QmWUswjn261LSyVxWAEpMVtPdy8zmKBJJfBpG3Qdpa8ZsE/go-libp2p-peer"
|
||||
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
|
||||
"context"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Println("Please give a peer ID as an argument")
|
||||
return
|
||||
}
|
||||
target, err := peer.IDB58Decode(os.Args[1])
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Basic ipfsnode setup
|
||||
r, err := fsrepo.Open("~/.ipfs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
cfg := &core.BuildCfg{
|
||||
Repo: r,
|
||||
Online: true,
|
||||
}
|
||||
|
||||
nd, err := core.NewNode(ctx, cfg)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Printf("I am peer %s dialing %s\n", nd.Identity, target)
|
||||
|
||||
con, err := corenet.Dial(nd, target, "/app/whyrusleeping")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
io.Copy(os.Stdout, con)
|
||||
}
|
|
@ -1,51 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
core "github.com/ipfs/go-ipfs/core"
|
||||
corenet "github.com/ipfs/go-ipfs/core/corenet"
|
||||
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
|
||||
"context"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Basic ipfsnode setup
|
||||
r, err := fsrepo.Open("~/.ipfs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
cfg := &core.BuildCfg{
|
||||
Repo: r,
|
||||
Online: true,
|
||||
}
|
||||
|
||||
nd, err := core.NewNode(ctx, cfg)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
list, err := corenet.Listen(nd, "/app/whyrusleeping")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Printf("I am peer: %s\n", nd.Identity.Pretty())
|
||||
|
||||
for {
|
||||
con, err := list.Accept()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
defer con.Close()
|
||||
|
||||
fmt.Fprintln(con, "Hello! This is whyrusleepings awesome ipfs service")
|
||||
fmt.Printf("Connection from: %s\n", con.Conn().RemotePeer())
|
||||
}
|
||||
}
|
|
@ -1,173 +0,0 @@
|
|||
---
|
||||
title: Making Your Own IPFS Service
|
||||
---
|
||||
|
||||
ipfs has a few default services that it runs by default, such as the dht,
|
||||
bitswap, and the diagnostics service. Each of these simply registers a
|
||||
handler on the ipfs PeerHost, and listens on it for new connections. The
|
||||
`corenet` package has a very clean interface to this functionality. So lets
|
||||
try building an easy demo service to try this out!
|
||||
|
||||
Lets start by building the service host:
|
||||
|
||||
```
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
core "github.com/ipfs/go-ipfs/core"
|
||||
corenet "github.com/ipfs/go-ipfs/core/corenet"
|
||||
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
|
||||
"code.google.com/p/go.net/context"
|
||||
)
|
||||
```
|
||||
|
||||
We dont need too many imports for this.
|
||||
Now, the only other thing we need is our main function:
|
||||
|
||||
Set up an ipfsnode.
|
||||
|
||||
```
|
||||
func main() {
|
||||
// Basic ipfsnode setup
|
||||
r, err := fsrepo.Open("~/.ipfs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
cfg := &core.BuildCfg{
|
||||
Repo: r,
|
||||
Online: true,
|
||||
}
|
||||
|
||||
nd, err := core.NewNode(ctx, cfg)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
```
|
||||
|
||||
Thats just the basic template of code to initiate a default ipfsnode from
|
||||
the config in the users `~/.ipfs` directory.
|
||||
|
||||
Next, we are going to build our service.
|
||||
|
||||
```
|
||||
list, err := corenet.Listen(nd, "/app/whyrusleeping")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Printf("I am peer: %s\n", nd.Identity.Pretty())
|
||||
|
||||
for {
|
||||
con, err := list.Accept()
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
defer con.Close()
|
||||
|
||||
fmt.Fprintln(con, "Hello! This is whyrusleepings awesome ipfs service")
|
||||
fmt.Printf("Connection from: %s\n", con.Conn().RemotePeer())
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
And thats really all you need to write a service on top of ipfs. When a client
|
||||
connects, we send them our greeting, print their peer ID to our log, and close
|
||||
the session. This is the simplest possible service, and you can really write
|
||||
anything you want to handle the connection.
|
||||
|
||||
Now we need a client to connect to us:
|
||||
|
||||
```
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
|
||||
core "github.com/ipfs/go-ipfs/core"
|
||||
corenet "github.com/ipfs/go-ipfs/core/corenet"
|
||||
peer "github.com/ipfs/go-ipfs/p2p/peer"
|
||||
fsrepo "github.com/ipfs/go-ipfs/repo/fsrepo"
|
||||
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Println("Please give a peer ID as an argument")
|
||||
return
|
||||
}
|
||||
target, err := peer.IDB58Decode(os.Args[1])
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Basic ipfsnode setup
|
||||
r, err := fsrepo.Open("~/.ipfs")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
cfg := &core.BuildCfg{
|
||||
Repo: r,
|
||||
Online: true,
|
||||
}
|
||||
|
||||
nd, err := core.NewNode(ctx, cfg)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Printf("I am peer %s dialing %s\n", nd.Identity, target)
|
||||
|
||||
con, err := corenet.Dial(nd, target, "/app/whyrusleeping")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
io.Copy(os.Stdout, con)
|
||||
}
|
||||
```
|
||||
|
||||
This client will set up their ipfs node (note: this is moderately expensive and
|
||||
you normally wont just spin up an instance for a single connection) and dial the
|
||||
service we just created.
|
||||
|
||||
To try it out, run the following on one computer:
|
||||
```
|
||||
$ ipfs init # if you havent already
|
||||
$ go run host.go
|
||||
```
|
||||
|
||||
That should print out that peers ID, copy it and use it on a second machine:
|
||||
```
|
||||
$ ipfs init # if you havent already
|
||||
$ go run client.go <peerID>
|
||||
```
|
||||
|
||||
It should print out `Hello! This is whyrusleepings awesome ipfs service`
|
||||
|
||||
Now, you might be asking yourself: "Why would I use this? How is it better than
|
||||
the `net` package?". Well, here are the advantages:
|
||||
|
||||
1. You dial a specific peerID, no matter what their IP address happens to be at the moment.
|
||||
2. You take advantage of the NAT traversal built into our net package.
|
||||
3. Instead of a 'port' number, you get a much more meaningful protocol ID string.
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
|
@ -1,68 +0,0 @@
|
|||
---
|
||||
title: Dealing with Blocks
|
||||
---
|
||||
|
||||
The `ipfs add` command will create a Merkle DAG out of the data in the files you
|
||||
specify. It follows the [unixfs data format](https://github.com/ipfs/go-ipfs/blob/master/unixfs/pb/unixfs.proto) when doing this. This means
|
||||
that your files are broken down into blocks, and then arranged in a tree-like
|
||||
structure using 'link nodes' to tie them together. A given file's 'hash' is
|
||||
actually the hash of the root (uppermost) node in the DAG. For a given DAG, you
|
||||
can easily view the sub-blocks under it with `ipfs ls`.
|
||||
|
||||
For example:
|
||||
```
|
||||
# ensure this file is larger than 256k
|
||||
ipfs add alargefile
|
||||
ipfs ls thathash
|
||||
```
|
||||
|
||||
The above command should print out something like:
|
||||
```
|
||||
ipfs@earth ~> ipfs ls qms2hjwx8qejwm4nmwu7ze6ndam2sfums3x6idwz5myzbn
|
||||
qmv8ndh7ageh9b24zngaextmuhj7aiuw3scc8hkczvjkww 7866189
|
||||
qmuvjja4s4cgyqyppozttssquvgcv2n2v8mae3gnkrxmol 7866189
|
||||
qmrgjmlhlddhvxuieveuuwkeci4ygx8z7ujunikzpfzjuk 7866189
|
||||
qmrolalcquyo5vu5v8bvqmgjcpzow16wukq3s3vrll2tdk 7866189
|
||||
qmwk51jygpchgwr3srdnmhyerheqd22qw3vvyamb3emhuw 5244129
|
||||
```
|
||||
|
||||
This shows all of the immediate sub-blocks of your file, as well as the
|
||||
size of them and their children on the disk.
|
||||
|
||||
### What to do with Blocks?
|
||||
If you feel adventurous, you can get a lot of different information out of these
|
||||
different blocks. You can use the sub-block hashes as input to `ipfs cat` to
|
||||
see only the data in any given sub-tree (the data of that block and its
|
||||
children). To see just the data of a given block and not its children, use
|
||||
`ipfs block get`. But be careful, as `ipfs block get` on an intermediate block
|
||||
will print out the raw binary data of its DAG structure to your screen.
|
||||
|
||||
`ipfs block stat` will tell you the exact size of a given block (without its
|
||||
children), and `ipfs refs` will tell you all the children of that block.
|
||||
Similarly, `ipfs ls` or `ipfs object links` will show you all children and
|
||||
their sizes. `ipfs refs` is a more suitable command for scripting something
|
||||
to run on each child block of a given object.
|
||||
|
||||
### Blocks vs Objects
|
||||
In IPFS, a block refers to a single unit of data, identified by its key (hash).
|
||||
A block can be any sort of data, and does not necessarily have any sort of
|
||||
format associated with it. An object, on the other hand, refers to a block that
|
||||
follows the Merkle DAG protobuf data format. It can be parsed and manipulated
|
||||
via the `ipfs object` command. Any given hash may represent an object or a block.
|
||||
|
||||
### Creating a Block from scratch
|
||||
Creating your own blocks is easy! Simply put your data in a file and run
|
||||
`ipfs block put <yourfile>` on it. Or, you can pipe your filedata into
|
||||
`ipfs block put`, like so:
|
||||
|
||||
```
|
||||
$ echo "This is some data" | ipfs block put
|
||||
QmfQ5QAjvg4GtA3wg3adpnDJug8ktA1BxurVqBD8rtgVjM
|
||||
$ ipfs block get QmfQ5QAjvg4GtA3wg3adpnDJug8ktA1BxurVqBD8rtgVjM
|
||||
This is some data
|
||||
```
|
||||
Note: When making your own block data, you won't be able to read the data with
|
||||
`ipfs cat`. This is because you are inputting raw data without the unixfs data
|
||||
format. To read raw blocks, use `ipfs block get` as shown in the example.
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
|
@ -1,58 +0,0 @@
|
|||
---
|
||||
title: Modifying the bootstrap peers list
|
||||
---
|
||||
|
||||
The IPFS bootstrap list is a list of peers with which the IPFS daemon learns about other peers on the network. IPFS comes with a default list of trusted peers, but you are free to modify the list to suit your needs. One popular use for a custom bootstrap list is to create a personal IPFS network.
|
||||
|
||||
First, let's list your node's bootstrap list:
|
||||
|
||||
```
|
||||
> ipfs bootstrap list
|
||||
/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
|
||||
/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx
|
||||
/ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z
|
||||
/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLpPVmHKQ4XTPdz8tjDFgdeRFkpV8JgYq8JVJ69RrZm
|
||||
/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64
|
||||
/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
|
||||
/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm
|
||||
/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
|
||||
/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3
|
||||
```
|
||||
|
||||
The lines listed above are the addresses of the default IPFS bootstrap nodes -- they are run by the IPFS development team. The addresses listed are fully resolved and specified in [multiaddr](https://github.com/jbenet/multiaddr) format, which makes every protocol explicit. This way, your node knows exactly where to reach the bootstrap nodes -- the location is unambiguous.
|
||||
|
||||
Don't change this list unless you understand what it means to do so. Bootstrapping is an important security point of failure in distributed systems: malicious bootstrap peers could only introduce you to other malicious peers. It is recommended to keep the default list provided by the IPFS dev team, or -- in the case of setting up private networks -- a list of nodes you control. Don't add peers to this list that you don't trust.
|
||||
|
||||
Here we add a new peer to the bootstrap list:
|
||||
```
|
||||
> ipfs bootstrap add /ip4/25.196.147.100/tcp/4001/ipfs/QmaMqSwWShsPg2RbredZtoneFjXhim7AQkqbLxib45Lx4S
|
||||
```
|
||||
|
||||
Here we remove a node from the bootstrap list:
|
||||
```
|
||||
> ipfs bootstrap rm /ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
|
||||
```
|
||||
|
||||
Let's say we want to create a backup of our new bootstrap list. We can easily do this by redirecting stdout of `ipfs bootstrap list` to a file:
|
||||
```
|
||||
> ipfs bootstrap list >save
|
||||
```
|
||||
|
||||
If we ever want to start from scratch, we can delete the entire bootstrap list at once:
|
||||
```
|
||||
> ipfs bootstrap rm --all
|
||||
```
|
||||
|
||||
With an empty list, we can restore the default bootstrap list:
|
||||
```
|
||||
> ipfs bootstrap add --default
|
||||
```
|
||||
|
||||
Remove the entire bootstrap list again, and restore our saved one by piping the contents of the saved file to `ipfs bootstrap add`:
|
||||
```
|
||||
> ipfs bootstrap rm --all
|
||||
> cat save | ipfs bootstrap add
|
||||
```
|
||||
|
||||
|
||||
By [jbenet](http://github.com/jbenet) and [insanity54](http://github.com/insanity54)
|
|
@ -1,53 +0,0 @@
|
|||
---
|
||||
title: Configuring Your Node
|
||||
---
|
||||
|
||||
ipfs is configured through a json formatted text file, located by default at
|
||||
`~/.ipfs/config`.
|
||||
|
||||
### Addresses
|
||||
The config file stores a few different address types, all of which use the
|
||||
multiaddr addressing format. Lets go over what each address type means.
|
||||
|
||||
```
|
||||
"Addresses": {
|
||||
"Swarm": [
|
||||
"/ip4/0.0.0.0/tcp/4001"
|
||||
],
|
||||
"API": "/ip4/127.0.0.1/tcp/5001",
|
||||
"Gateway": "/ip4/127.0.0.1/tcp/8080"
|
||||
}
|
||||
```
|
||||
|
||||
#### Swarm
|
||||
Swarm addresses are addresses that the local daemon will listen on for
|
||||
connections from other ipfs peers. You should try to ensure that these
|
||||
addresses can be dialed from a separate computer and that there are no
|
||||
firewalls blocking the ports you specify.
|
||||
|
||||
#### API
|
||||
The API address is the address that the daemon will serve the http API from.
|
||||
This API is used to control the daemon through the command line, or simply
|
||||
via curl if youre feeling adventurous. You should ensure that this address
|
||||
is not dialable from outside of your machine, or other potentially malicious
|
||||
parties may be able to send commands to your ipfs daemon.
|
||||
|
||||
#### Gateway
|
||||
The Gateway address is the address that the daemon will serve the gateway
|
||||
interface from. The gateway may be used to view files through ipfs, and serve
|
||||
static web content. This port may or may not be dialable from outside of your
|
||||
machine, thats entirely up to you. The gateway address is optional, if you
|
||||
leave it blank, the gateway server will not start.
|
||||
|
||||
### Mounts
|
||||
The mounts config values specifies the default mountpoints for the ipfs and
|
||||
ipns virtual filesystems, if no other directories are specified by the
|
||||
`ipfs mount` command. These folders should exist, and have permissions for your
|
||||
user to be able to mount to them via fuse.
|
||||
|
||||
### Bootstrap
|
||||
The Bootstrap config array specifies the list of ipfs peers that your daemon
|
||||
will connect to on startup. The default values for this are the 'ipfs solarnet'
|
||||
nodes, which are a set of VPS servers distributed around the country.
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
|
@ -1,84 +0,0 @@
|
|||
---
|
||||
title: Git, Even More Distributed
|
||||
---
|
||||
|
||||
Have you ever said to yourself: "Man, my git server isn't distributed enough" or
|
||||
"I wish I had an easy way to serve a static git repository worldwide". Well wish
|
||||
no more, I have the solution for you!
|
||||
|
||||
In this article, I will be discussing how to serve a git repository through the
|
||||
ipfs network. The end result will be a `git clone`able url served through ipfs!
|
||||
|
||||
To start, select a git repo you want to host, and do a bare clone of it:
|
||||
```
|
||||
$ git clone --bare git@myhost.io/myrepo
|
||||
```
|
||||
|
||||
For those who aren't super git savvy, a bare repo means that it doesn't have
|
||||
a working tree, and can be used as a server. They have a slightly different
|
||||
format than your normal git repo.
|
||||
|
||||
Now, to get it ready to be cloned, you need to do the following:
|
||||
```
|
||||
$ cd myrepo
|
||||
$ git update-server-info
|
||||
```
|
||||
|
||||
Optionally, you can unpack all of gits objects:
|
||||
```
|
||||
$ cp objects/pack/*.pack .
|
||||
$ git unpack-objects < ./*.pack
|
||||
$ rm ./*.pack
|
||||
```
|
||||
|
||||
Doing this breaks up gits large packfile into all of its individual objects.
|
||||
This will allow ipfs to deduplicate objects if you add multiple versions of
|
||||
this git repository.
|
||||
|
||||
Once youve done that, that repo is ready to be served. All thats left to do, is
|
||||
to add it to ipfs:
|
||||
```
|
||||
$ pwd
|
||||
/code/myrepo
|
||||
$ ipfs add -r .
|
||||
...
|
||||
...
|
||||
...
|
||||
added QmX679gmfyaRkKMvPA4WGNWXj9PtpvKWGPgtXaF18etC95 .
|
||||
```
|
||||
|
||||
Now, all thats left is to try cloning it:
|
||||
```
|
||||
$ cd /tmp
|
||||
$ git clone http://localhost:8080/ipfs/QmX679gmfyaRkKMvPA4WGNWXj9PtpvKWGPgtXaF18etC95 myrepo
|
||||
```
|
||||
|
||||
Note: make sure to change out that hash for yours.
|
||||
|
||||
Now, you may be asking "well what good is a git repo that I can't change anything on?"
|
||||
Well let me tell you an awesome usecase! I tend to program in a language called Go,
|
||||
for those who don't know go uses version control paths for its imports, i.e:
|
||||
```go
|
||||
import (
|
||||
"github.com/whyrusleeping/mycoollibrary"
|
||||
)
|
||||
```
|
||||
|
||||
This is a really nice feature, and solves a lot of problems, but often times, I run into
|
||||
the issue where im using someones library, and they change the API, and it breaks my code.
|
||||
Using what we've done above, you could clone the library, and add it into ipfs, so your import
|
||||
paths will now look something like:
|
||||
```go
|
||||
import (
|
||||
mylib "gateway.ipfs.io/ipfs/QmX679gmfyaRkKMvPA4WGNWXj9PtpvKWGPgtXaF18etC95"
|
||||
)
|
||||
```
|
||||
|
||||
And you will be guaranteed to have the same code every time!
|
||||
|
||||
Note: Since go doesnt allow the usage of localhost for import paths, we use the
|
||||
public http gateways. This provides no security guarantees as a man in the
|
||||
middle attack could ship you bad code. You could use a domain name that redirects
|
||||
to the localhost instead to avoid the issue.
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
Binary file not shown.
Before Width: | Height: | Size: 136 KiB |
|
@ -1 +0,0 @@
|
|||
bar
|
|
@ -1 +0,0 @@
|
|||
bar
|
|
@ -1 +0,0 @@
|
|||
foo
|
|
@ -1 +0,0 @@
|
|||
foo
|
|
@ -1,26 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ "$#" -ne 1 ]; then
|
||||
echo "usage: $0 <ipfs-path>..."
|
||||
echo "output merkledag links in graphviz dot"
|
||||
echo ""
|
||||
echo "use it with dot:"
|
||||
echo " $0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tsvg"
|
||||
echo " $0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpng"
|
||||
echo " $0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpdf"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
src='<src> [fontsize=8 shape=box];'
|
||||
dst='<dst> [fontsize=8 shape=box];'
|
||||
edge='<src> -> <dst> [label="<linkname>"];'
|
||||
fmt="$src
|
||||
$dst
|
||||
$edge"
|
||||
|
||||
echo "digraph {"
|
||||
echo " graph [rankdir=LR];"
|
||||
ipfs refs -r --format="$fmt" "$@" | awk '{ print "\t" $0 }'
|
||||
# ipfs refs -r --format="$fmt" "$@" | awk '{ print "\t" $0 }' | unflatten -l3
|
||||
echo "}"
|
|
@ -1,122 +0,0 @@
|
|||
---
|
||||
title: Visualizing objects with graphmd
|
||||
---
|
||||
|
||||
![](output/graph.png)
|
||||
|
||||
When using ipfs for storing files, or writing more complex datastructures,
|
||||
it is often very useful to visualize the merkledag being created. For this,
|
||||
I wrote a simple tool called `graphmd` (graph merkle dag).
|
||||
|
||||
`graphmd` is a very short shell script ([source](https://ipfs.io/ipfs/QmfT4cEw9zezKaV6wF9aELFtpuovxFCR8CXSkUb6enAgw8/graphmd)). It uses the
|
||||
`ipfs refs --format` flag to produce `dot` output.
|
||||
|
||||
## Install graphmd
|
||||
|
||||
`graphmd` will be in its own repo soon, but for now you can install it with:
|
||||
|
||||
```
|
||||
ipfs cat Qmcd7Sebd46vxDWjbUERK8w82zp8sgWTtHT5c93kzr2v3M >/usr/local/bin/graphmd
|
||||
chmod +x /usr/local/bin/graphmd
|
||||
```
|
||||
|
||||
## graphmd usage
|
||||
|
||||
```
|
||||
> graphmd
|
||||
usage: graphmd <ipfs-path>...
|
||||
output merkledag links in graphviz dot
|
||||
|
||||
use it with dot:
|
||||
bin/graphmd QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tsvg
|
||||
bin/graphmd QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpng
|
||||
bin/graphmd QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpdf
|
||||
```
|
||||
|
||||
## Example
|
||||
|
||||
Given this [demo](https://ipfs.io/ipfs/QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF) directory:
|
||||
|
||||
```sh
|
||||
> tree demo
|
||||
demo
|
||||
├── cat.jpg
|
||||
└── test
|
||||
├── bar
|
||||
├── baz
|
||||
│ ├── b
|
||||
│ └── f
|
||||
└── foo
|
||||
|
||||
2 directories, 5 files
|
||||
```
|
||||
|
||||
Add the files to ipfs
|
||||
|
||||
```sh
|
||||
> ipfs add -r demo
|
||||
added QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb demo/cat.jpg
|
||||
added QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM demo/test/bar
|
||||
added QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM demo/test/baz/b
|
||||
added QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 demo/test/baz/f
|
||||
added QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt demo/test/baz
|
||||
added QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 demo/test/foo
|
||||
added QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv demo/test
|
||||
added QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF demo
|
||||
```
|
||||
|
||||
Use `graphmd` to generate the dot output
|
||||
|
||||
```sh
|
||||
> graphmd QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF >graph.dot
|
||||
digraph {
|
||||
graph [rankdir=LR];
|
||||
QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF [fontsize=8 shape=box];
|
||||
QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb [fontsize=8 shape=box];
|
||||
QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF -> QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb [label="cat.jpg"];
|
||||
QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF [fontsize=8 shape=box];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box];
|
||||
QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF -> QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [label="test"];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box];
|
||||
QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [fontsize=8 shape=box];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [label="bar"];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box];
|
||||
QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [label="baz"];
|
||||
QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box];
|
||||
QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [fontsize=8 shape=box];
|
||||
QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt -> QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [label="b"];
|
||||
QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box];
|
||||
QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [fontsize=8 shape=box];
|
||||
QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt -> QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [label="f"];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box];
|
||||
QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [fontsize=8 shape=box];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [label="foo"];
|
||||
}
|
||||
```
|
||||
|
||||
Pipe it to `dot` to produce `svg`, `pdf`, `png` or [whatever](https://web.archive.org/web/20180216175016/http://www.graphviz.org/pdf/dotguide.pdf)
|
||||
|
||||
```
|
||||
graphmd QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF | dot -Tsvg >output/graph.svg
|
||||
graphmd QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF | dot -Tpdf >output/graph.pdf
|
||||
graphmd QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF | dot -Tpng >output/graph.png
|
||||
```
|
||||
|
||||
Et voilà: [svg](output/graph.svg), [pdf](output/graph.pdf), [png](output/graph.png)
|
||||
|
||||
![](output/graph.png)
|
||||
|
||||
## File blocks
|
||||
|
||||
`graphmd` is particularly useful to inspect file blocking algorithms.
|
||||
For example, here is what the `ipfs` binary looks like with the default
|
||||
semi-balanced indirect block chunking:
|
||||
|
||||
- [dot output](ipfsbin/graph.dot)
|
||||
- [svg render](ipfsbin/graph.svg)
|
||||
- [pdf render](ipfsbin/graph.pdf)
|
||||
|
||||
![](ipfsbin/graph.svg)
|
||||
|
||||
by [Juan Benet](https://github.com/jbenet)
|
|
@ -1,240 +0,0 @@
|
|||
digraph {
|
||||
graph [rankdir=LR];
|
||||
QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 -> QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6 [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6 [label=""];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV [fontsize=8 shape=box];
|
||||
QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT [fontsize=8 shape=box];
|
||||
QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -> QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT [label=""];
|
||||
QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 -> QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9 [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9 [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1 [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1 [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4 [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4 [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM [label=""];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD [fontsize=8 shape=box];
|
||||
QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn [fontsize=8 shape=box];
|
||||
QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -> QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn [label=""];
|
||||
QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 -> QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4 [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4 [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3 [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3 [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5 [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5 [label=""];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH [fontsize=8 shape=box];
|
||||
Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B [fontsize=8 shape=box];
|
||||
QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -> Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B [label=""];
|
||||
}
|
Binary file not shown.
|
@ -1,808 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 2.38.0 (20140413.2041)
|
||||
-->
|
||||
<!-- Title: %3 Pages: 1 -->
|
||||
<svg width="770pt" height="4094pt"
|
||||
viewBox="0.00 0.00 770.33 4094.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 4090)">
|
||||
<title>%3</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-4090 766.332,-4090 766.332,4 -4,4"/>
|
||||
<!-- QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4 -->
|
||||
<g id="node1" class="node"><title>QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4</title>
|
||||
<polygon fill="none" stroke="black" points="228.182,-1683 -0.060579,-1683 -0.060579,-1647 228.182,-1647 228.182,-1683"/>
|
||||
<text text-anchor="middle" x="114.061" y="-1662.6" font-family="Times,serif" font-size="8.00">QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -->
|
||||
<g id="node2" class="node"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV</title>
|
||||
<polygon fill="none" stroke="black" points="487.707,-3276 265.863,-3276 265.863,-3240 487.707,-3240 487.707,-3276"/>
|
||||
<text text-anchor="middle" x="376.785" y="-3255.6" font-family="Times,serif" font-size="8.00">QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV</text>
|
||||
</g>
|
||||
<!-- QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4->QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV -->
|
||||
<g id="edge1" class="edge"><title>QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4->QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV</title>
|
||||
<path fill="none" stroke="black" d="M118.034,-1683.16C144.442,-1844.52 338.641,-3031.05 371.169,-3229.8"/>
|
||||
<polygon fill="black" stroke="black" points="367.729,-3230.45 372.798,-3239.75 374.637,-3229.32 367.729,-3230.45"/>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -->
|
||||
<g id="node33" class="node"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD</title>
|
||||
<polygon fill="none" stroke="black" points="489.614,-1683 263.957,-1683 263.957,-1647 489.614,-1647 489.614,-1683"/>
|
||||
<text text-anchor="middle" x="376.785" y="-1662.6" font-family="Times,serif" font-size="8.00">QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD</text>
|
||||
</g>
|
||||
<!-- QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4->QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD -->
|
||||
<g id="edge32" class="edge"><title>QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4->QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD</title>
|
||||
<path fill="none" stroke="black" d="M228.281,-1665C236.683,-1665 245.182,-1665 253.635,-1665"/>
|
||||
<polygon fill="black" stroke="black" points="253.913,-1668.5 263.913,-1665 253.913,-1661.5 253.913,-1668.5"/>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -->
|
||||
<g id="node64" class="node"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH</title>
|
||||
<polygon fill="none" stroke="black" points="487.949,-468 265.621,-468 265.621,-432 487.949,-432 487.949,-468"/>
|
||||
<text text-anchor="middle" x="376.785" y="-447.6" font-family="Times,serif" font-size="8.00">QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH</text>
|
||||
</g>
|
||||
<!-- QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4->QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH -->
|
||||
<g id="edge63" class="edge"><title>QmUhGxNotmJDRVtoYWvCc2xvTe9PpynpDHZwD3y2UdaeR4->QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH</title>
|
||||
<path fill="none" stroke="black" d="M118.949,-1646.88C148.22,-1510.47 333.859,-645.378 369.774,-478.014"/>
|
||||
<polygon fill="black" stroke="black" points="373.199,-478.735 371.875,-468.223 366.354,-477.266 373.199,-478.735"/>
|
||||
</g>
|
||||
<!-- QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM -->
|
||||
<g id="node3" class="node"><title>QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM</title>
|
||||
<polygon fill="none" stroke="black" points="756.731,-4086 531.051,-4086 531.051,-4050 756.731,-4050 756.731,-4086"/>
|
||||
<text text-anchor="middle" x="643.891" y="-4065.6" font-family="Times,serif" font-size="8.00">QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM -->
|
||||
<g id="edge2" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmVHHcWx7Uro5CN5GPt8YMjncLfpSftSq9xVRpopdPwoFM</title>
|
||||
<path fill="none" stroke="black" d="M378.6,-3276.34C383.728,-3383.32 414.968,-3926.06 525.449,-4041 526.247,-4041.83 527.064,-4042.64 527.9,-4043.42"/>
|
||||
<polygon fill="black" stroke="black" points="525.919,-4046.32 535.897,-4049.88 530.318,-4040.87 525.919,-4046.32"/>
|
||||
</g>
|
||||
<!-- QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP -->
|
||||
<g id="node4" class="node"><title>QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP</title>
|
||||
<polygon fill="none" stroke="black" points="753.895,-4032 533.887,-4032 533.887,-3996 753.895,-3996 753.895,-4032"/>
|
||||
<text text-anchor="middle" x="643.891" y="-4011.6" font-family="Times,serif" font-size="8.00">QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP -->
|
||||
<g id="edge3" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmRUfpiX9CM7sKAfGLr9JbiqzpGdFCN3FJBx85QueTNzhP</title>
|
||||
<path fill="none" stroke="black" d="M378.859,-3276.07C385.287,-3378.05 421.935,-3880.75 525.449,-3987 526.252,-3987.82 527.075,-3988.63 527.916,-3989.4"/>
|
||||
<polygon fill="black" stroke="black" points="525.956,-3992.32 535.953,-3995.83 530.326,-3986.85 525.956,-3992.32"/>
|
||||
</g>
|
||||
<!-- QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J -->
|
||||
<g id="node5" class="node"><title>QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J</title>
|
||||
<polygon fill="none" stroke="black" points="746.649,-3978 541.133,-3978 541.133,-3942 746.649,-3942 746.649,-3978"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3957.6" font-family="Times,serif" font-size="8.00">QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J -->
|
||||
<g id="edge4" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmaazzgnFYyVL9jBf1oy2Zn4HJex1DdrdkRPfCueutxu2J</title>
|
||||
<path fill="none" stroke="black" d="M379.168,-3276C387.004,-3373.29 428.948,-3835.47 525.449,-3933 527.622,-3935.2 529.935,-3937.23 532.364,-3939.11"/>
|
||||
<polygon fill="black" stroke="black" points="530.787,-3942.27 541.04,-3944.93 534.689,-3936.45 530.787,-3942.27"/>
|
||||
</g>
|
||||
<!-- QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt -->
|
||||
<g id="node6" class="node"><title>QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt</title>
|
||||
<polygon fill="none" stroke="black" points="755.071,-3924 532.711,-3924 532.711,-3888 755.071,-3888 755.071,-3924"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3903.6" font-family="Times,serif" font-size="8.00">QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt -->
|
||||
<g id="edge5" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmcFH4SYu4nW4kFYfX9o8wr2WRYiz733FAwhP3zeWDi7Bt</title>
|
||||
<path fill="none" stroke="black" d="M379.542,-3276.07C388.913,-3368.8 435.982,-3790.2 525.449,-3879 526.389,-3879.93 527.354,-3880.84 528.342,-3881.71"/>
|
||||
<polygon fill="black" stroke="black" points="526.288,-3884.55 536.35,-3887.87 530.555,-3879 526.288,-3884.55"/>
|
||||
</g>
|
||||
<!-- QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ -->
|
||||
<g id="node7" class="node"><title>QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ</title>
|
||||
<polygon fill="none" stroke="black" points="758.719,-3870 529.062,-3870 529.062,-3834 758.719,-3834 758.719,-3870"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3849.6" font-family="Times,serif" font-size="8.00">QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ -->
|
||||
<g id="edge6" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPkwiwb99YSHCuEGA5iz2QHRgWgq2oD7k97Eqnr1om7UQ</title>
|
||||
<path fill="none" stroke="black" d="M379.997,-3276.23C391.044,-3364.33 443.009,-3744.9 525.449,-3825 526.42,-3825.94 527.416,-3826.86 528.437,-3827.74"/>
|
||||
<polygon fill="black" stroke="black" points="526.602,-3830.74 536.699,-3833.95 530.808,-3825.14 526.602,-3830.74"/>
|
||||
</g>
|
||||
<!-- QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF -->
|
||||
<g id="node8" class="node"><title>QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF</title>
|
||||
<polygon fill="none" stroke="black" points="760.723,-3816 527.058,-3816 527.058,-3780 760.723,-3780 760.723,-3816"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3795.6" font-family="Times,serif" font-size="8.00">QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF -->
|
||||
<g id="edge7" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmYDG5nR7JjX4sHKR4qKNrxvdm9zQw4UiXH2Y45GexMkNF</title>
|
||||
<path fill="none" stroke="black" d="M380.511,-3276.14C393.301,-3358.87 449.918,-3699.46 525.449,-3771 526.432,-3771.93 527.44,-3772.83 528.471,-3773.7"/>
|
||||
<polygon fill="black" stroke="black" points="526.677,-3776.73 536.805,-3779.84 530.826,-3771.09 526.677,-3776.73"/>
|
||||
</g>
|
||||
<!-- Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X -->
|
||||
<g id="node9" class="node"><title>Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X</title>
|
||||
<polygon fill="none" stroke="black" points="759.473,-3762 528.309,-3762 528.309,-3726 759.473,-3726 759.473,-3762"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3741.6" font-family="Times,serif" font-size="8.00">Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X -->
|
||||
<g id="edge8" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->Qme5qh3zcVTQ3hKPZ6uesRaCgyY9WUrFZo2T7YKM4xkW3X</title>
|
||||
<path fill="none" stroke="black" d="M377.685,-3276.22C378.35,-3345.25 390.412,-3593.01 525.449,-3717 526.581,-3718.04 527.744,-3719.04 528.937,-3720.01"/>
|
||||
<polygon fill="black" stroke="black" points="527.017,-3722.94 537.198,-3725.87 531.068,-3717.23 527.017,-3722.94"/>
|
||||
</g>
|
||||
<!-- QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo -->
|
||||
<g id="node10" class="node"><title>QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo</title>
|
||||
<polygon fill="none" stroke="black" points="751.199,-3708 536.582,-3708 536.582,-3672 751.199,-3672 751.199,-3708"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3687.6" font-family="Times,serif" font-size="8.00">QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo -->
|
||||
<g id="edge9" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPxUYaiVte9yDxooJL9SYPxLBL9tmYujTjaxejJxYKNwo</title>
|
||||
<path fill="none" stroke="black" d="M378.574,-3276.29C382.365,-3340.23 404.017,-3555.73 525.449,-3663 526.625,-3664.04 527.833,-3665.04 529.07,-3666"/>
|
||||
<polygon fill="black" stroke="black" points="527.394,-3669.1 537.624,-3671.86 531.347,-3663.32 527.394,-3669.1"/>
|
||||
</g>
|
||||
<!-- QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh -->
|
||||
<g id="node11" class="node"><title>QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh</title>
|
||||
<polygon fill="none" stroke="black" points="754.086,-3654 533.695,-3654 533.695,-3618 754.086,-3618 754.086,-3654"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3633.6" font-family="Times,serif" font-size="8.00">QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh -->
|
||||
<g id="edge10" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPofAYvmrBNgkABgQj3nEPdAKdFurrwnCB8FNgozhr2Lh</title>
|
||||
<path fill="none" stroke="black" d="M379.712,-3276.3C386.878,-3334.7 417.429,-3518.15 525.449,-3609 526.825,-3610.16 528.241,-3611.27 529.693,-3612.33"/>
|
||||
<polygon fill="black" stroke="black" points="528.071,-3615.45 538.368,-3617.95 531.874,-3609.57 528.071,-3615.45"/>
|
||||
</g>
|
||||
<!-- QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR -->
|
||||
<g id="node12" class="node"><title>QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR</title>
|
||||
<polygon fill="none" stroke="black" points="751.301,-3600 536.48,-3600 536.48,-3564 751.301,-3564 751.301,-3600"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3579.6" font-family="Times,serif" font-size="8.00">QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR -->
|
||||
<g id="edge11" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmTAaogaiuasr7JrWPBordJF7gW56JobUQRbsKfSNNH8fR</title>
|
||||
<path fill="none" stroke="black" d="M381.177,-3276.07C391.959,-3328.24 430.491,-3480.13 525.449,-3555 527.051,-3556.26 528.701,-3557.47 530.394,-3558.62"/>
|
||||
<polygon fill="black" stroke="black" points="528.813,-3561.75 539.181,-3563.93 532.435,-3555.76 528.813,-3561.75"/>
|
||||
</g>
|
||||
<!-- QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat -->
|
||||
<g id="node13" class="node"><title>QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat</title>
|
||||
<polygon fill="none" stroke="black" points="755.063,-3546 532.719,-3546 532.719,-3510 755.063,-3510 755.063,-3546"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3525.6" font-family="Times,serif" font-size="8.00">QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat -->
|
||||
<g id="edge12" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmXX3S8J2Vik74M1ND4zneoWnGAJNthB7Q79vwdQz5eoat</title>
|
||||
<path fill="none" stroke="black" d="M383.263,-3276.04C398.069,-3321.57 443.401,-3441.76 525.449,-3501 527.344,-3502.37 529.297,-3503.67 531.3,-3504.9"/>
|
||||
<polygon fill="black" stroke="black" points="529.927,-3508.14 540.372,-3509.92 533.313,-3502.02 529.927,-3508.14"/>
|
||||
</g>
|
||||
<!-- Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB -->
|
||||
<g id="node14" class="node"><title>Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB</title>
|
||||
<polygon fill="none" stroke="black" points="759.102,-3492 528.68,-3492 528.68,-3456 759.102,-3456 759.102,-3492"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3471.6" font-family="Times,serif" font-size="8.00">Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB -->
|
||||
<g id="edge13" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->Qme1YSxUvETdARr3QtWgsf9VMZk1guRP9Mn6pZEGhVLzdB</title>
|
||||
<path fill="none" stroke="black" d="M386.525,-3276.18C405.853,-3314.33 456.07,-3402.85 525.449,-3447 527.931,-3448.58 530.495,-3450.07 533.124,-3451.47"/>
|
||||
<polygon fill="black" stroke="black" points="531.764,-3454.7 542.29,-3455.9 534.813,-3448.4 531.764,-3454.7"/>
|
||||
</g>
|
||||
<!-- QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc -->
|
||||
<g id="node15" class="node"><title>QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc</title>
|
||||
<polygon fill="none" stroke="black" points="758.317,-3438 529.464,-3438 529.464,-3402 758.317,-3402 758.317,-3438"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3417.6" font-family="Times,serif" font-size="8.00">QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc -->
|
||||
<g id="edge14" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmcNw2ufVvgV7pEmMWKn78Wn4rnn8HCidDTVp1gPC2jkuc</title>
|
||||
<path fill="none" stroke="black" d="M392.037,-3276.03C416.213,-3305.32 468.242,-3362.98 525.449,-3393 528.995,-3394.86 532.667,-3396.59 536.427,-3398.21"/>
|
||||
<polygon fill="black" stroke="black" points="535.345,-3401.55 545.931,-3401.98 537.929,-3395.04 535.345,-3401.55"/>
|
||||
</g>
|
||||
<!-- QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh -->
|
||||
<g id="node16" class="node"><title>QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh</title>
|
||||
<polygon fill="none" stroke="black" points="755.766,-3384 532.016,-3384 532.016,-3348 755.766,-3348 755.766,-3384"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3363.6" font-family="Times,serif" font-size="8.00">QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh -->
|
||||
<g id="edge15" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmQrthQNznw7FwdWCjgT3eTy3X6sdsD2wk46F9vGAuVTxh</title>
|
||||
<path fill="none" stroke="black" d="M405.254,-3276.09C434.1,-3294.36 481.318,-3322.19 525.449,-3339 531.023,-3341.12 536.812,-3343.11 542.698,-3344.96"/>
|
||||
<polygon fill="black" stroke="black" points="542.093,-3348.43 552.677,-3347.95 544.102,-3341.73 542.093,-3348.43"/>
|
||||
</g>
|
||||
<!-- QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL -->
|
||||
<g id="node17" class="node"><title>QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL</title>
|
||||
<polygon fill="none" stroke="black" points="757.75,-3330 530.031,-3330 530.031,-3294 757.75,-3294 757.75,-3330"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3309.6" font-family="Times,serif" font-size="8.00">QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL -->
|
||||
<g id="edge16" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPpJJZSU4wNWqGdK77uqDSuMju9cd2d7rBrPFa8AGHWeL</title>
|
||||
<path fill="none" stroke="black" d="M466.43,-3276.06C491.412,-3281.14 518.74,-3286.71 544.268,-3291.91"/>
|
||||
<polygon fill="black" stroke="black" points="543.832,-3295.39 554.329,-3293.96 545.229,-3288.54 543.832,-3295.39"/>
|
||||
</g>
|
||||
<!-- QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN -->
|
||||
<g id="node18" class="node"><title>QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN</title>
|
||||
<polygon fill="none" stroke="black" points="758.367,-3276 529.414,-3276 529.414,-3240 758.367,-3240 758.367,-3276"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3255.6" font-family="Times,serif" font-size="8.00">QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN -->
|
||||
<g id="edge17" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmTFgwHuBSTEH7vjw6avYv7Mu8bguSmeygpExHMLXfyYjN</title>
|
||||
<path fill="none" stroke="black" d="M487.911,-3258C498.26,-3258 508.797,-3258 519.26,-3258"/>
|
||||
<polygon fill="black" stroke="black" points="519.26,-3261.5 529.26,-3258 519.26,-3254.5 519.26,-3261.5"/>
|
||||
</g>
|
||||
<!-- QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G -->
|
||||
<g id="node19" class="node"><title>QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G</title>
|
||||
<polygon fill="none" stroke="black" points="759.441,-3222 528.34,-3222 528.34,-3186 759.441,-3186 759.441,-3222"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3201.6" font-family="Times,serif" font-size="8.00">QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G -->
|
||||
<g id="edge18" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmUWrk9Fy7PgogkqxuQKRm5QiNWosXxKx6FbdvCtMaKV8G</title>
|
||||
<path fill="none" stroke="black" d="M466.43,-3239.94C491.412,-3234.86 518.74,-3229.29 544.268,-3224.09"/>
|
||||
<polygon fill="black" stroke="black" points="545.229,-3227.46 554.329,-3222.04 543.832,-3220.61 545.229,-3227.46"/>
|
||||
</g>
|
||||
<!-- QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE -->
|
||||
<g id="node20" class="node"><title>QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE</title>
|
||||
<polygon fill="none" stroke="black" points="758.91,-3168 528.871,-3168 528.871,-3132 758.91,-3132 758.91,-3168"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3147.6" font-family="Times,serif" font-size="8.00">QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE -->
|
||||
<g id="edge19" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmZg6Qmi4SXv63zCKS5AWjT2SEDTpd5XnFZ5qmX3fNX9aE</title>
|
||||
<path fill="none" stroke="black" d="M405.254,-3239.91C434.1,-3221.64 481.318,-3193.81 525.449,-3177 531.023,-3174.88 536.812,-3172.89 542.698,-3171.04"/>
|
||||
<polygon fill="black" stroke="black" points="544.102,-3174.27 552.677,-3168.05 542.093,-3167.57 544.102,-3174.27"/>
|
||||
</g>
|
||||
<!-- QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx -->
|
||||
<g id="node21" class="node"><title>QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx</title>
|
||||
<polygon fill="none" stroke="black" points="760.262,-3114 527.519,-3114 527.519,-3078 760.262,-3078 760.262,-3114"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3093.6" font-family="Times,serif" font-size="8.00">QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx -->
|
||||
<g id="edge20" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmTqo4QFHyuHGWVTW2dB1Whdd2nBJnjbLGoR4pbpZQzEyx</title>
|
||||
<path fill="none" stroke="black" d="M392.037,-3239.97C416.213,-3210.68 468.242,-3153.02 525.449,-3123 528.995,-3121.14 532.667,-3119.41 536.427,-3117.79"/>
|
||||
<polygon fill="black" stroke="black" points="537.929,-3120.96 545.931,-3114.02 535.345,-3114.45 537.929,-3120.96"/>
|
||||
</g>
|
||||
<!-- QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx -->
|
||||
<g id="node22" class="node"><title>QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx</title>
|
||||
<polygon fill="none" stroke="black" points="757.035,-3060 530.746,-3060 530.746,-3024 757.035,-3024 757.035,-3060"/>
|
||||
<text text-anchor="middle" x="643.891" y="-3039.6" font-family="Times,serif" font-size="8.00">QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx -->
|
||||
<g id="edge21" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmXm7ZcAdndVZ83s4Wnc6PQ57eVymQLZ5YshA4Dfxnoxvx</title>
|
||||
<path fill="none" stroke="black" d="M386.525,-3239.82C405.853,-3201.67 456.07,-3113.15 525.449,-3069 527.931,-3067.42 530.495,-3065.93 533.124,-3064.53"/>
|
||||
<polygon fill="black" stroke="black" points="534.813,-3067.6 542.29,-3060.1 531.764,-3061.3 534.813,-3067.6"/>
|
||||
</g>
|
||||
<!-- QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r -->
|
||||
<g id="node23" class="node"><title>QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r</title>
|
||||
<polygon fill="none" stroke="black" points="750.27,-3006 537.512,-3006 537.512,-2970 750.27,-2970 750.27,-3006"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2985.6" font-family="Times,serif" font-size="8.00">QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r -->
|
||||
<g id="edge22" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmW3o7HJgcnsD3YrASFtmquavfADahYx73ck33bnFntF5r</title>
|
||||
<path fill="none" stroke="black" d="M383.263,-3239.96C398.069,-3194.43 443.401,-3074.24 525.449,-3015 527.344,-3013.63 529.297,-3012.33 531.3,-3011.1"/>
|
||||
<polygon fill="black" stroke="black" points="533.313,-3013.98 540.372,-3006.08 529.927,-3007.86 533.313,-3013.98"/>
|
||||
</g>
|
||||
<!-- QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH -->
|
||||
<g id="node24" class="node"><title>QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH</title>
|
||||
<polygon fill="none" stroke="black" points="755.297,-2952 532.484,-2952 532.484,-2916 755.297,-2916 755.297,-2952"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2931.6" font-family="Times,serif" font-size="8.00">QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH -->
|
||||
<g id="edge23" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmdR4c6tkvrgw1cNYdEJJZHeeJgw2WUVu5HqwEk4cEipMH</title>
|
||||
<path fill="none" stroke="black" d="M381.177,-3239.93C391.959,-3187.76 430.491,-3035.87 525.449,-2961 527.051,-2959.74 528.701,-2958.53 530.394,-2957.38"/>
|
||||
<polygon fill="black" stroke="black" points="532.435,-2960.24 539.181,-2952.07 528.813,-2954.25 532.435,-2960.24"/>
|
||||
</g>
|
||||
<!-- QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv -->
|
||||
<g id="node25" class="node"><title>QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv</title>
|
||||
<polygon fill="none" stroke="black" points="756.652,-2898 531.129,-2898 531.129,-2862 756.652,-2862 756.652,-2898"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2877.6" font-family="Times,serif" font-size="8.00">QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv -->
|
||||
<g id="edge24" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmYScEDTJHPf3b4j2PqQnaAnQeZ81W2GWy151CuP3bVuSv</title>
|
||||
<path fill="none" stroke="black" d="M379.712,-3239.7C386.878,-3181.3 417.429,-2997.85 525.449,-2907 526.825,-2905.84 528.241,-2904.73 529.693,-2903.67"/>
|
||||
<polygon fill="black" stroke="black" points="531.874,-2906.43 538.368,-2898.05 528.071,-2900.55 531.874,-2906.43"/>
|
||||
</g>
|
||||
<!-- QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk -->
|
||||
<g id="node26" class="node"><title>QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk</title>
|
||||
<polygon fill="none" stroke="black" points="760.493,-2844 527.289,-2844 527.289,-2808 760.493,-2808 760.493,-2844"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2823.6" font-family="Times,serif" font-size="8.00">QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk -->
|
||||
<g id="edge25" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmVAgdT3iwBJDhZCiNQqD3KSH5EYMTK23Q4uNFZhVugkzk</title>
|
||||
<path fill="none" stroke="black" d="M378.574,-3239.71C382.365,-3175.77 404.017,-2960.27 525.449,-2853 526.625,-2851.96 527.833,-2850.96 529.07,-2850"/>
|
||||
<polygon fill="black" stroke="black" points="531.347,-2852.68 537.624,-2844.14 527.394,-2846.9 531.347,-2852.68"/>
|
||||
</g>
|
||||
<!-- QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ -->
|
||||
<g id="node27" class="node"><title>QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ</title>
|
||||
<polygon fill="none" stroke="black" points="759.75,-2790 528.031,-2790 528.031,-2754 759.75,-2754 759.75,-2790"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2769.6" font-family="Times,serif" font-size="8.00">QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ -->
|
||||
<g id="edge26" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmXoFm8N1SJaL5rus5aDFoNoucciAYpmgB4HQYwVZXGAFQ</title>
|
||||
<path fill="none" stroke="black" d="M377.685,-3239.78C378.35,-3170.75 390.412,-2922.99 525.449,-2799 526.581,-2797.96 527.744,-2796.96 528.937,-2795.99"/>
|
||||
<polygon fill="black" stroke="black" points="531.068,-2798.77 537.198,-2790.13 527.017,-2793.06 531.068,-2798.77"/>
|
||||
</g>
|
||||
<!-- Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR -->
|
||||
<g id="node28" class="node"><title>Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR</title>
|
||||
<polygon fill="none" stroke="black" points="759.207,-2736 528.574,-2736 528.574,-2700 759.207,-2700 759.207,-2736"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2715.6" font-family="Times,serif" font-size="8.00">Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR -->
|
||||
<g id="edge27" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->Qmafzn6npzkyCXDx2F9AFhDDTuNdmA7WpGCVEyvaUgJ3ZR</title>
|
||||
<path fill="none" stroke="black" d="M380.511,-3239.86C393.301,-3157.13 449.918,-2816.54 525.449,-2745 526.432,-2744.07 527.44,-2743.17 528.471,-2742.3"/>
|
||||
<polygon fill="black" stroke="black" points="530.826,-2744.91 536.805,-2736.16 526.677,-2739.27 530.826,-2744.91"/>
|
||||
</g>
|
||||
<!-- QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn -->
|
||||
<g id="node29" class="node"><title>QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn</title>
|
||||
<polygon fill="none" stroke="black" points="756.945,-2682 530.836,-2682 530.836,-2646 756.945,-2646 756.945,-2682"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2661.6" font-family="Times,serif" font-size="8.00">QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn -->
|
||||
<g id="edge28" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmPbT16NCqauqrUfFAQ987EaUVNagRuxx9a1W7guRawMyn</title>
|
||||
<path fill="none" stroke="black" d="M379.997,-3239.77C391.044,-3151.67 443.009,-2771.1 525.449,-2691 526.42,-2690.06 527.416,-2689.14 528.437,-2688.26"/>
|
||||
<polygon fill="black" stroke="black" points="530.808,-2690.86 536.699,-2682.05 526.602,-2685.26 530.808,-2690.86"/>
|
||||
</g>
|
||||
<!-- QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz -->
|
||||
<g id="node30" class="node"><title>QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz</title>
|
||||
<polygon fill="none" stroke="black" points="749.891,-2628 537.891,-2628 537.891,-2592 749.891,-2592 749.891,-2628"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2607.6" font-family="Times,serif" font-size="8.00">QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz -->
|
||||
<g id="edge29" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmR6sjyKdrRA4iBue1EnMjaVSHpF43E39V6ZeefiRPqdhz</title>
|
||||
<path fill="none" stroke="black" d="M379.542,-3239.93C388.913,-3147.2 435.982,-2725.8 525.449,-2637 526.725,-2635.73 528.048,-2634.52 529.413,-2633.36"/>
|
||||
<polygon fill="black" stroke="black" points="531.69,-2636.03 537.658,-2627.28 527.533,-2630.4 531.69,-2636.03"/>
|
||||
</g>
|
||||
<!-- QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6 -->
|
||||
<g id="node31" class="node"><title>QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6</title>
|
||||
<polygon fill="none" stroke="black" points="752.664,-2574 535.117,-2574 535.117,-2538 752.664,-2538 752.664,-2574"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2553.6" font-family="Times,serif" font-size="8.00">QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6 -->
|
||||
<g id="edge30" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmeBTS3QteTLrxL3u3jF3C4UG9GJunHknuBkUsGy8hwrk6</title>
|
||||
<path fill="none" stroke="black" d="M379.168,-3240C387.004,-3142.71 428.948,-2680.53 525.449,-2583 526.38,-2582.06 527.337,-2581.15 528.318,-2580.27"/>
|
||||
<polygon fill="black" stroke="black" points="530.542,-2582.97 536.275,-2574.06 526.237,-2577.45 530.542,-2582.97"/>
|
||||
</g>
|
||||
<!-- QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT -->
|
||||
<g id="node32" class="node"><title>QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT</title>
|
||||
<polygon fill="none" stroke="black" points="762.273,-2520 525.508,-2520 525.508,-2484 762.273,-2484 762.273,-2520"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2499.6" font-family="Times,serif" font-size="8.00">QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT</text>
|
||||
</g>
|
||||
<!-- QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT -->
|
||||
<g id="edge31" class="edge"><title>QmPdtbEkyPobazAMqdbj1MpoSaNjfm8rTvUkguTNLVBXZV->QmYNyQ4tJ2VpVpq7RUx4XVTCtc5CRBX7Zv5rMDATH5pWDT</title>
|
||||
<path fill="none" stroke="black" d="M378.859,-3239.93C385.287,-3137.95 421.935,-2635.25 525.449,-2529 526.252,-2528.18 527.075,-2527.37 527.916,-2526.6"/>
|
||||
<polygon fill="black" stroke="black" points="530.326,-2529.15 535.953,-2520.17 525.956,-2523.68 530.326,-2529.15"/>
|
||||
</g>
|
||||
<!-- QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM -->
|
||||
<g id="node34" class="node"><title>QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM</title>
|
||||
<polygon fill="none" stroke="black" points="761.691,-2466 526.09,-2466 526.09,-2430 761.691,-2430 761.691,-2466"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2445.6" font-family="Times,serif" font-size="8.00">QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM -->
|
||||
<g id="edge33" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmcLMn25VWARy5V4SgCdK49yVgWrzSguZeJP5pm4eNGVYM</title>
|
||||
<path fill="none" stroke="black" d="M378.717,-1683.05C384.462,-1787.18 418.401,-2310.35 525.449,-2421 526.249,-2421.83 527.069,-2422.63 527.908,-2423.41"/>
|
||||
<polygon fill="black" stroke="black" points="525.937,-2426.32 535.924,-2429.86 530.322,-2420.86 525.937,-2426.32"/>
|
||||
</g>
|
||||
<!-- QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o -->
|
||||
<g id="node35" class="node"><title>QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o</title>
|
||||
<polygon fill="none" stroke="black" points="757.203,-2412 530.578,-2412 530.578,-2376 757.203,-2376 757.203,-2412"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2391.6" font-family="Times,serif" font-size="8.00">QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o -->
|
||||
<g id="edge34" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZodojoY8nKHBVYoujmsDsT4pV8s9GY3BHA51Aa5dw62o</title>
|
||||
<path fill="none" stroke="black" d="M379.01,-1683.06C386.134,-1782.75 425.451,-2265.12 525.449,-2367 526.377,-2367.94 527.33,-2368.86 528.307,-2369.74"/>
|
||||
<polygon fill="black" stroke="black" points="526.214,-2372.55 536.241,-2375.97 530.537,-2367.05 526.214,-2372.55"/>
|
||||
</g>
|
||||
<!-- QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb -->
|
||||
<g id="node36" class="node"><title>QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb</title>
|
||||
<polygon fill="none" stroke="black" points="754.668,-2358 533.113,-2358 533.113,-2322 754.668,-2322 754.668,-2358"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2337.6" font-family="Times,serif" font-size="8.00">QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb -->
|
||||
<g id="edge35" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmcmEuLjtJzizQjgSEs8m2SJW1GSRLCXP4Y3KHYgpfuKqb</title>
|
||||
<path fill="none" stroke="black" d="M379.363,-1683.22C387.994,-1778.63 432.528,-2219.9 525.449,-2313 526.384,-2313.94 527.345,-2314.84 528.33,-2315.72"/>
|
||||
<polygon fill="black" stroke="black" points="526.262,-2318.55 536.311,-2321.9 530.548,-2313.01 526.262,-2318.55"/>
|
||||
</g>
|
||||
<!-- QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH -->
|
||||
<g id="node37" class="node"><title>QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH</title>
|
||||
<polygon fill="none" stroke="black" points="752.336,-2304 535.445,-2304 535.445,-2268 752.336,-2268 752.336,-2304"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2283.6" font-family="Times,serif" font-size="8.00">QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH -->
|
||||
<g id="edge36" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZPsekJNcq7jSVn8TGnxbxy9P4n6kCN1Swko2me4vfqTH</title>
|
||||
<path fill="none" stroke="black" d="M379.762,-1683.18C389.962,-1773.69 439.51,-2174.57 525.449,-2259 526.415,-2259.95 527.406,-2260.87 528.422,-2261.75"/>
|
||||
<polygon fill="black" stroke="black" points="526.57,-2264.74 536.653,-2268 530.799,-2259.16 526.57,-2264.74"/>
|
||||
</g>
|
||||
<!-- QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo -->
|
||||
<g id="node38" class="node"><title>QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo</title>
|
||||
<polygon fill="none" stroke="black" points="749.782,-2250 538,-2250 538,-2214 749.782,-2214 749.782,-2250"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2229.6" font-family="Times,serif" font-size="8.00">QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo -->
|
||||
<g id="edge37" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmTRzfEDBEoJyYjunu6RTXToJYZof4jhW15c4J27viKiuo</title>
|
||||
<path fill="none" stroke="black" d="M380.247,-1683.22C392.157,-1768.73 446.479,-2129.2 525.449,-2205 526.772,-2206.27 528.142,-2207.48 529.555,-2208.65"/>
|
||||
<polygon fill="black" stroke="black" points="527.903,-2211.77 538.073,-2214.74 531.973,-2206.07 527.903,-2211.77"/>
|
||||
</g>
|
||||
<!-- QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv -->
|
||||
<g id="node39" class="node"><title>QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv</title>
|
||||
<polygon fill="none" stroke="black" points="756.426,-2196 531.355,-2196 531.355,-2160 756.426,-2160 756.426,-2196"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2175.6" font-family="Times,serif" font-size="8.00">QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv -->
|
||||
<g id="edge38" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVVjqe2HcyUWRw8CxFzUyf5oJAmFwKa59birETu9CTdEv</title>
|
||||
<path fill="none" stroke="black" d="M377.31,-1683.28C376.505,-1754.85 383.618,-2018.63 525.449,-2151 526.572,-2152.05 527.728,-2153.06 528.913,-2154.03"/>
|
||||
<polygon fill="black" stroke="black" points="526.968,-2156.95 537.131,-2159.94 531.055,-2151.26 526.968,-2156.95"/>
|
||||
</g>
|
||||
<!-- QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz -->
|
||||
<g id="node40" class="node"><title>QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz</title>
|
||||
<polygon fill="none" stroke="black" points="758.656,-2142 529.125,-2142 529.125,-2106 758.656,-2106 758.656,-2142"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2121.6" font-family="Times,serif" font-size="8.00">QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz -->
|
||||
<g id="edge39" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmPUm5ZsvQhu9sqTNDLNBiAiT4UCsWzVbN72LUXqrxMjdz</title>
|
||||
<path fill="none" stroke="black" d="M378.097,-1683.08C380.272,-1749.38 397.12,-1981.3 525.449,-2097 526.615,-2098.05 527.812,-2099.06 529.04,-2100.04"/>
|
||||
<polygon fill="black" stroke="black" points="527.333,-2103.11 537.54,-2105.95 531.33,-2097.37 527.333,-2103.11"/>
|
||||
</g>
|
||||
<!-- QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG -->
|
||||
<g id="node41" class="node"><title>QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG</title>
|
||||
<polygon fill="none" stroke="black" points="754.246,-2088 533.535,-2088 533.535,-2052 754.246,-2052 754.246,-2088"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2067.6" font-family="Times,serif" font-size="8.00">QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG -->
|
||||
<g id="edge40" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmWC6MtcD6TvZ24eNciTjc9pyLzFF9LcMXfGv5qYRaujgG</title>
|
||||
<path fill="none" stroke="black" d="M379.112,-1683.36C384.569,-1744.68 410.79,-1944.01 525.449,-2043 526.783,-2044.15 528.156,-2045.26 529.564,-2046.32"/>
|
||||
<polygon fill="black" stroke="black" points="527.722,-2049.29 537.988,-2051.91 531.595,-2043.46 527.722,-2049.29"/>
|
||||
</g>
|
||||
<!-- QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9 -->
|
||||
<g id="node42" class="node"><title>QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9</title>
|
||||
<polygon fill="none" stroke="black" points="759.188,-2034 528.594,-2034 528.594,-1998 759.188,-1998 759.188,-2034"/>
|
||||
<text text-anchor="middle" x="643.891" y="-2013.6" font-family="Times,serif" font-size="8.00">QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9 -->
|
||||
<g id="edge41" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVUc4eK4Re6qwPBVMXe1euBXVvjuHGhrV8pD9YejP1KD9</title>
|
||||
<path fill="none" stroke="black" d="M380.375,-1683.08C389.284,-1738.32 423.925,-1906.13 525.449,-1989 526.999,-1990.27 528.597,-1991.47 530.237,-1992.63"/>
|
||||
<polygon fill="black" stroke="black" points="528.429,-1995.62 538.764,-1997.95 532.138,-1989.69 528.429,-1995.62"/>
|
||||
</g>
|
||||
<!-- QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf -->
|
||||
<g id="node43" class="node"><title>QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf</title>
|
||||
<polygon fill="none" stroke="black" points="758.191,-1980 529.59,-1980 529.59,-1944 758.191,-1944 758.191,-1980"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1959.6" font-family="Times,serif" font-size="8.00">QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf -->
|
||||
<g id="edge42" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmXhN1TAwCXacRVbxbNcDDTikC6fYMsYqSm2arWCL9xcxf</title>
|
||||
<path fill="none" stroke="black" d="M382.161,-1683.19C394.949,-1732.25 437.07,-1868.07 525.449,-1935 527.107,-1936.26 528.812,-1937.45 530.56,-1938.6"/>
|
||||
<polygon fill="black" stroke="black" points="529.218,-1941.87 539.62,-1943.88 532.743,-1935.82 529.218,-1941.87"/>
|
||||
</g>
|
||||
<!-- QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx -->
|
||||
<g id="node44" class="node"><title>QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx</title>
|
||||
<polygon fill="none" stroke="black" points="751.484,-1926 536.297,-1926 536.297,-1890 751.484,-1890 751.484,-1926"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1905.6" font-family="Times,serif" font-size="8.00">QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx -->
|
||||
<g id="edge43" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmUyinoH95zsagdKUpu9nibn2kV6oUJKnvWNvfRsMxjazx</title>
|
||||
<path fill="none" stroke="black" d="M384.731,-1683.19C401.768,-1725.22 449.83,-1829.43 525.449,-1881 527.604,-1882.47 529.828,-1883.86 532.109,-1885.18"/>
|
||||
<polygon fill="black" stroke="black" points="530.676,-1888.38 541.162,-1889.89 533.908,-1882.17 530.676,-1888.38"/>
|
||||
</g>
|
||||
<!-- QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL -->
|
||||
<g id="node45" class="node"><title>QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL</title>
|
||||
<polygon fill="none" stroke="black" points="758.719,-1872 529.062,-1872 529.062,-1836 758.719,-1836 758.719,-1872"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1851.6" font-family="Times,serif" font-size="8.00">QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL -->
|
||||
<g id="edge44" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmQY3GzGMxHBJiFU2KhezKazU9rjRWs9QP8gGxbwQ3SCfL</title>
|
||||
<path fill="none" stroke="black" d="M388.859,-1683.14C410.577,-1717.06 462.199,-1790.04 525.449,-1827 528.339,-1828.69 531.327,-1830.27 534.389,-1831.76"/>
|
||||
<polygon fill="black" stroke="black" points="533.212,-1835.06 543.772,-1835.92 536.05,-1828.66 533.212,-1835.06"/>
|
||||
</g>
|
||||
<!-- QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv -->
|
||||
<g id="node46" class="node"><title>QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv</title>
|
||||
<polygon fill="none" stroke="black" points="755.477,-1818 532.305,-1818 532.305,-1782 755.477,-1782 755.477,-1818"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1797.6" font-family="Times,serif" font-size="8.00">QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv -->
|
||||
<g id="edge45" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVAsMczDCuXJGy1wnhzWis7bnDUQXPokiSGi7ahC1cvLv</title>
|
||||
<path fill="none" stroke="black" d="M397.139,-1683.24C423.88,-1707.43 474.609,-1749.76 525.449,-1773 529.799,-1774.99 534.308,-1776.84 538.914,-1778.55"/>
|
||||
<polygon fill="black" stroke="black" points="537.888,-1781.9 548.483,-1781.9 540.198,-1775.3 537.888,-1781.9"/>
|
||||
</g>
|
||||
<!-- QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG -->
|
||||
<g id="node47" class="node"><title>QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG</title>
|
||||
<polygon fill="none" stroke="black" points="751.95,-1764 535.832,-1764 535.832,-1728 751.95,-1728 751.95,-1764"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1743.6" font-family="Times,serif" font-size="8.00">QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG -->
|
||||
<g id="edge46" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmS7mjXVd9GeLcLVf5eAxa5gtBZwyvEd7Roye1hzcjioWG</title>
|
||||
<path fill="none" stroke="black" d="M422.537,-1683.02C451.567,-1694.29 490.381,-1708.6 525.449,-1719 533.007,-1721.24 540.884,-1723.41 548.823,-1725.47"/>
|
||||
<polygon fill="black" stroke="black" points="547.965,-1728.87 558.52,-1727.94 549.691,-1722.08 547.965,-1728.87"/>
|
||||
</g>
|
||||
<!-- QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko -->
|
||||
<g id="node48" class="node"><title>QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko</title>
|
||||
<polygon fill="none" stroke="black" points="755.973,-1710 531.808,-1710 531.808,-1674 755.973,-1674 755.973,-1710"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1689.6" font-family="Times,serif" font-size="8.00">QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko -->
|
||||
<g id="edge47" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmTzNVP3sgRaaaABvmQvQD6QbdawAwyxxnUt7EtCAhixko</title>
|
||||
<path fill="none" stroke="black" d="M489.829,-1676.41C500.324,-1677.48 510.995,-1678.57 521.57,-1679.64"/>
|
||||
<polygon fill="black" stroke="black" points="521.367,-1683.14 531.67,-1680.67 522.076,-1676.18 521.367,-1683.14"/>
|
||||
</g>
|
||||
<!-- QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook -->
|
||||
<g id="node49" class="node"><title>QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook</title>
|
||||
<polygon fill="none" stroke="black" points="758.336,-1656 529.445,-1656 529.445,-1620 758.336,-1620 758.336,-1656"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1635.6" font-family="Times,serif" font-size="8.00">QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook -->
|
||||
<g id="edge48" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmXMbwtHJqphFKRuWhJxVFP3wVHrwbkTBj5Ld4Xzawyook</title>
|
||||
<path fill="none" stroke="black" d="M489.829,-1653.59C499.584,-1652.6 509.489,-1651.59 519.329,-1650.58"/>
|
||||
<polygon fill="black" stroke="black" points="519.956,-1654.04 529.55,-1649.54 519.246,-1647.07 519.956,-1654.04"/>
|
||||
</g>
|
||||
<!-- QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk -->
|
||||
<g id="node50" class="node"><title>QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk</title>
|
||||
<polygon fill="none" stroke="black" points="750.676,-1602 537.105,-1602 537.105,-1566 750.676,-1566 750.676,-1602"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1581.6" font-family="Times,serif" font-size="8.00">QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk -->
|
||||
<g id="edge49" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZKkYQtRTPdb2HLEJJ5L9JJ8ptZAWaoxEfQzrJtR8zVgk</title>
|
||||
<path fill="none" stroke="black" d="M422.537,-1646.98C451.567,-1635.71 490.381,-1621.4 525.449,-1611 533.007,-1608.76 540.884,-1606.59 548.823,-1604.53"/>
|
||||
<polygon fill="black" stroke="black" points="549.691,-1607.92 558.52,-1602.06 547.965,-1601.13 549.691,-1607.92"/>
|
||||
</g>
|
||||
<!-- QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD -->
|
||||
<g id="node51" class="node"><title>QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD</title>
|
||||
<polygon fill="none" stroke="black" points="758.438,-1548 529.344,-1548 529.344,-1512 758.438,-1512 758.438,-1548"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1527.6" font-family="Times,serif" font-size="8.00">QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD -->
|
||||
<g id="edge50" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmdDTrRzkhGXJS2HJ3W912NYieDrpXJ2DgHwx47X4EH3HD</title>
|
||||
<path fill="none" stroke="black" d="M397.139,-1646.76C423.88,-1622.57 474.609,-1580.24 525.449,-1557 529.799,-1555.01 534.308,-1553.16 538.914,-1551.45"/>
|
||||
<polygon fill="black" stroke="black" points="540.198,-1554.7 548.483,-1548.1 537.888,-1548.1 540.198,-1554.7"/>
|
||||
</g>
|
||||
<!-- QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd -->
|
||||
<g id="node52" class="node"><title>QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd</title>
|
||||
<polygon fill="none" stroke="black" points="755.664,-1494 532.117,-1494 532.117,-1458 755.664,-1458 755.664,-1494"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1473.6" font-family="Times,serif" font-size="8.00">QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd -->
|
||||
<g id="edge51" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmUu9sg3PkCAw5xtovb5ZqNN7TqYAMiznTFysYhmo9uLBd</title>
|
||||
<path fill="none" stroke="black" d="M388.859,-1646.86C410.577,-1612.94 462.199,-1539.96 525.449,-1503 528.339,-1501.31 531.327,-1499.73 534.389,-1498.24"/>
|
||||
<polygon fill="black" stroke="black" points="536.05,-1501.34 543.772,-1494.08 533.212,-1494.94 536.05,-1501.34"/>
|
||||
</g>
|
||||
<!-- QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1 -->
|
||||
<g id="node53" class="node"><title>QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1</title>
|
||||
<polygon fill="none" stroke="black" points="755.879,-1440 531.902,-1440 531.902,-1404 755.879,-1404 755.879,-1440"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1419.6" font-family="Times,serif" font-size="8.00">QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1 -->
|
||||
<g id="edge52" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmSmk6E99Qe8iTWPXhBkAQbdoieKkCxXd8cL6YgLi66Cg1</title>
|
||||
<path fill="none" stroke="black" d="M384.731,-1646.81C401.768,-1604.78 449.83,-1500.57 525.449,-1449 527.604,-1447.53 529.828,-1446.14 532.109,-1444.82"/>
|
||||
<polygon fill="black" stroke="black" points="533.908,-1447.83 541.162,-1440.11 530.676,-1441.62 533.908,-1447.83"/>
|
||||
</g>
|
||||
<!-- QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V -->
|
||||
<g id="node54" class="node"><title>QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V</title>
|
||||
<polygon fill="none" stroke="black" points="754.329,-1386 533.453,-1386 533.453,-1350 754.329,-1350 754.329,-1386"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1365.6" font-family="Times,serif" font-size="8.00">QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V -->
|
||||
<g id="edge53" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmNPcQZTFPoUzQrBqJMjxezJtUXXDGxpr9tGAhf1qPtQ7V</title>
|
||||
<path fill="none" stroke="black" d="M382.161,-1646.81C394.949,-1597.75 437.07,-1461.93 525.449,-1395 527.107,-1393.74 528.812,-1392.55 530.56,-1391.4"/>
|
||||
<polygon fill="black" stroke="black" points="532.743,-1394.18 539.62,-1386.12 529.218,-1388.13 532.743,-1394.18"/>
|
||||
</g>
|
||||
<!-- QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY -->
|
||||
<g id="node55" class="node"><title>QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY</title>
|
||||
<polygon fill="none" stroke="black" points="756.821,-1332 530.961,-1332 530.961,-1296 756.821,-1296 756.821,-1332"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1311.6" font-family="Times,serif" font-size="8.00">QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY -->
|
||||
<g id="edge54" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmPuTWcqGRQHJjEPPh9Bky5qGMvo24s1kcpnngKsUUkdLY</title>
|
||||
<path fill="none" stroke="black" d="M380.375,-1646.92C389.284,-1591.68 423.925,-1423.87 525.449,-1341 526.999,-1339.73 528.597,-1338.53 530.237,-1337.37"/>
|
||||
<polygon fill="black" stroke="black" points="532.138,-1340.31 538.764,-1332.05 528.429,-1334.38 532.138,-1340.31"/>
|
||||
</g>
|
||||
<!-- QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh -->
|
||||
<g id="node56" class="node"><title>QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh</title>
|
||||
<polygon fill="none" stroke="black" points="758.156,-1278 529.625,-1278 529.625,-1242 758.156,-1242 758.156,-1278"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1257.6" font-family="Times,serif" font-size="8.00">QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh -->
|
||||
<g id="edge55" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmRWG2TU4sqRESq543S6kAMXv7T9bUfqApRV24vd25nHJh</title>
|
||||
<path fill="none" stroke="black" d="M379.112,-1646.64C384.569,-1585.32 410.79,-1385.99 525.449,-1287 526.783,-1285.85 528.156,-1284.74 529.564,-1283.68"/>
|
||||
<polygon fill="black" stroke="black" points="531.595,-1286.54 537.988,-1278.09 527.722,-1280.71 531.595,-1286.54"/>
|
||||
</g>
|
||||
<!-- Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4 -->
|
||||
<g id="node57" class="node"><title>Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4</title>
|
||||
<polygon fill="none" stroke="black" points="749.883,-1224 537.898,-1224 537.898,-1188 749.883,-1188 749.883,-1224"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1203.6" font-family="Times,serif" font-size="8.00">Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4 -->
|
||||
<g id="edge56" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->Qmb8RW7gTd4UeGL3iP3e9b8Jv1Hzpa6Fj7c3khkP81Kvq4</title>
|
||||
<path fill="none" stroke="black" d="M378.097,-1646.92C380.272,-1580.62 397.12,-1348.7 525.449,-1233 526.758,-1231.82 528.107,-1230.69 529.494,-1229.6"/>
|
||||
<polygon fill="black" stroke="black" points="531.553,-1232.44 537.809,-1223.89 527.586,-1226.67 531.553,-1232.44"/>
|
||||
</g>
|
||||
<!-- QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC -->
|
||||
<g id="node58" class="node"><title>QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC</title>
|
||||
<polygon fill="none" stroke="black" points="759.082,-1170 528.699,-1170 528.699,-1134 759.082,-1134 759.082,-1170"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1149.6" font-family="Times,serif" font-size="8.00">QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC -->
|
||||
<g id="edge57" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmVW2kxapQYUbZN75gNFea3ifQQWKKt41fexNgZGPgwhbC</title>
|
||||
<path fill="none" stroke="black" d="M377.31,-1646.72C376.505,-1575.15 383.618,-1311.37 525.449,-1179 526.572,-1177.95 527.728,-1176.94 528.913,-1175.97"/>
|
||||
<polygon fill="black" stroke="black" points="531.055,-1178.74 537.131,-1170.06 526.968,-1173.05 531.055,-1178.74"/>
|
||||
</g>
|
||||
<!-- QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy -->
|
||||
<g id="node59" class="node"><title>QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy</title>
|
||||
<polygon fill="none" stroke="black" points="749.496,-1116 538.285,-1116 538.285,-1080 749.496,-1080 749.496,-1116"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1095.6" font-family="Times,serif" font-size="8.00">QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy -->
|
||||
<g id="edge58" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZC16QUatu28r76C3kmgxsuv3Zk63ivB9mureDtdVTtPy</title>
|
||||
<path fill="none" stroke="black" d="M380.247,-1646.78C392.157,-1561.27 446.479,-1200.8 525.449,-1125 526.772,-1123.73 528.142,-1122.52 529.555,-1121.35"/>
|
||||
<polygon fill="black" stroke="black" points="531.973,-1123.93 538.073,-1115.26 527.903,-1118.23 531.973,-1123.93"/>
|
||||
</g>
|
||||
<!-- QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj -->
|
||||
<g id="node60" class="node"><title>QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj</title>
|
||||
<polygon fill="none" stroke="black" points="753.109,-1062 534.672,-1062 534.672,-1026 753.109,-1026 753.109,-1062"/>
|
||||
<text text-anchor="middle" x="643.891" y="-1041.6" font-family="Times,serif" font-size="8.00">QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj -->
|
||||
<g id="edge59" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmU5yw59zPcoNcQ1Yt266sx5ZQW3PpDjqppRjRgFM1ehbj</title>
|
||||
<path fill="none" stroke="black" d="M379.762,-1646.82C389.962,-1556.31 439.51,-1155.43 525.449,-1071 526.415,-1070.05 527.406,-1069.13 528.422,-1068.25"/>
|
||||
<polygon fill="black" stroke="black" points="530.799,-1070.84 536.653,-1062 526.57,-1065.26 530.799,-1070.84"/>
|
||||
</g>
|
||||
<!-- QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn -->
|
||||
<g id="node61" class="node"><title>QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn</title>
|
||||
<polygon fill="none" stroke="black" points="755.367,-1008 532.414,-1008 532.414,-972 755.367,-972 755.367,-1008"/>
|
||||
<text text-anchor="middle" x="643.891" y="-987.6" font-family="Times,serif" font-size="8.00">QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn -->
|
||||
<g id="edge60" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmTnAZEQfBj4wfkKkAUSCifxTcvrAkEqnbwqwMkesUQ2yn</title>
|
||||
<path fill="none" stroke="black" d="M379.363,-1646.78C387.994,-1551.37 432.528,-1110.1 525.449,-1017 526.384,-1016.06 527.345,-1015.16 528.33,-1014.28"/>
|
||||
<polygon fill="black" stroke="black" points="530.548,-1016.99 536.311,-1008.1 526.262,-1011.45 530.548,-1016.99"/>
|
||||
</g>
|
||||
<!-- QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM -->
|
||||
<g id="node62" class="node"><title>QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM</title>
|
||||
<polygon fill="none" stroke="black" points="761.731,-954 526.051,-954 526.051,-918 761.731,-918 761.731,-954"/>
|
||||
<text text-anchor="middle" x="643.891" y="-933.6" font-family="Times,serif" font-size="8.00">QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM -->
|
||||
<g id="edge61" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmZvEW9WXpSXRDxcFALQ7p4jRJKZncNdNy9UFcy5vbXnZM</title>
|
||||
<path fill="none" stroke="black" d="M379.01,-1646.94C386.134,-1547.25 425.451,-1064.88 525.449,-963 526.377,-962.055 527.33,-961.141 528.307,-960.255"/>
|
||||
<polygon fill="black" stroke="black" points="530.537,-962.955 536.241,-954.026 526.214,-957.449 530.537,-962.955"/>
|
||||
</g>
|
||||
<!-- QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn -->
|
||||
<g id="node63" class="node"><title>QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn</title>
|
||||
<polygon fill="none" stroke="black" points="755.758,-900 532.023,-900 532.023,-864 755.758,-864 755.758,-900"/>
|
||||
<text text-anchor="middle" x="643.891" y="-879.6" font-family="Times,serif" font-size="8.00">QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn</text>
|
||||
</g>
|
||||
<!-- QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn -->
|
||||
<g id="edge62" class="edge"><title>QmUGcRKDaPPht8Agj4Qqx1BXszpWbB7bkLcnsA9B934oGD->QmcBe5xGrxFXhCoMZUTDe85dTyx99FfES7CkaLsZKzY5Hn</title>
|
||||
<path fill="none" stroke="black" d="M378.717,-1646.95C384.462,-1542.82 418.401,-1019.65 525.449,-909 526.249,-908.173 527.069,-907.369 527.908,-906.588"/>
|
||||
<polygon fill="black" stroke="black" points="530.322,-909.138 535.924,-900.145 525.937,-903.681 530.322,-909.138"/>
|
||||
</g>
|
||||
<!-- QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN -->
|
||||
<g id="node65" class="node"><title>QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN</title>
|
||||
<polygon fill="none" stroke="black" points="758.649,-846 529.133,-846 529.133,-810 758.649,-810 758.649,-846"/>
|
||||
<text text-anchor="middle" x="643.891" y="-825.6" font-family="Times,serif" font-size="8.00">QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN -->
|
||||
<g id="edge64" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmPWMnC7VBE7BnrKfawdQYMxtkjfaKeqLqEHjHy4Akx6AN</title>
|
||||
<path fill="none" stroke="black" d="M379.712,-468.298C386.878,-526.704 417.429,-710.15 525.449,-801 526.825,-802.157 528.241,-803.267 529.693,-804.332"/>
|
||||
<polygon fill="black" stroke="black" points="528.071,-807.451 538.368,-809.946 531.874,-801.574 528.071,-807.451"/>
|
||||
</g>
|
||||
<!-- QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y -->
|
||||
<g id="node66" class="node"><title>QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y</title>
|
||||
<polygon fill="none" stroke="black" points="759.438,-792 528.343,-792 528.343,-756 759.438,-756 759.438,-792"/>
|
||||
<text text-anchor="middle" x="643.891" y="-771.6" font-family="Times,serif" font-size="8.00">QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y -->
|
||||
<g id="edge65" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmbhqPW251ueXCwaHqDoE1ZQefukARhso5FHmGn5oSNN4Y</title>
|
||||
<path fill="none" stroke="black" d="M381.177,-468.07C391.959,-520.237 430.491,-672.126 525.449,-747 527.051,-748.263 528.701,-749.469 530.394,-750.62"/>
|
||||
<polygon fill="black" stroke="black" points="528.813,-753.755 539.181,-755.935 532.435,-747.765 528.813,-753.755"/>
|
||||
</g>
|
||||
<!-- QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW -->
|
||||
<g id="node67" class="node"><title>QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW</title>
|
||||
<polygon fill="none" stroke="black" points="747.278,-738 540.504,-738 540.504,-702 747.278,-702 747.278,-738"/>
|
||||
<text text-anchor="middle" x="643.891" y="-717.6" font-family="Times,serif" font-size="8.00">QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW -->
|
||||
<g id="edge66" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmcyJjYp2mgD24orivoiuStqu7jDJtxsUFWTFtbgFYJ9yW</title>
|
||||
<path fill="none" stroke="black" d="M383.263,-468.036C398.069,-513.572 443.401,-633.758 525.449,-693 527.527,-694.5 529.675,-695.919 531.881,-697.26"/>
|
||||
<polygon fill="black" stroke="black" points="530.205,-700.332 540.658,-702.059 533.563,-694.19 530.205,-700.332"/>
|
||||
</g>
|
||||
<!-- QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w -->
|
||||
<g id="node68" class="node"><title>QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w</title>
|
||||
<polygon fill="none" stroke="black" points="758.305,-684 529.476,-684 529.476,-648 758.305,-648 758.305,-684"/>
|
||||
<text text-anchor="middle" x="643.891" y="-663.6" font-family="Times,serif" font-size="8.00">QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w -->
|
||||
<g id="edge67" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmV3df7xsnWpQhNGynkHZNXUcSaHvfdempiZ3TtYhLUw3w</title>
|
||||
<path fill="none" stroke="black" d="M386.525,-468.181C405.853,-506.329 456.07,-594.845 525.449,-639 527.931,-640.58 530.495,-642.067 533.124,-643.468"/>
|
||||
<polygon fill="black" stroke="black" points="531.764,-646.698 542.29,-647.904 534.813,-640.397 531.764,-646.698"/>
|
||||
</g>
|
||||
<!-- QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4 -->
|
||||
<g id="node69" class="node"><title>QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4</title>
|
||||
<polygon fill="none" stroke="black" points="757.438,-630 530.343,-630 530.343,-594 757.438,-594 757.438,-630"/>
|
||||
<text text-anchor="middle" x="643.891" y="-609.6" font-family="Times,serif" font-size="8.00">QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4 -->
|
||||
<g id="edge68" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmSDTCDY3cn7niCxWLwhY94wsodMo8iaJkXWFkk2T64cB4</title>
|
||||
<path fill="none" stroke="black" d="M392.037,-468.027C416.213,-497.315 468.242,-554.977 525.449,-585 528.995,-586.861 532.667,-588.594 536.427,-590.209"/>
|
||||
<polygon fill="black" stroke="black" points="535.345,-593.545 545.931,-593.984 537.929,-587.04 535.345,-593.545"/>
|
||||
</g>
|
||||
<!-- QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus -->
|
||||
<g id="node70" class="node"><title>QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus</title>
|
||||
<polygon fill="none" stroke="black" points="758.746,-576 529.035,-576 529.035,-540 758.746,-540 758.746,-576"/>
|
||||
<text text-anchor="middle" x="643.891" y="-555.6" font-family="Times,serif" font-size="8.00">QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus -->
|
||||
<g id="edge69" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmdYzjaRXhrx4gMQ29MMzVmE4aUNLWaXu8Eb7piY8Mbfus</title>
|
||||
<path fill="none" stroke="black" d="M405.254,-468.094C434.1,-486.356 481.318,-514.195 525.449,-531 531.023,-533.122 536.812,-535.107 542.698,-536.958"/>
|
||||
<polygon fill="black" stroke="black" points="542.093,-540.431 552.677,-539.948 544.102,-533.725 542.093,-540.431"/>
|
||||
</g>
|
||||
<!-- QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q -->
|
||||
<g id="node71" class="node"><title>QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q</title>
|
||||
<polygon fill="none" stroke="black" points="755.875,-522 531.906,-522 531.906,-486 755.875,-486 755.875,-522"/>
|
||||
<text text-anchor="middle" x="643.891" y="-501.6" font-family="Times,serif" font-size="8.00">QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q -->
|
||||
<g id="edge70" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmczEoRPanoknpuBuKNghu59r94UUx1KfDhgHKRxEpQn8Q</title>
|
||||
<path fill="none" stroke="black" d="M466.43,-468.056C491.412,-473.145 518.74,-478.711 544.268,-483.911"/>
|
||||
<polygon fill="black" stroke="black" points="543.832,-487.394 554.329,-485.961 545.229,-480.535 543.832,-487.394"/>
|
||||
</g>
|
||||
<!-- QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R -->
|
||||
<g id="node72" class="node"><title>QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R</title>
|
||||
<polygon fill="none" stroke="black" points="757.633,-468 530.148,-468 530.148,-432 757.633,-432 757.633,-468"/>
|
||||
<text text-anchor="middle" x="643.891" y="-447.6" font-family="Times,serif" font-size="8.00">QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R -->
|
||||
<g id="edge71" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmbVXn6yXFuyXcw7ykPpWuprRkPferRPGbgvCY7DNy1U5R</title>
|
||||
<path fill="none" stroke="black" d="M488.294,-450C498.738,-450 509.369,-450 519.919,-450"/>
|
||||
<polygon fill="black" stroke="black" points="520,-453.5 530,-450 520,-446.5 520,-453.5"/>
|
||||
</g>
|
||||
<!-- QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx -->
|
||||
<g id="node73" class="node"><title>QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx</title>
|
||||
<polygon fill="none" stroke="black" points="757.45,-414 530.332,-414 530.332,-378 757.45,-378 757.45,-414"/>
|
||||
<text text-anchor="middle" x="643.891" y="-393.6" font-family="Times,serif" font-size="8.00">QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx -->
|
||||
<g id="edge72" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmYyEnwiNCn8HgtM1PDT4oUhc3BMSVfkkPVCr4YqQarDnx</title>
|
||||
<path fill="none" stroke="black" d="M466.43,-431.944C491.412,-426.855 518.74,-421.289 544.268,-416.089"/>
|
||||
<polygon fill="black" stroke="black" points="545.229,-419.465 554.329,-414.039 543.832,-412.606 545.229,-419.465"/>
|
||||
</g>
|
||||
<!-- QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3 -->
|
||||
<g id="node74" class="node"><title>QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3</title>
|
||||
<polygon fill="none" stroke="black" points="754.273,-360 533.508,-360 533.508,-324 754.273,-324 754.273,-360"/>
|
||||
<text text-anchor="middle" x="643.891" y="-339.6" font-family="Times,serif" font-size="8.00">QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3 -->
|
||||
<g id="edge73" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmQjq29oa8oGtvMrGmFfEcU1JCddaoF78BeU2jzSMU2mH3</title>
|
||||
<path fill="none" stroke="black" d="M405.254,-431.906C434.1,-413.644 481.318,-385.805 525.449,-369 531.023,-366.878 536.812,-364.893 542.698,-363.042"/>
|
||||
<polygon fill="black" stroke="black" points="544.102,-366.275 552.677,-360.052 542.093,-359.569 544.102,-366.275"/>
|
||||
</g>
|
||||
<!-- Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq -->
|
||||
<g id="node75" class="node"><title>Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq</title>
|
||||
<polygon fill="none" stroke="black" points="749.199,-306 538.582,-306 538.582,-270 749.199,-270 749.199,-306"/>
|
||||
<text text-anchor="middle" x="643.891" y="-285.6" font-family="Times,serif" font-size="8.00">Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq -->
|
||||
<g id="edge74" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->Qmcqpjgdh28TGdjYat3PDUxBccRqu5Nr8hUPvdt8PF4eVq</title>
|
||||
<path fill="none" stroke="black" d="M392.037,-431.973C416.213,-402.685 468.242,-345.023 525.449,-315 528.995,-313.139 532.667,-311.406 536.427,-309.791"/>
|
||||
<polygon fill="black" stroke="black" points="537.929,-312.96 545.931,-306.016 535.345,-306.455 537.929,-312.96"/>
|
||||
</g>
|
||||
<!-- QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR -->
|
||||
<g id="node76" class="node"><title>QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR</title>
|
||||
<polygon fill="none" stroke="black" points="752.012,-252 535.769,-252 535.769,-216 752.012,-216 752.012,-252"/>
|
||||
<text text-anchor="middle" x="643.891" y="-231.6" font-family="Times,serif" font-size="8.00">QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR -->
|
||||
<g id="edge75" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmT2zjcD5Cf4B7nLCnu6TngNuPcKciprAYTtzD3REXvzcR</title>
|
||||
<path fill="none" stroke="black" d="M386.525,-431.819C405.853,-393.671 456.07,-305.155 525.449,-261 527.931,-259.42 530.495,-257.933 533.124,-256.532"/>
|
||||
<polygon fill="black" stroke="black" points="534.813,-259.603 542.29,-252.096 531.764,-253.302 534.813,-259.603"/>
|
||||
</g>
|
||||
<!-- QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY -->
|
||||
<g id="node77" class="node"><title>QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY</title>
|
||||
<polygon fill="none" stroke="black" points="755.867,-198 531.914,-198 531.914,-162 755.867,-162 755.867,-198"/>
|
||||
<text text-anchor="middle" x="643.891" y="-177.6" font-family="Times,serif" font-size="8.00">QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY -->
|
||||
<g id="edge76" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmeyCHUPSF2ke9B6nnQHdUno32D8ej98vHWyezYi6QPPSY</title>
|
||||
<path fill="none" stroke="black" d="M383.263,-431.964C398.069,-386.428 443.401,-266.242 525.449,-207 527.344,-205.632 529.297,-204.332 531.3,-203.096"/>
|
||||
<polygon fill="black" stroke="black" points="533.313,-205.983 540.372,-198.083 529.927,-199.856 533.313,-205.983"/>
|
||||
</g>
|
||||
<!-- QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE -->
|
||||
<g id="node78" class="node"><title>QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE</title>
|
||||
<polygon fill="none" stroke="black" points="757.059,-144 530.722,-144 530.722,-108 757.059,-108 757.059,-144"/>
|
||||
<text text-anchor="middle" x="643.891" y="-123.6" font-family="Times,serif" font-size="8.00">QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE -->
|
||||
<g id="edge77" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmSHHkLpaSTBFfvtSJdTmxvP2cPMKrso66nB2d9wz4WVWE</title>
|
||||
<path fill="none" stroke="black" d="M381.177,-431.93C391.959,-379.763 430.491,-227.874 525.449,-153 527.051,-151.737 528.701,-150.531 530.394,-149.38"/>
|
||||
<polygon fill="black" stroke="black" points="532.435,-152.235 539.181,-144.065 528.813,-146.245 532.435,-152.235"/>
|
||||
</g>
|
||||
<!-- QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5 -->
|
||||
<g id="node79" class="node"><title>QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5</title>
|
||||
<polygon fill="none" stroke="black" points="756.277,-90 531.504,-90 531.504,-54 756.277,-54 756.277,-90"/>
|
||||
<text text-anchor="middle" x="643.891" y="-69.6" font-family="Times,serif" font-size="8.00">QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5 -->
|
||||
<g id="edge78" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->QmNPGySRo1GA1EXJgferHsD43zqy5dX6urKXYsfYFXyCG5</title>
|
||||
<path fill="none" stroke="black" d="M379.712,-431.702C386.878,-373.296 417.429,-189.85 525.449,-99 526.825,-97.8428 528.241,-96.7328 529.693,-95.6682"/>
|
||||
<polygon fill="black" stroke="black" points="531.874,-98.4257 538.368,-90.0545 528.071,-92.5488 531.874,-98.4257"/>
|
||||
</g>
|
||||
<!-- Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B -->
|
||||
<g id="node80" class="node"><title>Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B</title>
|
||||
<polygon fill="none" stroke="black" points="752.266,-36 535.516,-36 535.516,-0 752.266,-0 752.266,-36"/>
|
||||
<text text-anchor="middle" x="643.891" y="-15.6" font-family="Times,serif" font-size="8.00">Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B</text>
|
||||
</g>
|
||||
<!-- QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B -->
|
||||
<g id="edge79" class="edge"><title>QmWTgK7JU27djNdF1aHh3K3hVPJ5nZYtEy7tspwCz9PXLH->Qma3aC6KJB4Vit2f9Mi9Z7ZbKP2FfFCRbHbXY9b86fFS6B</title>
|
||||
<path fill="none" stroke="black" d="M378.574,-431.711C382.365,-367.766 404.017,-152.274 525.449,-45 526.625,-43.9612 527.833,-42.96 529.07,-41.9953"/>
|
||||
<polygon fill="black" stroke="black" points="531.347,-44.6778 537.624,-36.142 527.394,-38.9008 531.347,-44.6778"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 73 KiB |
|
@ -1,24 +0,0 @@
|
|||
digraph {
|
||||
graph [rankdir=LR];
|
||||
QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF [fontsize=8 shape=box];
|
||||
QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb [fontsize=8 shape=box];
|
||||
QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF -> QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb [label="cat.jpg"];
|
||||
QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF [fontsize=8 shape=box];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box];
|
||||
QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF -> QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [label="test"];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box];
|
||||
QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [fontsize=8 shape=box];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [label="bar"];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box];
|
||||
QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [label="baz"];
|
||||
QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box];
|
||||
QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [fontsize=8 shape=box];
|
||||
QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt -> QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM [label="b"];
|
||||
QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt [fontsize=8 shape=box];
|
||||
QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [fontsize=8 shape=box];
|
||||
QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt -> QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [label="f"];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv [fontsize=8 shape=box];
|
||||
QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [fontsize=8 shape=box];
|
||||
QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -> QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 [label="foo"];
|
||||
}
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 40 KiB |
|
@ -1,85 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 2.38.0 (20140413.2041)
|
||||
-->
|
||||
<!-- Title: %3 Pages: 1 -->
|
||||
<svg width="1099pt" height="128pt"
|
||||
viewBox="0.00 0.00 1099.49 127.96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 123.958)">
|
||||
<title>%3</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-123.958 1095.49,-123.958 1095.49,4 -4,4"/>
|
||||
<!-- QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF -->
|
||||
<g id="node1" class="node"><title>QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF</title>
|
||||
<polygon fill="none" stroke="black" points="230.563,-96.9578 -0.187806,-96.9578 -0.187806,-60.9578 230.563,-60.9578 230.563,-96.9578"/>
|
||||
<text text-anchor="middle" x="115.188" y="-76.5578" font-family="Times,serif" font-size="8.00">QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF</text>
|
||||
</g>
|
||||
<!-- QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb -->
|
||||
<g id="node2" class="node"><title>QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb</title>
|
||||
<polygon fill="none" stroke="black" points="523.592,-119.958 306.771,-119.958 306.771,-83.9578 523.592,-83.9578 523.592,-119.958"/>
|
||||
<text text-anchor="middle" x="415.182" y="-99.5578" font-family="Times,serif" font-size="8.00">QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb</text>
|
||||
</g>
|
||||
<!-- QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF->QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb -->
|
||||
<g id="edge1" class="edge"><title>QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF->QmajFHHivh25Qb2cNbnnnEeUe1gDLHX9ta7hs2XKX1vazb</title>
|
||||
<path fill="none" stroke="black" d="M230.548,-87.7844C252.085,-89.4467 274.644,-91.1879 296.287,-92.8584"/>
|
||||
<polygon fill="black" stroke="black" points="296.254,-96.3661 306.494,-93.6462 296.793,-89.3869 296.254,-96.3661"/>
|
||||
<text text-anchor="middle" x="267.229" y="-93.7578" font-family="Times,serif" font-size="14.00">cat.jpg</text>
|
||||
</g>
|
||||
<!-- QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -->
|
||||
<g id="node3" class="node"><title>QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv</title>
|
||||
<polygon fill="none" stroke="black" points="526.381,-65.9578 303.982,-65.9578 303.982,-29.9578 526.381,-29.9578 526.381,-65.9578"/>
|
||||
<text text-anchor="middle" x="415.182" y="-45.5578" font-family="Times,serif" font-size="8.00">QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv</text>
|
||||
</g>
|
||||
<!-- QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF->QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv -->
|
||||
<g id="edge2" class="edge"><title>QmRCJXG7HSmprrYwDrK1GctXHgbV7EYpVcJPQPwevoQuqF->QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv</title>
|
||||
<path fill="none" stroke="black" d="M230.548,-67.0611C251.282,-64.9041 272.964,-62.6485 293.864,-60.4744"/>
|
||||
<polygon fill="black" stroke="black" points="294.469,-63.9304 304.053,-59.4144 293.745,-56.9679 294.469,-63.9304"/>
|
||||
<text text-anchor="middle" x="267.229" y="-66.7578" font-family="Times,serif" font-size="14.00">test</text>
|
||||
</g>
|
||||
<!-- QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM -->
|
||||
<g id="node4" class="node"><title>QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM</title>
|
||||
<polygon fill="none" stroke="black" points="1082.83,-100.958 862.398,-100.958 862.398,-64.9578 1082.83,-64.9578 1082.83,-100.958"/>
|
||||
<text text-anchor="middle" x="972.613" y="-80.5578" font-family="Times,serif" font-size="8.00">QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM</text>
|
||||
</g>
|
||||
<!-- QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv->QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM -->
|
||||
<g id="edge3" class="edge"><title>QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv->QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM</title>
|
||||
<path fill="none" stroke="black" d="M513.5,-65.9828C535.838,-69.5205 559.539,-72.7998 581.709,-74.9578 691.041,-85.6 718.905,-81.1798 828.74,-82.9578 836.242,-83.0792 843.965,-83.172 851.753,-83.2411"/>
|
||||
<polygon fill="black" stroke="black" points="851.989,-86.7429 862.015,-83.3188 852.042,-79.7431 851.989,-86.7429"/>
|
||||
<text text-anchor="middle" x="696.225" y="-84.7578" font-family="Times,serif" font-size="14.00">bar</text>
|
||||
</g>
|
||||
<!-- QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt -->
|
||||
<g id="node5" class="node"><title>QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt</title>
|
||||
<polygon fill="none" stroke="black" points="810.756,-65.9578 581.693,-65.9578 581.693,-29.9578 810.756,-29.9578 810.756,-65.9578"/>
|
||||
<text text-anchor="middle" x="696.225" y="-45.5578" font-family="Times,serif" font-size="8.00">QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt</text>
|
||||
</g>
|
||||
<!-- QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv->QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt -->
|
||||
<g id="edge4" class="edge"><title>QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv->QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt</title>
|
||||
<path fill="none" stroke="black" d="M526.467,-47.9578C541.196,-47.9578 556.38,-47.9578 571.323,-47.9578"/>
|
||||
<polygon fill="black" stroke="black" points="571.62,-51.4579 581.62,-47.9578 571.62,-44.4579 571.62,-51.4579"/>
|
||||
<text text-anchor="middle" x="553.995" y="-50.7578" font-family="Times,serif" font-size="14.00">baz</text>
|
||||
</g>
|
||||
<!-- QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 -->
|
||||
<g id="node6" class="node"><title>QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6</title>
|
||||
<polygon fill="none" stroke="black" points="1091.36,-37.9578 853.867,-37.9578 853.867,-1.95781 1091.36,-1.95781 1091.36,-37.9578"/>
|
||||
<text text-anchor="middle" x="972.613" y="-17.5578" font-family="Times,serif" font-size="8.00">QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6</text>
|
||||
</g>
|
||||
<!-- QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv->QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 -->
|
||||
<g id="edge7" class="edge"><title>QmNtpA5TBNqHrKf3cLQ1AiUKXiE4JmUodbG5gXrajg8wdv->QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6</title>
|
||||
<path fill="none" stroke="black" d="M474.14,-29.9358C505.616,-21.0834 545.415,-11.3858 581.709,-6.95781 668.571,3.63959 767.068,0.229124 843.332,-5.74933"/>
|
||||
<polygon fill="black" stroke="black" points="843.217,-9.25138 853.467,-6.56909 843.782,-2.27417 843.217,-9.25138"/>
|
||||
<text text-anchor="middle" x="696.225" y="-9.75781" font-family="Times,serif" font-size="14.00">foo</text>
|
||||
</g>
|
||||
<!-- QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt->QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM -->
|
||||
<g id="edge5" class="edge"><title>QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt->QmTz3oc4gdpRMKP2sdGUPZTAGRngqjsi99BPoztyP53JMM</title>
|
||||
<path fill="none" stroke="black" d="M810.81,-62.4463C824.453,-64.1866 838.418,-65.9679 852.142,-67.7184"/>
|
||||
<polygon fill="black" stroke="black" points="851.722,-71.1931 862.084,-68.9867 852.607,-64.2494 851.722,-71.1931"/>
|
||||
<text text-anchor="middle" x="832.24" y="-67.7578" font-family="Times,serif" font-size="14.00">b</text>
|
||||
</g>
|
||||
<!-- QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt->QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6 -->
|
||||
<g id="edge6" class="edge"><title>QmX1ebVUtfY11ZCpVmqyE5mDoN62SpLd8eLPpg5GGV1ABt->QmYNmQKp6SuaVrpgWRsPTgCQCnpxUYGq76YEKBXuj2N4H6</title>
|
||||
<path fill="none" stroke="black" d="M810.81,-36.367C821.646,-35.2612 832.685,-34.1347 843.645,-33.0163"/>
|
||||
<polygon fill="black" stroke="black" points="844.087,-36.4895 853.68,-31.9923 843.377,-29.5256 844.087,-36.4895"/>
|
||||
<text text-anchor="middle" x="832.24" y="-36.7578" font-family="Times,serif" font-size="14.00">f</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 7.3 KiB |
|
@ -1,61 +0,0 @@
|
|||
---
|
||||
title: The Inter-Planetary Naming System
|
||||
---
|
||||
|
||||
ipns is a way to add a small amount of mutability to the permanent immutability
|
||||
that is ipfs. It allows you to store a reference to an ipfs hash under the
|
||||
namespace of your peerID ( the hash of your public key ). The commands to set it up
|
||||
are quite simple.
|
||||
|
||||
First, you'll need some content to publish:
|
||||
|
||||
```
|
||||
$ echo 'Let us have some mutable fun!' | ipfs add
|
||||
```
|
||||
|
||||
Note the hash that was printed out, and use it here to publish it to the network:
|
||||
|
||||
```
|
||||
$ ipfs name publish <that hash>
|
||||
Published to <your peer ID>: <that hash>
|
||||
```
|
||||
|
||||
Now, to test that it worked, you could try a couple of different things:
|
||||
|
||||
```
|
||||
$ ipfs name resolve <your peer ID>
|
||||
<that hash>
|
||||
```
|
||||
|
||||
If you ran that on the same machine, it should return instantly, as you have
|
||||
cached the entry locally; give it a shot on another computer running ipfs.
|
||||
|
||||
Another thing to try is viewing it on a gateway:
|
||||
|
||||
```
|
||||
https://ipfs.io/ipns/<your peer ID>
|
||||
```
|
||||
|
||||
So, now comes the fun part: Lets change things.
|
||||
|
||||
```
|
||||
$ echo 'Look! Things have changed!' | ipfs add
|
||||
```
|
||||
|
||||
Next, take the hash from there and...
|
||||
```
|
||||
$ ipfs name publish <the new hash>
|
||||
Published to <your peer ID>: <the new hash>
|
||||
```
|
||||
|
||||
Voila! Now, if you resolve that entry again, you'll see your new object.
|
||||
|
||||
Congratulations! You just successfully published and resolved an ipns entry!
|
||||
Note that updating an ipns entry can "break links" because anything referencing an ipns
|
||||
entry might no longer point to the content it expected. There is no way around
|
||||
this ( you know, mutability ), therefore, ipns links should be used carefully if
|
||||
you want to ensure permanence. In the future, we may have ipns entries work as
|
||||
a git commit chain, with each successive entry pointing back in time to other
|
||||
values.
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
|
@ -1,26 +0,0 @@
|
|||
---
|
||||
title: Playing with the Network
|
||||
---
|
||||
|
||||
IPFS is all about networking! Included are a useful set of commands
|
||||
to aid in observing the network.
|
||||
|
||||
See who you're directly connected to:
|
||||
|
||||
```sh
|
||||
ipfs swarm peers
|
||||
```
|
||||
|
||||
Manually connect to a specific peer. If the peer below doesn't work, choose one from the output of `ipfs swarm peers`.
|
||||
|
||||
```sh
|
||||
ipfs swarm connect /ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z
|
||||
```
|
||||
|
||||
Search for a given peer on the network:
|
||||
|
||||
```sh
|
||||
ipfs dht findpeer QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z
|
||||
```
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
|
@ -1,46 +0,0 @@
|
|||
---
|
||||
title: Pinning Files
|
||||
---
|
||||
|
||||
Pinning is a very important concept in ipfs. ipfs semantics try
|
||||
to make it feel like every single object is local, there is no "retrieve this
|
||||
file for me from a remote server", just `ipfs cat` or `ipfs get` which act
|
||||
the same way no matter where the actual object is located. While this is nice,
|
||||
sometimes you want to be able to control what you keep around. Pinning is the
|
||||
mechanism that allows you to tell ipfs to always keep a given object local.
|
||||
ipfs has a fairly aggressive caching mechanism that will keep an object local
|
||||
for a short time after you perform any ipfs operation on it, but these objects
|
||||
may get garbage collected fairly regularly. To prevent that garbage collection
|
||||
simply pin the hash you care about. Objects added through `ipfs add` are pinned
|
||||
recursively by default.
|
||||
```
|
||||
echo "ipfs rocks" > foo
|
||||
ipfs add foo
|
||||
ipfs pin ls --type=all
|
||||
ipfs pin rm <foo hash>
|
||||
ipfs pin rm -r <foo hash>
|
||||
ipfs pin ls --type=all
|
||||
```
|
||||
|
||||
As you may have noticed, the first `ipfs pin rm` command didnt work, it should
|
||||
have warned you that the given hash was "pinned recursively". There are three
|
||||
types of pins in the ipfs world; direct pins, which pin just a single block, and
|
||||
no others in relation to it. recursive pins, which pin a given block and all of
|
||||
its children, and indirect pins, which are the result of a given blocks parent
|
||||
being pinned recursively.
|
||||
|
||||
A pinned object cannot be garbage collected, if you dont believe me try this:
|
||||
```
|
||||
ipfs add foo
|
||||
ipfs repo gc
|
||||
ipfs cat <foo hash>
|
||||
```
|
||||
|
||||
But if foo were to somehow become unpinned...
|
||||
```
|
||||
ipfs pin rm -r <foo hash>
|
||||
ipfs repo gc
|
||||
ipfs cat <foo hash>
|
||||
```
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
|
@ -1,48 +0,0 @@
|
|||
---
|
||||
title: Snapshots
|
||||
---
|
||||
|
||||
Lets take a quick look at how ipfs can be used to take basic snapshots.
|
||||
|
||||
Save your directory:
|
||||
```
|
||||
$ ipfs add -r ~/code/myproject
|
||||
```
|
||||
|
||||
Note the hash:
|
||||
```
|
||||
$ echo $hash `date` >> snapshots
|
||||
```
|
||||
|
||||
|
||||
Or all at once:
|
||||
```
|
||||
$ echo `ipfs add -q -r ~/code/myproject | tail -n1` `date` >> snapshots
|
||||
```
|
||||
(Note: the `-q` makes the output only contain the hashes, piping through
|
||||
`tail -n1` ensures only the hash of the top folder is output.)
|
||||
|
||||
Make sure to have the placeholders for the mount points:
|
||||
```
|
||||
$ sudo mkdir /ipfs /ipns
|
||||
$ sudo chown `whoami` /ipfs /ipns
|
||||
```
|
||||
|
||||
You will need to have `Fuse` installed on your machine in order to be able to `mount` directories from the ipfs. You can find instructions of how to [install `Fuse` in the `go-ipfs` docs](https://github.com/ipfs/go-ipfs/blob/master/docs/fuse.md)
|
||||
|
||||
|
||||
View the snapshots live:
|
||||
```
|
||||
$ ipfs mount
|
||||
$ ls /ipfs/$hash/
|
||||
|
||||
# can also
|
||||
|
||||
$ cd /ipfs/$hash/
|
||||
$ ls
|
||||
```
|
||||
|
||||
Through the fuse interface, youll be able to access your files exactly as
|
||||
they were when you took the snapshot.
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
|
@ -1,28 +0,0 @@
|
|||
---
|
||||
title: Playing Videos
|
||||
---
|
||||
|
||||
ipfs can be used to store and play videos. Suppose we add a video:
|
||||
|
||||
```
|
||||
ipfs add -q sintel.mp4 | tail -n1
|
||||
```
|
||||
|
||||
Take the resulting hash, You can view it a couple different ways:
|
||||
|
||||
On the command line:
|
||||
```
|
||||
ipfs cat $vidhash | mplayer -vo xv -
|
||||
```
|
||||
|
||||
Via local gateway:
|
||||
```
|
||||
mplayer http://localhost:8080/ipfs/$vidhash
|
||||
|
||||
# or open it up in a tab in chrome (or firefox)
|
||||
|
||||
chromium http://localhost:8080/ipfs/$vidhash
|
||||
```
|
||||
(Note: the gateway method works with most video players and browsers)
|
||||
|
||||
By [whyrusleeping](http://github.com/whyrusleeping)
|
|
@ -1,88 +0,0 @@
|
|||
---
|
||||
title: IPFS for Websites
|
||||
---
|
||||
|
||||
### A short guide to hosting your site on ipfs
|
||||
|
||||
Adding your static website to ipfs is quite simple! Simply turn on your daemon:
|
||||
```bash
|
||||
$ ipfs daemon
|
||||
```
|
||||
|
||||
And add the directory containing your website:
|
||||
```bash
|
||||
$ ls mysite
|
||||
img index.html
|
||||
$ ipfs add -r mysite
|
||||
added QmcMN2wqoun88SVF5own7D5LUpnHwDA6ALZnVdFXhnYhAs mysite/img/spacecat.jpg
|
||||
added QmS8tC5NJqajBB5qFhcA1auav14iHMnoMZJWfmr4k3EY6w mysite/img
|
||||
added QmYh6HbZhHABQXrkQZ4aRRSoSa6bb9vaKoHeumWex6HRsT mysite/index.html
|
||||
added QmYeAiiK1UfB8MGLRefok1N7vBTyX8hGPuMXZ4Xq1DPyt7 mysite/
|
||||
```
|
||||
|
||||
The very last hash next to the folder name is the one you want, let's call it
|
||||
`$SITE_HASH` for now.
|
||||
|
||||
Now, you can test it out locally by opening `http://localhost:8080/ipfs/$SITE_HASH`
|
||||
in your web browser! Next, to view it coming from another ipfs node, you can try
|
||||
`http://gateway.ipfs.io/ipfs/$SITE_HASH`. Cool, right? But those hashes are
|
||||
rather ugly. Let's look at some ways to get rid of them.
|
||||
|
||||
First, you can do a simple DNS TXT record, containing `dnslink=/ipfs/$SITE_HASH`.
|
||||
Once that record propagates, you should be able to view your site at
|
||||
`http://localhost:8080/ipns/your.domain`. Now that's quite a bit cleaner.
|
||||
You can also try this on the gateway at `http://gateway.ipfs.io/ipns/your.domain`
|
||||
|
||||
Next, you might be asking "well what if i want to change my website, DNS is slow!"
|
||||
Well let me tell you about this little thing called Ipns (note the 'n'). Ipns is
|
||||
the Interplanetary Naming System, you might have noticed the above link has
|
||||
`/ipns/` instead of `/ipfs/`. Ipns is used for mutable content in the ipfs
|
||||
network, it's relatively easy to use, and will allow you to change your website
|
||||
without updating the dns record every time! So how do you use it?
|
||||
|
||||
After adding your webpage, simply do:
|
||||
```bash
|
||||
$ ipfs name publish $SITE_HASH
|
||||
Published to <your peer id>: /ipfs/$SITE_HASH
|
||||
```
|
||||
|
||||
(Disclaimer: When using IPNS to update websites, it's important to think about that
|
||||
assets could be loaded from two different resolved hashes when updating your website,
|
||||
leading to outdated/missing assets unless accounted for)
|
||||
|
||||
Now, you can test that it worked by viewing: `http://localhost:8080/ipns/<your peer id>`.
|
||||
And also try the same link on the public gateway. Once you're convinced that works,
|
||||
let's again hide the hash. Change your DNS TXT record to `dnslink=/ipns/<your peer id>`,
|
||||
wait for that record to propagate, and then try accessing `http://localhost:8080/ipns/your.domain`.
|
||||
|
||||
At this point, you have a website on ipfs/ipns, and you may be wondering how
|
||||
you could expose it at `http://your.domain`, so that the Internet users of
|
||||
today may access it too without them having to know about any of this. It's
|
||||
actually surprisingly simple to do, all you need for this is your previously
|
||||
created TXT record and to point the A record of `your.domain` to the IP
|
||||
address of an ipfs daemon that listens on port 80 for HTTP requests (such as
|
||||
`gateway.ipfs.io`). The users' browsers will send `your.domain` in the Host
|
||||
header of the requests, and you have your dnslink TXT records, so the ipfs
|
||||
gateway will recognize `your.domain` as an IPNS name, and so it will serve
|
||||
from under `/ipns/your.domain/` instead of `/`.
|
||||
|
||||
So, if you point `your.domain`'s A record to the IP of `gateway.ipfs.io`, and
|
||||
then wait for the DNS to propagate, then anyone should be able to access your
|
||||
ipfs-hosted site without any extra configuration simply at
|
||||
`http://your.domain`.
|
||||
|
||||
Alternatively, it is possible to use CNAME records to point at the DNS records
|
||||
of the gateway. This way, IP addresses of the gateway are automatically
|
||||
updated. Note however that CNAME records to not allow for other records, such
|
||||
as a TXT to refer to the ipfs/ipns record. Because of this, ipfs allows to
|
||||
create a DNS TXT record for `_dnslink.your.domain` with
|
||||
`dnslink=/ipns/<yourpeer id>`.
|
||||
|
||||
So by creating a CNAME for `your.domain` to `gateway.ipfs.io` and adding a
|
||||
`_dnslink.your.domain` record with `dnslink=/ipns/<your peer id>` you can host
|
||||
your website without explicitly referring to IP addresses of the ipfs gateway.
|
||||
|
||||
Happy Hacking!
|
||||
|
||||
By
|
||||
[Whyrusleeping](https://github.com/whyrusleeping)
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
title: FAQ
|
||||
# This is a terrible hack to get external links in `section:` sections
|
||||
# TODO: fix the nav so this isn't needed.
|
||||
external: "https://discuss.ipfs.io/c/help/Old-FAQ"
|
||||
---
|
|
@ -1,217 +0,0 @@
|
|||
---
|
||||
title: Install IPFS
|
||||
weight: 1
|
||||
---
|
||||
|
||||
<!--
|
||||
Based on the existing install docs at https://github.com/ipfs/website/blob/714fa4f3fc469d81b94dc190f1335b9556ad90e1/content/docs/install.md
|
||||
|
||||
Note there are pending PRs for that document that will need to be included here:
|
||||
- https://github.com/ipfs/website/pull/260 / https://github.com/ipfs/website/pull/228
|
||||
- https://github.com/ipfs/website/pull/258
|
||||
|
||||
-->
|
||||
|
||||
There are a variety of ways to install a copy of IPFS on your system. We generally recommend [installing a prebuilt package](#installing-from-a-prebuilt-package), but here are a few other supported options:
|
||||
|
||||
* [Installing from a Prebuilt Package](#installing-from-a-prebuilt-package) (recommended)
|
||||
* [Installing with ipfs-update](#installing-with-ipfs-update)
|
||||
* [Building from source](#building-from-source)
|
||||
* [Upgrading IPFS](#upgrading-ipfs)
|
||||
* [Troubleshooting](#troubleshooting)
|
||||
|
||||
Note these instructions all make use of the **command line.** We use `$` to indicate the command prompt — commands to type are on lines that are prefixed with that, while output lines are un-prefixed.
|
||||
|
||||
---
|
||||
|
||||
## Installing from a Prebuilt Package
|
||||
|
||||
First, download the right version of IPFS for your platform:
|
||||
|
||||
<a class="button button-primary" href="https://dist.ipfs.io/#go-ipfs" role="button">
|
||||
Download IPFS for your platform <i class="fa fa-download" aria-hidden="true"></i>
|
||||
</a>
|
||||
|
||||
### Mac OS X and Linux
|
||||
|
||||
After downloading, untar the archive, and move the `ipfs` binary somewhere in your executables `$PATH` using the `install.sh` script:
|
||||
|
||||
```sh
|
||||
$ tar xvfz go-ipfs.tar.gz
|
||||
$ cd go-ipfs
|
||||
$ ./install.sh
|
||||
```
|
||||
|
||||
Test it out:
|
||||
|
||||
```sh
|
||||
$ ipfs help
|
||||
USAGE:
|
||||
|
||||
ipfs - Global p2p merkle-dag filesystem.
|
||||
...
|
||||
```
|
||||
|
||||
Congratulations! You now have a working IPFS installation on your computer.
|
||||
|
||||
<a class="button button-primary" href="{{< relref "usage.md" >}}" role="button">
|
||||
General Usage <i class="fa fa-arrow-right"></i>
|
||||
</a>
|
||||
|
||||
### Windows
|
||||
|
||||
After downloading, unzip the archive, and move `ipfs.exe` somewhere in your `%PATH%`.
|
||||
|
||||
Test it out:
|
||||
|
||||
```sh
|
||||
$ ipfs help
|
||||
USAGE:
|
||||
|
||||
ipfs - Global p2p merkle-dag filesystem.
|
||||
...
|
||||
```
|
||||
|
||||
Congratulations! You now have a working IPFS installation on your computer.
|
||||
|
||||
<a class="button button-primary" href="{{< relref "usage.md" >}}" role="button">
|
||||
General Usage <i class="fa fa-arrow-right"></i>
|
||||
</a>
|
||||
|
||||
|
||||
---
|
||||
|
||||
## Installing with ipfs-update
|
||||
|
||||
`ipfs-update` is a command-line tool to install and upgrade the `ipfs` binary.
|
||||
|
||||
### Getting ipfs-update
|
||||
|
||||
`ipfs-update` can be downloaded for your platform at: https://dist.ipfs.io/#ipfs-update
|
||||
|
||||
If you have a working Go environment (>=1.8), you can also install it with:
|
||||
```
|
||||
$ go get -u github.com/ipfs/ipfs-update
|
||||
```
|
||||
|
||||
|
||||
When installing new versions of `ipfs` or upgrading make sure you are using the latest version of `ipfs-update`.
|
||||
|
||||
### Installing ipfs with ipfs-update
|
||||
|
||||
`ipfs-update versions` lists all the available `ipfs` versions which are available for download:
|
||||
|
||||
```
|
||||
$ ipfs-update versions
|
||||
v0.3.2
|
||||
v0.3.4
|
||||
v0.3.5
|
||||
v0.3.6
|
||||
v0.3.7
|
||||
v0.3.8
|
||||
v0.3.9
|
||||
v0.3.10
|
||||
v0.3.11
|
||||
v0.4.0
|
||||
v0.4.1
|
||||
v0.4.2
|
||||
v0.4.3
|
||||
v0.4.4
|
||||
v0.4.5
|
||||
v0.4.6
|
||||
v0.4.7-rc1
|
||||
```
|
||||
|
||||
|
||||
`ipfs-update install latest` will install the latest available version:
|
||||
|
||||
```
|
||||
$ ipfs-update install latest
|
||||
fetching go-ipfs version v0.4.7-rc1
|
||||
binary downloaded, verifying...
|
||||
success!
|
||||
stashing old binary
|
||||
installing new binary to /home/hector/go/bin/ipfs
|
||||
checking if repo migration is needed...
|
||||
Installation complete!
|
||||
```
|
||||
|
||||
Note that the latest available version may not be stable (i.e. release candidates
|
||||
in the form `vX.X.X-rcX`). So it is recommended to specify the version you want
|
||||
to install, for example: `ipfs-update install v0.4.6`.
|
||||
|
||||
---
|
||||
|
||||
## Building from Source
|
||||
|
||||
<div class="message mb">
|
||||
<strong>Warning:</strong> In the past you could install IPFS using <code>go get</code>. This
|
||||
does not work anymore!
|
||||
</div>
|
||||
|
||||
If you want, you can also build IPFS from source.
|
||||
If you are on Mac OS X or Linux take a look at [the readme](https://github.com/ipfs/go-ipfs#build-from-source) for install instructions.
|
||||
If you are on Windows take a look at [this document](https://github.com/ipfs/go-ipfs/blob/master/docs/windows.md) for instructions.
|
||||
|
||||
---
|
||||
|
||||
## Upgrading IPFS
|
||||
|
||||
`ipfs` upgrades (and downgrades) may involve a repository upgrade process performed by the
|
||||
[fs-repo-migrations](https://dist.ipfs.io/#fs-repo-migrations) tool.
|
||||
|
||||
### Upgrading using ipfs-update
|
||||
|
||||
`ipfs-update install` will download and run `fs-repo-migrations` when needed, during the installation of
|
||||
a newer or older `ipfs` version (as explained above). This is the easiest way of upgrading.
|
||||
|
||||
<div class="message mb">
|
||||
<strong>Warning:</strong> Make sure that the ipfs daemon is not running during an upgrade
|
||||
</div>
|
||||
|
||||
|
||||
### Upgrading manually
|
||||
|
||||
In order to perform a manual upgrade of `ipfs`, you will need to manually run any repository migrations. The
|
||||
procedure is as follows:
|
||||
|
||||
* Stop the `ipfs` daemon if it is running
|
||||
* Optionally backup your `ipfs` data folder (i.e. `cp -aL ~/.ipfs ~/.ipfs.bk`)
|
||||
* Download and install the latest version of `ipfs` from [https://dist.ipfs.io/#go-ipfs](https://dist.ipfs.io/#go-ipfs)
|
||||
* Run `ipfs daemon`.
|
||||
|
||||
When a repository migration is necessary, `ipfs` will inform the user, download and install `fs-repo-migrations`
|
||||
and perform the upgrade. If you wish the procedure to happen unattended, launch the daemon with the `--migrate`
|
||||
flag.
|
||||
|
||||
Migrations can be also run manually by downloading the latest version of `fs-repo-migrations`
|
||||
from [https://dist.ipfs.io/#fs-repo-migrations](https://dist.ipfs.io/#fs-repo-migrations) and
|
||||
[following these instructions](https://github.com/ipfs/fs-repo-migrations/blob/master/run.md).
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Help!
|
||||
|
||||
If you have any problems, come get live help at
|
||||
[#ipfs](../#community) or via [the mailing list](../#community).
|
||||
|
||||
### Check Go Version
|
||||
|
||||
IPFS works with Go 1.7.0 or later.
|
||||
To check what go version you have installed, type `go version`.
|
||||
Here's what I get:
|
||||
|
||||
```sh
|
||||
$ go version
|
||||
go version go1.7 linux/amd64
|
||||
```
|
||||
|
||||
If you need to update, it is recommended to install from the
|
||||
[canonical Go packages](https://golang.org/doc/install).
|
||||
Package managers often contain out-of-date Go packages.
|
||||
|
||||
### Install FUSE
|
||||
|
||||
For more details on setting up FUSE (so that you can mount the filesystem), see [github.com/ipfs/go-ipfs/blob/master/docs/fuse.md](https://github.com/ipfs/go-ipfs/blob/master/docs/fuse.md)
|
|
@ -1,173 +0,0 @@
|
|||
---
|
||||
title: Basic Usage
|
||||
weight: 2
|
||||
---
|
||||
|
||||
If you haven't done so, [install IPFS](../install).
|
||||
|
||||
During this tutorial, if you have any questions, feel free to ask them in [https://discuss.ipfs.io/](https://discuss.ipfs.io/) or in [#ipfs on chat.freenode.net](irc://chat.freenode.net/%23ipfs).
|
||||
|
||||
## Initialize the repository
|
||||
|
||||
`ipfs` stores all its settings and internal data in a directory called the *repository.* Before using IPFS for the first time, you’ll need to initialize the repository with the `ipfs init` command:
|
||||
|
||||
```sh
|
||||
> ipfs init
|
||||
initializing ipfs node at /Users/jbenet/.go-ipfs
|
||||
generating 2048-bit RSA keypair...done
|
||||
peer identity: Qmcpo2iLBikrdf1d6QU6vXuNb6P7hwrbNPW9kLAH8eG67z
|
||||
to get started, enter:
|
||||
|
||||
ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme
|
||||
|
||||
```
|
||||
|
||||
<div class="alert alert-warning">
|
||||
<p>
|
||||
If you are running on a server in a data center, you should initialize IPFS with the <code>server</code> profile. This will prevent IPFS from creating a lot of data center-internal traffic trying to discover local nodes:
|
||||
</p>
|
||||
|
||||
<pre><code class="language-sh">> ipfs init --profile server</code></pre>
|
||||
|
||||
<p>
|
||||
There are a whole host of other configuration options you may want to set — check <a href="https://github.com/ipfs/go-ipfs/blob/v0.4.15/docs/config.md">the full reference</a> for more.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info">
|
||||
The hash after <code>peer identity: </code> is your node’s ID and will be different from the one shown in the above output. Other nodes on the network use it to find and connect to you. You can run <code>ipfs id</code> at any time to get it again if you need it.
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info">
|
||||
The <code>HASH</code> in the <code>ipfs cat /ipfs/HASH/readme</code> line above may differ from the <code>HASH</code> in your output. If it does, use the one you got in the following instructions. Be sure not to confuse these hashes with your peer identity hash; <code>ipfs cat /ipfs/PEER_ID/readme</code> won't work.
|
||||
</div>
|
||||
|
||||
Now, try running:
|
||||
|
||||
```sh
|
||||
ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme
|
||||
```
|
||||
|
||||
You should see something like this:
|
||||
|
||||
```
|
||||
Hello and Welcome to IPFS!
|
||||
|
||||
██╗██████╗ ███████╗███████╗
|
||||
██║██╔══██╗██╔════╝██╔════╝
|
||||
██║██████╔╝█████╗ ███████╗
|
||||
██║██╔═══╝ ██╔══╝ ╚════██║
|
||||
██║██║ ██║ ███████║
|
||||
╚═╝╚═╝ ╚═╝ ╚══════╝
|
||||
|
||||
If you're seeing this, you have successfully installed
|
||||
IPFS and are now interfacing with the ipfs merkledag!
|
||||
|
||||
-------------------------------------------------------
|
||||
| Warning: |
|
||||
| This is alpha software. use at your own discretion! |
|
||||
| Much is missing or lacking polish. There are bugs. |
|
||||
| Not yet secure. Read the security notes for more. |
|
||||
-------------------------------------------------------
|
||||
|
||||
Check out some of the other files in this directory:
|
||||
|
||||
./about
|
||||
./help
|
||||
./quick-start <-- usage examples
|
||||
./readme <-- this file
|
||||
./security-notes
|
||||
|
||||
```
|
||||
|
||||
You can explore other objects in there. In particular, check out `quick-start`:
|
||||
|
||||
|
||||
```sh
|
||||
ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/quick-start
|
||||
```
|
||||
|
||||
Which will walk you through several interesting examples.
|
||||
|
||||
## Going Online
|
||||
|
||||
Once you're ready to take things online, run the daemon in another terminal:
|
||||
|
||||
```sh
|
||||
> ipfs daemon
|
||||
Initializing daemon...
|
||||
API server listening on /ip4/127.0.0.1/tcp/5001
|
||||
Gateway server listening on /ip4/127.0.0.1/tcp/8080
|
||||
```
|
||||
|
||||
Wait for all three lines to appear.
|
||||
|
||||
<div class="alert alert-info">
|
||||
Make note of the tcp ports you get. If they are different, use yours in the commands below.
|
||||
</div>
|
||||
|
||||
Now, switch back to your original terminal. If you're connected to the network,
|
||||
you should be able to see the ipfs addresses of your peers when you run:
|
||||
|
||||
```sh
|
||||
> ipfs swarm peers
|
||||
/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
|
||||
/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx
|
||||
/ip4/134.121.64.93/tcp/1035/ipfs/QmWHyrPWQnsz1wxHR219ooJDYTvxJPyZuDUPSDpdsAovN5
|
||||
/ip4/178.62.8.190/tcp/4002/ipfs/QmdXzZ25cyzSF99csCQmmPZ1NTbWTe8qtKFaZKpZQPdTFB
|
||||
```
|
||||
|
||||
These are a combination of `<transport address>/ipfs/<hash-of-public-key>`.
|
||||
|
||||
Now, you should be able to get objects from the network. Try:
|
||||
|
||||
```
|
||||
ipfs cat /ipfs/QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/cat.jpg >cat.jpg
|
||||
open cat.jpg
|
||||
```
|
||||
|
||||
And, you should be able to give the network objects. Try adding one, and then
|
||||
viewing it in your favorite browser. In this example, we are using `curl`
|
||||
as our browser, but you can open the IPFS URL in other browsers as well:
|
||||
|
||||
```
|
||||
> hash=`echo "I <3 IPFS -$(whoami)" | ipfs add -q`
|
||||
> curl "https://ipfs.io/ipfs/$hash"
|
||||
I <3 IPFS -<your username>
|
||||
```
|
||||
|
||||
Cool, huh? The gateway served a file _from your computer_. The gateway queried
|
||||
the DHT, found your machine, requested the file, your machine sent it to the
|
||||
gateway, and the gateway sent it to your browser.
|
||||
|
||||
<div class="alert alert-warning">
|
||||
Note: depending on the state of the network, <code>curl</code> may take a while. The public gateways may be overloaded or having a hard time reaching you.
|
||||
</div>
|
||||
|
||||
You can also check it out at your own local gateway:
|
||||
|
||||
```
|
||||
> curl "http://127.0.0.1:8080/ipfs/$hash"
|
||||
I <3 IPFS -<your username>
|
||||
```
|
||||
|
||||
By default, your gateway is not exposed to the world, it only works locally.
|
||||
|
||||
## Fancy Web Console
|
||||
|
||||
We also have a web console you can use to check the state of your node.
|
||||
On your favorite web browser, go to:
|
||||
|
||||
<pre><code><a href="http://localhost:5001/webui">http://localhost:5001/webui</a></code></pre>
|
||||
|
||||
This should bring up a console like this:
|
||||
|
||||
<figure>
|
||||
<img class="screenshot" alt="Web console connection view" src="../webui-connection.png">
|
||||
</figure>
|
||||
|
||||
Now, you're ready:
|
||||
|
||||
<a class="button button-primary" href="{{< ref "/guides/examples" >}}" role="button">
|
||||
Onward to more Examples <i class="fa fa-arrow-right"></i>
|
||||
</a>
|
Binary file not shown.
Before Width: | Height: | Size: 127 KiB |
|
@ -1,5 +0,0 @@
|
|||
---
|
||||
title: "Commands & API"
|
||||
headless: true
|
||||
opened: true
|
||||
---
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,3 +0,0 @@
|
|||
---
|
||||
title: "JS & Go Libraries"
|
||||
---
|
|
@ -1,34 +0,0 @@
|
|||
---
|
||||
title: "Working with Go IPFS"
|
||||
menu:
|
||||
reference:
|
||||
parent: go_implementation
|
||||
weight: 1
|
||||
---
|
||||
|
||||
`go-ipfs` is the primary reference implementation of IPFS. It is a command-line application, but can also be used as a library in other Go programs.
|
||||
|
||||
For more about using the `ipfs` application, see [basic usage](/start/usage) or any of the following reference documents:
|
||||
|
||||
- [Configuration reference](https://github.com/ipfs/go-ipfs/blob/master/docs/config.md)
|
||||
- [Datastore configuration](https://github.com/ipfs/go-ipfs/blob/master/docs/datastores.md)
|
||||
- [Experimental features](https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md)
|
||||
- [Installing command completion](https://github.com/ipfs/go-ipfs/blob/master/docs/command-completion.md)
|
||||
- [Mounting IPFS with FUSE](https://github.com/ipfs/go-ipfs/blob/master/docs/fuse.md)
|
||||
- [Installing plugins](https://github.com/ipfs/go-ipfs/blob/master/docs/plugins.md)
|
||||
|
||||
For more technical information about building, debugging or using the API, see:
|
||||
|
||||
- [Performance Debugging Guidelines](https://github.com/ipfs/go-ipfs/blob/master/docs/debug-guide.md)
|
||||
- [IPFS API Implementation](https://github.com/ipfs/go-ipfs/blob/master/docs/implement-api-bindings.md)
|
||||
- [Connecting with Websockets](https://github.com/ipfs/go-ipfs/blob/master/docs/transports.md)
|
||||
- Building on…
|
||||
- [Windows](https://github.com/ipfs/go-ipfs/blob/master/docs/windows.md)
|
||||
- [OpenBSD](https://github.com/ipfs/go-ipfs/blob/master/docs/openbsd.md)
|
||||
- Additional guides at: https://github.com/ipfs/go-ipfs/blob/master/docs/
|
||||
|
||||
If you plan to use `go-ipfs` as a package in your own Go application, you can take any of three main approaches:
|
||||
|
||||
- Use **[`go-ipfs`](https://github.com/ipfs/go-ipfs)** to run IPFS directly in your own process. See [the API reference](/go/pkg/go-ipfs/core/coreapi).
|
||||
- Use **[`go-ipfs-api`](https://github.com/ipfs/go-ipfs-api)** to communicate with an IPFS daemon in a separate process via its HTTP API (this is what `go-ipfs` does if a daemon is already running). See [the API reference](/go/pkg/go-ipfs-api).
|
||||
- Use other Go packages to communicate with the HTTP API directly. See the [HTTP API reference](/api/http).
|
|
@ -1,24 +0,0 @@
|
|||
---
|
||||
title: "Working with IPFS in JS"
|
||||
menu:
|
||||
reference:
|
||||
parent: js_implementation
|
||||
weight: 1
|
||||
---
|
||||
|
||||
There are two main JavaScript libraries for working with IPFS. Both work in Node.js and in modern web browsers:
|
||||
|
||||
- **[`js-ipfs`](https://github.com/ipfs/js-ipfs)** is a full implementation of IPFS, similar to [`go-ipfs`](https://githuh.com/ipfs/go-ipfs). You can use it either as a command-line application or as a library to start an IPFS node directly in your program.
|
||||
|
||||
- **[`js-ipfs-api`](https://github.com/ipfs/js-ipfs-api)** is a smaller library that controls an IPFS node that is already running via its [HTTP API](/api/http). `js-ipfs` actually uses this library internally if it detects that another node is already running on your computer. You can also interact with the [HTTP API](/api/http) directly using `fetch()` in a browser or a module like `request` in Node.js, but using this library can be much more convenient.
|
||||
|
||||
Both libraries have the same [interface for using all the major IPFS commands](https://github.com/ipfs/interface-ipfs-core/tree/master/SPEC).
|
||||
|
||||
Whenever reasonable, we recommend the second method (interacting with a separate IPFS node via the HTTP API). Keeping the IPFS node in a separate process (even if it’s one your program spawns) isolates you from any stability problems with the node. If a user already has IPFS installed, this also means you can take advantage of a single, common installation on their computer. It’s also less code to load in a browser. If you need to spawn a separate IPFS process, you might want to take a look at [`js-ipfsd-ctl`](https://github.com/ipfs/js-ipfsd-ctl), which uses the same interface to spawn a `go-ipfs` node, a `js-ipfs` node, or an in-process `js-ipfs` node.
|
||||
|
||||
|
||||
## IPFS in Web Browsers
|
||||
|
||||
Both the `js-ipfs` and `js-ipfs-api` libraries work in browsers, but each has some special considerations noted in their READMEs.
|
||||
|
||||
We are also building a browser extension named [IPFS Companion](https://github.com/ipfs-shipyard/ipfs-companion). If a visitor to your site has it installed, it will make a global [`window.ipfs`](https://github.com/ipfs-shipyard/ipfs-companion/blob/5d793ece81ec13e200f76a27d656688981740f13/docs/window.ipfs.md) object available to your JavaScript. This object has the same interface as `js-ipfs-api`, but comes with much better security controls and lets you use IPFS without loading any special libraries.
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
title: Packages
|
||||
url: pkg
|
||||
headless: true
|
||||
opened: true
|
||||
---
|
Loading…
Reference in New Issue