diff --git a/glide.lock b/glide.lock index f060e890c..1e4ca9c70 100644 --- a/glide.lock +++ b/glide.lock @@ -1,22 +1,30 @@ hash: 8281cf015a53a23b35321e80207da975eb4cdec6fdcbd479691d0a45d86e39b7 -updated: 2016-12-31T18:13:14.189959358+01:00 +updated: 2017-01-12T00:53:20.223766621+01:00 imports: +- name: github.com/awalterschulze/gographviz + version: 224d2284f4a707f4897baa9103580b7657c898fd + subpackages: + - ast + - errors + - lexer + - parser + - token - name: github.com/bugsnag/osext version: 0dd3f918b21bec95ace9dc86c7e70266cfc5c702 - name: github.com/deckarep/gosx-notifier version: 9daaf8a4715ebe4daf300036644762fe27d3aded - name: github.com/docker/docker - version: 997777ae9296d7b39537ab70abeb448e948f3a8e + version: acaf3cf870ff6a88df5c480682046e4106e31da5 subpackages: - api/types/strslice - name: github.com/docker/go-units version: e30f1e79f3cd72542f2026ceec18d3bd67ab859c - name: github.com/docker/libcompose - version: 2e320f69cafc70683514ee6226d40e2fe868e6d3 + version: 7c59e343cd9d1f3f5577b5bfb71f6486beb4c006 subpackages: - yaml - name: github.com/dustin/go-humanize - version: ef638b6c2e62b857442c6443dace9366a48c0ee2 + version: 7a41df006ff9af79a29f0ffa9c5f21fbe6314a2d - name: github.com/flynn/go-shlex version: 3f9db97f856818214da2e1057f8ad84803971cff - name: github.com/go-ole/go-ole @@ -34,7 +42,9 @@ imports: - name: github.com/jtolds/gls version: 8ddce2a84170772b95dd5d576c48d517b22cac63 - name: github.com/mattn/go-zglob - version: 2dbd7f37a45e993d5180a251b4bdd314d6333b70 + version: 1783ae1a9f7ff3a79240e8c249d8b575d70a6528 + subpackages: + - fastwalk - name: github.com/mgutz/ansi version: c286dcecd19ff979eeb73ea444e479b903f2cfcb - name: github.com/shirou/gopsutil @@ -66,7 +76,7 @@ imports: - name: github.com/urfave/cli version: 11c134509d89c2018675f369955218a180dc7428 - name: golang.org/x/crypto - version: f6b343c37ca80bfa8ea539da67a0b621f84fab1d + version: 7c6cc321c680f03b9ef0764448e780704f486b51 subpackages: - ssh/terminal - name: golang.org/x/net diff --git a/resources/graphviz.png b/resources/graphviz.png new file mode 100644 index 000000000..6ecf4afa9 Binary files /dev/null and b/resources/graphviz.png differ diff --git a/vendor/github.com/awalterschulze/gographviz/.travis.yml b/vendor/github.com/awalterschulze/gographviz/.travis.yml new file mode 100644 index 000000000..8dfe339cb --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/.travis.yml @@ -0,0 +1,10 @@ +before_install: + - ./install-godeps.sh + +script: + - make travis + +language: go + +go: + - 1.7.1 diff --git a/vendor/github.com/awalterschulze/gographviz/AUTHORS b/vendor/github.com/awalterschulze/gographviz/AUTHORS new file mode 100644 index 000000000..fa0713aa4 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/AUTHORS @@ -0,0 +1,15 @@ +# This is the official list of GoGraphviz authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS file, which +# lists people. For example, employees are listed in CONTRIBUTORS, +# but not in AUTHORS, because the employer holds the copyright. + +# Names should be added to this file as one of +# Organization's name +# Individual's name +# Individual's name + +# Please keep the list sorted. + +Vastech SA (PTY) LTD +Xavier Chassin +Walter Schulze diff --git a/vendor/github.com/awalterschulze/gographviz/CONTRIBUTORS b/vendor/github.com/awalterschulze/gographviz/CONTRIBUTORS new file mode 100644 index 000000000..ba8ecc80c --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/CONTRIBUTORS @@ -0,0 +1,2 @@ +Robin Eklind +Walter Schulze diff --git a/vendor/github.com/awalterschulze/gographviz/LICENSE b/vendor/github.com/awalterschulze/gographviz/LICENSE new file mode 100644 index 000000000..6259ffd56 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/LICENSE @@ -0,0 +1,46 @@ +Copyright 2013 GoGraphviz Authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +------------------------------------------------------------------------------- +Portions of gocc's source code has been derived from Go, and are covered by the +following license: +------------------------------------------------------------------------------- + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/vendor/github.com/awalterschulze/gographviz/Makefile b/vendor/github.com/awalterschulze/gographviz/Makefile new file mode 100644 index 000000000..a94981c2f --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/Makefile @@ -0,0 +1,14 @@ +regenerate: + go install github.com/goccmack/gocc + gocc dot.bnf + find . -type f -name '*.go' | xargs goimports -w + +test: + go test ./... + +travis: + make regenerate + go build ./... + go test ./... + gofmt -l -s -w . + git diff --exit-code diff --git a/vendor/github.com/awalterschulze/gographviz/Readme.md b/vendor/github.com/awalterschulze/gographviz/Readme.md new file mode 100644 index 000000000..809cef335 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/Readme.md @@ -0,0 +1,34 @@ +Parses the Graphviz DOT language and creates an interface, in golang, with which to easily create new and manipulate existing graphs which can be written back to the DOT format. + +This parser has been created using [gocc](http://code.google.com/p/gocc). + +### Example (Parse and Edit) ### + +``` +graphAst, _ := parser.ParseString(`digraph G {}`) +graph := NewGraph() +Analyse(graphAst, graph) +graph.AddNode("G", "a", nil) +graph.AddNode("G", "b", nil) +graph.AddEdge("a", "b", true, nil) +output := graph.String() +``` + +### Documentation ### + +The [godoc](https://godoc.org/github.com/awalterschulze/gographviz) includes some more examples. + +### Installation ### +go get github.com/awalterschulze/gographviz + +### Tests ### + +[![Build Status](https://travis-ci.org/awalterschulze/gographviz.svg?branch=master)](https://travis-ci.org/awalterschulze/gographviz) + +### Users ### + +[aptly](https://github.com/smira/aptly) - Debian repository management tool + +### Mentions ### + +[Using Golang and GraphViz to Visualize Complex Grails Applications](http://ilikeorangutans.github.io/2014/05/03/using-golang-and-graphviz-to-visualize-complex-grails-applications/) diff --git a/vendor/github.com/awalterschulze/gographviz/analyse.go b/vendor/github.com/awalterschulze/gographviz/analyse.go new file mode 100644 index 000000000..b002c4ddd --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/analyse.go @@ -0,0 +1,168 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "github.com/awalterschulze/gographviz/ast" +) + +//Creates a Graph structure by analysing an Abstract Syntax Tree representing a parsed graph. +func NewAnalysedGraph(graph *ast.Graph) *Graph { + g := NewGraph() + Analyse(graph, g) + return g +} + +//Analyses an Abstract Syntax Tree representing a parsed graph into a newly created graph structure Interface. +func Analyse(graph *ast.Graph, g Interface) { + graph.Walk(&graphVisitor{g}) +} + +type nilVisitor struct { +} + +func (this *nilVisitor) Visit(v ast.Elem) ast.Visitor { + return this +} + +type graphVisitor struct { + g Interface +} + +func (this *graphVisitor) Visit(v ast.Elem) ast.Visitor { + graph, ok := v.(*ast.Graph) + if !ok { + return this + } + this.g.SetStrict(graph.Strict) + this.g.SetDir(graph.Type == ast.DIGRAPH) + graphName := graph.Id.String() + this.g.SetName(graphName) + return newStmtVisitor(this.g, graphName) +} + +func newStmtVisitor(g Interface, graphName string) *stmtVisitor { + return &stmtVisitor{g, graphName, make(Attrs), make(Attrs), make(Attrs)} +} + +type stmtVisitor struct { + g Interface + graphName string + currentNodeAttrs Attrs + currentEdgeAttrs Attrs + currentGraphAttrs Attrs +} + +func (this *stmtVisitor) Visit(v ast.Elem) ast.Visitor { + switch s := v.(type) { + case ast.NodeStmt: + return this.nodeStmt(s) + case ast.EdgeStmt: + return this.edgeStmt(s) + case ast.NodeAttrs: + return this.nodeAttrs(s) + case ast.EdgeAttrs: + return this.edgeAttrs(s) + case ast.GraphAttrs: + return this.graphAttrs(s) + case *ast.SubGraph: + return this.subGraph(s) + case *ast.Attr: + return this.attr(s) + case ast.AttrList: + return &nilVisitor{} + default: + //fmt.Fprintf(os.Stderr, "unknown stmt %T\n", v) + } + return this +} + +func ammend(attrs Attrs, add Attrs) Attrs { + for key, value := range add { + if _, ok := attrs[key]; !ok { + attrs[key] = value + } + } + return attrs +} + +func overwrite(attrs Attrs, overwrite Attrs) Attrs { + for key, value := range overwrite { + attrs[key] = value + } + return attrs +} + +func (this *stmtVisitor) nodeStmt(stmt ast.NodeStmt) ast.Visitor { + attrs := Attrs(stmt.Attrs.GetMap()) + attrs = ammend(attrs, this.currentNodeAttrs) + this.g.AddNode(this.graphName, stmt.NodeId.String(), attrs) + return &nilVisitor{} +} + +func (this *stmtVisitor) edgeStmt(stmt ast.EdgeStmt) ast.Visitor { + attrs := stmt.Attrs.GetMap() + attrs = ammend(attrs, this.currentEdgeAttrs) + src := stmt.Source.GetId() + srcName := src.String() + if stmt.Source.IsNode() { + this.g.AddNode(this.graphName, srcName, this.currentNodeAttrs.Copy()) + } + srcPort := stmt.Source.GetPort() + for i := range stmt.EdgeRHS { + directed := bool(stmt.EdgeRHS[i].Op) + dst := stmt.EdgeRHS[i].Destination.GetId() + dstName := dst.String() + if stmt.EdgeRHS[i].Destination.IsNode() { + this.g.AddNode(this.graphName, dstName, this.currentNodeAttrs.Copy()) + } + dstPort := stmt.EdgeRHS[i].Destination.GetPort() + this.g.AddPortEdge(srcName, srcPort.String(), dstName, dstPort.String(), directed, attrs) + src = dst + srcPort = dstPort + srcName = dstName + } + return this +} + +func (this *stmtVisitor) nodeAttrs(stmt ast.NodeAttrs) ast.Visitor { + this.currentNodeAttrs = overwrite(this.currentNodeAttrs, ast.AttrList(stmt).GetMap()) + return &nilVisitor{} +} + +func (this *stmtVisitor) edgeAttrs(stmt ast.EdgeAttrs) ast.Visitor { + this.currentEdgeAttrs = overwrite(this.currentEdgeAttrs, ast.AttrList(stmt).GetMap()) + return &nilVisitor{} +} + +func (this *stmtVisitor) graphAttrs(stmt ast.GraphAttrs) ast.Visitor { + attrs := ast.AttrList(stmt).GetMap() + for key, value := range attrs { + this.g.AddAttr(this.graphName, key, value) + } + this.currentGraphAttrs = overwrite(this.currentGraphAttrs, attrs) + return &nilVisitor{} +} + +func (this *stmtVisitor) subGraph(stmt *ast.SubGraph) ast.Visitor { + subGraphName := stmt.Id.String() + this.g.AddSubGraph(this.graphName, subGraphName, this.currentGraphAttrs) + return newStmtVisitor(this.g, subGraphName) +} + +func (this *stmtVisitor) attr(stmt *ast.Attr) ast.Visitor { + this.g.AddAttr(this.graphName, stmt.Field.String(), stmt.Value.String()) + return this +} diff --git a/vendor/github.com/awalterschulze/gographviz/analysewrite_test.go b/vendor/github.com/awalterschulze/gographviz/analysewrite_test.go new file mode 100644 index 000000000..3d0827bdd --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/analysewrite_test.go @@ -0,0 +1,319 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "fmt" + "io/ioutil" + "os" + "testing" + + "github.com/awalterschulze/gographviz/parser" +) + +func (this *Nodes) String() string { + s := "Nodes:" + for i := range this.Nodes { + s += fmt.Sprintf("Node{%v}", this.Nodes[i]) + } + return s + "\n" +} + +func (this *Edges) String() string { + s := "Edges:" + for i := range this.Edges { + s += fmt.Sprintf("Edge{%v}", this.Edges[i]) + } + return s + "\n" +} + +func check(t *testing.T, err error) { + if err != nil { + t.Fatalf("%v", err) + } +} + +func assert(t *testing.T, msg string, v1 interface{}, v2 interface{}) { + if v1 != v2 { + t.Fatalf("%v %v != %v", msg, v1, v2) + } +} + +func anal(t *testing.T, input string) Interface { + t.Logf("Input: %v\n", input) + g, err := parser.ParseString(input) + check(t, err) + t.Logf("Parsed: %v\n", g) + ag := NewGraph() + Analyse(g, ag) + t.Logf("Analysed: %v\n", ag) + agstr := ag.String() + t.Logf("Written: %v\n", agstr) + g2, err := parser.ParseString(agstr) + check(t, err) + t.Logf("Parsed %v\n", g2) + ag2 := NewEscape() + Analyse(g2, ag2) + t.Logf("Analysed %v\n", ag2) + ag2str := ag2.String() + t.Logf("Written: %v\n", ag2str) + assert(t, "analysed", agstr, ag2str) + return ag2 +} + +func analfile(t *testing.T, filename string) Interface { + f, err := os.Open(filename) + check(t, err) + all, err := ioutil.ReadAll(f) + check(t, err) + return anal(t, string(all)) +} + +func analtest(t *testing.T, testname string) Interface { + return analfile(t, "./testdata/"+testname) +} + +func TestHelloWorldString(t *testing.T) { + input := `digraph G {Hello->World}` + anal(t, input) +} + +func TestHelloWorldFile(t *testing.T) { + analfile(t, "./testdata/helloworld.gv.txt") +} + +func TestAttr(t *testing.T) { + anal(t, + "digraph finite_state { rankdir = LR }") +} + +func TestString(t *testing.T) { + anal(t, + `digraph finite_state { rankdir = "LR" }`) +} + +func TestAttrList(t *testing.T) { + anal(t, ` +digraph { node [ shape = doublecircle ] }`) +} + +func TestStringLit(t *testing.T) { + anal(t, `digraph finite_state_machine { + size= "8" ; }`) +} + +func TestHashComments(t *testing.T) { + anal(t, `## bla \n + digraph G {Hello->World}`) +} + +func TestIntLit(t *testing.T) { + anal(t, `graph G { + 1 -- 30 [f=1];}`) +} + +func TestFloat1(t *testing.T) { + anal(t, `digraph { bla = 2.0 }`) +} + +func TestFloat2(t *testing.T) { + anal(t, `digraph { bla = .1 }`) +} + +func TestNegative(t *testing.T) { + anal(t, `digraph { -2 -> -1 }`) +} + +func TestUnderscore(t *testing.T) { + anal(t, `digraph { a_b = 1 }`) +} + +func TestNonAscii(t *testing.T) { + anal(t, `digraph { label=Tóth }`) +} + +func TestPorts(t *testing.T) { + anal(t, `digraph { "node6":f0 -> "node9":f1 }`) +} + +func TestHtml(t *testing.T) { + anal(t, `digraph { a = <
> }`) +} + +func TestIdWithKeyword(t *testing.T) { + anal(t, `digraph { edgeURL = "a" }`) +} + +func TestSubGraph(t *testing.T) { + anal(t, `digraph { subgraph { a -> b } }`) +} + +func TestImplicitSubGraph(t *testing.T) { + anal(t, `digraph { { a -> b } }`) +} + +func TestEdges(t *testing.T) { + anal(t, `digraph { a0 -> a1 -> a2 -> a3 }`) +} + +func TestEasyFsm1(t *testing.T) { + anal(t, `digraph finite_state_machine { + rankdir=LR; + size="8,5"; + node [shape = circle]; + LR_0 -> LR_2 [ label = "SS(B)" ]; + LR_0 -> LR_1 [ label = "SS(S)" ]; + LR_1 -> LR_3 [ label = "S($end)" ]; + LR_2 -> LR_6 [ label = "SS(b)" ]; + LR_2 -> LR_5 [ label = "SS(a)" ]; + LR_2 -> LR_4 [ label = "S(A)" ]; + LR_5 -> LR_7 [ label = "S(b)" ]; + LR_5 -> LR_5 [ label = "S(a)" ]; + LR_6 -> LR_6 [ label = "S(b)" ]; + LR_6 -> LR_5 [ label = "S(a)" ]; + LR_7 -> LR_8 [ label = "S(b)" ]; + LR_7 -> LR_5 [ label = "S(a)" ]; + LR_8 -> LR_6 [ label = "S(b)" ]; + LR_8 -> LR_5 [ label = "S(a)" ]; +}`) +} + +//node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8; should be applied to the nodes +func TestEasyFsm2(t *testing.T) { + anal(t, `digraph finite_state_machine { + rankdir=LR; + size="8,5"; + node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8; + node [shape = circle]; + LR_0 -> LR_2 [ label = "SS(B)" ]; + LR_0 -> LR_1 [ label = "SS(S)" ]; + LR_1 -> LR_3 [ label = "S($end)" ]; + LR_2 -> LR_6 [ label = "SS(b)" ]; + LR_2 -> LR_5 [ label = "SS(a)" ]; + LR_2 -> LR_4 [ label = "S(A)" ]; + LR_5 -> LR_7 [ label = "S(b)" ]; + LR_5 -> LR_5 [ label = "S(a)" ]; + LR_6 -> LR_6 [ label = "S(b)" ]; + LR_6 -> LR_5 [ label = "S(a)" ]; + LR_7 -> LR_8 [ label = "S(b)" ]; + LR_7 -> LR_5 [ label = "S(a)" ]; + LR_8 -> LR_6 [ label = "S(b)" ]; + LR_8 -> LR_5 [ label = "S(a)" ]; +}`) +} + +func TestEmptyAttrList(t *testing.T) { + anal(t, `digraph g { edge [ ] }`) +} + +func TestHelloWorld(t *testing.T) { + analtest(t, "helloworld.gv.txt") +} + +func TestCluster(t *testing.T) { + analtest(t, "cluster.gv.txt") +} + +func TestPsg(t *testing.T) { + analtest(t, "psg.gv.txt") +} + +func TestTransparency(t *testing.T) { + analtest(t, "transparency.gv.txt") +} + +func TestCrazy(t *testing.T) { + analtest(t, "crazy.gv.txt") +} + +func TestKennedyanc(t *testing.T) { + analtest(t, "kennedyanc.gv.txt") +} + +func TestRoot(t *testing.T) { + analtest(t, "root.gv.txt") +} + +func TestTwpoi(t *testing.T) { + analtest(t, "twopi.gv.txt") +} + +func TestDataStruct(t *testing.T) { + analtest(t, "datastruct.gv.txt") +} + +func TestLionShare(t *testing.T) { + analtest(t, "lion_share.gv.txt") +} + +func TestSdh(t *testing.T) { + analtest(t, "sdh.gv.txt") +} + +func TestUnix(t *testing.T) { + analtest(t, "unix.gv.txt") +} + +func TestEr(t *testing.T) { + analtest(t, "er.gv.txt") +} + +func TestNerworkMapTwopi(t *testing.T) { + analtest(t, "networkmap_twopi.gv.txt") +} + +func TestSibling(t *testing.T) { + analtest(t, "siblings.gv.txt") +} + +func TestWorld(t *testing.T) { + analtest(t, "world.gv.txt") +} + +func TestFdpclust(t *testing.T) { + analtest(t, "fdpclust.gv.txt") +} + +func TestPhilo(t *testing.T) { + analtest(t, "philo.gv.txt") +} + +func TestSoftmaint(t *testing.T) { + analtest(t, "softmaint.gv.txt") +} + +func TestFsm(t *testing.T) { + analtest(t, "fsm.gv.txt") +} + +func TestProcess(t *testing.T) { + analtest(t, "process.gv.txt") +} + +func TestSwitchGv(t *testing.T) { + analtest(t, "switch.gv.txt") +} + +func TestGd19942007(t *testing.T) { + analtest(t, "gd_1994_2007.gv.txt") +} + +func TestProfile(t *testing.T) { + analtest(t, "profile.gv.txt") +} + +func TestTrafficLights(t *testing.T) { + analtest(t, "traffic_lights.gv.txt") +} diff --git a/vendor/github.com/awalterschulze/gographviz/ast/ast.go b/vendor/github.com/awalterschulze/gographviz/ast/ast.go new file mode 100644 index 000000000..735cdaf7a --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/ast/ast.go @@ -0,0 +1,693 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +//Abstract Syntax Tree representing the DOT grammar +package ast + +import ( + "errors" + "fmt" + "math/rand" + "sort" + "strings" + + "github.com/awalterschulze/gographviz/token" +) + +var ( + r = rand.New(rand.NewSource(1234)) +) + +type Visitor interface { + Visit(e Elem) Visitor +} + +type Elem interface { + String() string +} + +type Walkable interface { + Walk(v Visitor) +} + +type Attrib interface{} + +type Bool bool + +const ( + FALSE = Bool(false) + TRUE = Bool(true) +) + +func (this Bool) String() string { + switch this { + case false: + return "false" + case true: + return "true" + } + panic("unreachable") +} + +func (this Bool) Walk(v Visitor) { + if v == nil { + return + } + v.Visit(this) +} + +type GraphType bool + +const ( + GRAPH = GraphType(false) + DIGRAPH = GraphType(true) +) + +func (this GraphType) String() string { + switch this { + case false: + return "graph" + case true: + return "digraph" + } + panic("unreachable") +} + +func (this GraphType) Walk(v Visitor) { + if v == nil { + return + } + v.Visit(this) +} + +type Graph struct { + Type GraphType + Strict bool + Id Id + StmtList StmtList +} + +func NewGraph(t, strict, id, l Attrib) (*Graph, error) { + g := &Graph{Type: t.(GraphType), Strict: bool(strict.(Bool)), Id: Id("")} + if id != nil { + g.Id = id.(Id) + } + if l != nil { + g.StmtList = l.(StmtList) + } + return g, nil +} + +func (this *Graph) String() string { + s := this.Type.String() + " " + this.Id.String() + " {\n" + if this.StmtList != nil { + s += this.StmtList.String() + } + s += "\n}\n" + return s +} + +func (this *Graph) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Type.Walk(v) + this.Id.Walk(v) + this.StmtList.Walk(v) +} + +type StmtList []Stmt + +func NewStmtList(s Attrib) (StmtList, error) { + ss := make(StmtList, 1) + ss[0] = s.(Stmt) + return ss, nil +} + +func AppendStmtList(ss, s Attrib) (StmtList, error) { + this := ss.(StmtList) + this = append(this, s.(Stmt)) + return this, nil +} + +func (this StmtList) String() string { + if len(this) == 0 { + return "" + } + s := "" + for i := 0; i < len(this); i++ { + ss := this[i].String() + if len(ss) > 0 { + s += "\t" + ss + ";\n" + } + } + return s +} + +func (this StmtList) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type Stmt interface { + Elem + Walkable + isStmt() +} + +func (this NodeStmt) isStmt() {} +func (this EdgeStmt) isStmt() {} +func (this EdgeAttrs) isStmt() {} +func (this NodeAttrs) isStmt() {} +func (this GraphAttrs) isStmt() {} +func (this *SubGraph) isStmt() {} +func (this *Attr) isStmt() {} + +type SubGraph struct { + Id Id + StmtList StmtList +} + +func NewSubGraph(id, l Attrib) (*SubGraph, error) { + g := &SubGraph{Id: Id(fmt.Sprintf("anon%d", r.Int63()))} + if id != nil { + if len(id.(Id)) > 0 { + g.Id = id.(Id) + } + } + if l != nil { + g.StmtList = l.(StmtList) + } + return g, nil +} + +func (this *SubGraph) GetId() Id { + return this.Id +} + +func (this *SubGraph) GetPort() Port { + port, err := NewPort(nil, nil) + if err != nil { + panic(err) + } + return port +} + +func (this *SubGraph) String() string { + gName := this.Id.String() + if strings.HasPrefix(gName, "anon") { + gName = "" + } + s := "subgraph " + this.Id.String() + " {\n" + if this.StmtList != nil { + s += this.StmtList.String() + } + s += "\n}\n" + return s +} + +func (this *SubGraph) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Id.Walk(v) + this.StmtList.Walk(v) +} + +type EdgeAttrs AttrList + +func NewEdgeAttrs(a Attrib) (EdgeAttrs, error) { + return EdgeAttrs(a.(AttrList)), nil +} + +func (this EdgeAttrs) String() string { + s := AttrList(this).String() + if len(s) == 0 { + return "" + } + return `edge ` + s +} + +func (this EdgeAttrs) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type NodeAttrs AttrList + +func NewNodeAttrs(a Attrib) (NodeAttrs, error) { + return NodeAttrs(a.(AttrList)), nil +} + +func (this NodeAttrs) String() string { + s := AttrList(this).String() + if len(s) == 0 { + return "" + } + return `node ` + s +} + +func (this NodeAttrs) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type GraphAttrs AttrList + +func NewGraphAttrs(a Attrib) (GraphAttrs, error) { + return GraphAttrs(a.(AttrList)), nil +} + +func (this GraphAttrs) String() string { + s := AttrList(this).String() + if len(s) == 0 { + return "" + } + return `graph ` + s +} + +func (this GraphAttrs) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type AttrList []AList + +func NewAttrList(a Attrib) (AttrList, error) { + as := make(AttrList, 0) + if a != nil { + as = append(as, a.(AList)) + } + return as, nil +} + +func AppendAttrList(as, a Attrib) (AttrList, error) { + this := as.(AttrList) + if a == nil { + return this, nil + } + this = append(this, a.(AList)) + return this, nil +} + +func (this AttrList) String() string { + s := "" + for _, alist := range this { + ss := alist.String() + if len(ss) > 0 { + s += "[ " + ss + " ] " + } + } + if len(s) == 0 { + return "" + } + return s +} + +func (this AttrList) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +func PutMap(attrmap map[string]string) AttrList { + attrlist := make(AttrList, 1) + attrlist[0] = make(AList, 0) + keys := make([]string, 0, len(attrmap)) + for key := range attrmap { + keys = append(keys, key) + } + sort.Strings(keys) + for _, name := range keys { + value := attrmap[name] + attrlist[0] = append(attrlist[0], &Attr{Id(name), Id(value)}) + } + return attrlist +} + +func (this AttrList) GetMap() map[string]string { + attrs := make(map[string]string) + for _, alist := range this { + for _, attr := range alist { + attrs[attr.Field.String()] = attr.Value.String() + } + } + return attrs +} + +type AList []*Attr + +func NewAList(a Attrib) (AList, error) { + as := make(AList, 1) + as[0] = a.(*Attr) + return as, nil +} + +func AppendAList(as, a Attrib) (AList, error) { + this := as.(AList) + attr := a.(*Attr) + this = append(this, attr) + return this, nil +} + +func (this AList) String() string { + if len(this) == 0 { + return "" + } + str := this[0].String() + for i := 1; i < len(this); i++ { + str += `, ` + this[i].String() + } + return str +} + +func (this AList) Walk(v Visitor) { + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type Attr struct { + Field Id + Value Id +} + +func NewAttr(f, v Attrib) (*Attr, error) { + a := &Attr{Field: f.(Id)} + a.Value = Id("true") + if v != nil { + ok := false + a.Value, ok = v.(Id) + if !ok { + return nil, errors.New(fmt.Sprintf("value = %v", v)) + } + } + return a, nil +} + +func (this *Attr) String() string { + return this.Field.String() + `=` + this.Value.String() +} + +func (this *Attr) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Field.Walk(v) + this.Value.Walk(v) +} + +type Location interface { + Elem + Walkable + isLocation() + GetId() Id + GetPort() Port + IsNode() bool +} + +func (this *NodeId) isLocation() {} +func (this *NodeId) IsNode() bool { return true } +func (this *SubGraph) isLocation() {} +func (this *SubGraph) IsNode() bool { return false } + +type EdgeStmt struct { + Source Location + EdgeRHS EdgeRHS + Attrs AttrList +} + +func NewEdgeStmt(id, e, attrs Attrib) (*EdgeStmt, error) { + var a AttrList = nil + var err error = nil + if attrs == nil { + a, err = NewAttrList(nil) + if err != nil { + return nil, err + } + } else { + a = attrs.(AttrList) + } + return &EdgeStmt{id.(Location), e.(EdgeRHS), a}, nil +} + +func (this EdgeStmt) String() string { + return strings.TrimSpace(this.Source.String() + this.EdgeRHS.String() + this.Attrs.String()) +} + +func (this EdgeStmt) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Source.Walk(v) + this.EdgeRHS.Walk(v) + this.Attrs.Walk(v) +} + +type EdgeRHS []*EdgeRH + +func NewEdgeRHS(op, id Attrib) (EdgeRHS, error) { + return EdgeRHS{&EdgeRH{op.(EdgeOp), id.(Location)}}, nil +} + +func AppendEdgeRHS(e, op, id Attrib) (EdgeRHS, error) { + erhs := e.(EdgeRHS) + erhs = append(erhs, &EdgeRH{op.(EdgeOp), id.(Location)}) + return erhs, nil +} + +func (this EdgeRHS) String() string { + s := "" + for i := range this { + s += this[i].String() + } + return strings.TrimSpace(s) +} + +func (this EdgeRHS) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + for i := range this { + this[i].Walk(v) + } +} + +type EdgeRH struct { + Op EdgeOp + Destination Location +} + +func (this *EdgeRH) String() string { + return strings.TrimSpace(this.Op.String() + this.Destination.String()) +} + +func (this *EdgeRH) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Op.Walk(v) + this.Destination.Walk(v) +} + +type NodeStmt struct { + NodeId *NodeId + Attrs AttrList +} + +func NewNodeStmt(id, attrs Attrib) (*NodeStmt, error) { + nid := id.(*NodeId) + var a AttrList = nil + var err error = nil + if attrs == nil { + a, err = NewAttrList(nil) + if err != nil { + return nil, err + } + } else { + a = attrs.(AttrList) + } + return &NodeStmt{nid, a}, nil +} + +func (this NodeStmt) String() string { + return strings.TrimSpace(this.NodeId.String() + ` ` + this.Attrs.String()) +} + +func (this NodeStmt) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.NodeId.Walk(v) + this.Attrs.Walk(v) +} + +type EdgeOp bool + +const ( + DIRECTED EdgeOp = true + UNDIRECTED EdgeOp = false +) + +func (this EdgeOp) String() string { + switch this { + case DIRECTED: + return "->" + case UNDIRECTED: + return "--" + } + panic("unreachable") +} + +func (this EdgeOp) Walk(v Visitor) { + if v == nil { + return + } + v.Visit(this) +} + +type NodeId struct { + Id Id + Port Port +} + +func NewNodeId(id, port Attrib) (*NodeId, error) { + if port == nil { + return &NodeId{id.(Id), Port{"", ""}}, nil + } + return &NodeId{id.(Id), port.(Port)}, nil +} + +func MakeNodeId(id string, port string) *NodeId { + p := Port{"", ""} + if len(port) > 0 { + ps := strings.Split(port, ":") + p.Id1 = Id(ps[1]) + if len(ps) > 2 { + p.Id2 = Id(ps[2]) + } + } + return &NodeId{Id(id), p} +} + +func (this *NodeId) String() string { + return this.Id.String() + this.Port.String() +} + +func (this *NodeId) GetId() Id { + return this.Id +} + +func (this *NodeId) GetPort() Port { + return this.Port +} + +func (this *NodeId) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Id.Walk(v) + this.Port.Walk(v) +} + +//TODO semantic analysis should decide which Id is an Id and which is a Compass Point +type Port struct { + Id1 Id + Id2 Id +} + +func NewPort(id1, id2 Attrib) (Port, error) { + port := Port{Id(""), Id("")} + if id1 != nil { + port.Id1 = id1.(Id) + } + if id2 != nil { + port.Id2 = id2.(Id) + } + return port, nil +} + +func (this Port) String() string { + if len(this.Id1) == 0 { + return "" + } + s := ":" + this.Id1.String() + if len(this.Id2) > 0 { + s += ":" + this.Id2.String() + } + return s +} + +func (this Port) Walk(v Visitor) { + if v == nil { + return + } + v = v.Visit(this) + this.Id1.Walk(v) + this.Id2.Walk(v) +} + +type Id string + +func NewId(id Attrib) (Id, error) { + if id == nil { + return Id(""), nil + } + id_lit := string(id.(*token.Token).Lit) + return Id(id_lit), nil +} + +func (this Id) String() string { + return string(this) +} + +func (this Id) Walk(v Visitor) { + if v == nil { + return + } + v.Visit(this) +} diff --git a/vendor/github.com/awalterschulze/gographviz/attrs.go b/vendor/github.com/awalterschulze/gographviz/attrs.go new file mode 100644 index 000000000..9aa7b99a2 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/attrs.go @@ -0,0 +1,71 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "fmt" + "os" + "sort" +) + +//Represents attributes for an Edge, Node or Graph. +type Attrs map[string]string + +//Creates an empty Attributes type. +func NewAttrs() Attrs { + return make(Attrs) +} + +//Adds an attribute name and value. +func (this Attrs) Add(field string, value string) { + prev, ok := this[field] + if ok { + fmt.Fprintf(os.Stderr, "WARNING: overwriting field %v value %v, with value %v\n", field, prev, value) + } + this[field] = value +} + +//Adds the attributes into this Attrs type overwriting duplicates. +func (this Attrs) Extend(more Attrs) { + for key, value := range more { + this.Add(key, value) + } +} + +//Only adds the missing attributes to this Attrs type. +func (this Attrs) Ammend(more Attrs) { + for key, value := range more { + if _, ok := this[key]; !ok { + this.Add(key, value) + } + } +} + +func (this Attrs) SortedNames() []string { + keys := make([]string, 0) + for key := range this { + keys = append(keys, key) + } + sort.Strings(keys) + return keys +} + +func (this Attrs) Copy() Attrs { + attrs := make(Attrs) + for k, v := range this { + attrs[k] = v + } + return attrs +} diff --git a/vendor/github.com/awalterschulze/gographviz/bug_test.go b/vendor/github.com/awalterschulze/gographviz/bug_test.go new file mode 100644 index 000000000..ceabe7e10 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/bug_test.go @@ -0,0 +1,43 @@ +package gographviz + +import ( + "testing" + + "github.com/awalterschulze/gographviz/ast" + "github.com/awalterschulze/gographviz/parser" +) + +type bugSubGraphWorldVisitor struct { + t *testing.T + found bool +} + +func (this *bugSubGraphWorldVisitor) Visit(v ast.Elem) ast.Visitor { + edge, ok := v.(ast.EdgeStmt) + if !ok { + return this + } + if edge.Source.GetId().String() != "2" { + return this + } + dst := edge.EdgeRHS[0].Destination + if _, ok := dst.(*ast.SubGraph); !ok { + this.t.Fatalf("2 -> Not SubGraph") + } else { + this.found = true + } + return this +} + +func TestBugSubGraphWorld(t *testing.T) { + g := analtest(t, "world.gv.txt") + st, err := parser.ParseString(g.String()) + check(t, err) + s := &bugSubGraphWorldVisitor{ + t: t, + } + st.Walk(s) + if !s.found { + t.Fatalf("2 -> SubGraph not found") + } +} diff --git a/vendor/github.com/awalterschulze/gographviz/dot.bnf b/vendor/github.com/awalterschulze/gographviz/dot.bnf new file mode 100644 index 000000000..6b1ba0a9f --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/dot.bnf @@ -0,0 +1,318 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +//This bnf has been derived from http://www.graphviz.org/content/dot-language +//The rules have been copied and are shown in the comments, with their derived bnf rules below. + +// ### [ Tokens ] ############################################################## + +// The keywords node, edge, graph, digraph, subgraph, and strict are case- +// independent. + +node + : 'n' 'o' 'd' 'e' + | 'N' 'o' 'd' 'e' + | 'N' 'O' 'D' 'E' +; + +edge + : 'e' 'd' 'g' 'e' + | 'E' 'd' 'g' 'e' + | 'E' 'D' 'G' 'E' +; + +// TODO: Rename graphx to graph once gocc#20 is fixed [1]. +// +// [1]: https://github.com/goccmack/gocc/issues/20 + +graphx + : 'g' 'r' 'a' 'p' 'h' + | 'G' 'r' 'a' 'p' 'h' + | 'G' 'R' 'A' 'P' 'H' +; + +digraph + : 'd' 'i' 'g' 'r' 'a' 'p' 'h' + | 'D' 'i' 'g' 'r' 'a' 'p' 'h' + | 'd' 'i' 'G' 'r' 'a' 'p' 'h' + | 'D' 'i' 'G' 'r' 'a' 'p' 'h' + | 'D' 'I' 'G' 'R' 'A' 'P' 'H' +; + +subgraph + : 's' 'u' 'b' 'g' 'r' 'a' 'p' 'h' + | 'S' 'u' 'b' 'g' 'r' 'a' 'p' 'h' + | 's' 'u' 'b' 'G' 'r' 'a' 'p' 'h' + | 'S' 'u' 'b' 'G' 'r' 'a' 'p' 'h' + | 'S' 'U' 'B' 'G' 'R' 'A' 'P' 'H' +; + +strict + : 's' 't' 'r' 'i' 'c' 't' + | 'S' 't' 'r' 'i' 'c' 't' + | 'S' 'T' 'R' 'I' 'C' 'T' +; + +// An arbitrary ASCII character except null (0x00), double quote (0x22) and +// backslash (0x5C). +_ascii_char + // skip null (0x00) + : '\x01' - '\x21' + // skip double quote (0x22) + | '\x23' - '\x5B' + // skip backslash (0x5C) + | '\x5D' - '\x7F' +; + +_ascii_letter + : 'a' - 'z' + | 'A' - 'Z' +; + +_ascii_digit : '0' - '9' ; + +_unicode_char + : _ascii_char + | _unicode_byte +; + +_unicode_byte + : '\u0080' - '\uFFFC' + // skip invalid code point (\uFFFD) + | '\uFFFE' - '\U0010FFFF' +; + +_letter : _ascii_letter | _unicode_byte | '_' ; +_decimal_digit : _ascii_digit ; +_decimals : _decimal_digit { _decimal_digit } ; + +// An ID is one of the following: +// +// 1) Any string of alphabetic ([a-zA-Z\200-\377]) characters, underscores +// ('_') or digits ([0-9]), not beginning with a digit; +// +// 2) a numeral [-]?(.[0-9]+ | [0-9]+(.[0-9]*)? ); +// +// 3) any double-quoted string ("...") possibly containing escaped quotes +// (\"); +// +// 4) an HTML string (<...>). + +id + : _letter { _letter | _decimal_digit } + | _int_lit + | _string_lit + | _html_lit +; + +_int_lit + : [ '-' ] '.' _decimals + | [ '-' ] _decimals [ '.' { _decimal_digit } ] +; + +// In quoted strings in DOT, the only escaped character is double-quote ("). +// That is, in quoted strings, the dyad \" is converted to "; all other +// characters are left unchanged. In particular, \\ remains \\. + +// As another aid for readability, dot allows double-quoted strings to span +// multiple physical lines using the standard C convention of a backslash +// immediately preceding a newline character. + +// In addition, double-quoted strings can be concatenated using a '+' operator. + +_escaped_char : '\\' ( _unicode_char | '"' | '\\' ) ; +_char : _unicode_char | _escaped_char ; +_string_lit : '"' { _char } '"' ; + +// An arbitrary HTML character except null (0x00), left angle bracket (0x3C) and +// right angle bracket (0x3E). +_html_char + // skip null (0x00) + : '\x01' - '\x3B' + // skip left angle bracket (0x3C) + | '\x3D' + // skip right angle bracket (0x3E) + | '\x3F' - '\xFF' +; + +_html_chars : { _html_char } ; +_html_tag : '<' _html_chars '>' ; +_html_lit : '<' { _html_chars | _html_tag } '>' ; + +// The language supports C++-style comments: /* */ and //. In addition, a line +// beginning with a '#' character is considered a line output from a C +// preprocessor (e.g., # 34 to indicate line 34 ) and discarded. + +_line_comment + : '/' '/' { . } '\n' + | '#' { . } '\n' +; + +_block_comment : '/' '*' { . | '*' } '*' '/' ; +!comment : _line_comment | _block_comment ; + +!whitespace : ' ' | '\t' | '\r' | '\n' ; + +// ### [ Syntax ] ############################################################## + +<< import "github.com/awalterschulze/gographviz/ast" >> + +//graph : [ strict ] (graph | digraph) [ ID ] '{' stmt_list '}' +DotGraph + : graphx "{" "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, nil, nil) >> + | strict graphx "{" "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, nil, nil) >> + | graphx Id "{" "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, $1, nil) >> + | strict graphx Id "{" "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, $2, nil) >> + | graphx "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, nil, $2) >> + | graphx Id "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, $1, $3) >> + | strict graphx "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, nil, $3) >> + | strict graphx Id "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, $2, $4) >> + | digraph "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, nil, nil) >> + | strict digraph "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, nil, nil) >> + | digraph Id "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, $1, nil) >> + | strict digraph Id "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, $2, nil) >> + | digraph "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, nil, $2) >> + | digraph Id "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, $1, $3) >> + | strict digraph "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, nil, $3) >> + | strict digraph Id "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, $2, $4) >> + ; + +//stmt_list : [ stmt [ ';' ] [ stmt_list ] ] +StmtList + : Stmt1 << ast.NewStmtList($0) >> + | StmtList Stmt1 << ast.AppendStmtList($0, $1) >> + ; + +Stmt1 + : Stmt << $0, nil >> + | Stmt ";" << $0, nil >> + ; + +//stmt : node_stmt | edge_stmt | attr_stmt | (ID '=' ID) | subgraph +Stmt + : Id "=" Id << ast.NewAttr($0, $2) >> + | NodeStmt << $0, nil >> + | EdgeStmt << $0, nil >> + | AttrStmt << $0, nil >> + | SubGraphStmt << $0, nil >> + ; + +//attr_stmt : (graph | node | edge) attr_list +AttrStmt + : graphx AttrList << ast.NewGraphAttrs($1) >> + | node AttrList << ast.NewNodeAttrs($1) >> + | edge AttrList << ast.NewEdgeAttrs($1) >> + ; + +//attr_list : '[' [ a_list ] ']' [ attr_list ] +AttrList + : "[" "]" << ast.NewAttrList(nil) >> + | "[" AList "]" << ast.NewAttrList($1) >> + | AttrList "[" "]" << ast.AppendAttrList($0, nil) >> + | AttrList "[" AList "]" << ast.AppendAttrList($0, $2) >> + ; + +//a_list : ID [ '=' ID ] [ ',' ] [ a_list ] +AList + : Attr << ast.NewAList($0) >> + | AList Attr << ast.AppendAList($0, $1) >> + | AList "," Attr << ast.AppendAList($0, $2) >> + ; + +//An a_list clause of the form ID is equivalent to ID=true. +Attr + : Id << ast.NewAttr($0, nil) >> + | Id "=" Id << ast.NewAttr($0, $2) >> + ; + +//edge_stmt : (node_id | subgraph) edgeRHS [ attr_list ] +EdgeStmt + : NodeId EdgeRHS << ast.NewEdgeStmt($0, $1, nil) >> + | NodeId EdgeRHS AttrList << ast.NewEdgeStmt($0, $1, $2) >> + | SubGraphStmt EdgeRHS << ast.NewEdgeStmt($0, $1, nil) >> + | SubGraphStmt EdgeRHS AttrList << ast.NewEdgeStmt($0, $1, $2) >> + ; + +//edgeRHS : edgeop (node_id | subgraph) [ edgeRHS ] +EdgeRHS + : EdgeOp NodeId << ast.NewEdgeRHS($0, $1) >> + | EdgeOp SubGraphStmt << ast.NewEdgeRHS($0, $1) >> + | EdgeRHS EdgeOp NodeId << ast.AppendEdgeRHS($0, $1, $2) >> + | EdgeRHS EdgeOp SubGraphStmt << ast.AppendEdgeRHS($0, $1, $2) >> + ; + +//node_stmt : node_id [ attr_list ] +NodeStmt + : NodeId << ast.NewNodeStmt($0, nil) >> + | NodeId AttrList << ast.NewNodeStmt($0, $1) >> + ; + +//node_id : ID [ port ] +NodeId + : Id << ast.NewNodeId($0, nil) >> + | Id Port << ast.NewNodeId($0, $1) >> + ; + +//compass_pt : (n | ne | e | se | s | sw | w | nw | c | _) +//Note also that the allowed compass point values are not keywords, +//so these strings can be used elsewhere as ordinary identifiers and, +//conversely, the parser will actually accept any identifier. +//port : ':' ID [ ':' compass_pt ] +// | ':' compass_pt +Port + : ":" Id << ast.NewPort($1, nil) >> + | ":" Id ":" Id << ast.NewPort($1, $3) >> + ; + +//subgraph : [ subgraph [ ID ] ] '{' stmt_list '}' +SubGraphStmt + : "{" StmtList "}" << ast.NewSubGraph(nil, $1) >> + | subgraph "{" StmtList "}" << ast.NewSubGraph(nil, $2) >> + | subgraph Id "{" StmtList "}" << ast.NewSubGraph($1, $3) >> + ; + +//An edgeop is -> in directed graphs and -- in undirected graphs. +EdgeOp + : "->" << ast.DIRECTED, nil >> + | "--" << ast.UNDIRECTED, nil >> + ; + +// An ID is one of the following: +// Any string of alphabetic ([a-zA-Z'200-'377]) characters, underscores ('_') or digits ([0-9]), not beginning with a digit; //CHECK 200-377 +// a numeral [-]?(.[0-9]+ | [0-9]+(.[0-9]*)? ); +// any double-quoted string ("...") possibly containing escaped quotes ('")1; //TODO +// an HTML string (<...>). +// An ID is just a string; the lack of quote characters in the first two forms is just for simplicity. +// There is no semantic difference between abc_2 and "abc_2", or between 2.34 and "2.34". +// Obviously, to use a keyword as an ID, it must be quoted. Note that, in HTML strings, angle brackets must occur in matched pairs, and unescaped newlines are allowed. +// In addition, the content must be legal XML, so that the special XML escape sequences for ", &, <, and > may be necessary in order to embed these characters in attribute values or raw text. +// Both quoted strings and HTML strings are scanned as a unit, so any embedded comments will be treated as part of the strings. +Id + : id << ast.NewId($0) >> + ; + +//The language supports C++-style comments: /* */ and //. +//In addition, a line beginning with a '#' character is considered a line output from a C preprocessor (e.g., # 34 to indicate line 34 ) and discarded. + +//TODO (if dot file is not parsable, it might be because of these points) + +//Semicolons aid readability but are not required except in the rare case that a named subgraph with no body immediately preceeds an anonymous subgraph, +//since the precedence rules cause this sequence to be parsed as a subgraph with a heading and a body. Also, any amount of whitespace may be inserted between terminals. + +//TODO +//As another aid for readability, dot allows single logical lines to span multiple physical lines using the standard C convention of a backslash immediately preceding a newline character. +//In addition, double-quoted strings can be concatenated using a '+' operator. As HTML strings can contain newline characters, they do not support the concatenation operator. + +//TODO +//Note there are still 3 sections on the webpage which have not been included (Subgraphs and Clusters, Lexical and Semantic Notes, and Character Encodings) diff --git a/vendor/github.com/awalterschulze/gographviz/edges.go b/vendor/github.com/awalterschulze/gographviz/edges.go new file mode 100644 index 000000000..517618513 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/edges.go @@ -0,0 +1,119 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "sort" +) + +//Represents an Edge. +type Edge struct { + Src string + SrcPort string + Dst string + DstPort string + Dir bool + Attrs Attrs +} + +//Represents a set of Edges. +type Edges struct { + SrcToDsts map[string]map[string][]*Edge + DstToSrcs map[string]map[string][]*Edge + Edges []*Edge +} + +//Creates a blank set of Edges. +func NewEdges() *Edges { + return &Edges{make(map[string]map[string][]*Edge), make(map[string]map[string][]*Edge), make([]*Edge, 0)} +} + +//Adds an Edge to the set of Edges. +func (this *Edges) Add(edge *Edge) { + if _, ok := this.SrcToDsts[edge.Src]; !ok { + this.SrcToDsts[edge.Src] = make(map[string][]*Edge) + } + if _, ok := this.SrcToDsts[edge.Src][edge.Dst]; !ok { + this.SrcToDsts[edge.Src][edge.Dst] = make([]*Edge, 0) + } + this.SrcToDsts[edge.Src][edge.Dst] = append(this.SrcToDsts[edge.Src][edge.Dst], edge) + + if _, ok := this.DstToSrcs[edge.Dst]; !ok { + this.DstToSrcs[edge.Dst] = make(map[string][]*Edge) + } + if _, ok := this.DstToSrcs[edge.Dst][edge.Src]; !ok { + this.DstToSrcs[edge.Dst][edge.Src] = make([]*Edge, 0) + } + this.DstToSrcs[edge.Dst][edge.Src] = append(this.DstToSrcs[edge.Dst][edge.Src], edge) + + this.Edges = append(this.Edges, edge) +} + +//Returns a sorted list of Edges. +func (this Edges) Sorted() []*Edge { + es := make(edgeSorter, len(this.Edges)) + copy(es, this.Edges) + sort.Sort(es) + return es +} + +type edgeSorter []*Edge + +func (es edgeSorter) Len() int { return len(es) } +func (es edgeSorter) Swap(i, j int) { es[i], es[j] = es[j], es[i] } +func (es edgeSorter) Less(i, j int) bool { + if es[i].Src < es[j].Src { + return true + } else if es[i].Src > es[j].Src { + return false + } + + if es[i].Dst < es[j].Dst { + return true + } else if es[i].Dst > es[j].Dst { + return false + } + + if es[i].SrcPort < es[j].SrcPort { + return true + } else if es[i].SrcPort > es[j].SrcPort { + return false + } + + if es[i].DstPort < es[j].DstPort { + return true + } else if es[i].DstPort > es[j].DstPort { + return false + } + + if es[i].Dir != es[j].Dir { + return es[i].Dir + } + + attrs := es[i].Attrs.Copy() + for k, v := range es[j].Attrs { + attrs[k] = v + } + + for _, k := range attrs.SortedNames() { + if es[i].Attrs[k] < es[j].Attrs[k] { + return true + } else if es[i].Attrs[k] > es[j].Attrs[k] { + return false + } + } + + return false +} diff --git a/vendor/github.com/awalterschulze/gographviz/edges_test.go b/vendor/github.com/awalterschulze/gographviz/edges_test.go new file mode 100644 index 000000000..cd3fb21b2 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/edges_test.go @@ -0,0 +1,177 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "reflect" + "testing" +) + +func TestEdges_Sorted(t *testing.T) { + var tts = map[string]struct { + edges []*Edge + expected []*Edge + }{ + "empty": { + edges: []*Edge{}, + expected: []*Edge{}, + }, + "one edge": { + edges: []*Edge{ + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + }, + expected: []*Edge{ + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + }, + }, + "two non parallel edges": { + edges: []*Edge{ + {Src: "0", Dst: "2", Attrs: map[string]string{"label": "hello"}}, + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + }, + expected: []*Edge{ + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + {Src: "0", Dst: "2", Attrs: map[string]string{"label": "hello"}}, + }, + }, + "two parallel edges": { + edges: []*Edge{ + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "hello"}}, + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + }, + expected: []*Edge{ + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "hello"}}, + }, + }, + "two parallel edges - one without label": { + edges: []*Edge{ + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + {Src: "0", Dst: "1"}, + }, + expected: []*Edge{ + {Src: "0", Dst: "1"}, + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + }, + }, + "several non parallel edges": { + edges: []*Edge{ + {Src: "0", Dst: "2", Attrs: map[string]string{"label": "hello"}}, + {Src: "1", Dst: "1", Attrs: map[string]string{"label": "world"}}, + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + {Src: "1", Dst: "0", Attrs: map[string]string{"label": "golang"}}, + }, + expected: []*Edge{ + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + {Src: "0", Dst: "2", Attrs: map[string]string{"label": "hello"}}, + {Src: "1", Dst: "0", Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "1", Attrs: map[string]string{"label": "world"}}, + }, + }, + "several with parallel edges": { + edges: []*Edge{ + {Src: "0", Dst: "2", Attrs: map[string]string{"label": "hello"}}, + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "cba"}}, + {Src: "1", Dst: "1", Attrs: map[string]string{"label": "world"}}, + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + {Src: "1", Dst: "0", Attrs: map[string]string{"label": "gopher"}}, + {Src: "1", Dst: "0", Attrs: map[string]string{"label": "golang"}}, + }, + expected: []*Edge{ + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "cba"}}, + {Src: "0", Dst: "2", Attrs: map[string]string{"label": "hello"}}, + {Src: "1", Dst: "0", Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", Attrs: map[string]string{"label": "gopher"}}, + {Src: "1", Dst: "1", Attrs: map[string]string{"label": "world"}}, + }, + }, + "edges with ports": { + edges: []*Edge{ + {Src: "0", Dst: "1", SrcPort: "a", DstPort: "b"}, + {Src: "0", Dst: "1", SrcPort: "a", DstPort: "a"}, + {Src: "0", Dst: "1", SrcPort: "b", DstPort: "a"}, + }, + expected: []*Edge{ + {Src: "0", Dst: "1", SrcPort: "a", DstPort: "a"}, + {Src: "0", Dst: "1", SrcPort: "a", DstPort: "b"}, + {Src: "0", Dst: "1", SrcPort: "b", DstPort: "a"}, + }, + }, + "directed edges before non directed edges": { + edges: []*Edge{ + {Src: "0", Dst: "1", Dir: false}, + {Src: "0", Dst: "1", Dir: true}, + }, + expected: []*Edge{ + {Src: "0", Dst: "1", Dir: true}, + {Src: "0", Dst: "1", Dir: false}, + }, + }, + "the theory of everything": { + edges: []*Edge{ + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "cba"}}, + {Src: "1", Dst: "0", SrcPort: "a", Dir: false, Attrs: map[string]string{"label": "gopher"}}, + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + {Src: "0", Dst: "2", Attrs: map[string]string{"label": "hello"}}, + {Src: "1", Dst: "0", Attrs: map[string]string{"label": "gopher"}}, + {Src: "1", Dst: "0", Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", SrcPort: "b", Attrs: map[string]string{"label": "gopher"}}, + {Src: "1", Dst: "0", SrcPort: "a", DstPort: "b", Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "1", Attrs: map[string]string{"comment": "test", "label": "world"}}, + {Src: "1", Dst: "0", SrcPort: "a", DstPort: "a", Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", SrcPort: "a", Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", SrcPort: "b", Dir: false, Attrs: map[string]string{"label": "gopher"}}, + {Src: "1", Dst: "1", Attrs: map[string]string{"label": "world"}}, + {Src: "1", Dst: "0", SrcPort: "a", DstPort: "b", Dir: true, Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "1", Attrs: map[string]string{"comment": "test", "label": "hello"}}, + {Src: "1", Dst: "0", SrcPort: "a", Dir: true, Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", SrcPort: "a", DstPort: "b", Dir: true, Attrs: map[string]string{"label": "graphviz"}}, + }, + expected: []*Edge{ + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "abc"}}, + {Src: "0", Dst: "1", Attrs: map[string]string{"label": "cba"}}, + {Src: "0", Dst: "2", Attrs: map[string]string{"label": "hello"}}, + {Src: "1", Dst: "0", Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", Attrs: map[string]string{"label": "gopher"}}, + {Src: "1", Dst: "0", SrcPort: "a", Dir: true, Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", SrcPort: "a", Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", SrcPort: "a", Dir: false, Attrs: map[string]string{"label": "gopher"}}, + {Src: "1", Dst: "0", SrcPort: "a", DstPort: "a", Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", SrcPort: "a", DstPort: "b", Dir: true, Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", SrcPort: "a", DstPort: "b", Dir: true, Attrs: map[string]string{"label": "graphviz"}}, + {Src: "1", Dst: "0", SrcPort: "a", DstPort: "b", Attrs: map[string]string{"label": "golang"}}, + {Src: "1", Dst: "0", SrcPort: "b", Dir: false, Attrs: map[string]string{"label": "gopher"}}, + {Src: "1", Dst: "0", SrcPort: "b", Attrs: map[string]string{"label": "gopher"}}, + {Src: "1", Dst: "1", Attrs: map[string]string{"label": "world"}}, + {Src: "1", Dst: "1", Attrs: map[string]string{"comment": "test", "label": "hello"}}, + {Src: "1", Dst: "1", Attrs: map[string]string{"comment": "test", "label": "world"}}, + }, + }, + } + + for name, tt := range tts { + edges := NewEdges() + for _, e := range tt.edges { + edges.Add(e) + } + s := edges.Sorted() + if !reflect.DeepEqual(tt.expected, s) { + t.Errorf("%s - Sorted invalid: expected %v got %v", name, tt.expected, s) + } else if !reflect.DeepEqual(edges.Edges, tt.edges) { + t.Errorf("%s - Sorted should not have changed original order: expected %v got %v", name, tt.edges, edges.Edges) + } + } +} diff --git a/vendor/github.com/awalterschulze/gographviz/errors/errors.go b/vendor/github.com/awalterschulze/gographviz/errors/errors.go new file mode 100644 index 000000000..c833968e8 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/errors/errors.go @@ -0,0 +1,56 @@ +// generated by gocc; DO NOT EDIT. + +package errors + +import ( + "bytes" + "fmt" + + "github.com/awalterschulze/gographviz/token" +) + +type ErrorSymbol interface { +} + +type Error struct { + Err error + ErrorToken *token.Token + ErrorSymbols []ErrorSymbol + ExpectedTokens []string + StackTop int +} + +func (E *Error) String() string { + w := new(bytes.Buffer) + fmt.Fprintf(w, "Error") + if E.Err != nil { + fmt.Fprintf(w, " %s\n", E.Err) + } else { + fmt.Fprintf(w, "\n") + } + fmt.Fprintf(w, "Token: type=%d, lit=%s\n", E.ErrorToken.Type, E.ErrorToken.Lit) + fmt.Fprintf(w, "Pos: offset=%d, line=%d, column=%d\n", E.ErrorToken.Pos.Offset, E.ErrorToken.Pos.Line, E.ErrorToken.Pos.Column) + fmt.Fprintf(w, "Expected one of: ") + for _, sym := range E.ExpectedTokens { + fmt.Fprintf(w, "%s ", sym) + } + fmt.Fprintf(w, "ErrorSymbol:\n") + for _, sym := range E.ErrorSymbols { + fmt.Fprintf(w, "%v\n", sym) + } + return w.String() +} + +func (e *Error) Error() string { + w := new(bytes.Buffer) + fmt.Fprintf(w, "Error in S%d: %s, %s", e.StackTop, token.TokMap.TokenString(e.ErrorToken), e.ErrorToken.Pos.String()) + if e.Err != nil { + fmt.Fprintf(w, e.Err.Error()) + } else { + fmt.Fprintf(w, ", expected one of: ") + for _, expected := range e.ExpectedTokens { + fmt.Fprintf(w, "%s ", expected) + } + } + return w.String() +} diff --git a/vendor/github.com/awalterschulze/gographviz/escape.go b/vendor/github.com/awalterschulze/gographviz/escape.go new file mode 100644 index 000000000..60b0cccdb --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/escape.go @@ -0,0 +1,183 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "fmt" + "strings" + "text/template" + "unicode" +) + +type Escape struct { + *Graph +} + +//Returns a graph which will try to escape some strings when required +func NewEscape() *Escape { + return &Escape{NewGraph()} +} + +func isHtml(s string) bool { + if len(s) == 0 { + return false + } + ss := strings.TrimSpace(s) + if ss[0] != '<' { + return false + } + count := 0 + for _, c := range ss { + if c == '<' { + count += 1 + } + if c == '>' { + count -= 1 + } + } + if count == 0 { + return true + } + return false +} + +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || + ch >= 0x80 && unicode.IsLetter(ch) && ch != 'ε' +} + +func isId(s string) bool { + i := 0 + pos := false + for _, c := range s { + if i == 0 { + if !isLetter(c) { + return false + } + pos = true + } + if unicode.IsSpace(c) { + return false + } + if c == '-' { + return false + } + i++ + } + return pos +} + +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +func isNumber(s string) bool { + state := 0 + for _, c := range s { + if state == 0 { + if isDigit(c) || c == '.' { + state = 2 + } else if c == '-' { + state = 1 + } else { + return false + } + } else if state == 1 { + if isDigit(c) || c == '.' { + state = 2 + } + } else if c != '.' && !isDigit(c) { + return false + } + } + return (state == 2) +} + +func isStringLit(s string) bool { + if !strings.HasPrefix(s, `"`) || !strings.HasSuffix(s, `"`) { + return false + } + var prev rune + for _, r := range s[1 : len(s)-1] { + if r == '"' && prev != '\\' { + return false + } + prev = r + } + return true +} + +func esc(s string) string { + if len(s) == 0 { + return s + } + if isHtml(s) { + return s + } + ss := strings.TrimSpace(s) + if ss[0] == '<' { + return fmt.Sprintf("\"%s\"", strings.Replace(s, "\"", "\\\"", -1)) + } + if isId(s) { + return s + } + if isNumber(s) { + return s + } + if isStringLit(s) { + return s + } + return fmt.Sprintf("\"%s\"", template.HTMLEscapeString(s)) +} + +func escAttrs(attrs map[string]string) map[string]string { + newAttrs := make(map[string]string) + for k, v := range attrs { + newAttrs[esc(k)] = esc(v) + } + return newAttrs +} + +func (this *Escape) SetName(name string) { + this.Graph.SetName(esc(name)) +} + +func (this *Escape) AddPortEdge(src, srcPort, dst, dstPort string, directed bool, attrs map[string]string) { + this.Graph.AddPortEdge(esc(src), srcPort, esc(dst), dstPort, directed, escAttrs(attrs)) +} + +func (this *Escape) AddEdge(src, dst string, directed bool, attrs map[string]string) { + this.AddPortEdge(src, "", dst, "", directed, attrs) +} + +func (this *Escape) AddNode(parentGraph string, name string, attrs map[string]string) { + this.Graph.AddNode(esc(parentGraph), esc(name), escAttrs(attrs)) +} + +func (this *Escape) AddAttr(parentGraph string, field, value string) { + this.Graph.AddAttr(esc(parentGraph), esc(field), esc(value)) +} + +func (this *Escape) AddSubGraph(parentGraph string, name string, attrs map[string]string) { + this.Graph.AddSubGraph(esc(parentGraph), esc(name), escAttrs(attrs)) +} + +func (this *Escape) IsNode(name string) bool { + return this.Graph.IsNode(esc(name)) +} + +func (this *Escape) IsSubGraph(name string) bool { + return this.Graph.IsSubGraph(esc(name)) +} diff --git a/vendor/github.com/awalterschulze/gographviz/escape_test.go b/vendor/github.com/awalterschulze/gographviz/escape_test.go new file mode 100644 index 000000000..9c91f3923 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/escape_test.go @@ -0,0 +1,47 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "strings" + "testing" +) + +func TestEscape(t *testing.T) { + g := NewEscape() + g.SetName("asdf adsf") + g.SetDir(true) + g.AddNode("asdf asdf", "kasdf99 99", map[string]string{ + "7; + "a << b"; + "kasdf99 99" [ "World}`)) + if err != nil { + panic(err) + } + s := g.String() + fmt.Println(s) + // Output: digraph G { + // Hello->World; + // Hello; + // World; + // + //} +} + +func ExampleNewGraph() { + g := NewGraph() + g.SetName("G") + g.SetDir(true) + g.AddNode("G", "Hello", nil) + g.AddNode("G", "World", nil) + g.AddEdge("Hello", "World", true, nil) + s := g.String() + fmt.Println(s) + // Output: digraph G { + // Hello->World; + // Hello; + // World; + // + //} +} + +type MyOwnGraphStructure struct { + weights map[int]map[int]int + max int +} + +func NewMyOwnGraphStructure() *MyOwnGraphStructure { + return &MyOwnGraphStructure{ + make(map[int]map[int]int), + 0, + } +} + +func (this *MyOwnGraphStructure) SetStrict(strict bool) {} +func (this *MyOwnGraphStructure) SetDir(directed bool) {} +func (this *MyOwnGraphStructure) SetName(name string) {} +func (this *MyOwnGraphStructure) AddPortEdge(src, srcPort, dst, dstPort string, directed bool, attrs map[string]string) { + srci, err := strconv.Atoi(src) + if err != nil { + return + } + dsti, err := strconv.Atoi(dst) + if err != nil { + return + } + ai, err := strconv.Atoi(attrs["label"]) + if err != nil { + return + } + if _, ok := this.weights[srci]; !ok { + this.weights[srci] = make(map[int]int) + } + this.weights[srci][dsti] = ai + if srci > this.max { + this.max = srci + } + if dsti > this.max { + this.max = dsti + } + +} +func (this *MyOwnGraphStructure) AddEdge(src, dst string, directed bool, attrs map[string]string) { + this.AddPortEdge(src, "", dst, "", directed, attrs) +} +func (this *MyOwnGraphStructure) AddNode(parentGraph string, name string, attrs map[string]string) {} +func (this *MyOwnGraphStructure) AddAttr(parentGraph string, field, value string) {} +func (this *MyOwnGraphStructure) AddSubGraph(parentGraph string, name string, attrs map[string]string) { +} +func (this *MyOwnGraphStructure) String() string { return "" } + +//An Example of how to parse into your own simpler graph structure and output it back to graphviz. +//This example reads in only numbers and outputs a matrix graph. +func ExampleMyOwnGraphStructure() { + name := "matrix" + parsed, err := Parse([]byte(` + digraph G { + 1 -> 2 [ label = 5 ]; + 4 -> 2 [ label = 1 ]; + 4 -> 1 [ label = 2 ]; + 1 -> 1 [ label = 0 ]; + } + + `)) + if err != nil { + panic(err) + } + mine := NewMyOwnGraphStructure() + Analyse(parsed, mine) + output := NewGraph() + output.SetName(name) + output.SetDir(true) + for i := 1; i <= mine.max; i++ { + output.AddNode(name, fmt.Sprintf("%v", i), nil) + if _, ok := mine.weights[i]; !ok { + mine.weights[i] = make(map[int]int) + } + } + for i := 1; i <= mine.max; i++ { + for j := 1; j <= mine.max; j++ { + output.AddEdge(fmt.Sprintf("%v", i), fmt.Sprintf("%v", j), true, map[string]string{"label": fmt.Sprintf("%v", mine.weights[i][j])}) + } + } + s := output.String() + fmt.Println(s) + // Output: digraph matrix { + // 1->1[ label=0 ]; + // 1->2[ label=5 ]; + // 1->3[ label=0 ]; + // 1->4[ label=0 ]; + // 2->1[ label=0 ]; + // 2->2[ label=0 ]; + // 2->3[ label=0 ]; + // 2->4[ label=0 ]; + // 3->1[ label=0 ]; + // 3->2[ label=0 ]; + // 3->3[ label=0 ]; + // 3->4[ label=0 ]; + // 4->1[ label=2 ]; + // 4->2[ label=1 ]; + // 4->3[ label=0 ]; + // 4->4[ label=0 ]; + // 1; + // 2; + // 3; + // 4; + // + //} +} diff --git a/vendor/github.com/awalterschulze/gographviz/gographviz.go b/vendor/github.com/awalterschulze/gographviz/gographviz.go new file mode 100644 index 000000000..f8a7db7ee --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/gographviz.go @@ -0,0 +1,53 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +//Package gographviz provides parsing for the DOT grammar into +//an abstract syntax tree representing a graph, +//analysis of the abstract syntax tree into a more usable structure, +//and writing back of this structure into the DOT format. +package gographviz + +import ( + "github.com/awalterschulze/gographviz/ast" + "github.com/awalterschulze/gographviz/parser" +) + +var _ Interface = NewGraph() + +//Implementing this interface allows you to parse the graph into your own structure. +type Interface interface { + SetStrict(strict bool) + SetDir(directed bool) + SetName(name string) + AddPortEdge(src, srcPort, dst, dstPort string, directed bool, attrs map[string]string) + AddEdge(src, dst string, directed bool, attrs map[string]string) + AddNode(parentGraph string, name string, attrs map[string]string) + AddAttr(parentGraph string, field, value string) + AddSubGraph(parentGraph string, name string, attrs map[string]string) + String() string +} + +//Parses the buffer into a abstract syntax tree representing the graph. +func Parse(buf []byte) (*ast.Graph, error) { + return parser.ParseBytes(buf) +} + +//Parses and creates a new Graph from the data. +func Read(buf []byte) (*Graph, error) { + st, err := Parse(buf) + if err != nil { + return nil, err + } + return NewAnalysedGraph(st), nil +} diff --git a/vendor/github.com/awalterschulze/gographviz/graph.go b/vendor/github.com/awalterschulze/gographviz/graph.go new file mode 100644 index 000000000..75d579eb9 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/graph.go @@ -0,0 +1,113 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +//The analysed representation of the Graph parsed from the DOT format. +type Graph struct { + Attrs Attrs + Name string + Directed bool + Strict bool + Nodes *Nodes + Edges *Edges + SubGraphs *SubGraphs + Relations *Relations +} + +//Creates a new empty graph, ready to be populated. +func NewGraph() *Graph { + return &Graph{ + Attrs: make(Attrs), + Name: "", + Directed: false, + Strict: false, + Nodes: NewNodes(), + Edges: NewEdges(), + SubGraphs: NewSubGraphs(), + Relations: NewRelations(), + } +} + +//If the graph is strict then multiple edges are not allowed between the same pairs of nodes, +//see dot man page. +func (this *Graph) SetStrict(strict bool) { + this.Strict = strict +} + +//Sets whether the graph is directed (true) or undirected (false). +func (this *Graph) SetDir(dir bool) { + this.Directed = dir +} + +//Sets the graph name. +func (this *Graph) SetName(name string) { + this.Name = name +} + +//Adds an edge to the graph from node src to node dst. +//srcPort and dstPort are the port the node ports, leave as empty strings if it is not required. +//This does not imply the adding of missing nodes. +func (this *Graph) AddPortEdge(src, srcPort, dst, dstPort string, directed bool, attrs map[string]string) { + this.Edges.Add(&Edge{src, srcPort, dst, dstPort, directed, attrs}) +} + +//Adds an edge to the graph from node src to node dst. +//This does not imply the adding of missing nodes. +//If directed is set to true then SetDir(true) must also be called or there will be a syntax error in the output. +func (this *Graph) AddEdge(src, dst string, directed bool, attrs map[string]string) { + this.AddPortEdge(src, "", dst, "", directed, attrs) +} + +//Adds a node to a graph/subgraph. +//If not subgraph exists use the name of the main graph. +//This does not imply the adding of a missing subgraph. +func (this *Graph) AddNode(parentGraph string, name string, attrs map[string]string) { + this.Nodes.Add(&Node{name, attrs}) + this.Relations.Add(parentGraph, name) +} + +func (this *Graph) getAttrs(graphName string) Attrs { + if this.Name == graphName { + return this.Attrs + } + g, ok := this.SubGraphs.SubGraphs[graphName] + if !ok { + panic("graph or subgraph " + graphName + " does not exist") + } + return g.Attrs +} + +//Adds an attribute to a graph/subgraph. +func (this *Graph) AddAttr(parentGraph string, field string, value string) { + this.getAttrs(parentGraph).Add(field, value) +} + +//Adds a subgraph to a graph/subgraph. +func (this *Graph) AddSubGraph(parentGraph string, name string, attrs map[string]string) { + this.SubGraphs.Add(name) + for key, value := range attrs { + this.AddAttr(name, key, value) + } +} + +func (this *Graph) IsNode(name string) bool { + _, ok := this.Nodes.Lookup[name] + return ok +} + +func (this *Graph) IsSubGraph(name string) bool { + _, ok := this.SubGraphs.SubGraphs[name] + return ok +} diff --git a/vendor/github.com/awalterschulze/gographviz/install-godeps.sh b/vendor/github.com/awalterschulze/gographviz/install-godeps.sh new file mode 100755 index 000000000..5bbf4f069 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/install-godeps.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -xe +mkdir -p $GOPATH/src/githbub.com/goccmack +git clone https://github.com/goccmack/gocc $GOPATH/src/github.com/goccmack/gocc +go get golang.org/x/tools/cmd/goimports diff --git a/vendor/github.com/awalterschulze/gographviz/lexer/acttab.go b/vendor/github.com/awalterschulze/gographviz/lexer/acttab.go new file mode 100644 index 000000000..391101075 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/lexer/acttab.go @@ -0,0 +1,587 @@ +// generated by gocc; DO NOT EDIT. + +package lexer + +import ( + "fmt" + + "github.com/awalterschulze/gographviz/token" +) + +type ActionTable [NumStates]ActionRow + +type ActionRow struct { + Accept token.Type + Ignore string +} + +func (this ActionRow) String() string { + return fmt.Sprintf("Accept=%d, Ignore=%s", this.Accept, this.Ignore) +} + +var ActTab = ActionTable{ + ActionRow{ // S0 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S1 + Accept: -1, + Ignore: "!whitespace", + }, + ActionRow{ // S2 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S3 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S4 + Accept: 13, + Ignore: "", + }, + ActionRow{ // S5 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S6 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S7 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S8 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S9 + Accept: 14, + Ignore: "", + }, + ActionRow{ // S10 + Accept: 7, + Ignore: "", + }, + ActionRow{ // S11 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S12 + Accept: 8, + Ignore: "", + }, + ActionRow{ // S13 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S14 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S15 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S16 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S17 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S18 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S19 + Accept: 11, + Ignore: "", + }, + ActionRow{ // S20 + Accept: 12, + Ignore: "", + }, + ActionRow{ // S21 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S22 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S23 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S24 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S25 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S26 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S27 + Accept: 3, + Ignore: "", + }, + ActionRow{ // S28 + Accept: 4, + Ignore: "", + }, + ActionRow{ // S29 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S30 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S31 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S32 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S33 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S34 + Accept: -1, + Ignore: "!comment", + }, + ActionRow{ // S35 + Accept: 17, + Ignore: "", + }, + ActionRow{ // S36 + Accept: 16, + Ignore: "", + }, + ActionRow{ // S37 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S38 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S39 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S40 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S41 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S42 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S43 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S44 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S45 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S46 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S47 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S48 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S49 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S50 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S51 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S52 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S53 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S54 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S55 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S56 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S57 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S58 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S59 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S60 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S61 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S62 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S63 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S64 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S65 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S66 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S67 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S68 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S69 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S70 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S71 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S72 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S73 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S74 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S75 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S76 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S77 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S78 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S79 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S80 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S81 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S82 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S83 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S84 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S85 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S86 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S87 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S88 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S89 + Accept: -1, + Ignore: "!comment", + }, + ActionRow{ // S90 + Accept: 0, + Ignore: "", + }, + ActionRow{ // S91 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S92 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S93 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S94 + Accept: 10, + Ignore: "", + }, + ActionRow{ // S95 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S96 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S97 + Accept: 9, + Ignore: "", + }, + ActionRow{ // S98 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S99 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S100 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S101 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S102 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S103 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S104 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S105 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S106 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S107 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S108 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S109 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S110 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S111 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S112 + Accept: 2, + Ignore: "", + }, + ActionRow{ // S113 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S114 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S115 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S116 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S117 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S118 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S119 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S120 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S121 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S122 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S123 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S124 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S125 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S126 + Accept: 5, + Ignore: "", + }, + ActionRow{ // S127 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S128 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S129 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S130 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S131 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S132 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S133 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S134 + Accept: 6, + Ignore: "", + }, + ActionRow{ // S135 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S136 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S137 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S138 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S139 + Accept: 18, + Ignore: "", + }, + ActionRow{ // S140 + Accept: 15, + Ignore: "", + }, +} diff --git a/vendor/github.com/awalterschulze/gographviz/lexer/lexer.go b/vendor/github.com/awalterschulze/gographviz/lexer/lexer.go new file mode 100644 index 000000000..ea4d0746c --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/lexer/lexer.go @@ -0,0 +1,328 @@ +// generated by gocc; DO NOT EDIT. + +package lexer + +import ( + // "fmt" + "io/ioutil" + "unicode/utf8" + + // "github.com/awalterschulze/gographviz/util" + "github.com/awalterschulze/gographviz/token" +) + +const ( + NoState = -1 + NumStates = 141 + NumSymbols = 184 +) + +type Lexer struct { + src []byte + pos int + line int + column int +} + +func NewLexer(src []byte) *Lexer { + lexer := &Lexer{ + src: src, + pos: 0, + line: 1, + column: 1, + } + return lexer +} + +func NewLexerFile(fpath string) (*Lexer, error) { + src, err := ioutil.ReadFile(fpath) + if err != nil { + return nil, err + } + return NewLexer(src), nil +} + +func (this *Lexer) Scan() (tok *token.Token) { + + // fmt.Printf("Lexer.Scan() pos=%d\n", this.pos) + + tok = new(token.Token) + if this.pos >= len(this.src) { + tok.Type = token.EOF + tok.Pos.Offset, tok.Pos.Line, tok.Pos.Column = this.pos, this.line, this.column + return + } + start, startLine, startColumn, end := this.pos, this.line, this.column, 0 + tok.Type = token.INVALID + state, rune1, size := 0, rune(-1), 0 + for state != -1 { + + // fmt.Printf("\tpos=%d, line=%d, col=%d, state=%d\n", this.pos, this.line, this.column, state) + + if this.pos >= len(this.src) { + rune1 = -1 + } else { + rune1, size = utf8.DecodeRune(this.src[this.pos:]) + this.pos += size + } + + // Production start + if rune1 != -1 { + state = TransTab[state](rune1) + } else { + state = -1 + } + // Production end + + // Debug start + // nextState := -1 + // if rune1 != -1 { + // nextState = TransTab[state](rune1) + // } + // fmt.Printf("\tS%d, : tok=%s, rune == %s(%x), next state == %d\n", state, token.TokMap.Id(tok.Type), util.RuneToString(rune1), rune1, nextState) + // fmt.Printf("\t\tpos=%d, size=%d, start=%d, end=%d\n", this.pos, size, start, end) + // if nextState != -1 { + // fmt.Printf("\t\taction:%s\n", ActTab[nextState].String()) + // } + // state = nextState + // Debug end + + if state != -1 { + + switch rune1 { + case '\n': + this.line++ + this.column = 1 + case '\r': + this.column = 1 + case '\t': + this.column += 4 + default: + this.column++ + } + + switch { + case ActTab[state].Accept != -1: + tok.Type = ActTab[state].Accept + // fmt.Printf("\t Accept(%s), %s(%d)\n", string(act), token.TokMap.Id(tok), tok) + end = this.pos + case ActTab[state].Ignore != "": + // fmt.Printf("\t Ignore(%s)\n", string(act)) + start, startLine, startColumn = this.pos, this.line, this.column + state = 0 + if start >= len(this.src) { + tok.Type = token.EOF + } + + } + } else { + if tok.Type == token.INVALID { + end = this.pos + } + } + } + if end > start { + this.pos = end + tok.Lit = this.src[start:end] + } else { + tok.Lit = []byte{} + } + tok.Pos.Offset, tok.Pos.Line, tok.Pos.Column = start, startLine, startColumn + + // fmt.Printf("Token at %s: %s \"%s\"\n", tok.String(), token.TokMap.Id(tok.Type), tok.Lit) + + return +} + +func (this *Lexer) Reset() { + this.pos = 0 +} + +/* +Lexer symbols: +0: 'n' +1: 'o' +2: 'd' +3: 'e' +4: 'N' +5: 'o' +6: 'd' +7: 'e' +8: 'N' +9: 'O' +10: 'D' +11: 'E' +12: 'e' +13: 'd' +14: 'g' +15: 'e' +16: 'E' +17: 'd' +18: 'g' +19: 'e' +20: 'E' +21: 'D' +22: 'G' +23: 'E' +24: 'g' +25: 'r' +26: 'a' +27: 'p' +28: 'h' +29: 'G' +30: 'r' +31: 'a' +32: 'p' +33: 'h' +34: 'G' +35: 'R' +36: 'A' +37: 'P' +38: 'H' +39: 'd' +40: 'i' +41: 'g' +42: 'r' +43: 'a' +44: 'p' +45: 'h' +46: 'D' +47: 'i' +48: 'g' +49: 'r' +50: 'a' +51: 'p' +52: 'h' +53: 'd' +54: 'i' +55: 'G' +56: 'r' +57: 'a' +58: 'p' +59: 'h' +60: 'D' +61: 'i' +62: 'G' +63: 'r' +64: 'a' +65: 'p' +66: 'h' +67: 'D' +68: 'I' +69: 'G' +70: 'R' +71: 'A' +72: 'P' +73: 'H' +74: 's' +75: 'u' +76: 'b' +77: 'g' +78: 'r' +79: 'a' +80: 'p' +81: 'h' +82: 'S' +83: 'u' +84: 'b' +85: 'g' +86: 'r' +87: 'a' +88: 'p' +89: 'h' +90: 's' +91: 'u' +92: 'b' +93: 'G' +94: 'r' +95: 'a' +96: 'p' +97: 'h' +98: 'S' +99: 'u' +100: 'b' +101: 'G' +102: 'r' +103: 'a' +104: 'p' +105: 'h' +106: 'S' +107: 'U' +108: 'B' +109: 'G' +110: 'R' +111: 'A' +112: 'P' +113: 'H' +114: 's' +115: 't' +116: 'r' +117: 'i' +118: 'c' +119: 't' +120: 'S' +121: 't' +122: 'r' +123: 'i' +124: 'c' +125: 't' +126: 'S' +127: 'T' +128: 'R' +129: 'I' +130: 'C' +131: 'T' +132: '{' +133: '}' +134: ';' +135: '=' +136: '[' +137: ']' +138: ',' +139: ':' +140: '-' +141: '>' +142: '-' +143: '-' +144: '_' +145: '-' +146: '.' +147: '-' +148: '.' +149: '\' +150: '"' +151: '\' +152: '"' +153: '"' +154: '=' +155: '<' +156: '>' +157: '<' +158: '>' +159: '/' +160: '/' +161: '\n' +162: '#' +163: '\n' +164: '/' +165: '*' +166: '*' +167: '*' +168: '/' +169: ' ' +170: '\t' +171: '\r' +172: '\n' +173: \u0001-'!' +174: '#'-'[' +175: ']'-\u007f +176: 'a'-'z' +177: 'A'-'Z' +178: '0'-'9' +179: \u0080-\ufffc +180: \ufffe-\U0010ffff +181: \u0001-';' +182: '?'-\u00ff +183: . + +*/ diff --git a/vendor/github.com/awalterschulze/gographviz/lexer/transitiontable.go b/vendor/github.com/awalterschulze/gographviz/lexer/transitiontable.go new file mode 100644 index 000000000..381c34203 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/lexer/transitiontable.go @@ -0,0 +1,3017 @@ +// generated by gocc; DO NOT EDIT. + +package lexer + +/* +Let s be the current state +Let r be the current input rune +transitionTable[s](r) returns the next state. +*/ +type TransitionTable [NumStates]func(rune) int + +var TransTab = TransitionTable{ + + // S0 + func(r rune) int { + switch { + case r == 9: // ['\t','\t'] + return 1 + case r == 10: // ['\n','\n'] + return 1 + case r == 13: // ['\r','\r'] + return 1 + case r == 32: // [' ',' '] + return 1 + case r == 34: // ['"','"'] + return 2 + case r == 35: // ['#','#'] + return 3 + case r == 44: // [',',','] + return 4 + case r == 45: // ['-','-'] + return 5 + case r == 46: // ['.','.'] + return 6 + case r == 47: // ['/','/'] + return 7 + case 48 <= r && r <= 57: // ['0','9'] + return 8 + case r == 58: // [':',':'] + return 9 + case r == 59: // [';',';'] + return 10 + case r == 60: // ['<','<'] + return 11 + case r == 61: // ['=','='] + return 12 + case 65 <= r && r <= 67: // ['A','C'] + return 13 + case r == 68: // ['D','D'] + return 14 + case r == 69: // ['E','E'] + return 15 + case r == 70: // ['F','F'] + return 13 + case r == 71: // ['G','G'] + return 16 + case 72 <= r && r <= 77: // ['H','M'] + return 13 + case r == 78: // ['N','N'] + return 17 + case 79 <= r && r <= 82: // ['O','R'] + return 13 + case r == 83: // ['S','S'] + return 18 + case 84 <= r && r <= 90: // ['T','Z'] + return 13 + case r == 91: // ['[','['] + return 19 + case r == 93: // [']',']'] + return 20 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 99: // ['a','c'] + return 13 + case r == 100: // ['d','d'] + return 22 + case r == 101: // ['e','e'] + return 23 + case r == 102: // ['f','f'] + return 13 + case r == 103: // ['g','g'] + return 24 + case 104 <= r && r <= 109: // ['h','m'] + return 13 + case r == 110: // ['n','n'] + return 25 + case 111 <= r && r <= 114: // ['o','r'] + return 13 + case r == 115: // ['s','s'] + return 26 + case 116 <= r && r <= 122: // ['t','z'] + return 13 + case r == 123: // ['{','{'] + return 27 + case r == 125: // ['}','}'] + return 28 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S1 + func(r rune) int { + switch { + + } + return NoState + }, + + // S2 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S3 + func(r rune) int { + switch { + case r == 10: // ['\n','\n'] + return 34 + + default: + return 3 + } + + }, + + // S4 + func(r rune) int { + switch { + + } + return NoState + }, + + // S5 + func(r rune) int { + switch { + case r == 45: // ['-','-'] + return 35 + case r == 46: // ['.','.'] + return 6 + case 48 <= r && r <= 57: // ['0','9'] + return 8 + case r == 62: // ['>','>'] + return 36 + + } + return NoState + }, + + // S6 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 37 + + } + return NoState + }, + + // S7 + func(r rune) int { + switch { + case r == 42: // ['*','*'] + return 38 + case r == 47: // ['/','/'] + return 39 + + } + return NoState + }, + + // S8 + func(r rune) int { + switch { + case r == 46: // ['.','.'] + return 40 + case 48 <= r && r <= 57: // ['0','9'] + return 8 + + } + return NoState + }, + + // S9 + func(r rune) int { + switch { + + } + return NoState + }, + + // S10 + func(r rune) int { + switch { + + } + return NoState + }, + + // S11 + func(r rune) int { + switch { + case 1 <= r && r <= 59: // [\u0001,';'] + return 41 + case r == 60: // ['<','<'] + return 42 + case r == 61: // ['=','='] + return 41 + case r == 62: // ['>','>'] + return 43 + case 63 <= r && r <= 255: // ['?',\u00ff] + return 41 + + } + return NoState + }, + + // S12 + func(r rune) int { + switch { + + } + return NoState + }, + + // S13 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S14 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 72: // ['A','H'] + return 13 + case r == 73: // ['I','I'] + return 45 + case 74 <= r && r <= 90: // ['J','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 104: // ['a','h'] + return 13 + case r == 105: // ['i','i'] + return 46 + case 106 <= r && r <= 122: // ['j','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S15 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 67: // ['A','C'] + return 13 + case r == 68: // ['D','D'] + return 47 + case 69 <= r && r <= 90: // ['E','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 99: // ['a','c'] + return 13 + case r == 100: // ['d','d'] + return 48 + case 101 <= r && r <= 122: // ['e','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S16 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 81: // ['A','Q'] + return 13 + case r == 82: // ['R','R'] + return 49 + case 83 <= r && r <= 90: // ['S','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 50 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S17 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 78: // ['A','N'] + return 13 + case r == 79: // ['O','O'] + return 51 + case 80 <= r && r <= 90: // ['P','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 110: // ['a','n'] + return 13 + case r == 111: // ['o','o'] + return 52 + case 112 <= r && r <= 122: // ['p','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S18 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 83: // ['A','S'] + return 13 + case r == 84: // ['T','T'] + return 53 + case r == 85: // ['U','U'] + return 54 + case 86 <= r && r <= 90: // ['V','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 115: // ['a','s'] + return 13 + case r == 116: // ['t','t'] + return 55 + case r == 117: // ['u','u'] + return 56 + case 118 <= r && r <= 122: // ['v','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S19 + func(r rune) int { + switch { + + } + return NoState + }, + + // S20 + func(r rune) int { + switch { + + } + return NoState + }, + + // S21 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S22 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 104: // ['a','h'] + return 13 + case r == 105: // ['i','i'] + return 57 + case 106 <= r && r <= 122: // ['j','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S23 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 99: // ['a','c'] + return 13 + case r == 100: // ['d','d'] + return 58 + case 101 <= r && r <= 122: // ['e','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S24 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 59 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S25 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 110: // ['a','n'] + return 13 + case r == 111: // ['o','o'] + return 60 + case 112 <= r && r <= 122: // ['p','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S26 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 115: // ['a','s'] + return 13 + case r == 116: // ['t','t'] + return 61 + case r == 117: // ['u','u'] + return 62 + case 118 <= r && r <= 122: // ['v','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S27 + func(r rune) int { + switch { + + } + return NoState + }, + + // S28 + func(r rune) int { + switch { + + } + return NoState + }, + + // S29 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S30 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S31 + func(r rune) int { + switch { + + } + return NoState + }, + + // S32 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 63 + case r == 34: // ['"','"'] + return 64 + case 35 <= r && r <= 91: // ['#','['] + return 63 + case r == 92: // ['\','\'] + return 64 + case 93 <= r && r <= 127: // [']',\u007f] + return 63 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 65 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 65 + + } + return NoState + }, + + // S33 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S34 + func(r rune) int { + switch { + + } + return NoState + }, + + // S35 + func(r rune) int { + switch { + + } + return NoState + }, + + // S36 + func(r rune) int { + switch { + + } + return NoState + }, + + // S37 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 37 + + } + return NoState + }, + + // S38 + func(r rune) int { + switch { + case r == 42: // ['*','*'] + return 66 + + default: + return 38 + } + + }, + + // S39 + func(r rune) int { + switch { + case r == 10: // ['\n','\n'] + return 34 + + default: + return 39 + } + + }, + + // S40 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 67 + + } + return NoState + }, + + // S41 + func(r rune) int { + switch { + case 1 <= r && r <= 59: // [\u0001,';'] + return 41 + case r == 60: // ['<','<'] + return 42 + case r == 61: // ['=','='] + return 41 + case r == 62: // ['>','>'] + return 43 + case 63 <= r && r <= 255: // ['?',\u00ff] + return 41 + + } + return NoState + }, + + // S42 + func(r rune) int { + switch { + case 1 <= r && r <= 59: // [\u0001,';'] + return 68 + case r == 61: // ['=','='] + return 68 + case 63 <= r && r <= 255: // ['?',\u00ff] + return 68 + + } + return NoState + }, + + // S43 + func(r rune) int { + switch { + + } + return NoState + }, + + // S44 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S45 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 69 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S46 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 70 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 71 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S47 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 72 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S48 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 73 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S49 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case r == 65: // ['A','A'] + return 74 + case 66 <= r && r <= 90: // ['B','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S50 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 75 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S51 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 67: // ['A','C'] + return 13 + case r == 68: // ['D','D'] + return 76 + case 69 <= r && r <= 90: // ['E','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S52 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 99: // ['a','c'] + return 13 + case r == 100: // ['d','d'] + return 77 + case 101 <= r && r <= 122: // ['e','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S53 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 81: // ['A','Q'] + return 13 + case r == 82: // ['R','R'] + return 78 + case 83 <= r && r <= 90: // ['S','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S54 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case r == 65: // ['A','A'] + return 13 + case r == 66: // ['B','B'] + return 79 + case 67 <= r && r <= 90: // ['C','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S55 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 80 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S56 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 13 + case r == 98: // ['b','b'] + return 81 + case 99 <= r && r <= 122: // ['c','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S57 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 82 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 83 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S58 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 84 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S59 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 85 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S60 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 99: // ['a','c'] + return 13 + case r == 100: // ['d','d'] + return 86 + case 101 <= r && r <= 122: // ['e','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S61 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 87 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S62 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 13 + case r == 98: // ['b','b'] + return 88 + case 99 <= r && r <= 122: // ['c','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S63 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S64 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S65 + func(r rune) int { + switch { + case 1 <= r && r <= 33: // [\u0001,'!'] + return 30 + case r == 34: // ['"','"'] + return 31 + case 35 <= r && r <= 91: // ['#','['] + return 30 + case r == 92: // ['\','\'] + return 32 + case 93 <= r && r <= 127: // [']',\u007f] + return 30 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 33 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 33 + + } + return NoState + }, + + // S66 + func(r rune) int { + switch { + case r == 42: // ['*','*'] + return 66 + case r == 47: // ['/','/'] + return 89 + + default: + return 38 + } + + }, + + // S67 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 67 + + } + return NoState + }, + + // S68 + func(r rune) int { + switch { + case 1 <= r && r <= 59: // [\u0001,';'] + return 68 + case r == 61: // ['=','='] + return 68 + case r == 62: // ['>','>'] + return 90 + case 63 <= r && r <= 255: // ['?',\u00ff] + return 68 + + } + return NoState + }, + + // S69 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 81: // ['A','Q'] + return 13 + case r == 82: // ['R','R'] + return 91 + case 83 <= r && r <= 90: // ['S','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S70 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 92 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S71 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 93 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S72 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 68: // ['A','D'] + return 13 + case r == 69: // ['E','E'] + return 94 + case 70 <= r && r <= 90: // ['F','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S73 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 100: // ['a','d'] + return 13 + case r == 101: // ['e','e'] + return 94 + case 102 <= r && r <= 122: // ['f','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S74 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 79: // ['A','O'] + return 13 + case r == 80: // ['P','P'] + return 95 + case 81 <= r && r <= 90: // ['Q','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S75 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 96 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S76 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 68: // ['A','D'] + return 13 + case r == 69: // ['E','E'] + return 97 + case 70 <= r && r <= 90: // ['F','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S77 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 100: // ['a','d'] + return 13 + case r == 101: // ['e','e'] + return 97 + case 102 <= r && r <= 122: // ['f','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S78 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 72: // ['A','H'] + return 13 + case r == 73: // ['I','I'] + return 98 + case 74 <= r && r <= 90: // ['J','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S79 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 99 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S80 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 104: // ['a','h'] + return 13 + case r == 105: // ['i','i'] + return 100 + case 106 <= r && r <= 122: // ['j','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S81 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 101 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 102 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S82 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 103 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S83 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 104 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S84 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 100: // ['a','d'] + return 13 + case r == 101: // ['e','e'] + return 94 + case 102 <= r && r <= 122: // ['f','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S85 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 105 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S86 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 100: // ['a','d'] + return 13 + case r == 101: // ['e','e'] + return 97 + case 102 <= r && r <= 122: // ['f','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S87 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 104: // ['a','h'] + return 13 + case r == 105: // ['i','i'] + return 106 + case 106 <= r && r <= 122: // ['j','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S88 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 70: // ['A','F'] + return 13 + case r == 71: // ['G','G'] + return 107 + case 72 <= r && r <= 90: // ['H','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 102: // ['a','f'] + return 13 + case r == 103: // ['g','g'] + return 108 + case 104 <= r && r <= 122: // ['h','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S89 + func(r rune) int { + switch { + + } + return NoState + }, + + // S90 + func(r rune) int { + switch { + case 1 <= r && r <= 59: // [\u0001,';'] + return 41 + case r == 60: // ['<','<'] + return 42 + case r == 61: // ['=','='] + return 41 + case r == 62: // ['>','>'] + return 43 + case 63 <= r && r <= 255: // ['?',\u00ff] + return 41 + + } + return NoState + }, + + // S91 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case r == 65: // ['A','A'] + return 109 + case 66 <= r && r <= 90: // ['B','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S92 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 110 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S93 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 111 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S94 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S95 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 71: // ['A','G'] + return 13 + case r == 72: // ['H','H'] + return 112 + case 73 <= r && r <= 90: // ['I','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S96 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 112 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S97 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S98 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 66: // ['A','B'] + return 13 + case r == 67: // ['C','C'] + return 113 + case 68 <= r && r <= 90: // ['D','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S99 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 81: // ['A','Q'] + return 13 + case r == 82: // ['R','R'] + return 114 + case 83 <= r && r <= 90: // ['S','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S100 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 98: // ['a','b'] + return 13 + case r == 99: // ['c','c'] + return 115 + case 100 <= r && r <= 122: // ['d','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S101 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 116 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S102 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 117 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S103 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 118 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S104 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 119 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S105 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 112 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S106 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 98: // ['a','b'] + return 13 + case r == 99: // ['c','c'] + return 120 + case 100 <= r && r <= 122: // ['d','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S107 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 121 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S108 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 113: // ['a','q'] + return 13 + case r == 114: // ['r','r'] + return 122 + case 115 <= r && r <= 122: // ['s','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S109 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 79: // ['A','O'] + return 13 + case r == 80: // ['P','P'] + return 123 + case 81 <= r && r <= 90: // ['Q','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S110 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 124 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S111 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 125 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S112 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S113 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 83: // ['A','S'] + return 13 + case r == 84: // ['T','T'] + return 126 + case 85 <= r && r <= 90: // ['U','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S114 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case r == 65: // ['A','A'] + return 127 + case 66 <= r && r <= 90: // ['B','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S115 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 115: // ['a','s'] + return 13 + case r == 116: // ['t','t'] + return 126 + case 117 <= r && r <= 122: // ['u','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S116 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 128 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S117 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 129 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S118 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 130 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S119 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 131 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S120 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 115: // ['a','s'] + return 13 + case r == 116: // ['t','t'] + return 126 + case 117 <= r && r <= 122: // ['u','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S121 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 132 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S122 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case r == 97: // ['a','a'] + return 133 + case 98 <= r && r <= 122: // ['b','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S123 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 71: // ['A','G'] + return 13 + case r == 72: // ['H','H'] + return 134 + case 73 <= r && r <= 90: // ['I','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S124 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 134 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S125 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 134 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S126 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S127 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 79: // ['A','O'] + return 13 + case r == 80: // ['P','P'] + return 135 + case 81 <= r && r <= 90: // ['Q','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S128 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 136 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S129 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 137 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S130 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 134 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S131 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 134 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S132 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 138 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S133 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 111: // ['a','o'] + return 13 + case r == 112: // ['p','p'] + return 139 + case 113 <= r && r <= 122: // ['q','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S134 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S135 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 71: // ['A','G'] + return 13 + case r == 72: // ['H','H'] + return 140 + case 73 <= r && r <= 90: // ['I','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S136 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 140 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S137 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 140 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S138 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 140 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S139 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 103: // ['a','g'] + return 13 + case r == 104: // ['h','h'] + return 140 + case 105 <= r && r <= 122: // ['i','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, + + // S140 + func(r rune) int { + switch { + case 48 <= r && r <= 57: // ['0','9'] + return 44 + case 65 <= r && r <= 90: // ['A','Z'] + return 13 + case r == 95: // ['_','_'] + return 21 + case 97 <= r && r <= 122: // ['a','z'] + return 13 + case 128 <= r && r <= 65532: // [\u0080,\ufffc] + return 29 + case 65534 <= r && r <= 1114111: // [\ufffe,\U0010ffff] + return 29 + + } + return NoState + }, +} diff --git a/vendor/github.com/awalterschulze/gographviz/nodes.go b/vendor/github.com/awalterschulze/gographviz/nodes.go new file mode 100644 index 000000000..1d17b987f --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/nodes.go @@ -0,0 +1,61 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "sort" +) + +//Represents a Node. +type Node struct { + Name string + Attrs Attrs +} + +//Represents a set of Nodes. +type Nodes struct { + Lookup map[string]*Node + Nodes []*Node +} + +//Creates a new set of Nodes. +func NewNodes() *Nodes { + return &Nodes{make(map[string]*Node), make([]*Node, 0)} +} + +//Adds a Node to the set of Nodes, ammending the attributes of an already existing node. +func (this *Nodes) Add(node *Node) { + n, ok := this.Lookup[node.Name] + if ok { + n.Attrs.Ammend(node.Attrs) + return + } + this.Lookup[node.Name] = node + this.Nodes = append(this.Nodes, node) +} + +//Returns a sorted list of nodes. +func (this Nodes) Sorted() []*Node { + keys := make([]string, 0, len(this.Lookup)) + for key := range this.Lookup { + keys = append(keys, key) + } + sort.Strings(keys) + nodes := make([]*Node, len(keys)) + for i := range keys { + nodes[i] = this.Lookup[keys[i]] + } + return nodes +} diff --git a/vendor/github.com/awalterschulze/gographviz/parser/action.go b/vendor/github.com/awalterschulze/gographviz/parser/action.go new file mode 100644 index 000000000..ba5364bc8 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/parser/action.go @@ -0,0 +1,51 @@ +// generated by gocc; DO NOT EDIT. + +package parser + +import ( + "fmt" +) + +type action interface { + act() + String() string +} + +type ( + accept bool + shift int // value is next state index + reduce int // value is production index +) + +func (this accept) act() {} +func (this shift) act() {} +func (this reduce) act() {} + +func (this accept) Equal(that action) bool { + if _, ok := that.(accept); ok { + return true + } + return false +} + +func (this reduce) Equal(that action) bool { + that1, ok := that.(reduce) + if !ok { + return false + } + return this == that1 +} + +func (this shift) Equal(that action) bool { + that1, ok := that.(shift) + if !ok { + return false + } + return this == that1 +} + +func (this accept) String() string { return "accept(0)" } +func (this shift) String() string { return fmt.Sprintf("shift:%d", this) } +func (this reduce) String() string { + return fmt.Sprintf("reduce:%d(%s)", this, productionsTable[this].String) +} diff --git a/vendor/github.com/awalterschulze/gographviz/parser/actiontable.go b/vendor/github.com/awalterschulze/gographviz/parser/actiontable.go new file mode 100644 index 000000000..a1c3258e9 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/parser/actiontable.go @@ -0,0 +1,3114 @@ +// generated by gocc; DO NOT EDIT. + +package parser + +type ( + actionTable [numStates]actionRow + actionRow struct { + canRecover bool + actions [numSymbols]action + } +) + +var actionTab = actionTable{ + actionRow{ // S0 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(2), /* graphx */ + nil, /* { */ + nil, /* } */ + shift(3), /* strict */ + shift(4), /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S1 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + accept(true), /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S2 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(5), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(7), /* id */ + + }, + }, + actionRow{ // S3 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(8), /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + shift(9), /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S4 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(10), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(7), /* id */ + + }, + }, + actionRow{ // S5 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(14), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S6 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(28), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S7 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + reduce(57), /* {, reduce: Id */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S8 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(29), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(7), /* id */ + + }, + }, + actionRow{ // S9 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(31), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(7), /* id */ + + }, + }, + actionRow{ // S10 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(33), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S11 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(35), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S12 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + shift(37), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S13 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S14 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(1), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S15 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(48), /* graphx, reduce: NodeId */ + reduce(48), /* {, reduce: NodeId */ + reduce(48), /* }, reduce: NodeId */ + nil, /* strict */ + nil, /* digraph */ + reduce(48), /* ;, reduce: NodeId */ + shift(39), /* = */ + reduce(48), /* node, reduce: NodeId */ + reduce(48), /* edge, reduce: NodeId */ + reduce(48), /* [, reduce: NodeId */ + nil, /* ] */ + nil, /* , */ + shift(41), /* : */ + reduce(48), /* subgraph, reduce: NodeId */ + reduce(48), /* ->, reduce: NodeId */ + reduce(48), /* --, reduce: NodeId */ + reduce(48), /* id, reduce: NodeId */ + + }, + }, + actionRow{ // S16 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(42), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S17 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(17), /* graphx, reduce: StmtList */ + reduce(17), /* {, reduce: StmtList */ + reduce(17), /* }, reduce: StmtList */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + reduce(17), /* node, reduce: StmtList */ + reduce(17), /* edge, reduce: StmtList */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(17), /* subgraph, reduce: StmtList */ + nil, /* -> */ + nil, /* -- */ + reduce(17), /* id, reduce: StmtList */ + + }, + }, + actionRow{ // S18 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(19), /* graphx, reduce: Stmt1 */ + reduce(19), /* {, reduce: Stmt1 */ + reduce(19), /* }, reduce: Stmt1 */ + nil, /* strict */ + nil, /* digraph */ + shift(44), /* ; */ + nil, /* = */ + reduce(19), /* node, reduce: Stmt1 */ + reduce(19), /* edge, reduce: Stmt1 */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(19), /* subgraph, reduce: Stmt1 */ + nil, /* -> */ + nil, /* -- */ + reduce(19), /* id, reduce: Stmt1 */ + + }, + }, + actionRow{ // S19 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(22), /* graphx, reduce: Stmt */ + reduce(22), /* {, reduce: Stmt */ + reduce(22), /* }, reduce: Stmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(22), /* ;, reduce: Stmt */ + nil, /* = */ + reduce(22), /* node, reduce: Stmt */ + reduce(22), /* edge, reduce: Stmt */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(22), /* subgraph, reduce: Stmt */ + nil, /* -> */ + nil, /* -- */ + reduce(22), /* id, reduce: Stmt */ + + }, + }, + actionRow{ // S20 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(23), /* graphx, reduce: Stmt */ + reduce(23), /* {, reduce: Stmt */ + reduce(23), /* }, reduce: Stmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(23), /* ;, reduce: Stmt */ + nil, /* = */ + reduce(23), /* node, reduce: Stmt */ + reduce(23), /* edge, reduce: Stmt */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(23), /* subgraph, reduce: Stmt */ + nil, /* -> */ + nil, /* -- */ + reduce(23), /* id, reduce: Stmt */ + + }, + }, + actionRow{ // S21 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(24), /* graphx, reduce: Stmt */ + reduce(24), /* {, reduce: Stmt */ + reduce(24), /* }, reduce: Stmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(24), /* ;, reduce: Stmt */ + nil, /* = */ + reduce(24), /* node, reduce: Stmt */ + reduce(24), /* edge, reduce: Stmt */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(24), /* subgraph, reduce: Stmt */ + nil, /* -> */ + nil, /* -- */ + reduce(24), /* id, reduce: Stmt */ + + }, + }, + actionRow{ // S22 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(25), /* graphx, reduce: Stmt */ + reduce(25), /* {, reduce: Stmt */ + reduce(25), /* }, reduce: Stmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(25), /* ;, reduce: Stmt */ + nil, /* = */ + reduce(25), /* node, reduce: Stmt */ + reduce(25), /* edge, reduce: Stmt */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(25), /* subgraph, reduce: Stmt */ + shift(47), /* -> */ + shift(48), /* -- */ + reduce(25), /* id, reduce: Stmt */ + + }, + }, + actionRow{ // S23 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + shift(37), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S24 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + shift(37), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S25 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(46), /* graphx, reduce: NodeStmt */ + reduce(46), /* {, reduce: NodeStmt */ + reduce(46), /* }, reduce: NodeStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(46), /* ;, reduce: NodeStmt */ + nil, /* = */ + reduce(46), /* node, reduce: NodeStmt */ + reduce(46), /* edge, reduce: NodeStmt */ + shift(37), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(46), /* subgraph, reduce: NodeStmt */ + shift(47), /* -> */ + shift(48), /* -- */ + reduce(46), /* id, reduce: NodeStmt */ + + }, + }, + actionRow{ // S26 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(53), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(7), /* id */ + + }, + }, + actionRow{ // S27 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(57), /* graphx, reduce: Id */ + reduce(57), /* {, reduce: Id */ + reduce(57), /* }, reduce: Id */ + nil, /* strict */ + nil, /* digraph */ + reduce(57), /* ;, reduce: Id */ + reduce(57), /* =, reduce: Id */ + reduce(57), /* node, reduce: Id */ + reduce(57), /* edge, reduce: Id */ + reduce(57), /* [, reduce: Id */ + nil, /* ] */ + nil, /* , */ + reduce(57), /* :, reduce: Id */ + reduce(57), /* subgraph, reduce: Id */ + reduce(57), /* ->, reduce: Id */ + reduce(57), /* --, reduce: Id */ + reduce(57), /* id, reduce: Id */ + + }, + }, + actionRow{ // S28 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(55), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S29 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(57), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S30 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(59), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S31 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(60), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S32 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(62), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S33 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(9), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S34 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(63), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S35 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(64), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S36 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(26), /* graphx, reduce: AttrStmt */ + reduce(26), /* {, reduce: AttrStmt */ + reduce(26), /* }, reduce: AttrStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(26), /* ;, reduce: AttrStmt */ + nil, /* = */ + reduce(26), /* node, reduce: AttrStmt */ + reduce(26), /* edge, reduce: AttrStmt */ + shift(66), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(26), /* subgraph, reduce: AttrStmt */ + nil, /* -> */ + nil, /* -- */ + reduce(26), /* id, reduce: AttrStmt */ + + }, + }, + actionRow{ // S37 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + shift(68), /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(71), /* id */ + + }, + }, + actionRow{ // S38 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(72), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S39 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(74), /* id */ + + }, + }, + actionRow{ // S40 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(49), /* graphx, reduce: NodeId */ + reduce(49), /* {, reduce: NodeId */ + reduce(49), /* }, reduce: NodeId */ + nil, /* strict */ + nil, /* digraph */ + reduce(49), /* ;, reduce: NodeId */ + nil, /* = */ + reduce(49), /* node, reduce: NodeId */ + reduce(49), /* edge, reduce: NodeId */ + reduce(49), /* [, reduce: NodeId */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(49), /* subgraph, reduce: NodeId */ + reduce(49), /* ->, reduce: NodeId */ + reduce(49), /* --, reduce: NodeId */ + reduce(49), /* id, reduce: NodeId */ + + }, + }, + actionRow{ // S41 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(76), /* id */ + + }, + }, + actionRow{ // S42 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(5), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S43 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(18), /* graphx, reduce: StmtList */ + reduce(18), /* {, reduce: StmtList */ + reduce(18), /* }, reduce: StmtList */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + reduce(18), /* node, reduce: StmtList */ + reduce(18), /* edge, reduce: StmtList */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(18), /* subgraph, reduce: StmtList */ + nil, /* -> */ + nil, /* -- */ + reduce(18), /* id, reduce: StmtList */ + + }, + }, + actionRow{ // S44 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(20), /* graphx, reduce: Stmt1 */ + reduce(20), /* {, reduce: Stmt1 */ + reduce(20), /* }, reduce: Stmt1 */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + reduce(20), /* node, reduce: Stmt1 */ + reduce(20), /* edge, reduce: Stmt1 */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(20), /* subgraph, reduce: Stmt1 */ + nil, /* -> */ + nil, /* -- */ + reduce(20), /* id, reduce: Stmt1 */ + + }, + }, + actionRow{ // S45 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(40), /* graphx, reduce: EdgeStmt */ + reduce(40), /* {, reduce: EdgeStmt */ + reduce(40), /* }, reduce: EdgeStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(40), /* ;, reduce: EdgeStmt */ + nil, /* = */ + reduce(40), /* node, reduce: EdgeStmt */ + reduce(40), /* edge, reduce: EdgeStmt */ + shift(37), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(40), /* subgraph, reduce: EdgeStmt */ + shift(47), /* -> */ + shift(48), /* -- */ + reduce(40), /* id, reduce: EdgeStmt */ + + }, + }, + actionRow{ // S46 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(79), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(83), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(76), /* id */ + + }, + }, + actionRow{ // S47 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + reduce(55), /* {, reduce: EdgeOp */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(55), /* subgraph, reduce: EdgeOp */ + nil, /* -> */ + nil, /* -- */ + reduce(55), /* id, reduce: EdgeOp */ + + }, + }, + actionRow{ // S48 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + reduce(56), /* {, reduce: EdgeOp */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(56), /* subgraph, reduce: EdgeOp */ + nil, /* -> */ + nil, /* -- */ + reduce(56), /* id, reduce: EdgeOp */ + + }, + }, + actionRow{ // S49 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(27), /* graphx, reduce: AttrStmt */ + reduce(27), /* {, reduce: AttrStmt */ + reduce(27), /* }, reduce: AttrStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(27), /* ;, reduce: AttrStmt */ + nil, /* = */ + reduce(27), /* node, reduce: AttrStmt */ + reduce(27), /* edge, reduce: AttrStmt */ + shift(66), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(27), /* subgraph, reduce: AttrStmt */ + nil, /* -> */ + nil, /* -- */ + reduce(27), /* id, reduce: AttrStmt */ + + }, + }, + actionRow{ // S50 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(28), /* graphx, reduce: AttrStmt */ + reduce(28), /* {, reduce: AttrStmt */ + reduce(28), /* }, reduce: AttrStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(28), /* ;, reduce: AttrStmt */ + nil, /* = */ + reduce(28), /* node, reduce: AttrStmt */ + reduce(28), /* edge, reduce: AttrStmt */ + shift(66), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(28), /* subgraph, reduce: AttrStmt */ + nil, /* -> */ + nil, /* -- */ + reduce(28), /* id, reduce: AttrStmt */ + + }, + }, + actionRow{ // S51 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(47), /* graphx, reduce: NodeStmt */ + reduce(47), /* {, reduce: NodeStmt */ + reduce(47), /* }, reduce: NodeStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(47), /* ;, reduce: NodeStmt */ + nil, /* = */ + reduce(47), /* node, reduce: NodeStmt */ + reduce(47), /* edge, reduce: NodeStmt */ + shift(66), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(47), /* subgraph, reduce: NodeStmt */ + nil, /* -> */ + nil, /* -- */ + reduce(47), /* id, reduce: NodeStmt */ + + }, + }, + actionRow{ // S52 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(38), /* graphx, reduce: EdgeStmt */ + reduce(38), /* {, reduce: EdgeStmt */ + reduce(38), /* }, reduce: EdgeStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(38), /* ;, reduce: EdgeStmt */ + nil, /* = */ + reduce(38), /* node, reduce: EdgeStmt */ + reduce(38), /* edge, reduce: EdgeStmt */ + shift(37), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(38), /* subgraph, reduce: EdgeStmt */ + shift(47), /* -> */ + shift(48), /* -- */ + reduce(38), /* id, reduce: EdgeStmt */ + + }, + }, + actionRow{ // S53 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S54 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(86), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S55 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(3), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S56 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(87), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S57 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(2), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S58 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(88), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S59 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(89), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S60 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(10), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S61 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(91), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S62 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(92), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S63 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(13), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S64 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(11), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S65 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(94), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S66 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + shift(95), /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(71), /* id */ + + }, + }, + actionRow{ // S67 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + shift(97), /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + reduce(36), /* ], reduce: Attr */ + reduce(36), /* ,, reduce: Attr */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + reduce(36), /* id, reduce: Attr */ + + }, + }, + actionRow{ // S68 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(29), /* graphx, reduce: AttrList */ + reduce(29), /* {, reduce: AttrList */ + reduce(29), /* }, reduce: AttrList */ + nil, /* strict */ + nil, /* digraph */ + reduce(29), /* ;, reduce: AttrList */ + nil, /* = */ + reduce(29), /* node, reduce: AttrList */ + reduce(29), /* edge, reduce: AttrList */ + reduce(29), /* [, reduce: AttrList */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(29), /* subgraph, reduce: AttrList */ + nil, /* -> */ + nil, /* -- */ + reduce(29), /* id, reduce: AttrList */ + + }, + }, + actionRow{ // S69 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + shift(98), /* ] */ + shift(100), /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(71), /* id */ + + }, + }, + actionRow{ // S70 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + reduce(33), /* ], reduce: AList */ + reduce(33), /* ,, reduce: AList */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + reduce(33), /* id, reduce: AList */ + + }, + }, + actionRow{ // S71 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + reduce(57), /* =, reduce: Id */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + reduce(57), /* ], reduce: Id */ + reduce(57), /* ,, reduce: Id */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + reduce(57), /* id, reduce: Id */ + + }, + }, + actionRow{ // S72 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(52), /* graphx, reduce: SubGraphStmt */ + reduce(52), /* {, reduce: SubGraphStmt */ + reduce(52), /* }, reduce: SubGraphStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(52), /* ;, reduce: SubGraphStmt */ + nil, /* = */ + reduce(52), /* node, reduce: SubGraphStmt */ + reduce(52), /* edge, reduce: SubGraphStmt */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(52), /* subgraph, reduce: SubGraphStmt */ + reduce(52), /* ->, reduce: SubGraphStmt */ + reduce(52), /* --, reduce: SubGraphStmt */ + reduce(52), /* id, reduce: SubGraphStmt */ + + }, + }, + actionRow{ // S73 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(21), /* graphx, reduce: Stmt */ + reduce(21), /* {, reduce: Stmt */ + reduce(21), /* }, reduce: Stmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(21), /* ;, reduce: Stmt */ + nil, /* = */ + reduce(21), /* node, reduce: Stmt */ + reduce(21), /* edge, reduce: Stmt */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(21), /* subgraph, reduce: Stmt */ + nil, /* -> */ + nil, /* -- */ + reduce(21), /* id, reduce: Stmt */ + + }, + }, + actionRow{ // S74 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(57), /* graphx, reduce: Id */ + reduce(57), /* {, reduce: Id */ + reduce(57), /* }, reduce: Id */ + nil, /* strict */ + nil, /* digraph */ + reduce(57), /* ;, reduce: Id */ + nil, /* = */ + reduce(57), /* node, reduce: Id */ + reduce(57), /* edge, reduce: Id */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(57), /* subgraph, reduce: Id */ + nil, /* -> */ + nil, /* -- */ + reduce(57), /* id, reduce: Id */ + + }, + }, + actionRow{ // S75 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(50), /* graphx, reduce: Port */ + reduce(50), /* {, reduce: Port */ + reduce(50), /* }, reduce: Port */ + nil, /* strict */ + nil, /* digraph */ + reduce(50), /* ;, reduce: Port */ + nil, /* = */ + reduce(50), /* node, reduce: Port */ + reduce(50), /* edge, reduce: Port */ + reduce(50), /* [, reduce: Port */ + nil, /* ] */ + nil, /* , */ + shift(101), /* : */ + reduce(50), /* subgraph, reduce: Port */ + reduce(50), /* ->, reduce: Port */ + reduce(50), /* --, reduce: Port */ + reduce(50), /* id, reduce: Port */ + + }, + }, + actionRow{ // S76 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(57), /* graphx, reduce: Id */ + reduce(57), /* {, reduce: Id */ + reduce(57), /* }, reduce: Id */ + nil, /* strict */ + nil, /* digraph */ + reduce(57), /* ;, reduce: Id */ + nil, /* = */ + reduce(57), /* node, reduce: Id */ + reduce(57), /* edge, reduce: Id */ + reduce(57), /* [, reduce: Id */ + nil, /* ] */ + nil, /* , */ + reduce(57), /* :, reduce: Id */ + reduce(57), /* subgraph, reduce: Id */ + reduce(57), /* ->, reduce: Id */ + reduce(57), /* --, reduce: Id */ + reduce(57), /* id, reduce: Id */ + + }, + }, + actionRow{ // S77 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(41), /* graphx, reduce: EdgeStmt */ + reduce(41), /* {, reduce: EdgeStmt */ + reduce(41), /* }, reduce: EdgeStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(41), /* ;, reduce: EdgeStmt */ + nil, /* = */ + reduce(41), /* node, reduce: EdgeStmt */ + reduce(41), /* edge, reduce: EdgeStmt */ + shift(66), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(41), /* subgraph, reduce: EdgeStmt */ + nil, /* -> */ + nil, /* -- */ + reduce(41), /* id, reduce: EdgeStmt */ + + }, + }, + actionRow{ // S78 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(79), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(83), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(76), /* id */ + + }, + }, + actionRow{ // S79 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S80 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(48), /* graphx, reduce: NodeId */ + reduce(48), /* {, reduce: NodeId */ + reduce(48), /* }, reduce: NodeId */ + nil, /* strict */ + nil, /* digraph */ + reduce(48), /* ;, reduce: NodeId */ + nil, /* = */ + reduce(48), /* node, reduce: NodeId */ + reduce(48), /* edge, reduce: NodeId */ + reduce(48), /* [, reduce: NodeId */ + nil, /* ] */ + nil, /* , */ + shift(41), /* : */ + reduce(48), /* subgraph, reduce: NodeId */ + reduce(48), /* ->, reduce: NodeId */ + reduce(48), /* --, reduce: NodeId */ + reduce(48), /* id, reduce: NodeId */ + + }, + }, + actionRow{ // S81 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(43), /* graphx, reduce: EdgeRHS */ + reduce(43), /* {, reduce: EdgeRHS */ + reduce(43), /* }, reduce: EdgeRHS */ + nil, /* strict */ + nil, /* digraph */ + reduce(43), /* ;, reduce: EdgeRHS */ + nil, /* = */ + reduce(43), /* node, reduce: EdgeRHS */ + reduce(43), /* edge, reduce: EdgeRHS */ + reduce(43), /* [, reduce: EdgeRHS */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(43), /* subgraph, reduce: EdgeRHS */ + reduce(43), /* ->, reduce: EdgeRHS */ + reduce(43), /* --, reduce: EdgeRHS */ + reduce(43), /* id, reduce: EdgeRHS */ + + }, + }, + actionRow{ // S82 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(42), /* graphx, reduce: EdgeRHS */ + reduce(42), /* {, reduce: EdgeRHS */ + reduce(42), /* }, reduce: EdgeRHS */ + nil, /* strict */ + nil, /* digraph */ + reduce(42), /* ;, reduce: EdgeRHS */ + nil, /* = */ + reduce(42), /* node, reduce: EdgeRHS */ + reduce(42), /* edge, reduce: EdgeRHS */ + reduce(42), /* [, reduce: EdgeRHS */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(42), /* subgraph, reduce: EdgeRHS */ + reduce(42), /* ->, reduce: EdgeRHS */ + reduce(42), /* --, reduce: EdgeRHS */ + reduce(42), /* id, reduce: EdgeRHS */ + + }, + }, + actionRow{ // S83 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(105), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(7), /* id */ + + }, + }, + actionRow{ // S84 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(39), /* graphx, reduce: EdgeStmt */ + reduce(39), /* {, reduce: EdgeStmt */ + reduce(39), /* }, reduce: EdgeStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(39), /* ;, reduce: EdgeStmt */ + nil, /* = */ + reduce(39), /* node, reduce: EdgeStmt */ + reduce(39), /* edge, reduce: EdgeStmt */ + shift(66), /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(39), /* subgraph, reduce: EdgeStmt */ + nil, /* -> */ + nil, /* -- */ + reduce(39), /* id, reduce: EdgeStmt */ + + }, + }, + actionRow{ // S85 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(107), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S86 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S87 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(6), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S88 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(7), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S89 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(4), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S90 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(109), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S91 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(15), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S92 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(12), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S93 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(110), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S94 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(14), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S95 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(31), /* graphx, reduce: AttrList */ + reduce(31), /* {, reduce: AttrList */ + reduce(31), /* }, reduce: AttrList */ + nil, /* strict */ + nil, /* digraph */ + reduce(31), /* ;, reduce: AttrList */ + nil, /* = */ + reduce(31), /* node, reduce: AttrList */ + reduce(31), /* edge, reduce: AttrList */ + reduce(31), /* [, reduce: AttrList */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(31), /* subgraph, reduce: AttrList */ + nil, /* -> */ + nil, /* -- */ + reduce(31), /* id, reduce: AttrList */ + + }, + }, + actionRow{ // S96 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + shift(111), /* ] */ + shift(100), /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(71), /* id */ + + }, + }, + actionRow{ // S97 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(113), /* id */ + + }, + }, + actionRow{ // S98 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(30), /* graphx, reduce: AttrList */ + reduce(30), /* {, reduce: AttrList */ + reduce(30), /* }, reduce: AttrList */ + nil, /* strict */ + nil, /* digraph */ + reduce(30), /* ;, reduce: AttrList */ + nil, /* = */ + reduce(30), /* node, reduce: AttrList */ + reduce(30), /* edge, reduce: AttrList */ + reduce(30), /* [, reduce: AttrList */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(30), /* subgraph, reduce: AttrList */ + nil, /* -> */ + nil, /* -- */ + reduce(30), /* id, reduce: AttrList */ + + }, + }, + actionRow{ // S99 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + reduce(34), /* ], reduce: AList */ + reduce(34), /* ,, reduce: AList */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + reduce(34), /* id, reduce: AList */ + + }, + }, + actionRow{ // S100 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(71), /* id */ + + }, + }, + actionRow{ // S101 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(116), /* id */ + + }, + }, + actionRow{ // S102 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(45), /* graphx, reduce: EdgeRHS */ + reduce(45), /* {, reduce: EdgeRHS */ + reduce(45), /* }, reduce: EdgeRHS */ + nil, /* strict */ + nil, /* digraph */ + reduce(45), /* ;, reduce: EdgeRHS */ + nil, /* = */ + reduce(45), /* node, reduce: EdgeRHS */ + reduce(45), /* edge, reduce: EdgeRHS */ + reduce(45), /* [, reduce: EdgeRHS */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(45), /* subgraph, reduce: EdgeRHS */ + reduce(45), /* ->, reduce: EdgeRHS */ + reduce(45), /* --, reduce: EdgeRHS */ + reduce(45), /* id, reduce: EdgeRHS */ + + }, + }, + actionRow{ // S103 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(44), /* graphx, reduce: EdgeRHS */ + reduce(44), /* {, reduce: EdgeRHS */ + reduce(44), /* }, reduce: EdgeRHS */ + nil, /* strict */ + nil, /* digraph */ + reduce(44), /* ;, reduce: EdgeRHS */ + nil, /* = */ + reduce(44), /* node, reduce: EdgeRHS */ + reduce(44), /* edge, reduce: EdgeRHS */ + reduce(44), /* [, reduce: EdgeRHS */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(44), /* subgraph, reduce: EdgeRHS */ + reduce(44), /* ->, reduce: EdgeRHS */ + reduce(44), /* --, reduce: EdgeRHS */ + reduce(44), /* id, reduce: EdgeRHS */ + + }, + }, + actionRow{ // S104 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(117), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S105 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S106 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + shift(119), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S107 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(53), /* graphx, reduce: SubGraphStmt */ + reduce(53), /* {, reduce: SubGraphStmt */ + reduce(53), /* }, reduce: SubGraphStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(53), /* ;, reduce: SubGraphStmt */ + nil, /* = */ + reduce(53), /* node, reduce: SubGraphStmt */ + reduce(53), /* edge, reduce: SubGraphStmt */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(53), /* subgraph, reduce: SubGraphStmt */ + reduce(53), /* ->, reduce: SubGraphStmt */ + reduce(53), /* --, reduce: SubGraphStmt */ + reduce(53), /* id, reduce: SubGraphStmt */ + + }, + }, + actionRow{ // S108 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(120), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S109 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(8), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S110 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + reduce(16), /* $, reduce: DotGraph */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + nil, /* id */ + + }, + }, + actionRow{ // S111 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(32), /* graphx, reduce: AttrList */ + reduce(32), /* {, reduce: AttrList */ + reduce(32), /* }, reduce: AttrList */ + nil, /* strict */ + nil, /* digraph */ + reduce(32), /* ;, reduce: AttrList */ + nil, /* = */ + reduce(32), /* node, reduce: AttrList */ + reduce(32), /* edge, reduce: AttrList */ + reduce(32), /* [, reduce: AttrList */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(32), /* subgraph, reduce: AttrList */ + nil, /* -> */ + nil, /* -- */ + reduce(32), /* id, reduce: AttrList */ + + }, + }, + actionRow{ // S112 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + reduce(37), /* ], reduce: Attr */ + reduce(37), /* ,, reduce: Attr */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + reduce(37), /* id, reduce: Attr */ + + }, + }, + actionRow{ // S113 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + reduce(57), /* ], reduce: Id */ + reduce(57), /* ,, reduce: Id */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + reduce(57), /* id, reduce: Id */ + + }, + }, + actionRow{ // S114 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + nil, /* graphx */ + nil, /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + nil, /* node */ + nil, /* edge */ + nil, /* [ */ + reduce(35), /* ], reduce: AList */ + reduce(35), /* ,, reduce: AList */ + nil, /* : */ + nil, /* subgraph */ + nil, /* -> */ + nil, /* -- */ + reduce(35), /* id, reduce: AList */ + + }, + }, + actionRow{ // S115 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(51), /* graphx, reduce: Port */ + reduce(51), /* {, reduce: Port */ + reduce(51), /* }, reduce: Port */ + nil, /* strict */ + nil, /* digraph */ + reduce(51), /* ;, reduce: Port */ + nil, /* = */ + reduce(51), /* node, reduce: Port */ + reduce(51), /* edge, reduce: Port */ + reduce(51), /* [, reduce: Port */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(51), /* subgraph, reduce: Port */ + reduce(51), /* ->, reduce: Port */ + reduce(51), /* --, reduce: Port */ + reduce(51), /* id, reduce: Port */ + + }, + }, + actionRow{ // S116 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(57), /* graphx, reduce: Id */ + reduce(57), /* {, reduce: Id */ + reduce(57), /* }, reduce: Id */ + nil, /* strict */ + nil, /* digraph */ + reduce(57), /* ;, reduce: Id */ + nil, /* = */ + reduce(57), /* node, reduce: Id */ + reduce(57), /* edge, reduce: Id */ + reduce(57), /* [, reduce: Id */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(57), /* subgraph, reduce: Id */ + reduce(57), /* ->, reduce: Id */ + reduce(57), /* --, reduce: Id */ + reduce(57), /* id, reduce: Id */ + + }, + }, + actionRow{ // S117 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(52), /* graphx, reduce: SubGraphStmt */ + reduce(52), /* {, reduce: SubGraphStmt */ + reduce(52), /* }, reduce: SubGraphStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(52), /* ;, reduce: SubGraphStmt */ + nil, /* = */ + reduce(52), /* node, reduce: SubGraphStmt */ + reduce(52), /* edge, reduce: SubGraphStmt */ + reduce(52), /* [, reduce: SubGraphStmt */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(52), /* subgraph, reduce: SubGraphStmt */ + reduce(52), /* ->, reduce: SubGraphStmt */ + reduce(52), /* --, reduce: SubGraphStmt */ + reduce(52), /* id, reduce: SubGraphStmt */ + + }, + }, + actionRow{ // S118 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(121), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S119 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + nil, /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S120 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(54), /* graphx, reduce: SubGraphStmt */ + reduce(54), /* {, reduce: SubGraphStmt */ + reduce(54), /* }, reduce: SubGraphStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(54), /* ;, reduce: SubGraphStmt */ + nil, /* = */ + reduce(54), /* node, reduce: SubGraphStmt */ + reduce(54), /* edge, reduce: SubGraphStmt */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(54), /* subgraph, reduce: SubGraphStmt */ + reduce(54), /* ->, reduce: SubGraphStmt */ + reduce(54), /* --, reduce: SubGraphStmt */ + reduce(54), /* id, reduce: SubGraphStmt */ + + }, + }, + actionRow{ // S121 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(53), /* graphx, reduce: SubGraphStmt */ + reduce(53), /* {, reduce: SubGraphStmt */ + reduce(53), /* }, reduce: SubGraphStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(53), /* ;, reduce: SubGraphStmt */ + nil, /* = */ + reduce(53), /* node, reduce: SubGraphStmt */ + reduce(53), /* edge, reduce: SubGraphStmt */ + reduce(53), /* [, reduce: SubGraphStmt */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(53), /* subgraph, reduce: SubGraphStmt */ + reduce(53), /* ->, reduce: SubGraphStmt */ + reduce(53), /* --, reduce: SubGraphStmt */ + reduce(53), /* id, reduce: SubGraphStmt */ + + }, + }, + actionRow{ // S122 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + shift(12), /* graphx */ + shift(13), /* { */ + shift(123), /* } */ + nil, /* strict */ + nil, /* digraph */ + nil, /* ; */ + nil, /* = */ + shift(23), /* node */ + shift(24), /* edge */ + nil, /* [ */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + shift(26), /* subgraph */ + nil, /* -> */ + nil, /* -- */ + shift(27), /* id */ + + }, + }, + actionRow{ // S123 + canRecover: false, + actions: [numSymbols]action{ + nil, /* INVALID */ + nil, /* $ */ + reduce(54), /* graphx, reduce: SubGraphStmt */ + reduce(54), /* {, reduce: SubGraphStmt */ + reduce(54), /* }, reduce: SubGraphStmt */ + nil, /* strict */ + nil, /* digraph */ + reduce(54), /* ;, reduce: SubGraphStmt */ + nil, /* = */ + reduce(54), /* node, reduce: SubGraphStmt */ + reduce(54), /* edge, reduce: SubGraphStmt */ + reduce(54), /* [, reduce: SubGraphStmt */ + nil, /* ] */ + nil, /* , */ + nil, /* : */ + reduce(54), /* subgraph, reduce: SubGraphStmt */ + reduce(54), /* ->, reduce: SubGraphStmt */ + reduce(54), /* --, reduce: SubGraphStmt */ + reduce(54), /* id, reduce: SubGraphStmt */ + + }, + }, +} diff --git a/vendor/github.com/awalterschulze/gographviz/parser/gototable.go b/vendor/github.com/awalterschulze/gographviz/parser/gototable.go new file mode 100644 index 000000000..d2dc4cae9 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/parser/gototable.go @@ -0,0 +1,2493 @@ +// generated by gocc; DO NOT EDIT. + +package parser + +const numNTSymbols = 17 + +type ( + gotoTable [numStates]gotoRow + gotoRow [numNTSymbols]int +) + +var gotoTab = gotoTable{ + gotoRow{ // S0 + -1, // S' + 1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S1 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S2 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 6, // Id + + }, + gotoRow{ // S3 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S4 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 11, // Id + + }, + gotoRow{ // S5 + -1, // S' + -1, // DotGraph + 16, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S6 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S7 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S8 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 30, // Id + + }, + gotoRow{ // S9 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 32, // Id + + }, + gotoRow{ // S10 + -1, // S' + -1, // DotGraph + 34, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S11 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S12 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + 36, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S13 + -1, // S' + -1, // DotGraph + 38, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S14 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S15 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + 40, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S16 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S17 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S18 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S19 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S20 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S21 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S22 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + 45, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + 46, // EdgeOp + -1, // Id + + }, + gotoRow{ // S23 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + 49, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S24 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + 50, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S25 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + 51, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + 52, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + 46, // EdgeOp + -1, // Id + + }, + gotoRow{ // S26 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 54, // Id + + }, + gotoRow{ // S27 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S28 + -1, // S' + -1, // DotGraph + 56, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S29 + -1, // S' + -1, // DotGraph + 58, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S30 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S31 + -1, // S' + -1, // DotGraph + 61, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S32 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S33 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S34 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S35 + -1, // S' + -1, // DotGraph + 65, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S36 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S37 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + 69, // AList + 70, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 67, // Id + + }, + gotoRow{ // S38 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S39 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 73, // Id + + }, + gotoRow{ // S40 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S41 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 75, // Id + + }, + gotoRow{ // S42 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S43 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S44 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S45 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + 77, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + 78, // EdgeOp + -1, // Id + + }, + gotoRow{ // S46 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + 82, // NodeId + -1, // Port + 81, // SubGraphStmt + -1, // EdgeOp + 80, // Id + + }, + gotoRow{ // S47 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S48 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S49 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S50 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S51 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S52 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + 84, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + 78, // EdgeOp + -1, // Id + + }, + gotoRow{ // S53 + -1, // S' + -1, // DotGraph + 85, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S54 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S55 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S56 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S57 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S58 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S59 + -1, // S' + -1, // DotGraph + 90, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S60 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S61 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S62 + -1, // S' + -1, // DotGraph + 93, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S63 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S64 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S65 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S66 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + 96, // AList + 70, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 67, // Id + + }, + gotoRow{ // S67 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S68 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S69 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + 99, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 67, // Id + + }, + gotoRow{ // S70 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S71 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S72 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S73 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S74 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S75 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S76 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S77 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S78 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + 103, // NodeId + -1, // Port + 102, // SubGraphStmt + -1, // EdgeOp + 80, // Id + + }, + gotoRow{ // S79 + -1, // S' + -1, // DotGraph + 104, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S80 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + 40, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S81 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S82 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S83 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 106, // Id + + }, + gotoRow{ // S84 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S85 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S86 + -1, // S' + -1, // DotGraph + 108, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S87 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S88 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S89 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S90 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S91 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S92 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S93 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S94 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S95 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S96 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + 99, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 67, // Id + + }, + gotoRow{ // S97 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 112, // Id + + }, + gotoRow{ // S98 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S99 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S100 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + 114, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 67, // Id + + }, + gotoRow{ // S101 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + 115, // Id + + }, + gotoRow{ // S102 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S103 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S104 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S105 + -1, // S' + -1, // DotGraph + 118, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S106 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S107 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S108 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S109 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S110 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S111 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S112 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S113 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S114 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S115 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S116 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S117 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S118 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S119 + -1, // S' + -1, // DotGraph + 122, // StmtList + 17, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S120 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S121 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, + gotoRow{ // S122 + -1, // S' + -1, // DotGraph + -1, // StmtList + 43, // Stmt1 + 18, // Stmt + 21, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + 20, // EdgeStmt + -1, // EdgeRHS + 19, // NodeStmt + 25, // NodeId + -1, // Port + 22, // SubGraphStmt + -1, // EdgeOp + 15, // Id + + }, + gotoRow{ // S123 + -1, // S' + -1, // DotGraph + -1, // StmtList + -1, // Stmt1 + -1, // Stmt + -1, // AttrStmt + -1, // AttrList + -1, // AList + -1, // Attr + -1, // EdgeStmt + -1, // EdgeRHS + -1, // NodeStmt + -1, // NodeId + -1, // Port + -1, // SubGraphStmt + -1, // EdgeOp + -1, // Id + + }, +} diff --git a/vendor/github.com/awalterschulze/gographviz/parser/main.go b/vendor/github.com/awalterschulze/gographviz/parser/main.go new file mode 100644 index 000000000..eafdb4ba1 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/parser/main.go @@ -0,0 +1,69 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +//A parser for the DOT grammar. +package parser + +import ( + "fmt" + "io" + "io/ioutil" + "os" + + "github.com/awalterschulze/gographviz/ast" + "github.com/awalterschulze/gographviz/lexer" +) + +//Parses a DOT string and outputs the +//abstract syntax tree representing the graph. +func ParseString(dotString string) (*ast.Graph, error) { + return ParseBytes([]byte(dotString)) +} + +//Parses the bytes representing a DOT string +//and outputs the abstract syntax tree representing the graph. +func ParseBytes(dotBytes []byte) (*ast.Graph, error) { + lex := lexer.NewLexer(dotBytes) + parser := NewParser() + st, err := parser.Parse(lex) + if err != nil { + return nil, err + } + g, ok := st.(*ast.Graph) + if !ok { + panic(fmt.Sprintf("Parser did not return an *ast.Graph, but rather a %T", st)) + } + return g, nil +} + +//Parses a reader which contains a DOT string +//and outputs the abstract syntax tree representing the graph. +func Parse(r io.Reader) (*ast.Graph, error) { + bytes, err := ioutil.ReadAll(r) + if err != nil { + return nil, err + } + return ParseBytes(bytes) +} + +//Parses a file which contains a DOT string +//and outputs the abstract syntax tree representing the graph. +func ParseFile(filename string) (*ast.Graph, error) { + f, err := os.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + return Parse(f) +} diff --git a/vendor/github.com/awalterschulze/gographviz/parser/parser.go b/vendor/github.com/awalterschulze/gographviz/parser/parser.go new file mode 100644 index 000000000..a71c43438 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/parser/parser.go @@ -0,0 +1,212 @@ +// generated by gocc; DO NOT EDIT. + +package parser + +import ( + "bytes" + "fmt" + + parseError "github.com/awalterschulze/gographviz/errors" + "github.com/awalterschulze/gographviz/token" +) + +const ( + numProductions = 58 + numStates = 124 + numSymbols = 36 +) + +// Stack + +type stack struct { + state []int + attrib []Attrib +} + +const iNITIAL_STACK_SIZE = 100 + +func newStack() *stack { + return &stack{state: make([]int, 0, iNITIAL_STACK_SIZE), + attrib: make([]Attrib, 0, iNITIAL_STACK_SIZE), + } +} + +func (this *stack) reset() { + this.state = this.state[0:0] + this.attrib = this.attrib[0:0] +} + +func (this *stack) push(s int, a Attrib) { + this.state = append(this.state, s) + this.attrib = append(this.attrib, a) +} + +func (this *stack) top() int { + return this.state[len(this.state)-1] +} + +func (this *stack) peek(pos int) int { + return this.state[pos] +} + +func (this *stack) topIndex() int { + return len(this.state) - 1 +} + +func (this *stack) popN(items int) []Attrib { + lo, hi := len(this.state)-items, len(this.state) + + attrib := this.attrib[lo:hi] + + this.state = this.state[:lo] + this.attrib = this.attrib[:lo] + + return attrib +} + +func (S *stack) String() string { + w := new(bytes.Buffer) + fmt.Fprintf(w, "stack:\n") + for i, st := range S.state { + fmt.Fprintf(w, "\t%d:%d , ", i, st) + if S.attrib[i] == nil { + fmt.Fprintf(w, "nil") + } else { + fmt.Fprintf(w, "%v", S.attrib[i]) + } + fmt.Fprintf(w, "\n") + } + return w.String() +} + +// Parser + +type Parser struct { + stack *stack + nextToken *token.Token + pos int +} + +type Scanner interface { + Scan() (tok *token.Token) +} + +func NewParser() *Parser { + p := &Parser{stack: newStack()} + p.Reset() + return p +} + +func (P *Parser) Reset() { + P.stack.reset() + P.stack.push(0, nil) +} + +func (P *Parser) Error(err error, scanner Scanner) (recovered bool, errorAttrib *parseError.Error) { + errorAttrib = &parseError.Error{ + Err: err, + ErrorToken: P.nextToken, + ErrorSymbols: P.popNonRecoveryStates(), + ExpectedTokens: make([]string, 0, 8), + } + for t, action := range actionTab[P.stack.top()].actions { + if action != nil { + errorAttrib.ExpectedTokens = append(errorAttrib.ExpectedTokens, token.TokMap.Id(token.Type(t))) + } + } + + if action := actionTab[P.stack.top()].actions[token.TokMap.Type("error")]; action != nil { + P.stack.push(int(action.(shift)), errorAttrib) // action can only be shift + } else { + return + } + + if action := actionTab[P.stack.top()].actions[P.nextToken.Type]; action != nil { + recovered = true + } + for !recovered && P.nextToken.Type != token.EOF { + P.nextToken = scanner.Scan() + if action := actionTab[P.stack.top()].actions[P.nextToken.Type]; action != nil { + recovered = true + } + } + + return +} + +func (P *Parser) popNonRecoveryStates() (removedAttribs []parseError.ErrorSymbol) { + if rs, ok := P.firstRecoveryState(); ok { + errorSymbols := P.stack.popN(int(P.stack.topIndex() - rs)) + removedAttribs = make([]parseError.ErrorSymbol, len(errorSymbols)) + for i, e := range errorSymbols { + removedAttribs[i] = e + } + } else { + removedAttribs = []parseError.ErrorSymbol{} + } + return +} + +// recoveryState points to the highest state on the stack, which can recover +func (P *Parser) firstRecoveryState() (recoveryState int, canRecover bool) { + recoveryState, canRecover = P.stack.topIndex(), actionTab[P.stack.top()].canRecover + for recoveryState > 0 && !canRecover { + recoveryState-- + canRecover = actionTab[P.stack.peek(recoveryState)].canRecover + } + return +} + +func (P *Parser) newError(err error) error { + e := &parseError.Error{ + Err: err, + StackTop: P.stack.top(), + ErrorToken: P.nextToken, + } + actRow := actionTab[P.stack.top()] + for i, t := range actRow.actions { + if t != nil { + e.ExpectedTokens = append(e.ExpectedTokens, token.TokMap.Id(token.Type(i))) + } + } + return e +} + +func (this *Parser) Parse(scanner Scanner) (res interface{}, err error) { + this.Reset() + this.nextToken = scanner.Scan() + for acc := false; !acc; { + action := actionTab[this.stack.top()].actions[this.nextToken.Type] + if action == nil { + if recovered, errAttrib := this.Error(nil, scanner); !recovered { + this.nextToken = errAttrib.ErrorToken + return nil, this.newError(nil) + } + if action = actionTab[this.stack.top()].actions[this.nextToken.Type]; action == nil { + panic("Error recovery led to invalid action") + } + } + + // fmt.Printf("S%d %s %s\n", this.stack.top(), token.TokMap.TokenString(this.nextToken), action.String()) + + switch act := action.(type) { + case accept: + res = this.stack.popN(1)[0] + acc = true + case shift: + this.stack.push(int(act), this.nextToken) + this.nextToken = scanner.Scan() + case reduce: + prod := productionsTable[int(act)] + attrib, err := prod.ReduceFunc(this.stack.popN(prod.NumSymbols)) + if err != nil { + return nil, this.newError(err) + } else { + this.stack.push(gotoTab[this.stack.top()][prod.NTType], attrib) + } + default: + panic("unknown action: " + action.String()) + } + } + return res, nil +} diff --git a/vendor/github.com/awalterschulze/gographviz/parser/parser_test.go b/vendor/github.com/awalterschulze/gographviz/parser/parser_test.go new file mode 100644 index 000000000..051d25476 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/parser/parser_test.go @@ -0,0 +1,294 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package parser + +import ( + "fmt" + "io/ioutil" + "testing" + + "github.com/awalterschulze/gographviz/ast" +) + +func check(t *testing.T, err error) { + if err != nil { + t.Fatalf("%v", err) + } +} + +func assert(t *testing.T, msg string, v1 interface{}, v2 interface{}) { + if v1 != v2 { + t.Fatalf("%v\n%v\n!=\n%v", msg, v1, v2) + } +} + +func parseTest(t *testing.T, filename string) { + localFilename := "../testdata/" + filename + s, err := ioutil.ReadFile(localFilename) + check(t, err) + t.Logf("Input String = %v", string(s)) + g, err := ParseFile(localFilename) + t.Logf("First Parse = %v", g) + check(t, err) + gstr := g.String() + g2, err := ParseString(gstr) + t.Logf("Second Parse = %v", g2) + check(t, err) + gstr2 := g2.String() + assert(t, "output strings", gstr, gstr2) +} + +func parseStringTest(t *testing.T, s string) { + t.Logf("Input String = %v", s) + g, err := ParseString(s) + t.Logf("First Parse = %v", g) + check(t, err) + gstr := g.String() + g2, err := ParseString(gstr) + t.Logf("Second Parse = %v", g2) + check(t, err) + gstr2 := g2.String() + assert(t, "output strings", gstr, gstr2) +} + +func TestHelloWorldString(t *testing.T) { + input := `digraph G {Hello->World}` + g, err := ParseString(input) + check(t, err) + fmt.Printf("%#v", g) +} + +func TestHelloWorldFile(t *testing.T) { + g, err := ParseFile("../testdata/helloworld.gv.txt") + check(t, err) + fmt.Printf("%#v", g) +} + +func TestAttr(t *testing.T) { + parseStringTest(t, + "digraph finite_state { rankdir = LR }") +} + +func TestString(t *testing.T) { + parseStringTest(t, + `digraph finite_state { rankdir = "LR" }`) +} + +func TestAttrList(t *testing.T) { + parseStringTest(t, ` +digraph { node [ shape = doublecircle ] }`) +} + +func TestStringLit(t *testing.T) { + parseStringTest(t, `digraph finite_state_machine { + size= "8" ; }`) +} + +func TestHashComments(t *testing.T) { + parseStringTest(t, `## bla \n + digraph G {Hello->World}`) +} + +func TestIntLit(t *testing.T) { + parseStringTest(t, `graph G { + 1 -- 30 [f=1];}`) +} + +func TestFloat1(t *testing.T) { + parseStringTest(t, `digraph { bla = 2.0 }`) +} + +func TestFloat2(t *testing.T) { + parseStringTest(t, `digraph { bla = .1 }`) +} + +func TestNegative(t *testing.T) { + parseStringTest(t, `digraph { -2 -> -1 }`) +} + +func TestUnderscore(t *testing.T) { + parseStringTest(t, `digraph { a_b = 1 }`) +} + +func TestNonAscii(t *testing.T) { + parseStringTest(t, `digraph { label=Tóth }`) +} + +func TestPorts(t *testing.T) { + parseStringTest(t, `digraph { "node6":f0 -> "node9":f1 }`) +} + +func TestHtml(t *testing.T) { + parseStringTest(t, `digraph { a = <
> }`) +} + +func TestIdWithKeyword(t *testing.T) { + parseStringTest(t, `digraph { edgeURL = "a" }`) +} + +func TestSubGraph(t *testing.T) { + parseStringTest(t, `digraph { subgraph { a -> b } }`) +} + +func TestImplicitSubGraph(t *testing.T) { + parseStringTest(t, `digraph { { a -> b } }`) +} + +func TestEdges(t *testing.T) { + parseStringTest(t, `digraph { a0 -> a1 -> a2 -> a3 }`) +} + +func TestNodes(t *testing.T) { + parseStringTest(t, `digraph { a0 a1 }`) +} + +func TestTwoAttributes(t *testing.T) { + g, err := ParseString(`digraph { a0 [shape = circle bla = bla]}`) + check(t, err) + t.Logf("Parsed String = %v", g) + for _, stmt := range g.StmtList { + node := stmt.(*ast.NodeStmt) + if len(node.Attrs[0]) != 2 { + t.Fatalf("Not enough attributes, expected two, but found %v in %v", len(node.Attrs), node) + } + } +} + +func TestEasyFsm(t *testing.T) { + parseStringTest(t, `digraph finite_state_machine { + rankdir=LR; + size="8,5"; + node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8; + node [shape = circle]; + LR_0 -> LR_2 [ label = "SS(B)" ]; + LR_0 -> LR_1 [ label = "SS(S)" ]; + LR_1 -> LR_3 [ label = "S($end)" ]; + LR_2 -> LR_6 [ label = "SS(b)" ]; + LR_2 -> LR_5 [ label = "SS(a)" ]; + LR_2 -> LR_4 [ label = "S(A)" ]; + LR_5 -> LR_7 [ label = "S(b)" ]; + LR_5 -> LR_5 [ label = "S(a)" ]; + LR_6 -> LR_6 [ label = "S(b)" ]; + LR_6 -> LR_5 [ label = "S(a)" ]; + LR_7 -> LR_8 [ label = "S(b)" ]; + LR_7 -> LR_5 [ label = "S(a)" ]; + LR_8 -> LR_6 [ label = "S(b)" ]; + LR_8 -> LR_5 [ label = "S(a)" ]; +}`) +} + +func TestEmptyAttrList(t *testing.T) { + parseStringTest(t, `digraph g { edge [ ] }`) +} + +func TestHelloWorld(t *testing.T) { + parseTest(t, "helloworld.gv.txt") +} + +func TestCluster(t *testing.T) { + parseTest(t, "cluster.gv.txt") +} + +func TestPsg(t *testing.T) { + parseTest(t, "psg.gv.txt") +} + +func TestTransparency(t *testing.T) { + parseTest(t, "transparency.gv.txt") +} + +func TestCrazy(t *testing.T) { + parseTest(t, "crazy.gv.txt") +} + +func TestKennedyanc(t *testing.T) { + parseTest(t, "kennedyanc.gv.txt") +} + +func TestRoot(t *testing.T) { + parseTest(t, "root.gv.txt") +} + +func TestTwpoi(t *testing.T) { + parseTest(t, "twopi.gv.txt") +} + +func TestDataStruct(t *testing.T) { + parseTest(t, "datastruct.gv.txt") +} + +func TestLionShare(t *testing.T) { + parseTest(t, "lion_share.gv.txt") +} + +func TestSdh(t *testing.T) { + parseTest(t, "sdh.gv.txt") +} + +func TestUnix(t *testing.T) { + parseTest(t, "unix.gv.txt") +} + +func TestEr(t *testing.T) { + parseTest(t, "er.gv.txt") +} + +func TestNerworkMapTwopi(t *testing.T) { + parseTest(t, "networkmap_twopi.gv.txt") +} + +func TestSibling(t *testing.T) { + parseTest(t, "siblings.gv.txt") +} + +func TestWorld(t *testing.T) { + parseTest(t, "world.gv.txt") +} + +func TestFdpclust(t *testing.T) { + parseTest(t, "fdpclust.gv.txt") +} + +func TestPhilo(t *testing.T) { + parseTest(t, "philo.gv.txt") +} + +func TestSoftmaint(t *testing.T) { + parseTest(t, "softmaint.gv.txt") +} + +func TestFsm(t *testing.T) { + parseTest(t, "fsm.gv.txt") +} + +func TestProcess(t *testing.T) { + parseTest(t, "process.gv.txt") +} + +func TestSwitchGv(t *testing.T) { + parseTest(t, "switch.gv.txt") +} + +func TestGd19942007(t *testing.T) { + parseTest(t, "gd_1994_2007.gv.txt") +} + +func TestProfile(t *testing.T) { + parseTest(t, "profile.gv.txt") +} + +func TestTrafficLights(t *testing.T) { + parseTest(t, "traffic_lights.gv.txt") +} diff --git a/vendor/github.com/awalterschulze/gographviz/parser/productionstable.go b/vendor/github.com/awalterschulze/gographviz/parser/productionstable.go new file mode 100644 index 000000000..b94b5b813 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/parser/productionstable.go @@ -0,0 +1,603 @@ +// generated by gocc; DO NOT EDIT. + +package parser + +import "github.com/awalterschulze/gographviz/ast" + +type ( + //TODO: change type and variable names to be consistent with other tables + ProdTab [numProductions]ProdTabEntry + ProdTabEntry struct { + String string + Id string + NTType int + Index int + NumSymbols int + ReduceFunc func([]Attrib) (Attrib, error) + } + Attrib interface { + } +) + +var productionsTable = ProdTab{ + ProdTabEntry{ + String: `S' : DotGraph << >>`, + Id: "S'", + NTType: 0, + Index: 0, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `DotGraph : graphx "{" "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, nil, nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 1, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.FALSE, nil, nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict graphx "{" "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, nil, nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 2, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.TRUE, nil, nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : graphx Id "{" "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, X[1], nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 3, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.FALSE, X[1], nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict graphx Id "{" "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, X[2], nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 4, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.TRUE, X[2], nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : graphx "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, nil, X[2]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 5, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.FALSE, nil, X[2]) + }, + }, + ProdTabEntry{ + String: `DotGraph : graphx Id "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.FALSE, X[1], X[3]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 6, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.FALSE, X[1], X[3]) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict graphx "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, nil, X[3]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 7, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.TRUE, nil, X[3]) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict graphx Id "{" StmtList "}" << ast.NewGraph(ast.GRAPH, ast.TRUE, X[2], X[4]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 8, + NumSymbols: 6, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.GRAPH, ast.TRUE, X[2], X[4]) + }, + }, + ProdTabEntry{ + String: `DotGraph : digraph "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, nil, nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 9, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.FALSE, nil, nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict digraph "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, nil, nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 10, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.TRUE, nil, nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : digraph Id "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, X[1], nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 11, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.FALSE, X[1], nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict digraph Id "{" "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, X[2], nil) >>`, + Id: "DotGraph", + NTType: 1, + Index: 12, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.TRUE, X[2], nil) + }, + }, + ProdTabEntry{ + String: `DotGraph : digraph "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, nil, X[2]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 13, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.FALSE, nil, X[2]) + }, + }, + ProdTabEntry{ + String: `DotGraph : digraph Id "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.FALSE, X[1], X[3]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 14, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.FALSE, X[1], X[3]) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict digraph "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, nil, X[3]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 15, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.TRUE, nil, X[3]) + }, + }, + ProdTabEntry{ + String: `DotGraph : strict digraph Id "{" StmtList "}" << ast.NewGraph(ast.DIGRAPH, ast.TRUE, X[2], X[4]) >>`, + Id: "DotGraph", + NTType: 1, + Index: 16, + NumSymbols: 6, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraph(ast.DIGRAPH, ast.TRUE, X[2], X[4]) + }, + }, + ProdTabEntry{ + String: `StmtList : Stmt1 << ast.NewStmtList(X[0]) >>`, + Id: "StmtList", + NTType: 2, + Index: 17, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewStmtList(X[0]) + }, + }, + ProdTabEntry{ + String: `StmtList : StmtList Stmt1 << ast.AppendStmtList(X[0], X[1]) >>`, + Id: "StmtList", + NTType: 2, + Index: 18, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendStmtList(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `Stmt1 : Stmt << X[0], nil >>`, + Id: "Stmt1", + NTType: 3, + Index: 19, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Stmt1 : Stmt ";" << X[0], nil >>`, + Id: "Stmt1", + NTType: 3, + Index: 20, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Stmt : Id "=" Id << ast.NewAttr(X[0], X[2]) >>`, + Id: "Stmt", + NTType: 4, + Index: 21, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAttr(X[0], X[2]) + }, + }, + ProdTabEntry{ + String: `Stmt : NodeStmt << X[0], nil >>`, + Id: "Stmt", + NTType: 4, + Index: 22, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Stmt : EdgeStmt << X[0], nil >>`, + Id: "Stmt", + NTType: 4, + Index: 23, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Stmt : AttrStmt << X[0], nil >>`, + Id: "Stmt", + NTType: 4, + Index: 24, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `Stmt : SubGraphStmt << X[0], nil >>`, + Id: "Stmt", + NTType: 4, + Index: 25, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return X[0], nil + }, + }, + ProdTabEntry{ + String: `AttrStmt : graphx AttrList << ast.NewGraphAttrs(X[1]) >>`, + Id: "AttrStmt", + NTType: 5, + Index: 26, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewGraphAttrs(X[1]) + }, + }, + ProdTabEntry{ + String: `AttrStmt : node AttrList << ast.NewNodeAttrs(X[1]) >>`, + Id: "AttrStmt", + NTType: 5, + Index: 27, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewNodeAttrs(X[1]) + }, + }, + ProdTabEntry{ + String: `AttrStmt : edge AttrList << ast.NewEdgeAttrs(X[1]) >>`, + Id: "AttrStmt", + NTType: 5, + Index: 28, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeAttrs(X[1]) + }, + }, + ProdTabEntry{ + String: `AttrList : "[" "]" << ast.NewAttrList(nil) >>`, + Id: "AttrList", + NTType: 6, + Index: 29, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAttrList(nil) + }, + }, + ProdTabEntry{ + String: `AttrList : "[" AList "]" << ast.NewAttrList(X[1]) >>`, + Id: "AttrList", + NTType: 6, + Index: 30, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAttrList(X[1]) + }, + }, + ProdTabEntry{ + String: `AttrList : AttrList "[" "]" << ast.AppendAttrList(X[0], nil) >>`, + Id: "AttrList", + NTType: 6, + Index: 31, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendAttrList(X[0], nil) + }, + }, + ProdTabEntry{ + String: `AttrList : AttrList "[" AList "]" << ast.AppendAttrList(X[0], X[2]) >>`, + Id: "AttrList", + NTType: 6, + Index: 32, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendAttrList(X[0], X[2]) + }, + }, + ProdTabEntry{ + String: `AList : Attr << ast.NewAList(X[0]) >>`, + Id: "AList", + NTType: 7, + Index: 33, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAList(X[0]) + }, + }, + ProdTabEntry{ + String: `AList : AList Attr << ast.AppendAList(X[0], X[1]) >>`, + Id: "AList", + NTType: 7, + Index: 34, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendAList(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `AList : AList "," Attr << ast.AppendAList(X[0], X[2]) >>`, + Id: "AList", + NTType: 7, + Index: 35, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendAList(X[0], X[2]) + }, + }, + ProdTabEntry{ + String: `Attr : Id << ast.NewAttr(X[0], nil) >>`, + Id: "Attr", + NTType: 8, + Index: 36, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAttr(X[0], nil) + }, + }, + ProdTabEntry{ + String: `Attr : Id "=" Id << ast.NewAttr(X[0], X[2]) >>`, + Id: "Attr", + NTType: 8, + Index: 37, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewAttr(X[0], X[2]) + }, + }, + ProdTabEntry{ + String: `EdgeStmt : NodeId EdgeRHS << ast.NewEdgeStmt(X[0], X[1], nil) >>`, + Id: "EdgeStmt", + NTType: 9, + Index: 38, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeStmt(X[0], X[1], nil) + }, + }, + ProdTabEntry{ + String: `EdgeStmt : NodeId EdgeRHS AttrList << ast.NewEdgeStmt(X[0], X[1], X[2]) >>`, + Id: "EdgeStmt", + NTType: 9, + Index: 39, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeStmt(X[0], X[1], X[2]) + }, + }, + ProdTabEntry{ + String: `EdgeStmt : SubGraphStmt EdgeRHS << ast.NewEdgeStmt(X[0], X[1], nil) >>`, + Id: "EdgeStmt", + NTType: 9, + Index: 40, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeStmt(X[0], X[1], nil) + }, + }, + ProdTabEntry{ + String: `EdgeStmt : SubGraphStmt EdgeRHS AttrList << ast.NewEdgeStmt(X[0], X[1], X[2]) >>`, + Id: "EdgeStmt", + NTType: 9, + Index: 41, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeStmt(X[0], X[1], X[2]) + }, + }, + ProdTabEntry{ + String: `EdgeRHS : EdgeOp NodeId << ast.NewEdgeRHS(X[0], X[1]) >>`, + Id: "EdgeRHS", + NTType: 10, + Index: 42, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeRHS(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `EdgeRHS : EdgeOp SubGraphStmt << ast.NewEdgeRHS(X[0], X[1]) >>`, + Id: "EdgeRHS", + NTType: 10, + Index: 43, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewEdgeRHS(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `EdgeRHS : EdgeRHS EdgeOp NodeId << ast.AppendEdgeRHS(X[0], X[1], X[2]) >>`, + Id: "EdgeRHS", + NTType: 10, + Index: 44, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendEdgeRHS(X[0], X[1], X[2]) + }, + }, + ProdTabEntry{ + String: `EdgeRHS : EdgeRHS EdgeOp SubGraphStmt << ast.AppendEdgeRHS(X[0], X[1], X[2]) >>`, + Id: "EdgeRHS", + NTType: 10, + Index: 45, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.AppendEdgeRHS(X[0], X[1], X[2]) + }, + }, + ProdTabEntry{ + String: `NodeStmt : NodeId << ast.NewNodeStmt(X[0], nil) >>`, + Id: "NodeStmt", + NTType: 11, + Index: 46, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewNodeStmt(X[0], nil) + }, + }, + ProdTabEntry{ + String: `NodeStmt : NodeId AttrList << ast.NewNodeStmt(X[0], X[1]) >>`, + Id: "NodeStmt", + NTType: 11, + Index: 47, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewNodeStmt(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `NodeId : Id << ast.NewNodeId(X[0], nil) >>`, + Id: "NodeId", + NTType: 12, + Index: 48, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewNodeId(X[0], nil) + }, + }, + ProdTabEntry{ + String: `NodeId : Id Port << ast.NewNodeId(X[0], X[1]) >>`, + Id: "NodeId", + NTType: 12, + Index: 49, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewNodeId(X[0], X[1]) + }, + }, + ProdTabEntry{ + String: `Port : ":" Id << ast.NewPort(X[1], nil) >>`, + Id: "Port", + NTType: 13, + Index: 50, + NumSymbols: 2, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewPort(X[1], nil) + }, + }, + ProdTabEntry{ + String: `Port : ":" Id ":" Id << ast.NewPort(X[1], X[3]) >>`, + Id: "Port", + NTType: 13, + Index: 51, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewPort(X[1], X[3]) + }, + }, + ProdTabEntry{ + String: `SubGraphStmt : "{" StmtList "}" << ast.NewSubGraph(nil, X[1]) >>`, + Id: "SubGraphStmt", + NTType: 14, + Index: 52, + NumSymbols: 3, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewSubGraph(nil, X[1]) + }, + }, + ProdTabEntry{ + String: `SubGraphStmt : subgraph "{" StmtList "}" << ast.NewSubGraph(nil, X[2]) >>`, + Id: "SubGraphStmt", + NTType: 14, + Index: 53, + NumSymbols: 4, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewSubGraph(nil, X[2]) + }, + }, + ProdTabEntry{ + String: `SubGraphStmt : subgraph Id "{" StmtList "}" << ast.NewSubGraph(X[1], X[3]) >>`, + Id: "SubGraphStmt", + NTType: 14, + Index: 54, + NumSymbols: 5, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewSubGraph(X[1], X[3]) + }, + }, + ProdTabEntry{ + String: `EdgeOp : "->" << ast.DIRECTED, nil >>`, + Id: "EdgeOp", + NTType: 15, + Index: 55, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.DIRECTED, nil + }, + }, + ProdTabEntry{ + String: `EdgeOp : "--" << ast.UNDIRECTED, nil >>`, + Id: "EdgeOp", + NTType: 15, + Index: 56, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.UNDIRECTED, nil + }, + }, + ProdTabEntry{ + String: `Id : id << ast.NewId(X[0]) >>`, + Id: "Id", + NTType: 16, + Index: 57, + NumSymbols: 1, + ReduceFunc: func(X []Attrib) (Attrib, error) { + return ast.NewId(X[0]) + }, + }, +} diff --git a/vendor/github.com/awalterschulze/gographviz/relations.go b/vendor/github.com/awalterschulze/gographviz/relations.go new file mode 100644 index 000000000..088085cd9 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/relations.go @@ -0,0 +1,52 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "sort" +) + +//Represents the relations between graphs and nodes. +//Each node belongs the main graph or a subgraph. +type Relations struct { + ParentToChildren map[string]map[string]bool + ChildToParents map[string]map[string]bool +} + +//Creates an empty set of relations. +func NewRelations() *Relations { + return &Relations{make(map[string]map[string]bool), make(map[string]map[string]bool)} +} + +//Adds a node to a parent graph. +func (this *Relations) Add(parent string, child string) { + if _, ok := this.ParentToChildren[parent]; !ok { + this.ParentToChildren[parent] = make(map[string]bool) + } + this.ParentToChildren[parent][child] = true + if _, ok := this.ChildToParents[child]; !ok { + this.ChildToParents[child] = make(map[string]bool) + } + this.ChildToParents[child][parent] = true +} + +func (this *Relations) SortedChildren(parent string) []string { + keys := make([]string, 0) + for key := range this.ParentToChildren[parent] { + keys = append(keys, key) + } + sort.Strings(keys) + return keys +} diff --git a/vendor/github.com/awalterschulze/gographviz/subgraphs.go b/vendor/github.com/awalterschulze/gographviz/subgraphs.go new file mode 100644 index 000000000..2f33e06ad --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/subgraphs.go @@ -0,0 +1,63 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "sort" +) + +//Represents a Subgraph. +type SubGraph struct { + Attrs Attrs + Name string +} + +//Creates a new Subgraph. +func NewSubGraph(name string) *SubGraph { + return &SubGraph{ + Attrs: make(Attrs), + Name: name, + } +} + +//Represents a set of SubGraphs. +type SubGraphs struct { + SubGraphs map[string]*SubGraph +} + +//Creates a new blank set of SubGraphs. +func NewSubGraphs() *SubGraphs { + return &SubGraphs{make(map[string]*SubGraph)} +} + +//Adds and creates a new Subgraph to the set of SubGraphs. +func (this *SubGraphs) Add(name string) { + if _, ok := this.SubGraphs[name]; !ok { + this.SubGraphs[name] = NewSubGraph(name) + } +} + +func (this *SubGraphs) Sorted() []*SubGraph { + keys := make([]string, 0) + for key := range this.SubGraphs { + keys = append(keys, key) + } + sort.Strings(keys) + s := make([]*SubGraph, len(keys)) + for i, key := range keys { + s[i] = this.SubGraphs[key] + } + return s +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/README b/vendor/github.com/awalterschulze/gographviz/testdata/README new file mode 100644 index 000000000..e8bb70bab --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/README @@ -0,0 +1 @@ +These test graphs have been copied from the graphviz gallery found here http://www.graphviz.org/Gallery.php \ No newline at end of file diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/cluster.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/cluster.gv.txt new file mode 100644 index 000000000..67dcd4c24 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/cluster.gv.txt @@ -0,0 +1,27 @@ +digraph G { + + subgraph cluster_0 { + style=filled; + color=lightgrey; + node [style=filled,color=white]; + a0 -> a1 -> a2 -> a3; + label = "process #1"; + } + + subgraph cluster_1 { + node [style=filled]; + b0 -> b1 -> b2 -> b3; + label = "process #2"; + color=blue + } + start -> a0; + start -> b0; + a1 -> b3; + b2 -> a3; + a3 -> a0; + a3 -> end; + b3 -> end; + + start [shape=Mdiamond]; + end [shape=Msquare]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/crazy.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/crazy.gv.txt new file mode 100644 index 000000000..b51d4987f --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/crazy.gv.txt @@ -0,0 +1,104 @@ +digraph "unix" { + graph [ fontname = "Helvetica-Oblique", + fontsize = 36, + label = "\n\n\n\nObject Oriented Graphs\nStephen North, 3/19/93", + size = "6,6" ]; + node [ shape = polygon, + sides = 4, + distortion = "0.0", + orientation = "0.0", + skew = "0.0", + color = white, + style = filled, + fontname = "Helvetica-Outline" ]; + "5th Edition" [sides=9, distortion="0.936354", orientation=28, skew="-0.126818", color=salmon2]; + "6th Edition" [sides=5, distortion="0.238792", orientation=11, skew="0.995935", color=deepskyblue]; + "PWB 1.0" [sides=8, distortion="0.019636", orientation=79, skew="-0.440424", color=goldenrod2]; + LSX [sides=9, distortion="-0.698271", orientation=22, skew="-0.195492", color=burlywood2]; + "1 BSD" [sides=7, distortion="0.265084", orientation=26, skew="0.403659", color=gold1]; + "Mini Unix" [distortion="0.039386", orientation=2, skew="-0.461120", color=greenyellow]; + Wollongong [sides=5, distortion="0.228564", orientation=63, skew="-0.062846", color=darkseagreen]; + Interdata [distortion="0.624013", orientation=56, skew="0.101396", color=dodgerblue1]; + "Unix/TS 3.0" [sides=8, distortion="0.731383", orientation=43, skew="-0.824612", color=thistle2]; + "PWB 2.0" [sides=6, distortion="0.592100", orientation=34, skew="-0.719269", color=darkolivegreen3]; + "7th Edition" [sides=10, distortion="0.298417", orientation=65, skew="0.310367", color=chocolate]; + "8th Edition" [distortion="-0.997093", orientation=50, skew="-0.061117", color=turquoise3]; + "32V" [sides=7, distortion="0.878516", orientation=19, skew="0.592905", color=steelblue3]; + V7M [sides=10, distortion="-0.960249", orientation=32, skew="0.460424", color=navy]; + "Ultrix-11" [sides=10, distortion="-0.633186", orientation=10, skew="0.333125", color=darkseagreen4]; + Xenix [sides=8, distortion="-0.337997", orientation=52, skew="-0.760726", color=coral]; + "UniPlus+" [sides=7, distortion="0.788483", orientation=39, skew="-0.526284", color=darkolivegreen3]; + "9th Edition" [sides=7, distortion="0.138690", orientation=55, skew="0.554049", color=coral3]; + "2 BSD" [sides=7, distortion="-0.010661", orientation=84, skew="0.179249", color=blanchedalmond]; + "2.8 BSD" [distortion="-0.239422", orientation=44, skew="0.053841", color=lightskyblue1]; + "2.9 BSD" [distortion="-0.843381", orientation=70, skew="-0.601395", color=aquamarine2]; + "3 BSD" [sides=10, distortion="0.251820", orientation=18, skew="-0.530618", color=lemonchiffon]; + "4 BSD" [sides=5, distortion="-0.772300", orientation=24, skew="-0.028475", color=darkorange1]; + "4.1 BSD" [distortion="-0.226170", orientation=38, skew="0.504053", color=lightyellow1]; + "4.2 BSD" [sides=10, distortion="-0.807349", orientation=50, skew="-0.908842", color=darkorchid4]; + "4.3 BSD" [sides=10, distortion="-0.030619", orientation=76, skew="0.985021", color=lemonchiffon2]; + "Ultrix-32" [distortion="-0.644209", orientation=21, skew="0.307836", color=goldenrod3]; + "PWB 1.2" [sides=7, distortion="0.640971", orientation=84, skew="-0.768455", color=cyan]; + "USG 1.0" [distortion="0.758942", orientation=42, skew="0.039886", color=blue]; + "CB Unix 1" [sides=9, distortion="-0.348692", orientation=42, skew="0.767058", color=firebrick]; + "USG 2.0" [distortion="0.748625", orientation=74, skew="-0.647656", color=chartreuse4]; + "CB Unix 2" [sides=10, distortion="0.851818", orientation=32, skew="-0.020120", color=greenyellow]; + "CB Unix 3" [sides=10, distortion="0.992237", orientation=29, skew="0.256102", color=bisque4]; + "Unix/TS++" [sides=6, distortion="0.545461", orientation=16, skew="0.313589", color=mistyrose2]; + "PDP-11 Sys V" [sides=9, distortion="-0.267769", orientation=40, skew="0.271226", color=cadetblue1]; + "USG 3.0" [distortion="-0.848455", orientation=44, skew="0.267152", color=bisque2]; + "Unix/TS 1.0" [distortion="0.305594", orientation=75, skew="0.070516", color=orangered]; + "TS 4.0" [sides=10, distortion="-0.641701", orientation=50, skew="-0.952502", color=crimson]; + "System V.0" [sides=9, distortion="0.021556", orientation=26, skew="-0.729938", color=darkorange1]; + "System V.2" [sides=6, distortion="0.985153", orientation=33, skew="-0.399752", color=darkolivegreen4]; + "System V.3" [sides=7, distortion="-0.687574", orientation=58, skew="-0.180116", color=lightsteelblue1]; + "5th Edition" -> "6th Edition"; + "5th Edition" -> "PWB 1.0"; + "6th Edition" -> LSX; + "6th Edition" -> "1 BSD"; + "6th Edition" -> "Mini Unix"; + "6th Edition" -> Wollongong; + "6th Edition" -> Interdata; + Interdata -> "Unix/TS 3.0"; + Interdata -> "PWB 2.0"; + Interdata -> "7th Edition"; + "7th Edition" -> "8th Edition"; + "7th Edition" -> "32V"; + "7th Edition" -> V7M; + "7th Edition" -> "Ultrix-11"; + "7th Edition" -> Xenix; + "7th Edition" -> "UniPlus+"; + V7M -> "Ultrix-11"; + "8th Edition" -> "9th Edition"; + "1 BSD" -> "2 BSD"; + "2 BSD" -> "2.8 BSD"; + "2.8 BSD" -> "Ultrix-11"; + "2.8 BSD" -> "2.9 BSD"; + "32V" -> "3 BSD"; + "3 BSD" -> "4 BSD"; + "4 BSD" -> "4.1 BSD"; + "4.1 BSD" -> "4.2 BSD"; + "4.1 BSD" -> "2.8 BSD"; + "4.1 BSD" -> "8th Edition"; + "4.2 BSD" -> "4.3 BSD"; + "4.2 BSD" -> "Ultrix-32"; + "PWB 1.0" -> "PWB 1.2"; + "PWB 1.0" -> "USG 1.0"; + "PWB 1.2" -> "PWB 2.0"; + "USG 1.0" -> "CB Unix 1"; + "USG 1.0" -> "USG 2.0"; + "CB Unix 1" -> "CB Unix 2"; + "CB Unix 2" -> "CB Unix 3"; + "CB Unix 3" -> "Unix/TS++"; + "CB Unix 3" -> "PDP-11 Sys V"; + "USG 2.0" -> "USG 3.0"; + "USG 3.0" -> "Unix/TS 3.0"; + "PWB 2.0" -> "Unix/TS 3.0"; + "Unix/TS 1.0" -> "Unix/TS 3.0"; + "Unix/TS 3.0" -> "TS 4.0"; + "Unix/TS++" -> "TS 4.0"; + "CB Unix 3" -> "TS 4.0"; + "TS 4.0" -> "System V.0"; + "System V.0" -> "System V.2"; + "System V.2" -> "System V.3"; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/datastruct.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/datastruct.gv.txt new file mode 100644 index 000000000..e68eb33e2 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/datastruct.gv.txt @@ -0,0 +1,114 @@ +digraph g { +graph [ +rankdir = "LR" +]; +node [ +fontsize = "16" +shape = "ellipse" +]; +edge [ +]; +"node0" [ +label = " 0x10ba8| " +shape = "record" +]; +"node1" [ +label = " 0xf7fc4380| | |-1" +shape = "record" +]; +"node2" [ +label = " 0xf7fc44b8| | |2" +shape = "record" +]; +"node3" [ +label = " 3.43322790286038071e-06|44.79998779296875|0" +shape = "record" +]; +"node4" [ +label = " 0xf7fc4380| | |2" +shape = "record" +]; +"node5" [ +label = " (nil)| | |-1" +shape = "record" +]; +"node6" [ +label = " 0xf7fc4380| | |1" +shape = "record" +]; +"node7" [ +label = " 0xf7fc4380| | |2" +shape = "record" +]; +"node8" [ +label = " (nil)| | |-1" +shape = "record" +]; +"node9" [ +label = " (nil)| | |-1" +shape = "record" +]; +"node10" [ +label = " (nil)| | |-1" +shape = "record" +]; +"node11" [ +label = " (nil)| | |-1" +shape = "record" +]; +"node12" [ +label = " 0xf7fc43e0| | |1" +shape = "record" +]; +"node0":f0 -> "node1":f0 [ +id = 0 +]; +"node0":f1 -> "node2":f0 [ +id = 1 +]; +"node1":f0 -> "node3":f0 [ +id = 2 +]; +"node1":f1 -> "node4":f0 [ +id = 3 +]; +"node1":f2 -> "node5":f0 [ +id = 4 +]; +"node4":f0 -> "node3":f0 [ +id = 5 +]; +"node4":f1 -> "node6":f0 [ +id = 6 +]; +"node4":f2 -> "node10":f0 [ +id = 7 +]; +"node6":f0 -> "node3":f0 [ +id = 8 +]; +"node6":f1 -> "node7":f0 [ +id = 9 +]; +"node6":f2 -> "node9":f0 [ +id = 10 +]; +"node7":f0 -> "node3":f0 [ +id = 11 +]; +"node7":f1 -> "node1":f0 [ +id = 12 +]; +"node7":f2 -> "node8":f0 [ +id = 13 +]; +"node10":f1 -> "node11":f0 [ +id = 14 +]; +"node10":f2 -> "node12":f0 [ +id = 15 +]; +"node11":f2 -> "node1":f0 [ +id = 16 +]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/er.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/er.gv.txt new file mode 100644 index 000000000..55060f2d7 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/er.gv.txt @@ -0,0 +1,22 @@ +graph ER { + node [shape=box]; course; institute; student; + node [shape=ellipse]; {node [label="name"] name0; name1; name2;} + code; grade; number; + node [shape=diamond,style=filled,color=lightgrey]; "C-I"; "S-C"; "S-I"; + + name0 -- course; + code -- course; + course -- "C-I" [label="n",len=1.00]; + "C-I" -- institute [label="1",len=1.00]; + institute -- name1; + institute -- "S-I" [label="1",len=1.00]; + "S-I" -- student [label="n",len=1.00]; + student -- grade; + student -- name2; + student -- number; + student -- "S-C" [label="m",len=1.00]; + "S-C" -- course [label="n",len=1.00]; + + label = "\n\nEntity Relation Diagram\ndrawn by NEATO"; + fontsize=20; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/fdpclust.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/fdpclust.gv.txt new file mode 100644 index 000000000..3b124cfcd --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/fdpclust.gv.txt @@ -0,0 +1,15 @@ +graph G { + e + subgraph clusterA { + a -- b; + subgraph clusterC { + C -- D; + } + } + subgraph clusterB { + d -- f + } + d -- D + e -- clusterB + clusterC -- clusterB +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/fsm.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/fsm.gv.txt new file mode 100644 index 000000000..e59b7c2dc --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/fsm.gv.txt @@ -0,0 +1,20 @@ +digraph finite_state_machine { + rankdir=LR; + size="8,5" + node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8; + node [shape = circle]; + LR_0 -> LR_2 [ label = "SS(B)" ]; + LR_0 -> LR_1 [ label = "SS(S)" ]; + LR_1 -> LR_3 [ label = "S($end)" ]; + LR_2 -> LR_6 [ label = "SS(b)" ]; + LR_2 -> LR_5 [ label = "SS(a)" ]; + LR_2 -> LR_4 [ label = "S(A)" ]; + LR_5 -> LR_7 [ label = "S(b)" ]; + LR_5 -> LR_5 [ label = "S(a)" ]; + LR_6 -> LR_6 [ label = "S(b)" ]; + LR_6 -> LR_5 [ label = "S(a)" ]; + LR_7 -> LR_8 [ label = "S(b)" ]; + LR_7 -> LR_5 [ label = "S(a)" ]; + LR_8 -> LR_6 [ label = "S(b)" ]; + LR_8 -> LR_5 [ label = "S(a)" ]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/gd_1994_2007.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/gd_1994_2007.gv.txt new file mode 100644 index 000000000..6645ff884 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/gd_1994_2007.gv.txt @@ -0,0 +1,1903 @@ +/* This is a co-authorship graph. Each node is an author and an edge exist between two authors if their name appears in a paper on one of the International Symposium on Graph Drawing bwteeen 1994-2007. The top 8 connected components is taken, and the graph is laidout using sfdp, and a map showing the clustering relationship is generated using gvmap with command: + +gvmap -e gd_1994_2007.gv | neato -Ecolor="#55555522" -n2 -Tpng > gd_1994_2007.png + +This graph already has coordinates assigned and overlap removed. For a graph not yet laidout, use a layout engine with a suitable overlap removal algorithm, e.g., + +sfdp -Goverlap=prism + +first before feeding the output to gvmap. + +*/ + +graph { + graph [charset=latin1, overlap_scaling=3, pack=90, label="Co-authorship graph for the International Symposiums on Graph Drawing, 1994-2007"]; + node [label="\N", width="0.001", height="0.001", margin="0.001"]; + graph [bb="0,0,1537.4,1200.5"]; + 127 [label=Lee, width="0.22222", height="0.15278", group=11, fontsize=7, pos="570.02,1089.4"]; + 131 [label=Robertson, width="0.52778", height="0.13889", group=11, fontsize=6, pos="616.67,1076.4"]; + 509 [label=Bederson, width="0.47222", height="0.13889", group=11, fontsize=6, pos="537.18,1070.5"]; + 410 [label=Nachmanson, width="0.66667", height="0.13889", group=11, fontsize=6, pos="610.55,1105.5"]; + 32 [label=Tóth, width="0.30556", height="0.18056", group=12, fontsize=8, pos="1025.2,394.21"]; + 391 [label=Kyncl, width="0.36111", height="0.15278", group=12, fontsize=7, pos="1162.2,354.41"]; + 99 [label=Pinchasi, width="0.44444", height="0.13889", group=12, fontsize=6, pos="1101,372.82"]; + 272 [label=Cerný, width="0.33333", height="0.15278", group=12, fontsize=7, pos="1178.6,378.07"]; + 87 [label=Keszegh, width="0.44444", height="0.13889", group=12, fontsize=6, pos="1060.5,374.88"]; + 498 [label=Pálvölgyi, width="0.47222", height="0.13889", group=12, fontsize=6, pos="1077.7,354.65"]; + 687 [label=Pach, width="0.36111", height="0.19444", group=12, fontsize=9, pos="1035.5,354.35"]; + 36 [label=Tardos, width="0.41667", height="0.15278", group=12, fontsize=7, pos="1122.3,354.19"]; + 454 [label=Thiele, width="0.36111", height="0.15278", group=12, fontsize=7, pos="956.8,410.02"]; + 90 [label=Finocchi, width="0.5", height="0.15278", group=22, fontsize=7, pos="584.56,703.73"]; + 427 [label=Pizzonia, width="0.55556", height="0.18056", group=22, fontsize=8, pos="632.76,702.8"]; + 261 [label="Di Battista", width="0.80556", height="0.19444", group=22, fontsize=9, pos="730.22,666.57"]; + 385 [label=Patrignani, width="0.77778", height="0.19444", group=22, fontsize=9, pos="577.66,606.48"]; + 102 [label=Liotta, width="0.47222", height="0.23611", group=22, fontsize=10, pos="657.21,601.24"]; + 276 [label=Thome, width="0.33333", height="0.13889", group=2, fontsize=6, pos="328.35,655.91"]; + 521 [label=Pouchkarev, width="0.61111", height="0.13889", group=2, fontsize=6, pos="285.66,660.24"]; + 294 [label=Mutzel, width="0.52778", height="0.19444", group=2, fontsize=9, pos="463.05,540.27"]; + 279 [label=Hundack, width="0.47222", height="0.13889", group=2, fontsize=6, pos="315.11,638"]; + 206 [label=Ahmed, width="0.38889", height="0.13889", group=10, fontsize=6, pos="390.78,326.1"]; + 659 [label=Forster, width="0.47222", height="0.18056", group=10, fontsize=8, pos="449.75,348.09"]; + 319 [label=Hong, width="0.41667", height="0.19444", group=10, fontsize=9, pos="369.57,355.33"]; + 567 [label=Murray, width="0.44444", height="0.15278", group=10, fontsize=7, pos="470.55,305.58"]; + 352 [label=Dwyer, width="0.47222", height="0.18056", group=10, fontsize=8, pos="434.1,326.59"]; + 648 [label=Taib, width="0.22222", height="0.13889", group=10, fontsize=6, pos="351.33,299.36"]; + 372 [label=Nikolov, width="0.47222", height="0.15278", group=10, fontsize=7, pos="360.79,262.65"]; + 550 [label=Fu, width="0.13889", height="0.13889", group=10, fontsize=6, pos="360.86,335.3"]; + 584 [label=Ho, width="0.19444", height="0.15278", group=10, fontsize=7, pos="405.61,306.07"]; + 698 [label=Koschutzki, width="0.58333", height="0.13889", group=10, fontsize=6, pos="429.21,286.93"]; + 504 [label=Tarassov, width="0.44444", height="0.13889", group=10, fontsize=6, pos="383.56,281.27"]; + 443 [label=McAllister, width="0.55556", height="0.13889", group=22, fontsize=6, pos="923.62,726.81"]; + 579 [label=Bose, width="0.33333", height="0.18056", group=22, fontsize=8, pos="894.64,661.79"]; + 71 [label=Purchase, width="0.52778", height="0.15278", group=10, fontsize=7, pos="410.08,131.11"]; + 155 [label=Cohen, width="0.36111", height="0.15278", group=10, fontsize=7, pos="465.04,216.62"]; + 326 [label=Görg, width="0.27778", height="0.15278", group=10, fontsize=7, pos="362.41,56.794"]; + 235 [label=Hoggan, width="0.41667", height="0.13889", group=10, fontsize=6, pos="373.78,75.433"]; + 520 [label=Allder, width="0.33333", height="0.13889", group=10, fontsize=6, pos="409.56,91.859"]; + 195 [label=James, width="0.30556", height="0.13889", group=10, fontsize=6, pos="434.61,163.02"]; + 118 [label=Felsner, width="0.5", height="0.18056", group=15, fontsize=8, pos="700.56,810.86"]; + 656 [label=Dangelmayr, width="0.61111", height="0.13889", group=15, fontsize=6, pos="756.02,816.52"]; + 374 [label=Zickfeld, width="0.41667", height="0.13889", group=15, fontsize=6, pos="807.57,831.21"]; + 175 [label=Massow, width="0.41667", height="0.13889", group=15, fontsize=6, pos="655.65,823.15"]; + 573 [label=Bonichon, width="0.5", height="0.13889", group=15, fontsize=6, pos="701.05,834.46"]; + 671 [label=Mosbah, width="0.41667", height="0.13889", group=15, fontsize=6, pos="758.04,846.03"]; + 680 [label=Vargiu, width="0.41667", height="0.15278", group=22, fontsize=7, pos="576.43,627.22"]; + 139 [label="Di Giacomo", width="0.88889", height="0.19444", group=22, fontsize=9, pos="704.19,625.07"]; + 600 [label=Goodrich, width="0.66667", height="0.19444", group=22, fontsize=9, pos="477.52,601.42"]; + 358 [label=Didimo, width="0.55556", height="0.19444", group=22, fontsize=9, pos="672.68,666.3"]; + 315 [label=Meijer, width="0.44444", height="0.18056", group=22, fontsize=8, pos="794.96,623.02"]; + 200 [label=Wood, width="0.47222", height="0.19444", group=22, fontsize=9, pos="876.25,525.58"]; + 380 [label=Rosamond, width="0.55556", height="0.13889", group=22, fontsize=6, pos="794.61,557.03"]; + 667 [label=Garg, width="0.36111", height="0.19444", group=22, fontsize=9, pos="528.46,773.08"]; + 440 [label="van Kreveld", width="0.69444", height="0.15278", group=22, fontsize=7, pos="550.24,563.55"]; + 120 [label=ElGindy, width="0.41667", height="0.13889", group=22, fontsize=6, pos="698.48,598.32"]; + 339 [label=Lubiw, width="0.41667", height="0.18056", group=22, fontsize=8, pos="799.19,601.79"]; + 310 [label=Fellows, width="0.41667", height="0.13889", group=22, fontsize=6, pos="705.43,561.16"]; + 614 [label=Ragde, width="0.33333", height="0.13889", group=22, fontsize=6, pos="729.78,580.4"]; + 601 [label=Kobourov, width="0.75", height="0.19444", group=20, fontsize=9, pos="492.63,487.56"]; + 163 [label=Tassinari, width="0.52778", height="0.15278", group=22, fontsize=7, pos="618.41,645.69"]; + 215 [label=Parise, width="0.33333", height="0.13889", group=22, fontsize=6, pos="536.69,636.65"]; + 613 [label=Binucci, width="0.44444", height="0.15278", group=22, fontsize=7, pos="727.19,707.67"]; + 225 [label=Giordano, width="0.55556", height="0.15278", group=22, fontsize=7, pos="682.67,711.06"]; + 307 [label=Nonato, width="0.41667", height="0.15278", group=22, fontsize=7, pos="744.4,687.31"]; + 269 [label=Everett, width="0.41667", height="0.15278", group=22, fontsize=7, pos="783.52,701.57"]; + 644 [label=Dujmovic, width="0.66667", height="0.18056", group=22, fontsize=8, pos="769.35,523.83"]; + 422 [label=Tamassia, width="0.66667", height="0.19444", group=22, fontsize=9, pos="606.74,584.32"]; + 369 [label=Lazard, width="0.41667", height="0.15278", group=22, fontsize=7, pos="790.17,675.73"]; + 185 [label=Eppstein, width="0.55556", height="0.18056", group=14, fontsize=8, pos="489.83,576.96"]; + 160 [label=Brandenburg, width="0.94444", height="0.19444", group=14, fontsize=9, pos="554.01,454.66"]; + 555 [label=Nishimura, width="0.55556", height="0.13889", group=22, fontsize=6, pos="731.72,543.16"]; + 472 [label=Speckmann, width="0.66667", height="0.15278", group=22, fontsize=7, pos="468.91,720.54"]; + 409 [label=Lenhart, width="0.52778", height="0.18056", group=22, fontsize=8, pos="825.51,647.48"]; + 691 [label=McCartin, width="0.47222", height="0.13889", group=22, fontsize=6, pos="767.58,582.31"]; + 284 [label=Whitesides, width="0.80556", height="0.19444", group=22, fontsize=9, pos="702.37,523.07"]; + 171 [label=Buti, width="0.22222", height="0.13889", group=22, fontsize=6, pos="635.66,679.3"]; + 485 [label=Bridgeman, width="0.75", height="0.18056", group=22, fontsize=8, pos="547.47,662.96"]; + 331 [label=Snoeyink, width="0.47222", height="0.13889", group=22, fontsize=6, pos="901.21,752.93"]; + 706 [label=Carmignani, width="0.66667", height="0.15278", group=22, fontsize=7, pos="648.7,755.91"]; + 395 [label=Barbagallo, width="0.55556", height="0.13889", group=22, fontsize=6, pos="687.33,729.69"]; + 560 [label=Vyskocil, width="0.47222", height="0.13889", group=12, fontsize=6, pos="1156.5,457.82"]; + 668 [label=Kára, width="0.30556", height="0.15278", group=12, fontsize=7, pos="1160.2,414.8"]; + 16 [label=Tanenbaum, width="0.58333", height="0.13889", group=22, fontsize=6, pos="342.13,675"]; + 466 [label=Scheinerman, width="0.63889", height="0.13889", group=22, fontsize=6, pos="356.79,695.95"]; + 512 [label=Madden, width="0.55556", height="0.18056", group=6, fontsize=8, pos="815.23,265.91"]; + 595 [label=Madden, width="0.47222", height="0.15278", group=6, fontsize=7, pos="803.64,242.37"]; + 688 [label=Powers, width="0.38889", height="0.13889", group=6, fontsize=6, pos="734.03,271.39"]; + 533 [label=Grigorescu, width="0.55556", height="0.13889", group=6, fontsize=6, pos="757.93,253.49"]; + 594 [label=Himsolt, width="0.52778", height="0.18056", group=6, fontsize=8, pos="699.88,316.06"]; + 194 [label=Laison, width="0.33333", height="0.13889", group=7, fontsize=6, pos="946.69,790.16"]; + 397 [label=Safari, width="0.27778", height="0.13889", group=7, fontsize=6, pos="954.66,813.89"]; + 290 [label=Trotter, width="0.33333", height="0.13889", group=7, fontsize=6, pos="923.04,808.07"]; + 222 [label=Evans, width="0.33333", height="0.13889", group=7, fontsize=6, pos="979.45,794.64"]; + 404 [label=Dean, width="0.36111", height="0.18056", group=22, fontsize=8, pos="973.52,753.81"]; + 57 [label=Marriott, width="0.55556", height="0.18056", group=10, fontsize=8, pos="290.58,271.6"]; + 360 [label=Stuckey, width="0.44444", height="0.15278", group=10, fontsize=7, pos="367.96,224"]; + 619 [label=Wybrow, width="0.52778", height="0.15278", group=10, fontsize=7, pos="338.45,243.32"]; + 117 [label=He, width="0.16667", height="0.13889", group=10, fontsize=6, pos="267.7,248.6"]; + 616 [label=Koren, width="0.41667", height="0.18056", group=10, fontsize=8, pos="296.98,357.86"]; + 517 [label=Newton, width="0.47222", height="0.15278", group=13, fontsize=7, pos="709.79,152.31"]; + 603 [label=Sýkora, width="0.47222", height="0.18056", group=13, fontsize=8, pos="739.82,174.36"]; + 674 [label=Uzovic, width="0.38889", height="0.13889", group=13, fontsize=6, pos="699.4,189.8"]; + 458 [label=Wagner, width="0.58333", height="0.19444", group=18, fontsize=9, pos="701.84,466.04"]; + 596 [label=Benkert, width="0.47222", height="0.15278", group=18, fontsize=7, pos="901.77,468.12"]; + 677 [label=Kaufmann, width="0.77778", height="0.19444", group=22, fontsize=9, pos="757.31,386.96"]; + 481 [label=Lerner, width="0.33333", height="0.13889", group=18, fontsize=6, pos="754.16,406.99"]; + 510 [label=Baur, width="0.27778", height="0.15278", group=18, fontsize=7, pos="722,444.95"]; + 488 [label=Gaertler, width="0.47222", height="0.15278", group=18, fontsize=7, pos="778.8,427.53"]; + 703 [label=Kenis, width="0.30556", height="0.13889", group=18, fontsize=6, pos="704.9,409.1"]; + 490 [label=Görke, width="0.30556", height="0.13889", group=18, fontsize=6, pos="838.07,442.01"]; + 316 [label="de Berg", width="0.38889", height="0.13889", group=22, fontsize=6, pos="435.13,790.36"]; + 89 [label=Plaisant, width="0.41667", height="0.13889", group=11, fontsize=6, pos="520.25,1090.7"]; + 103 [label="Sims Parr", width="0.47222", height="0.13889", group=11, fontsize=6, pos="538.05,1109"]; + 31 [label=Bubeck, width="0.41667", height="0.13889", group=6, fontsize=6, pos="869.65,350.27"]; + 192 [label=Rosenstiel, width="0.52778", height="0.13889", group=6, fontsize=6, pos="827.67,336.3"]; + 518 [label=Ritt, width="0.22222", height="0.13889", group=6, fontsize=6, pos="882.66,368.18"]; + 318 [label=Fößmeier, width="0.63889", height="0.18056", group=6, fontsize=8, pos="786.31,305.16"]; + 111 [label=Steckelbach, width="0.61111", height="0.13889", group=6, fontsize=6, pos="843.34,369.33"]; + 35 [label=Vondrák, width="0.44444", height="0.13889", group=12, fontsize=6, pos="1275.9,342.94"]; + 631 [label=Nyklová, width="0.5", height="0.15278", group=12, fontsize=7, pos="1238.2,362.67"]; + 411 [label=Babilon, width="0.47222", height="0.15278", group=12, fontsize=7, pos="1264.4,323.98"]; + 11 [label=Krug, width="0.27778", height="0.13889", group=18, fontsize=6, pos="826.84,411.15"]; + 492 [label=Andalman, width="0.52778", height="0.13889", group=5, fontsize=6, pos="615.8,462.65"]; + 661 [label=Ryall, width="0.33333", height="0.15278", group=22, fontsize=7, pos="654.18,484.19"]; + 208 [label=Dickerson, width="0.52778", height="0.13889", group=14, fontsize=6, pos="427.05,646.91"]; + 364 [label=Meng, width="0.33333", height="0.15278", group=14, fontsize=7, pos="421.29,624.78"]; + 511 [label=Rosi, width="0.25", height="0.13889", group=10, fontsize=6, pos="563.35,164.99"]; + 546 [label="de Mendonça Neto", width="1.0556", height="0.15278", group=10, fontsize=7, pos="569.49,196.34"]; + 434 [label=Harel, width="0.33333", height="0.15278", group=10, fontsize=7, pos="224.92,351.52"]; + 93 [label=Agarwal, width="0.44444", height="0.13889", group=12, fontsize=6, pos="1107.3,294.13"]; + 445 [label=Sharir, width="0.30556", height="0.13889", group=12, fontsize=6, pos="1081.8,276.21"]; + 292 [label=Kaplan, width="0.36111", height="0.13889", group=20, fontsize=6, pos="46.923,582.61"]; + 382 [label=Vasiliu, width="0.41667", height="0.15278", group=20, fontsize=7, pos="46.214,560"]; + 582 [label=Diguglielmo, width="0.63889", height="0.13889", group=20, fontsize=6, pos="93.132,559.49"]; + 323 [label=Sander, width="0.44444", height="0.18056", group=20, fontsize=8, pos="115.18,532.89"]; + 29 [label=Ellson, width="0.33333", height="0.13889", group=10, fontsize=6, pos="335.92,387.6"]; + 64 [label=Koutsofios, width="0.55556", height="0.13889", group=10, fontsize=6, pos="394.37,404.99"]; + 666 [label=Woodhull, width="0.58333", height="0.15278", group=10, fontsize=7, pos="377.16,381.72"]; + 497 [label=North, width="0.38889", height="0.18056", group=10, fontsize=8, pos="511.55,404.49"]; + 649 [label=Gansner, width="0.55556", height="0.18056", group=10, fontsize=8, pos="417.89,439.09"]; + 325 [label=Ju, width="0.11111", height="0.13889", group=8, fontsize=6, pos="1466.6,253.89"]; + 548 [label=Park, width="0.25", height="0.13889", group=8, fontsize=6, pos="1466.3,230.63"]; + 378 [label=Gudmundsson, width="0.80556", height="0.15278", group=10, fontsize=7, pos="548.08,526.31"]; + 291 [label=Matera, width="0.36111", height="0.13889", group=22, fontsize=6, pos="598.84,766.62"]; + 442 [label=Chrobak, width="0.41667", height="0.13889", group=16, fontsize=6, pos="1174.4,581.98"]; + 531 [label=Nakano, width="0.52778", height="0.18056", group=16, fontsize=8, pos="1131.8,581.65"]; + 540 [label=Joevenazzo, width="0.55556", height="0.13889", group=22, fontsize=6, pos="829.83,752.94"]; + 647 [label=Wilsdon, width="0.44444", height="0.13889", group=22, fontsize=6, pos="870.98,735.03"]; + 199 [label=Wampler, width="0.55556", height="0.15278", group=20, fontsize=7, pos="327.77,454.71"]; + 701 [label=Harding, width="0.41667", height="0.13889", group=20, fontsize=6, pos="441.91,458.42"]; + 373 [label=Erten, width="0.36111", height="0.18056", group=20, fontsize=8, pos="391.48,464.08"]; + 641 [label=Navabi, width="0.41667", height="0.15278", group=20, fontsize=7, pos="320.27,435.38"]; + 642 [label=Forrester, width="0.47222", height="0.13889", group=20, fontsize=6, pos="372.65,443.23"]; + 622 [label=Yee, width="0.25", height="0.15278", group=20, fontsize=7, pos="357.14,474.14"]; + 226 [label=Alzohairi, width="0.47222", height="0.13889", group=3, fontsize=6, pos="1248.7,902.49"]; + 553 [label=Rival, width="0.33333", height="0.15278", group=3, fontsize=7, pos="1241.4,935.94"]; + 15 [label=Suchý, width="0.30556", height="0.13889", group=12, fontsize=6, pos="1128.7,415.31"]; + 496 [label=Jelínková, width="0.47222", height="0.13889", group=12, fontsize=6, pos="1156.3,433.42"]; + 187 [label=Pergel, width="0.38889", height="0.15278", group=12, fontsize=7, pos="1117.1,437.92"]; + 121 [label=Kratochvíl, width="0.66667", height="0.18056", group=4, fontsize=8, pos="1090.6,465.19"]; + 153 [label=Nöllenburg, width="0.63889", height="0.15278", group=4, fontsize=7, pos="958.13,505.36"]; + 221 [label=Atienza, width="0.41667", height="0.13889", group=4, fontsize=6, pos="964.63,548.67"]; + 280 [label=Garrido, width="0.44444", height="0.15278", group=4, fontsize=7, pos="981.32,528.56"]; + 618 [label=Moreno, width="0.41667", height="0.13889", group=4, fontsize=6, pos="1023,491.38"]; + 282 [label=Hernández, width="0.61111", height="0.15278", group=4, fontsize=7, pos="1020.2,601.07"]; + 558 [label=Grima, width="0.30556", height="0.13889", group=4, fontsize=6, pos="1000.8,509.44"]; + 420 [label=Kroll, width="0.27778", height="0.13889", group=18, fontsize=6, pos="937.8,464.84"]; + 396 [label=Valenzuela, width="0.55556", height="0.13889", group=4, fontsize=6, pos="1049,545.26"]; + 464 [label=Portillo, width="0.38889", height="0.13889", group=4, fontsize=6, pos="1001.7,547.53"]; + 308 [label=Haverkort, width="0.52778", height="0.13889", group=18, fontsize=6, pos="926.6,486.74"]; + 664 [label=Villar, width="0.30556", height="0.13889", group=4, fontsize=6, pos="1028.5,527.35"]; + 453 [label=Cortés, width="0.33333", height="0.13889", group=4, fontsize=6, pos="1065.7,502.55"]; + 657 [label=Reyes, width="0.33333", height="0.13889", group=4, fontsize=6, pos="1059.8,524.93"]; + 257 [label=Wolff, width="0.41667", height="0.18056", group=4, fontsize=8, pos="977.17,474.95"]; + 431 [label=Gassner, width="0.41667", height="0.13889", group=2, fontsize=6, pos="131.08,577.45"]; + 501 [label=Schaefer, width="0.55556", height="0.18056", group=2, fontsize=8, pos="78.298,623.21"]; + 577 [label=Schulz, width="0.33333", height="0.13889", group=2, fontsize=6, pos="180.33,611.34"]; + 712 [label="Estrella-Balderrama", width="1.1389", height="0.15278", group=2, fontsize=7, pos="192.5,558.37"]; + 527 [label=Eades, width="0.44444", height="0.19444", group=10, fontsize=9, pos="560.04,336.96"]; + 559 [label=Lee, width="0.22222", height="0.13889", group=10, fontsize=6, pos="506.66,302.14"]; + 610 [label=Huang, width="0.38889", height="0.15278", group=10, fontsize=7, pos="569.89,235.72"]; + 704 [label=Lin, width="0.22222", height="0.15278", group=10, fontsize=7, pos="529.1,243.93"]; + 663 [label="do Nascimento", width="0.83333", height="0.15278", group=10, fontsize=7, pos="468.4,368.15"]; + 651 [label=Feng, width="0.30556", height="0.15278", group=10, fontsize=7, pos="579.99,257.37"]; + 653 [label=Huang, width="0.33333", height="0.13889", group=10, fontsize=6, pos="498.11,284.07"]; + 337 [label=Trümbach, width="0.5", height="0.13889", group=2, fontsize=6, pos="424.79,387.07"]; + 478 [label=Schreiber, width="0.61111", height="0.18056", group=2, fontsize=8, pos="505.33,425.22"]; + 101 [label="de Castro", width="0.55556", height="0.15278", group=4, fontsize=7, pos="1029,566.47"]; + 124 [label=Márquez, width="0.52778", height="0.15278", group=4, fontsize=7, pos="1074.3,586.13"]; + 407 [label=Dana, width="0.33333", height="0.15278", group=4, fontsize=7, pos="1082.6,625.59"]; + 73 [label=Duncan, width="0.52778", height="0.18056", group=20, fontsize=8, pos="434.02,517.24"]; + 476 [label=Wenk, width="0.33333", height="0.13889", group=20, fontsize=6, pos="445.73,497.92"]; + 388 [label=Cheng, width="0.33333", height="0.13889", group=20, fontsize=6, pos="443.18,560.98"]; + 340 [label=Bachmaier, width="0.63889", height="0.15278", group=14, fontsize=7, pos="512.39,347.11"]; + 394 [label=Raitner, width="0.5", height="0.18056", group=14, fontsize=8, pos="564.4,378.54"]; + 76 [label=Geyer, width="0.30556", height="0.13889", group=13, fontsize=6, pos="795.62,285.48"]; + 201 [label="Vrt'o", width="0.33333", height="0.18056", group=13, fontsize=8, pos="769.86,216.25"]; + 311 [label=Wilhelm, width="0.44444", height="0.13889", group=20, fontsize=6, pos="94.962,489.61"]; + 690 [label=Alt, width="0.19444", height="0.13889", group=20, fontsize=6, pos="102.52,508.01"]; + 62 [label=Kikusts, width="0.44444", height="0.15278", group=6, fontsize=7, pos="915.57,151.11"]; + 164 [label=Dogrusoz, width="0.63889", height="0.18056", group=6, fontsize=8, pos="899.05,246.49"]; + 508 [label=Rucevskis, width="0.52778", height="0.13889", group=6, fontsize=6, pos="949.34,120.47"]; + 67 [label=Kumar, width="0.36111", height="0.13889", group=20, fontsize=6, pos="142.13,458.44"]; + 469 [label=Abello, width="0.41667", height="0.15278", group=20, fontsize=7, pos="228.66,446.6"]; + 198 [label=Dyck, width="0.27778", height="0.13889", group=22, fontsize=6, pos="880.73,696.78"]; + 389 [label=Giral, width="0.25", height="0.13889", group=6, fontsize=6, pos="960.09,230.62"]; + 452 [label=Civril, width="0.33333", height="0.15278", group=6, fontsize=7, pos="989.32,216.08"]; + 423 [label=Demir, width="0.33333", height="0.13889", group=6, fontsize=6, pos="931.71,200.01"]; + 327 [label=Le, width="0.13889", height="0.13889", group=20, fontsize=6, pos="352.71,423.43"]; + 471 [label=Edachery, width="0.47222", height="0.13889", group=14, fontsize=6, pos="488.17,448.2"]; + 522 [label=Sen, width="0.22222", height="0.15278", group=14, fontsize=7, pos="472.47,401.15"]; + 236 [label=Aloupis, width="0.41667", height="0.13889", group=22, fontsize=6, pos="962.07,630.47"]; + 505 [label=Morin, width="0.36111", height="0.15278", group=22, fontsize=7, pos="927.77,559.96"]; + 361 [label=Maeda, width="0.33333", height="0.13889", group=10, fontsize=6, pos="262.41,313.28"]; + 370 [label=Sugiyama, width="0.55556", height="0.15278", group=10, fontsize=7, pos="253.61,294.52"]; + 168 [label=Garcìa, width="0.33333", height="0.13889", group=4, fontsize=6, pos="1054.7,652.11"]; + 460 [label=Ramos, width="0.41667", height="0.15278", group=4, fontsize=7, pos="1004.8,688.66"]; + 184 [label=Koch, width="0.27778", height="0.13889", group=2, fontsize=6, pos="209.07,521.86"]; + 328 [label=Fialko, width="0.33333", height="0.13889", group=2, fontsize=6, pos="287.17,508.98"]; + 390 [label=Leipert, width="0.47222", height="0.18056", group=2, fontsize=8, pos="320.29,571.44"]; + 303 [label=Jünger, width="0.47222", height="0.19444", group=2, fontsize=9, pos="389.24,532.72"]; + 597 [label=Gutwenger, width="0.72222", height="0.18056", group=2, fontsize=8, pos="268.44,576.27"]; + 288 [label=Alberts, width="0.38889", height="0.13889", group=2, fontsize=6, pos="311.57,551.13"]; + 537 [label=Ambras, width="0.41667", height="0.13889", group=2, fontsize=6, pos="238.02,503.95"]; + 637 [label=Ziegler, width="0.41667", height="0.15278", group=2, fontsize=7, pos="360.83,553.45"]; + 14 [label=Abellanas, width="0.58333", height="0.15278", group=4, fontsize=7, pos="1066.8,704.3"]; + 40 [label=Noy, width="0.27778", height="0.15278", group=4, fontsize=7, pos="1084.6,653.91"]; + 561 [label=Ferran, width="0.33333", height="0.13889", group=4, fontsize=6, pos="1069.9,726.91"]; + 135 [label=Johansen, width="0.52778", height="0.15278", group=22, fontsize=7, pos="887.2,546.32"]; + 433 [label=Shermer, width="0.55556", height="0.18056", group=22, fontsize=8, pos="946.44,579.99"]; + 534 [label=Gartshore, width="0.47222", height="0.13889", group=22, fontsize=6, pos="921.51,617.22"]; + 539 [label=Closson, width="0.41667", height="0.13889", group=22, fontsize=6, pos="928.05,599.3"]; + 348 [label=Siebenhaller, width="0.69444", height="0.15278", group=18, fontsize=7, pos="743.68,345.04"]; + 145 [label=Keskin, width="0.36111", height="0.13889", group=6, fontsize=6, pos="860.9,99.259"]; + 598 [label=Vogelmann, width="0.58333", height="0.13889", group=6, fontsize=6, pos="813.68,111.74"]; + 342 [label=Frick, width="0.36111", height="0.18056", group=6, fontsize=8, pos="812.22,143.97"]; + 178 [label=Boyer, width="0.36111", height="0.15278", group=22, fontsize=7, pos="557.05,752.32"]; + 357 [label=Cortese, width="0.41667", height="0.15278", group=22, fontsize=7, pos="596.89,739.98"]; + 24 [label=Aronov, width="0.41667", height="0.13889", group=12, fontsize=6, pos="1124.4,312.05"]; + 65 [label=Pollack, width="0.44444", height="0.15278", group=12, fontsize=7, pos="1127.4,269.73"]; + 285 [label=Hurtado, width="0.47222", height="0.15278", group=4, fontsize=7, pos="1120.2,647.2"]; + 636 [label=Mateos, width="0.38889", height="0.13889", group=4, fontsize=6, pos="1144.3,611.05"]; + 554 [label=Hernando, width="0.5", height="0.13889", group=4, fontsize=6, pos="1134.7,685.24"]; + 696 [label=Tejel, width="0.27778", height="0.13889", group=4, fontsize=6, pos="1105.9,703.75"]; + 583 [label=García, width="0.33333", height="0.13889", group=4, fontsize=6, pos="1130.2,665.82"]; + 104 [label=Melançon, width="0.5", height="0.13889", group=18, fontsize=6, pos="690.89,246.84"]; + 402 [label=Herman, width="0.47222", height="0.15278", group=18, fontsize=7, pos="652.61,290.35"]; + 324 [label=Delest, width="0.33333", height="0.13889", group=18, fontsize=6, pos="639.55,242.21"]; + 673 [label="de Ruiter", width="0.44444", height="0.13889", group=18, fontsize=6, pos="646.5,271.74"]; + 494 [label=Mariani, width="0.41667", height="0.13889", group=22, fontsize=6, pos="513.62,739.15"]; + 484 [label=Frati, width="0.33333", height="0.18056", group=22, fontsize=8, pos="624.02,522.75"]; + 570 [label=Lesh, width="0.27778", height="0.13889", group=22, fontsize=6, pos="575.76,544.94"]; + 154 [label=Roxborough, width="0.63889", height="0.13889", group=14, fontsize=6, pos="259.22,388.82"]; + 96 [label=Tsiaras, width="0.33333", height="0.13889", group=6, fontsize=6, pos="956.59,331.1"]; + 365 [label=Triantafilou, width="0.58333", height="0.13889", group=6, fontsize=6, pos="938.21,310.2"]; + 432 [label=Tollis, width="0.41667", height="0.19444", group=6, fontsize=9, pos="899.93,330.23"]; + 705 [label=Kisielewicz, width="0.61111", height="0.13889", group=3, fontsize=6, pos="1199.5,920.23"]; + 159 [label=Chow, width="0.27778", height="0.13889", group=10, fontsize=6, pos="490.13,197.7"]; + 304 [label=Ruskey, width="0.44444", height="0.15278", group=10, fontsize=7, pos="556.29,216.39"]; + 468 [label=Pohl, width="0.25", height="0.13889", group=10, fontsize=6, pos="351.56,8.7964"]; + 593 [label=Deng, width="0.33333", height="0.15278", group=22, fontsize=7, pos="659.91,440.28"]; + 214 [label=Brandes, width="0.61111", height="0.19444", group=18, fontsize=9, pos="662.94,419.55"]; + 654 [label=Bachl, width="0.33333", height="0.15278", group=14, fontsize=7, pos="554.56,433.92"]; + 581 [label=Pick, width="0.25", height="0.13889", group=14, fontsize=6, pos="524.06,385.15"]; + 362 [label=Rohrer, width="0.36111", height="0.13889", group=14, fontsize=6, pos="609.22,378.37"]; + 569 [label=Cudjoe, width="0.36111", height="0.13889", group=23, fontsize=6, pos="238.69,1158.9"]; + 684 [label=Manning, width="0.47222", height="0.13889", group=23, fontsize=6, pos="304.74,1142.1"]; + 8 [label=Wiese, width="0.36111", height="0.15278", group=18, fontsize=7, pos="774.59,366.22"]; + 334 [label=Eiglsperger, width="0.75", height="0.18056", group=18, fontsize=8, pos="704.87,365.52"]; + 37 [label=Kupke, width="0.38889", height="0.15278", group=2, fontsize=7, pos="305.22,599.15"]; + 43 [label=Miyazawa, width="0.52778", height="0.13889", group=16, fontsize=6, pos="1296.7,631.62"]; + 630 [label=Nishizeki, width="0.61111", height="0.18056", group=16, fontsize=8, pos="1269.7,599.9"]; + 297 [label=Miura, width="0.36111", height="0.15278", group=16, fontsize=7, pos="1244.4,625.99"]; + 5 [label=Hallett, width="0.33333", height="0.13889", group=22, fontsize=6, pos="806.1,574.95"]; + 20 [label=Kitching, width="0.5", height="0.15278", group=22, fontsize=7, pos="747.54,561.78"]; + 18 [label=Suderman, width="0.66667", height="0.18056", group=22, fontsize=8, pos="746.53,603.62"]; + 608 [label=Fanto, width="0.30556", height="0.13889", group=22, fontsize=6, pos="496.07,681.09"]; + 536 [label=Valtr, width="0.30556", height="0.15278", group=12, fontsize=7, pos="1223.3,316.27"]; + 538 [label=Devillers, width="0.47222", height="0.13889", group=22, fontsize=6, pos="763.34,743.09"]; + 679 [label=Pentcheva, width="0.55556", height="0.13889", group=22, fontsize=6, pos="826.88,718.69"]; + 21 [label=Carpendale, width="0.55556", height="0.13889", group=17, fontsize=6, pos="1009.9,652.13"]; + 128 [label=Fracchia, width="0.44444", height="0.13889", group=17, fontsize=6, pos="959.93,662.58"]; + 88 [label=Cowperthwaite, width="0.75", height="0.13889", group=17, fontsize=6, pos="1011.8,634.21"]; + 552 [label="Bocek-Rivele", width="0.77778", height="0.15278", group=6, fontsize=7, pos="1036.4,196.76"]; + 669 [label="Magdon-Ismail", width="0.88889", height="0.15278", group=6, fontsize=7, pos="983.33,176.71"]; + 193 [label=Schank, width="0.36111", height="0.13889", group=18, fontsize=6, pos="857.76,469.72"]; + 398 [label=Cornelsen, width="0.55556", height="0.15278", group=18, fontsize=7, pos="761.13,455.21"]; + 678 [label=Gomez, width="0.33333", height="0.13889", group=22, fontsize=6, pos="1024.8,707.48"]; + 180 [label=Nickle, width="0.33333", height="0.13889", group=22, fontsize=6, pos="849.37,700.73"]; + 244 [label=Six, width="0.22222", height="0.18056", group=6, fontsize=8, pos="859.23,255.34"]; + 588 [label=Papakostas, width="0.72222", height="0.18056", group=6, fontsize=8, pos="956.66,249.94"]; + 449 [label=Kakoulis, width="0.52778", height="0.15278", group=6, fontsize=7, pos="848.43,226.98"]; + 526 [label=Vince, width="0.33333", height="0.13889", group=22, fontsize=6, pos="936.76,680.75"]; + 351 [label=Houle, width="0.41667", height="0.18056", group=10, fontsize=8, pos="625.08,397.92"]; + 240 [label=Jourdan, width="0.44444", height="0.15278", group=3, fontsize=7, pos="1269.5,961.71"]; + 513 [label=Zaguia, width="0.41667", height="0.15278", group=3, fontsize=7, pos="1296.2,937.38"]; + 74 [label=Rappaport, width="0.52778", height="0.13889", group=22, fontsize=6, pos="884.95,642.46"]; + 414 [label=Hirsch, width="0.33333", height="0.13889", group=22, fontsize=6, pos="883.07,622.23"]; + 61 [label=Munoz, width="0.36111", height="0.13889", group=13, fontsize=6, pos="817.82,172.52"]; + 681 [label=Unger, width="0.33333", height="0.13889", group=13, fontsize=6, pos="815.37,192.41"]; + 299 [label=Wenger, width="0.41667", height="0.13889", group=12, fontsize=6, pos="1123.2,335.57"]; + 115 [label=Yildiz, width="0.33333", height="0.13889", group=2, fontsize=6, pos="278.08,637.11"]; + 568 [label=Barth, width="0.33333", height="0.15278", group=2, fontsize=7, pos="299.32,618.47"]; + 377 [label=Gotsman, width="0.44444", height="0.13889", group=10, fontsize=6, pos="211.59,373.03"]; + 602 [label=Székely, width="0.5", height="0.18056", group=13, fontsize=8, pos="767.69,195.11"]; + 652 [label=Shahrokhi, width="0.63889", height="0.18056", group=13, fontsize=8, pos="766.96,153.62"]; + 626 [label=Torok, width="0.30556", height="0.13889", group=13, fontsize=6, pos="662.51,179"]; + 255 [label=Djidjev, width="0.44444", height="0.15278", group=13, fontsize=7, pos="858.64,207.66"]; + 415 [label=Matsuno, width="0.44444", height="0.13889", group=16, fontsize=6, pos="1267.4,663.46"]; + 152 [label=Hashemi, width="0.44444", height="0.13889", group=3, fontsize=6, pos="1198.3,944.99"]; + 189 [label=Diehl, width="0.33333", height="0.15278", group=10, fontsize=7, pos="321.47,6.9436"]; + 300 [label=Birke, width="0.30556", height="0.13889", group=10, fontsize=6, pos="316.76,25.651"]; + 592 [label=Bruß, width="0.27778", height="0.13889", group=6, fontsize=6, pos="770.79,108.19"]; + 347 [label=Ludwig, width="0.41667", height="0.13889", group=6, fontsize=6, pos="765.09,87.245"]; + 91 [label=Chanda, width="0.36111", height="0.13889", group=22, fontsize=6, pos="545.05,822"]; + 341 [label=Marcandalli, width="0.61111", height="0.13889", group=22, fontsize=6, pos="717.41,765.65"]; + 480 [label=Yusufov, width="0.44444", height="0.13889", group=20, fontsize=6, pos="280.4,438.68"]; + 107 [label=Drechsler, width="0.5", height="0.13889", group=9, fontsize=6, pos="815.37,1083.2"]; + 682 [label=Günther, width="0.44444", height="0.15278", group=9, fontsize=7, pos="863.93,1071.9"]; + 345 [label=Becker, width="0.41667", height="0.15278", group=9, fontsize=7, pos="843.97,1014.6"]; + 624 [label=Eschbach, width="0.47222", height="0.13889", group=9, fontsize=6, pos="802.74,1024.7"]; + 535 [label=Doerr, width="0.30556", height="0.13889", group=6, fontsize=6, pos="995.7,290.39"]; + 623 [label=Papamanthou, width="0.80556", height="0.15278", group=6, fontsize=7, pos="1002.2,311.13"]; + 467 [label=Goaoc, width="0.33333", height="0.13889", group=4, fontsize=6, pos="1025.1,427.94"]; + 503 [label=Okamoto, width="0.44444", height="0.13889", group=4, fontsize=6, pos="1043.8,445.86"]; + 77 [label=Holleis, width="0.41667", height="0.15278", group=14, fontsize=7, pos="522.41,366.51"]; + 174 [label=Goldberg, width="0.47222", height="0.13889", group=21, fontsize=6, pos="1365.1,1133.3"]; + 387 [label=Skiena, width="0.33333", height="0.13889", group=21, fontsize=6, pos="1420.3,1159.2"]; + 216 [label=Shannon, width="0.41667", height="0.13889", group=21, fontsize=6, pos="1360.4,1170.7"]; + 245 [label=Berry, width="0.30556", height="0.13889", group=21, fontsize=6, pos="1402,1126.2"]; + 381 [label=Dean, width="0.27778", height="0.13889", group=21, fontsize=6, pos="1394.5,1186.7"]; + 309 [label=Boitmanis, width="0.52778", height="0.13889", group=18, fontsize=6, pos="650.85,326.87"]; + 435 [label=Shubina, width="0.41667", height="0.13889", group=18, fontsize=6, pos="674.24,502.93"]; + 281 [label=Puppe, width="0.33333", height="0.13889", group=18, fontsize=6, pos="596.36,327.79"]; + 355 [label=Pich, width="0.27778", height="0.15278", group=18, fontsize=7, pos="681.96,345.49"]; + 650 [label=Gelfand, width="0.41667", height="0.13889", group=22, fontsize=6, pos="459.19,667.64"]; + 572 [label=Finkel, width="0.33333", height="0.13889", group=22, fontsize=6, pos="495.46,637.24"]; + 634 [label=Chan, width="0.27778", height="0.13889", group=22, fontsize=6, pos="464.21,629.52"]; + 39 [label=Molitor, width="0.44444", height="0.15278", group=9, fontsize=7, pos="912.41,1020"]; + 238 [label=Schönfeld, width="0.55556", height="0.15278", group=9, fontsize=7, pos="869.06,1043.1"]; + 462 [label=Matuszewski, width="0.66667", height="0.13889", group=9, fontsize=6, pos="950.7,1059.2"]; + 383 [label=Dobkin, width="0.38889", height="0.13889", group=10, fontsize=6, pos="344.34,405.51"]; + 12 [label=Proskurowski, width="0.69444", height="0.13889", group=4, fontsize=6, pos="1153.3,499.84"]; + 416 [label=Fiala, width="0.27778", height="0.13889", group=4, fontsize=6, pos="1136.1,519"]; + 689 [label=Dvorák, width="0.38889", height="0.13889", group=12, fontsize=6, pos="1204,420.44"]; + 52 [label=Taylor, width="0.33333", height="0.13889", group=10, fontsize=6, pos="257.29,356.54"]; + 638 [label=Abelson, width="0.44444", height="0.13889", group=10, fontsize=6, pos="270.68,338.44"]; + 229 [label=Durocher, width="0.47222", height="0.13889", group=20, fontsize=6, pos="87.611,591.41"]; + 260 [label=Brunner, width="0.41667", height="0.13889", group=14, fontsize=6, pos="478.89,263.65"]; + 263 [label=König, width="0.33333", height="0.13889", group=14, fontsize=6, pos="514.63,262.6"]; + 237 [label=Maxová, width="0.41667", height="0.13889", group=12, fontsize=6, pos="1281.9,305.36"]; + 475 [label=Matousek, width="0.55556", height="0.15278", group=12, fontsize=7, pos="1266.3,286.74"]; + 670 [label=Misue, width="0.36111", height="0.15278", group=10, fontsize=7, pos="215.62,272.45"]; + 68 [label=Hutchinson, width="0.75", height="0.18056", group=22, fontsize=8, pos="926.95,700.27"]; + 612 [label=Bretscher, width="0.5", height="0.13889", group=22, fontsize=6, pos="831.84,539.1"]; + 144 [label=Blair, width="0.27778", height="0.13889", group=5, fontsize=6, pos="565.42,507.49"]; + 700 [label=Kruja, width="0.30556", height="0.13889", group=5, fontsize=6, pos="538.84,488.65"]; + 587 [label=Waters, width="0.36111", height="0.13889", group=5, fontsize=6, pos="528.16,507.67"]; + 338 [label=Tóth, width="0.27778", height="0.15278", group=12, fontsize=7, pos="1070.2,300.39"]; + 100 [label=Ghosh, width="0.33333", height="0.13889", group=16, fontsize=6, pos="1332.7,566.23"]; + 134 [label=Rahman, width="0.55556", height="0.18056", group=16, fontsize=8, pos="1263.3,579.15"]; + 25 [label=Xu, width="0.16667", height="0.13889", group=10, fontsize=6, pos="346.7,317.4"]; + 286 [label=Kuchem, width="0.44444", height="0.13889", group=18, fontsize=6, pos="874.07,441.53"]; + 83 [label=Jeong, width="0.27778", height="0.13889", group=8, fontsize=6, pos="1524.7,230.71"]; + 470 [label=Byun, width="0.33333", height="0.15278", group=8, fontsize=7, pos="1524.4,253.82"]; + 305 [label=Pop, width="0.22222", height="0.13889", group=22, fontsize=6, pos="429.09,769.27"]; + 477 [label=Aggarwal, width="0.5", height="0.13889", group=22, fontsize=6, pos="389.21,747.91"]; + 177 [label=Kanne, width="0.33333", height="0.13889", group=2, fontsize=6, pos="406.85,363.1"]; + 615 [label=Pitta, width="0.27778", height="0.15278", group=20, fontsize=7, pos="373.89,493.56"]; + 239 [label=Ruml, width="0.27778", height="0.13889", group=5, fontsize=6, pos="613.92,481.34"]; + 158 [label=Sablowski, width="0.5", height="0.13889", group=6, fontsize=6, pos="870.24,127.01"]; + 22 [label=Pangrác, width="0.47222", height="0.15278", group=12, fontsize=7, pos="1222.6,343.3"]; + 60 [label=Král, width="0.22222", height="0.13889", group=12, fontsize=6, pos="1207.9,381.34"]; + 42 [label=Vismara, width="0.5", height="0.15278", group=22, fontsize=7, pos="600.77,665"]; + 363 [label=Heß, width="0.22222", height="0.13889", group=6, fontsize=6, pos="804.52,354.2"]; + 301 [label=Sun, width="0.19444", height="0.13889", group=22, fontsize=6, pos="402.82,714.68"]; + 6 [label=Trotta, width="0.33333", height="0.15278", group=22, fontsize=7, pos="757.93,626.23"]; + 56 [label=Wismath, width="0.58333", height="0.18056", group=22, fontsize=8, pos="841.04,623.1"]; + 436 [label=Skodinis, width="0.41667", height="0.13889", group=2, fontsize=6, pos="306.15,406.2"]; + 47 [label=Marcus, width="0.38889", height="0.13889", group=12, fontsize=6, pos="1170.6,327.16"]; + 213 [label=Pacheco, width="0.44444", height="0.13889", group=23, fontsize=6, pos="261.22,1194.5"]; + 406 [label=Atallah, width="0.38889", height="0.13889", group=23, fontsize=6, pos="265.63,1126.6"]; + 94 [label=Liao, width="0.27778", height="0.15278", group=19, fontsize=7, pos="1436.3,6.5"]; + 306 [label=Yen, width="0.27778", height="0.18056", group=19, fontsize=8, pos="1401.7,26.404"]; + 629 [label=Lu, width="0.16667", height="0.15278", group=19, fontsize=7, pos="1454.3,27.658"]; + 298 [label=Chen, width="0.30556", height="0.15278", group=19, fontsize=7, pos="1435.4,46.972"]; + 51 [label=Xia, width="0.19444", height="0.13889", group=6, fontsize=6, pos="942.48,280.69"]; + 456 [label=Bekos, width="0.36111", height="0.15278", group=22, fontsize=7, pos="912.86,445.14"]; + 686 [label=Potika, width="0.33333", height="0.13889", group=22, fontsize=6, pos="874.77,407.95"]; + 439 [label=Jelínek, width="0.33333", height="0.13889", group=12, fontsize=6, pos="1192.3,400.37"]; + 296 [label=Cruz, width="0.27778", height="0.15278", group=1, fontsize=7, pos="525.03,846.99"]; + 660 [label=Lambe, width="0.36111", height="0.13889", group=1, fontsize=6, pos="547.41,879.63"]; + 576 [label=Twarog, width="0.38889", height="0.13889", group=1, fontsize=6, pos="503.39,888.14"]; + 265 [label=Carmel, width="0.36111", height="0.13889", group=10, fontsize=6, pos="232.77,332.71"]; + 384 [label=Nakano, width="0.41667", height="0.13889", group=16, fontsize=6, pos="1315.2,611.66"]; + 386 [label=Telle, width="0.27778", height="0.13889", group=22, fontsize=6, pos="916.86,523.05"]; + 405 [label=Lynn, width="0.27778", height="0.13889", group=22, fontsize=6, pos="888.34,505.54"]; + 125 [label=Merrick, width="0.47222", height="0.15278", group=10, fontsize=7, pos="488.65,466.82"]; + 329 [label=Leonforte, width="0.5", height="0.13889", group=22, fontsize=6, pos="715.94,783.85"]; + 44 [label=Pór, width="0.22222", height="0.13889", group=22, fontsize=6, pos="927.45,541.35"]; + 27 [label=Gethner, width="0.44444", height="0.15278", group=7, fontsize=7, pos="935.8,771.54"]; + 190 [label=Lueker, width="0.36111", height="0.13889", group=22, fontsize=6, pos="413.17,682.42"]; + 95 [label=Grilli, width="0.30556", height="0.15278", group=22, fontsize=7, pos="752.06,645.81"]; + 400 [label=Asano, width="0.33333", height="0.13889", group=16, fontsize=6, pos="1350.1,624.07"]; + 693 [label=Landis, width="0.33333", height="0.13889", group=20, fontsize=6, pos="457.18,419.76"]; + 151 [label=Köpf, width="0.30556", height="0.15278", group=18, fontsize=7, pos="735.55,425.61"]; + 529 [label=Rusu, width="0.30556", height="0.15278", group=22, fontsize=7, pos="498.94,823.06"]; + 557 [label=Pelsmajer, width="0.58333", height="0.15278", group=2, fontsize=7, pos="143.77,647.68"]; + 599 [label=Stefankovic, width="0.66667", height="0.15278", group=2, fontsize=7, pos="25,640.9"]; + 695 [label=Schmidt, width="0.41667", height="0.13889", group=2, fontsize=6, pos="242.02,634.23"]; + 692 [label=Chimani, width="0.47222", height="0.15278", group=2, fontsize=7, pos="243.34,615.62"]; + 566 [label=Lee, width="0.22222", height="0.13889", group=2, fontsize=6, pos="349.45,625.45"]; + 275 [label=Lin, width="0.22222", height="0.15278", group=10, fontsize=7, pos="614.32,260.82"]; + 157 [label=Weiskircher, width="0.69444", height="0.15278", group=2, fontsize=7, pos="164.93,536.86"]; + 170 [label=Buchheim, width="0.66667", height="0.18056", group=2, fontsize=8, pos="275.07,466.73"]; + 227 [label=Percan, width="0.41667", height="0.15278", group=2, fontsize=7, pos="215.5,593.87"]; + 399 [label=Dhandapani, width="0.61111", height="0.13889", group=12, fontsize=6, pos="1173.9,255.3"]; + 133 [label=Basu, width="0.27778", height="0.13889", group=12, fontsize=6, pos="1159.2,237.33"]; + 197 [label=Schlieper, width="0.47222", height="0.13889", group=18, fontsize=6, pos="647.03,358.35"]; + 203 [label=Friedrich, width="0.55556", height="0.15278", group=10, fontsize=7, pos="542.98,316.16"]; + 424 [label=Lillo, width="0.25", height="0.13889", group=22, fontsize=6, pos="676.59,791.35"]; + 138 [label=Stolfi, width="0.27778", height="0.13889", group=10, fontsize=6, pos="495.41,179.68"]; + 274 [label=Lozada, width="0.36111", height="0.13889", group=10, fontsize=6, pos="529.17,160.74"]; + 81 [label=Näher, width="0.33333", height="0.13889", group=2, fontsize=6, pos="358.03,573.86"]; + 108 [label=Krüger, width="0.36111", height="0.13889", group=2, fontsize=6, pos="350.03,532.86"]; + 172 [label=Brockenauer, width="0.66667", height="0.13889", group=2, fontsize=6, pos="223.52,539.76"]; + 137 [label=Marshall, width="0.52778", height="0.15278", group=18, fontsize=7, pos="602.94,358.04"]; + 459 [label=Mili, width="0.25", height="0.15278", group=6, fontsize=7, pos="967.18,291.58"]; + 543 [label=Castelló, width="0.47222", height="0.15278", group=6, fontsize=7, pos="974.53,271.76"]; + 346 [label=Alt, width="0.19444", height="0.13889", group=22, fontsize=6, pos="784.94,504.5"]; + 447 [label=Godau, width="0.38889", height="0.15278", group=22, fontsize=7, pos="738.81,497.97"]; + 186 [label=Fox, width="0.25", height="0.15278", group=12, fontsize=7, pos="1090.2,321.66"]; + 110 [label=Biedl, width="0.41667", height="0.19444", group=22, fontsize=9, pos="786.03,484.46"]; + 486 [label=Aziza, width="0.30556", height="0.13889", group=22, fontsize=6, pos="885.71,487.64"]; + 604 [label=Spriggs, width="0.38889", height="0.13889", group=22, fontsize=6, pos="836.9,507.5"]; + 147 [label=Lozito, width="0.33333", height="0.13889", group=23, fontsize=6, pos="301.99,1184.1"]; + 491 [label=Iturriaga, width="0.5", height="0.15278", group=22, fontsize=7, pos="886.31,585.01"]; + 421 [label=Haible, width="0.33333", height="0.13889", group=20, fontsize=6, pos="43.287,531.44"]; + 683 [label=Baudel, width="0.36111", height="0.13889", group=20, fontsize=6, pos="77.454,530.96"]; + 625 [label=Yoshikawa, width="0.55556", height="0.13889", group=16, fontsize=6, pos="1168,629.06"]; + 268 [label=Healy, width="0.41667", height="0.18056", group=10, fontsize=8, pos="328.72,205.66"]; + 350 [label=Harrigan, width="0.44444", height="0.13889", group=10, fontsize=6, pos="334.74,167.97"]; + 483 [label=Lynch, width="0.33333", height="0.13889", group=10, fontsize=6, pos="294.51,182.65"]; + 336 [label=Kuusik, width="0.36111", height="0.13889", group=10, fontsize=6, pos="371.89,185.95"]; + 69 [label=Uno, width="0.27778", height="0.15278", group=4, fontsize=7, pos="1089.8,538.01"]; + 191 [label=Symvonis, width="0.63889", height="0.18056", group=22, fontsize=8, pos="812.97,463"]; + 565 [label=Murtagh, width="0.44444", height="0.13889", group=10, fontsize=6, pos="299.99,317.82"]; + 224 [label=Ferdinand, width="0.52778", height="0.13889", group=20, fontsize=6, pos="65.88,507.66"]; + 321 [label=Przytycka, width="0.52778", height="0.13889", group=4, fontsize=6, pos="1142.5,475.75"]; + 212 [label=Feng, width="0.27778", height="0.13889", group=6, fontsize=6, pos="749.44,235.57"]; + 126 [label=Lin, width="0.22222", height="0.15278", group=19, fontsize=7, pos="1352.5,12.598"]; + 580 [label=Chuang, width="0.38889", height="0.13889", group=19, fontsize=6, pos="1358.6,43.276"]; + 251 [label=Zhu, width="0.22222", height="0.13889", group=22, fontsize=6, pos="687.66,389.38"]; + 209 [label=Shieber, width="0.41667", height="0.15278", group=5, fontsize=7, pos="614.26,500.9"]; + 574 [label=Cappos, width="0.36111", height="0.13889", group=20, fontsize=6, pos="269.93,486.05"]; + 33 [label=Odenthal, width="0.44444", height="0.13889", group=2, fontsize=6, pos="343.65,606.85"]; + 63 [label=Carrington, width="0.55556", height="0.13889", group=10, fontsize=6, pos="378.95,109.78"]; + 7 [label=Han, width="0.25", height="0.15278", group=8, fontsize=7, pos="1495.2,242.12"]; + 80 [label=Demetrescu, width="0.66667", height="0.15278", group=22, fontsize=7, pos="540.18,683"]; + 26 [label=Freivalds, width="0.47222", height="0.13889", group=6, fontsize=6, pos="899.29,169.73"]; + 457 [label=Jaoua, width="0.27778", height="0.13889", group=3, fontsize=6, pos="1336.1,939.88"]; + 72 [label=Efrat, width="0.30556", height="0.15278", group=20, fontsize=7, pos="414.39,484.11"]; + 264 [label=Garvan, width="0.36111", height="0.13889", group=10, fontsize=6, pos="548.13,279.47"]; + 591 [label=Azuma, width="0.36111", height="0.13889", group=16, fontsize=6, pos="1305.2,649.53"]; + 232 [label=Fekete, width="0.41667", height="0.15278", group=10, fontsize=7, pos="657.75,459.6"]; + 10 [label=Marks, width="0.44444", height="0.18056", group=5, fontsize=8, pos="574.44,481.98"]; + 142 [label=Bertolazzi, width="0.52778", height="0.13889", group=22, fontsize=6, pos="707.83,747.6"]; + 207 [label=Fleischer, width="0.47222", height="0.13889", group=18, fontsize=6, pos="629.3,308.97"]; + 167 [label=Naznin, width="0.36111", height="0.13889", group=16, fontsize=6, pos="1323.6,593.64"]; + 123 [label=Quigley, width="0.44444", height="0.15278", group=10, fontsize=7, pos="498.87,324.93"]; + 50 [label=Cobos, width="0.36111", height="0.15278", group=4, fontsize=7, pos="1108.7,605.47"]; + 66 [label=Vernacotola, width="0.61111", height="0.13889", group=22, fontsize=6, pos="623.9,795.24"]; + 658 [label=Kant, width="0.25", height="0.13889", group=6, fontsize=6, pos="791.18,326.03"]; + 54 [label=Eckersley, width="0.5", height="0.13889", group=10, fontsize=6, pos="420.31,233.41"]; + 70 [label=Shin, width="0.22222", height="0.13889", group=4, fontsize=6, pos="1054.4,484.52"]; + 166 [label=Wagner, width="0.41667", height="0.13889", group=4, fontsize=6, pos="985.32,428.67"]; + 141 [label=Sykora, width="0.33333", height="0.13889", group=13, fontsize=6, pos="669.83,159.76"]; + 30 [label=Klau, width="0.30556", height="0.18056", group=2, fontsize=8, pos="317.22,530.59"]; + 38 [label=Ebner, width="0.33333", height="0.15278", group=2, fontsize=7, pos="220.12,485.34"]; + 403 [label=Barouni, width="0.41667", height="0.13889", group=3, fontsize=6, pos="1334,915.25"]; + 252 [label=Webber, width="0.47222", height="0.15278", group=10, fontsize=7, pos="586.62,296.27"]; + 571 [label=Scott, width="0.25", height="0.13889", group=10, fontsize=6, pos="604.34,235.97"]; + 28 [label=Klein, width="0.33333", height="0.15278", group=2, fontsize=7, pos="270.98,596.29"]; + 283 [label=Fowler, width="0.41667", height="0.15278", group=20, fontsize=7, pos="322.93,493.32"]; + 75 [label=Dillencourt, width="0.63889", height="0.15278", group=14, fontsize=7, pos="391.26,605.46"]; + 606 [label=Hirschberg, width="0.55556", height="0.13889", group=14, fontsize=6, pos="373.08,643.45"]; + 589 [label=Egi, width="0.22222", height="0.15278", group=16, fontsize=7, pos="1304.2,574.95"]; + 335 [label=Hachul, width="0.41667", height="0.15278", group=2, fontsize=7, pos="188.58,630.04"]; + 59 [label=Tokuyama, width="0.52778", height="0.13889", group=16, fontsize=6, pos="1203.8,607.37"]; + 332 [label=Watanabe, width="0.5", height="0.13889", group=16, fontsize=6, pos="1216.4,589.45"]; + 267 [label=Kosaraju, width="0.52778", height="0.15278", group=22, fontsize=7, pos="474.81,699.72"]; + 219 [label=Gajer, width="0.30556", height="0.15278", group=20, fontsize=7, pos="448.19,580.13"]; + 13 [label=Mumford, width="0.47222", height="0.13889", group=22, fontsize=6, pos="481.36,804.43"]; + 85 [label=Toussaint, width="0.47222", height="0.13889", group=22, fontsize=6, pos="1033.6,670.03"]; + 278 [label=Carlson, width="0.38889", height="0.13889", group=14, fontsize=6, pos="385.69,663.26"]; + 248 [label=Cetintas, width="0.41667", height="0.13889", group=6, fontsize=6, pos="918.82,218.07"]; + 9 [label=Italiano, width="0.38889", height="0.13889", group=22, fontsize=6, pos="521.27,793.1"]; + 408 [label=Hui, width="0.22222", height="0.13889", group=2, fontsize=6, pos="138.28,666.32"]; + 356 [label=Wagner, width="0.41667", height="0.13889", group=22, fontsize=6, pos="432.79,701.93"]; + 4 [label=Bertault, width="0.55556", height="0.18056", group=6, fontsize=8, pos="691.72,266.16"]; + 143 [label=Miller, width="0.33333", height="0.13889", group=6, fontsize=6, pos="683.05,219.41"]; + 34 [label=Fernau, width="0.36111", height="0.13889", group=22, fontsize=6, pos="748.84,479.28"]; + 393 [label=Genc, width="0.27778", height="0.15278", group=6, fontsize=7, pos="869.5,188.34"]; + 196 [label=Mehldau, width="0.44444", height="0.13889", group=6, fontsize=6, pos="804.82,90.264"]; + 127 -- 131 [weight="1.0", pos="577.73,1087.2 584.66,1085.3 595.01,1082.4 603.29,1080.1"]; + 127 -- 509 [weight="1.0", pos="563.69,1085.8 558.47,1082.7 551.04,1078.5 545.37,1075.2"]; + 127 -- 410 [weight="1.0", pos="577.08,1092.2 583.16,1094.6 592.05,1098.1 599.13,1101"]; + 32 -- 391 [weight="2.0", pos="1035.5,391.22 1060.8,383.88 1125.6,365.04 1151.4,357.55"]; + 32 -- 99 [weight="1.0", pos="1035.5,391.32 1049.4,387.4 1074.2,380.4 1088.9,376.22"]; + 32 -- 272 [weight="1.0", pos="1036.3,393.05 1064.3,390.1 1138.1,382.34 1166.9,379.31"]; + 32 -- 87 [weight="1.0", pos="1033.4,389.73 1039.1,386.6 1046.7,382.46 1052.3,379.34"]; + 32 -- 498 [weight="1.0", pos="1032.1,389.04 1042.3,381.33 1061.4,366.94 1071.4,359.45"]; + 32 -- 687 [weight="9.0", pos="1026.9,387.63 1028.8,380.37 1031.8,368.76 1033.7,361.34"]; + 32 -- 36 [weight="1.0", pos="1034.6,390.37 1052.9,382.82 1093.5,366.09 1112.3,358.32"]; + 32 -- 454 [weight="1.0", pos="1014.8,396.61 1002.4,399.48 981.71,404.27 968.67,407.28"]; + 90 -- 427 [weight="1.0", pos="602.78,703.38 605.98,703.32 609.33,703.25 612.58,703.19"]; + 90 -- 261 [weight="1.0", pos="598.52,700.17 624.44,693.55 680.07,679.36 710.07,671.71"]; + 90 -- 385 [weight="1.0", pos="584.17,698.22 582.99,681.67 579.49,632.35 578.17,613.71"]; + 90 -- 102 [weight="1.0", pos="588.46,698.22 600.49,681.26 637,629.75 651.34,609.52"]; + 276 -- 521 [weight="1.0", pos="316.69,657.09 313.33,657.43 309.57,657.82 305.85,658.19"]; + 276 -- 294 [weight="1.0", pos="333.8,651.24 354.87,633.15 431.03,567.76 455.46,546.79"]; + 276 -- 279 [weight="1.0", pos="324.74,651.02 322.9,648.53 320.67,645.52 318.82,643.02"]; + 206 -- 659 [weight="1.0", pos="400.52,329.73 410.59,333.49 426.36,339.37 437.33,343.46"]; + 206 -- 319 [weight="1.0", pos="387.08,331.2 383.57,336.04 378.27,343.35 374.41,348.65"]; + 206 -- 567 [weight="1.0", pos="402.21,323.16 416.85,319.39 442.18,312.88 457.55,308.92"]; + 206 -- 352 [weight="1.0", pos="404.97,326.26 408.81,326.31 413.02,326.35 417.01,326.4"]; + 206 -- 648 [weight="1.0", pos="383.91,321.45 376.23,316.24 363.94,307.9 356.85,303.1"]; + 206 -- 372 [weight="1.0", pos="388.43,321.12 382.9,309.44 369.14,280.32 363.38,268.14"]; + 206 -- 550 [weight="1.0", pos="379.98,329.43 375.16,330.91 369.71,332.58 365.87,333.76"]; + 206 -- 584 [weight="1.0", pos="394.52,321.05 396.79,317.99 399.66,314.1 401.92,311.06"]; + 206 -- 698 [weight="1.0", pos="395.49,321.3 402.79,313.86 416.75,299.63 424.22,292.02"]; + 206 -- 504 [weight="1.0", pos="389.95,320.96 388.56,312.31 385.76,294.96 384.38,286.35"]; + 443 -- 579 [weight="1.0", pos="921.34,721.71 916.11,709.97 903.24,681.09 897.49,668.19"]; + 71 -- 155 [weight="1.0", pos="413.69,136.72 423.62,152.18 451.31,195.26 461.35,210.88"]; + 71 -- 326 [weight="1.0", pos="406.34,125.28 397.3,111.18 374.36,75.427 365.74,61.998"]; + 71 -- 235 [weight="1.0", pos="406.47,125.57 399.44,114.79 384.01,91.126 377.17,80.627"]; + 71 -- 520 [weight="1.0", pos="410.01,125.32 409.9,117.64 409.73,104.22 409.63,96.925"]; + 71 -- 195 [weight="1.0", pos="414.35,136.67 418.97,142.67 426.25,152.15 430.71,157.95"]; + 118 -- 656 [weight="1.0", pos="718.11,812.65 723.69,813.22 729.92,813.86 735.68,814.44"]; + 118 -- 374 [weight="1.0", pos="716.81,813.95 738.09,818 774.99,825.01 794.54,828.73"]; + 118 -- 175 [weight="1.0", pos="685.85,814.89 679.81,816.54 672.93,818.42 667.25,819.97"]; + 118 -- 573 [weight="1.0", pos="700.7,817.56 700.77,821.27 700.87,825.8 700.94,829.24"]; + 118 -- 671 [weight="1.0", pos="709.79,816.51 721.22,823.5 740.43,835.26 750.83,841.62"]; + 102 -- 118 [weight="1.0", pos="658.96,609.72 666.09,644.19 692.82,773.44 699.19,804.24"]; + 102 -- 680 [weight="2.0", pos="642.77,605.89 627.16,610.91 602.58,618.81 588.13,623.46"]; + 102 -- 139 [weight="14.0", pos="669.55,607.5 676.3,610.92 684.63,615.15 691.44,618.6"]; + 102 -- 600 [weight="1.0", pos="639.98,601.26 607.83,601.29 538.63,601.36 501.78,601.4"]; + 102 -- 358 [weight="12.0", pos="659.23,609.75 662.31,622.7 668.12,647.13 670.99,659.19"]; + 102 -- 427 [weight="1.0", pos="655.13,609.9 650.35,629.76 638.67,678.24 634.38,696.07"]; + 102 -- 315 [weight="6.0", pos="673.55,603.83 700.49,608.08 753.83,616.52 779.9,620.64"]; + 102 -- 200 [weight="1.0", pos="671.25,596.39 711.09,582.63 824.52,543.45 863.17,530.1"]; + 102 -- 380 [weight="1.0", pos="671.66,596.59 698.66,587.9 756.39,569.33 781.97,561.1"]; + 102 -- 667 [weight="2.0", pos="651,609.53 628.8,639.16 553.61,739.52 533.46,766.4"]; + 102 -- 440 [weight="1.0", pos="643.23,596.31 622.5,589.01 583.89,575.41 563.55,568.25"]; + 102 -- 120 [weight="1.0", pos="674.47,600.02 677.57,599.8 680.76,599.58 683.77,599.36"]; + 102 -- 339 [weight="2.0", pos="674.34,601.31 702.36,601.42 757.56,601.63 784.16,601.73"]; + 102 -- 310 [weight="1.0", pos="666.05,593.89 675.84,585.75 691.33,572.88 699.67,565.95"]; + 102 -- 614 [weight="1.0", pos="672.25,596.92 686.53,592.82 707.59,586.77 719.88,583.24"]; + 102 -- 601 [weight="1.0", pos="646.92,594.13 617.22,573.62 531.66,514.52 502.5,494.38"]; + 102 -- 163 [weight="2.0", pos="650.09,609.39 642.31,618.32 630.03,632.38 623.27,640.12"]; + 102 -- 215 [weight="1.0", pos="642.43,605.58 617.54,612.9 567.9,627.48 546.68,633.71"]; + 102 -- 613 [weight="2.0", pos="662.7,609.59 676.36,630.37 711.62,684 723.34,701.82"]; + 102 -- 225 [weight="1.0", pos="659.21,609.86 664.23,631.5 677.25,687.68 681.39,705.53"]; + 102 -- 385 [weight="2.0", pos="640.34,602.35 630.03,603.03 616.61,603.91 604.83,604.69"]; + 102 -- 579 [weight="1.0", pos="672.42,605.12 716.74,616.42 845.03,649.14 883.56,658.97"]; + 102 -- 307 [weight="2.0", pos="664.95,608.88 682.28,625.99 723.9,667.07 738.89,681.87"]; + 102 -- 269 [weight="1.0", pos="666.29,608.46 690.5,627.69 756.16,679.83 777.04,696.42"]; + 102 -- 294 [weight="1.0", pos="642.62,596.66 606.55,585.33 513.52,556.12 477.55,544.83"]; + 102 -- 644 [weight="1.0", pos="667.56,594.1 689.36,579.05 739.68,544.32 760.29,530.09"]; + 102 -- 422 [weight="2.0", pos="642.88,596.44 636.59,594.33 629.17,591.84 622.7,589.67"]; + 102 -- 261 [weight="9.0", pos="665.59,608.74 679.82,621.47 708.53,647.16 722.39,659.56"]; + 102 -- 369 [weight="1.0", pos="668.55,607.59 694.67,622.23 758.64,658.06 781.7,670.99"]; + 102 -- 185 [weight="1.0", pos="640.86,598.87 609.52,594.32 541.19,584.41 508.28,579.63"]; + 102 -- 160 [weight="1.0", pos="651.37,592.94 632.94,566.78 576.3,486.32 559.04,461.81"]; + 102 -- 555 [weight="1.0", pos="666.65,593.89 682.15,581.8 712.6,558.06 725.6,547.93"]; + 102 -- 472 [weight="1.0", pos="646.55,608 612.63,629.49 507.66,695.99 477.25,715.26"]; + 102 -- 409 [weight="6.0", pos="672.15,605.34 704,614.1 778.32,634.51 810.37,643.32"]; + 102 -- 691 [weight="1.0", pos="673.5,598.45 694.84,594.79 731.99,588.41 752.65,584.87"]; + 102 -- 284 [weight="4.0", pos="662.04,592.88 670.96,577.44 689.86,544.72 698.23,530.23"]; + 102 -- 171 [weight="1.0", pos="654.82,609.89 650.31,626.25 640.65,661.22 637.05,674.26"]; + 102 -- 485 [weight="1.0", pos="645.88,607.61 624.63,619.56 579.07,645.18 558.25,656.89"]; + 331 -- 443 [weight="1.0", pos="905.53,747.9 909.5,743.27 915.35,736.45 919.31,731.83"]; + 331 -- 579 [weight="1.0", pos="900.84,747.77 899.72,732.18 896.35,685.59 895.11,668.32"]; + 358 -- 613 [weight="3.0", pos="681.19,672.77 691.97,680.95 710.33,694.88 720.28,702.43"]; + 358 -- 440 [weight="1.0", pos="664.64,659.56 641.87,640.45 577.22,586.2 556.62,568.92"]; + 358 -- 385 [weight="3.0", pos="662.86,660.13 644.85,648.78 606.64,624.72 588.13,613.07"]; + 358 -- 706 [weight="2.0", pos="670.79,673.33 666.2,690.5 654.48,734.28 650.25,750.1"]; + 358 -- 427 [weight="5.0", pos="665.35,673 657.97,679.75 646.67,690.08 639.5,696.63"]; + 358 -- 472 [weight="1.0", pos="656.69,670.56 618.6,680.7 522.84,706.19 484.83,716.31"]; + 358 -- 395 [weight="1.0", pos="674.36,673.57 677.37,686.58 683.59,713.51 686.17,724.67"]; + 358 -- 485 [weight="1.0", pos="652.56,665.77 631.41,665.2 598,664.31 574.54,663.68"]; + 358 -- 422 [weight="1.0", pos="667.05,659.31 654.6,643.82 624.79,606.76 612.35,591.29"]; + 560 -- 668 [weight="1.0", pos="1157,452.54 1157.7,444.38 1159,428.74 1159.7,420.39"]; + 16 -- 466 [weight="1.0", pos="345.83,680.28 348.07,683.49 350.91,687.55 353.14,690.74"]; + 16 -- 600 [weight="1.0", pos="350.6,670.39 373.99,657.68 439.49,622.09 466.09,607.64"]; + 512 -- 595 [weight="2.0", pos="812.06,259.48 810.29,255.88 808.11,251.45 806.41,248"]; + 512 -- 688 [weight="1.0", pos="795.57,267.23 780.83,268.23 761.03,269.57 747.91,270.45"]; + 512 -- 533 [weight="1.0", pos="798.35,262.25 790.42,260.53 781.05,258.5 773.32,256.82"]; + 512 -- 594 [weight="1.0", pos="802.88,271.27 780.56,280.98 733.78,301.32 711.79,310.88"]; + 194 -- 397 [weight="1.0", pos="948.38,795.19 949.73,799.22 951.62,804.84 952.97,808.87"]; + 194 -- 290 [weight="1.0", pos="940.72,794.68 937.11,797.41 932.52,800.89 928.92,803.61"]; + 194 -- 222 [weight="1.0", pos="958.15,791.73 961.25,792.15 964.61,792.61 967.72,793.03"]; + 194 -- 404 [weight="1.0", pos="950.42,785.11 955.26,778.55 963.7,767.12 968.93,760.04"]; + 57 -- 360 [weight="3.0", pos="300.07,265.76 315.4,256.33 345.38,237.89 359.81,229.01"]; + 57 -- 352 [weight="5.0", pos="303.57,276.58 331.17,287.15 395.32,311.73 422.06,321.98"]; + 57 -- 619 [weight="2.0", pos="300.27,265.88 309.01,260.71 321.74,253.19 330.06,248.28"]; + 57 -- 117 [weight="1.0", pos="284.33,265.31 280.31,261.27 275.2,256.14 271.71,252.64"]; + 57 -- 616 [weight="1.0", pos="291.08,278.37 292.28,294.57 295.31,335.43 296.49,351.36"]; + 517 -- 603 [weight="1.0", pos="716.75,157.42 721.19,160.68 726.96,164.92 731.62,168.33"]; + 517 -- 674 [weight="1.0", pos="708.25,157.84 706.27,165.01 702.83,177.43 700.87,184.48"]; + 458 -- 596 [weight="1.0", pos="722.86,466.26 762.66,466.67 848.3,467.56 884.77,467.94"]; + 458 -- 677 [weight="1.0", pos="706.76,459.02 717.26,444.05 741.76,409.13 752.32,394.08"]; + 458 -- 481 [weight="1.0", pos="707.84,459.27 718.47,447.27 740.37,422.56 749.75,411.98"]; + 458 -- 510 [weight="2.0", pos="708.22,459.36 711.17,456.27 714.62,452.67 717.32,449.84"]; + 458 -- 488 [weight="4.0", pos="713.53,460.19 728.83,452.53 755.37,439.26 769.42,432.22"]; + 458 -- 703 [weight="1.0", pos="702.24,458.59 702.87,446.9 704.07,424.51 704.61,414.35"]; + 458 -- 490 [weight="1.0", pos="720.5,462.75 749.5,457.63 804.45,447.94 827.49,443.87"]; + 316 -- 472 [weight="1.0", pos="437.56,785.34 443.67,772.71 459.66,739.67 466.13,726.29"]; + 454 -- 687 [weight="1.0", pos="963.51,405.28 977.94,395.07 1011.9,371.09 1027.5,360.07"]; + 163 -- 667 [weight="1.0", pos="614.54,651.16 600.09,671.64 549.2,743.71 533.27,766.27"]; + 163 -- 215 [weight="1.0", pos="600.27,643.68 584.47,641.93 562.03,639.45 548.46,637.95"]; + 163 -- 261 [weight="2.0", pos="634.43,648.68 653.51,652.24 685.53,658.22 707.25,662.28"]; + 163 -- 680 [weight="2.0", pos="607.82,641.03 601.21,638.12 592.76,634.41 586.3,631.56"]; + 163 -- 171 [weight="1.0", pos="621.26,651.24 624.55,657.65 629.92,668.11 633.09,674.29"]; + 163 -- 422 [weight="1.0", pos="617.33,640.02 615.21,628.87 610.49,604.06 608.14,591.66"]; + 395 -- 427 [weight="1.0", pos="677.83,725 668.42,720.37 654.02,713.27 644.04,708.36"]; + 395 -- 706 [weight="1.0", pos="680.25,734.5 673.54,739.05 663.48,745.87 656.54,750.59"]; + 89 -- 103 [weight="1.0", pos="525.12,1095.7 527.67,1098.3 530.78,1101.5 533.32,1104.1"]; + 89 -- 127 [weight="1.0", pos="535.45,1090.3 544.15,1090.1 554.7,1089.8 561.85,1089.6"]; + 89 -- 509 [weight="1.0", pos="524.52,1085.6 527.11,1082.5 530.4,1078.6 532.97,1075.5"]; + 584 -- 659 [weight="1.0", pos="410.33,310.57 418.25,318.11 434.21,333.3 443.2,341.86"]; + 584 -- 648 [weight="1.0", pos="398.51,305.2 388.4,303.94 369.89,301.65 359.31,300.34"]; + 584 -- 698 [weight="1.0", pos="410.61,302.01 414.29,299.03 419.31,294.96 423.21,291.8"]; + 31 -- 677 [weight="1.0", pos="858.88,353.79 839.33,360.17 797.86,373.72 774.4,381.38"]; + 31 -- 192 [weight="1.0", pos="858.62,346.6 852.79,344.66 845.62,342.27 839.66,340.29"]; + 31 -- 518 [weight="1.0", pos="873.2,355.16 875.07,357.73 877.35,360.87 879.2,363.41"]; + 31 -- 318 [weight="1.0", pos="861.66,345.94 846.58,337.78 813.95,320.12 797,310.95"]; + 31 -- 111 [weight="1.0", pos="863.28,354.88 859.26,357.79 854.09,361.54 850.01,364.49"]; + 35 -- 631 [weight="1.0", pos="1267.5,347.31 1261.5,350.45 1253.4,354.66 1247.3,357.89"]; + 35 -- 411 [weight="1.0", pos="1272.7,337.76 1271.2,335.21 1269.3,332.15 1267.8,329.55"]; + 11 -- 458 [weight="1.0", pos="819.03,414.58 798.07,423.78 740.51,449.06 714.68,460.4"]; + 492 -- 661 [weight="1.0", pos="623.94,467.22 630.63,470.97 640.03,476.25 646.57,479.92"]; + 208 -- 600 [weight="1.0", pos="432.45,642.04 441.51,633.88 459.76,617.43 470.04,608.17"]; + 208 -- 364 [weight="1.0", pos="425.72,641.77 424.84,638.41 423.69,633.99 422.78,630.51"]; + 511 -- 546 [weight="1.0", pos="564.37,170.17 565.48,175.87 567.27,185.01 568.41,190.84"]; + 434 -- 616 [weight="4.0", pos="236.82,352.57 249.21,353.66 268.65,355.37 282.06,356.55"]; + 93 -- 445 [weight="1.0", pos="1100.6,289.42 1096.7,286.68 1091.8,283.25 1088,280.58"]; + 93 -- 687 [weight="1.0", pos="1101.7,298.85 1088.7,309.72 1056.8,336.48 1042.6,348.42"]; + 292 -- 382 [weight="1.0", pos="46.759,577.36 46.647,573.82 46.5,569.14 46.387,565.53"]; + 292 -- 582 [weight="1.0", pos="54.972,578.58 63.04,574.54 75.445,568.34 83.906,564.11"]; + 292 -- 323 [weight="1.0", pos="53.222,578.02 65.632,568.98 93.23,548.88 107.02,538.84"]; + 29 -- 64 [weight="1.0", pos="345.84,390.55 355.61,393.46 370.59,397.92 381.33,401.11"]; + 29 -- 666 [weight="1.0", pos="347.63,385.93 351.06,385.44 354.9,384.89 358.64,384.36"]; + 29 -- 497 [weight="1.0", pos="347.72,388.73 379.02,391.74 464.09,399.92 497.66,403.15"]; + 29 -- 649 [weight="1.0", pos="342.63,391.81 357.24,400.99 391.94,422.79 408.63,433.27"]; + 325 -- 548 [weight="1.0", pos="1466.5,248.5 1466.5,244.63 1466.4,239.46 1466.4,235.68"]; + 378 -- 440 [weight="1.0", pos="548.41,532.13 548.82,539.16 549.5,550.93 549.91,557.9"]; + 291 -- 427 [weight="1.0", pos="601.5,761.61 607.56,750.21 622.39,722.31 629.22,709.47"]; + 291 -- 706 [weight="1.0", pos="610.4,764.14 616.5,762.83 624.11,761.19 630.94,759.72"]; + 291 -- 358 [weight="1.0", pos="602.4,761.78 614.44,745.42 653.66,692.14 667.66,673.12"]; + 442 -- 531 [weight="1.0", pos="1159,581.86 1156.4,581.84 1153.6,581.82 1150.8,581.8"]; + 540 -- 647 [weight="1.0", pos="839.79,748.61 846.36,745.75 854.91,742.03 861.4,739.2"]; + 199 -- 701 [weight="1.0", pos="347.65,455.36 370.26,456.09 406.67,457.27 426.98,457.93"]; + 199 -- 373 [weight="1.0", pos="345.51,457.32 356.12,458.88 369.34,460.82 378.88,462.23"]; + 199 -- 641 [weight="1.0", pos="325.56,449.02 324.55,446.43 323.37,443.39 322.38,440.83"]; + 199 -- 642 [weight="1.0", pos="342.46,450.95 347.99,449.54 354.22,447.94 359.59,446.57"]; + 199 -- 622 [weight="2.0", pos="335.48,459.81 340.24,462.96 346.27,466.95 350.76,469.92"]; + 199 -- 601 [weight="2.0", pos="344.18,457.98 374.15,463.95 437.73,476.62 471.12,483.27"]; + 226 -- 553 [weight="1.0", pos="1247.5,907.72 1246.2,913.89 1244,924.12 1242.6,930.42"]; + 649 -- 666 [weight="1.0", pos="413.22,432.51 405.11,421.09 388.59,397.81 381.06,387.2"]; + 15 -- 560 [weight="1.0", pos="1131.9,420.18 1137.2,428.3 1147.8,444.49 1153.2,452.74"]; + 15 -- 496 [weight="1.0", pos="1135.1,419.51 1139.3,422.27 1144.8,425.88 1149.1,428.73"]; + 15 -- 187 [weight="1.0", pos="1126,420.55 1124.2,424.1 1121.8,428.78 1120,432.39"]; + 15 -- 121 [weight="1.0", pos="1124.9,420.27 1118,429.34 1103.3,448.58 1095.6,458.69"]; + 15 -- 668 [weight="1.0", pos="1139.7,415.13 1142.7,415.08 1145.9,415.03 1148.9,414.98"]; + 153 -- 221 [weight="1.0", pos="958.98,511.02 960.25,519.46 962.62,535.22 963.85,543.41"]; + 153 -- 280 [weight="1.0", pos="963.51,510.74 967.26,514.49 972.23,519.47 975.97,523.21"]; + 153 -- 618 [weight="1.0", pos="975.52,501.61 986.48,499.25 1000.4,496.25 1010.3,494.11"]; + 153 -- 282 [weight="1.0", pos="961.83,511.06 972.89,528.13 1005.6,578.65 1016.6,595.52"]; + 153 -- 558 [weight="1.0", pos="979.96,507.45 983.4,507.78 986.83,508.1 989.88,508.39"]; + 153 -- 420 [weight="1.0", pos="955.31,499.73 951.33,491.81 944.16,477.52 940.35,469.91"]; + 153 -- 396 [weight="1.0", pos="969.27,510.25 987.09,518.08 1021.7,533.29 1038.9,540.82"]; + 153 -- 464 [weight="1.0", pos="963.83,510.88 972.4,519.18 988.5,534.77 996.66,542.67"]; + 153 -- 308 [weight="1.0", pos="949.18,500.08 944.52,497.32 938.87,493.99 934.39,491.34"]; + 153 -- 664 [weight="1.0", pos="972.37,509.81 986.34,514.18 1007.2,520.71 1019.2,524.45"]; + 153 -- 596 [weight="2.0", pos="950.3,500.18 939.53,493.07 920.27,480.35 909.54,473.25"]; + 153 -- 453 [weight="1.0", pos="981.22,504.76 1003.4,504.18 1036.2,503.33 1053.7,502.87"]; + 153 -- 657 [weight="1.0", pos="976.32,508.86 997.34,512.91 1031.3,519.44 1048.7,522.79"]; + 153 -- 257 [weight="3.0", pos="961.63,499.78 964.89,494.57 969.76,486.79 973.17,481.33"]; + 431 -- 501 [weight="1.0", pos="125.43,582.35 115.75,590.74 96.011,607.85 85.409,617.04"]; + 431 -- 577 [weight="1.0", pos="137.92,582.16 147.44,588.71 164.54,600.47 173.85,606.88"]; + 431 -- 712 [weight="1.0", pos="142.06,574.04 151.44,571.13 165.09,566.89 175.82,563.55"]; + 527 -- 559 [weight="1.0", pos="550.74,330.89 539.63,323.65 521.39,311.75 512.25,305.79"]; + 527 -- 567 [weight="1.0", pos="547.22,332.46 529.72,326.33 498.64,315.43 481.93,309.57"]; + 527 -- 610 [weight="2.0", pos="560.75,329.68 562.62,310.45 567.66,258.64 569.33,241.39"]; + 527 -- 704 [weight="2.0", pos="557.72,329.96 551.82,312.22 536.34,265.69 530.97,249.55"]; + 527 -- 546 [weight="1.0", pos="560.53,329.79 562.18,305.17 567.61,224.31 569.11,202.06"]; + 527 -- 663 [weight="1.0", pos="547.3,341.29 530.38,347.05 500.58,357.2 482.84,363.23"]; + 527 -- 651 [weight="3.0", pos="561.81,329.89 565.71,314.37 574.94,277.54 578.53,263.21"]; + 527 -- 653 [weight="1.0", pos="552.45,330.47 539.79,319.66 514.66,298.21 503.58,288.74"]; + 382 -- 582 [weight="1.0", pos="61.317,559.84 64.103,559.81 67.07,559.77 70.03,559.74"]; + 337 -- 478 [weight="1.0", pos="434.03,391.45 448.74,398.42 477.47,412.02 493.6,419.67"]; + 409 -- 579 [weight="1.0", pos="841.89,650.87 854.67,653.52 872.08,657.12 883.34,659.45"]; + 648 -- 659 [weight="1.0", pos="357.79,302.55 374.38,310.77 418.64,332.68 439.1,342.81"]; + 648 -- 698 [weight="1.0", pos="359.08,298.12 371.24,296.18 395.11,292.37 411.59,289.74"]; + 101 -- 124 [weight="2.0", pos="1039.9,571.23 1047.2,574.37 1056.6,578.45 1063.8,581.55"]; + 101 -- 221 [weight="1.0", pos="1014.7,562.52 1003.1,559.32 987.07,554.88 976.29,551.89"]; + 101 -- 280 [weight="1.0", pos="1022.3,561.2 1013.2,553.95 996.96,541.01 987.88,533.79"]; + 101 -- 618 [weight="1.0", pos="1028.5,560.57 1027.4,546.33 1024.5,510.2 1023.4,496.63"]; + 101 -- 282 [weight="1.0", pos="1027.5,572.18 1025.9,578.63 1023.2,589.06 1021.6,595.46"]; + 101 -- 558 [weight="1.0", pos="1026.1,560.79 1020.6,549.63 1008.5,525.01 1003.3,514.43"]; + 101 -- 396 [weight="1.0", pos="1034,561.12 1037.2,557.78 1041.2,553.51 1044.3,550.25"]; + 101 -- 153 [weight="1.0", pos="1022.4,560.83 1008.9,549.13 977.82,522.35 964.45,510.81"]; + 101 -- 407 [weight="1.0", pos="1033.9,571.92 1044.2,583.24 1067.7,609.16 1077.8,620.32"]; + 101 -- 464 [weight="1.0", pos="1021.5,561.29 1017.3,558.4 1012.2,554.84 1008.2,552.06"]; + 101 -- 664 [weight="1.0", pos="1028.9,560.69 1028.8,553.04 1028.6,539.66 1028.5,532.4"]; + 101 -- 453 [weight="1.0", pos="1032.1,561.02 1039.1,548.82 1056,519.47 1062.8,507.63"]; + 101 -- 657 [weight="1.0", pos="1033,561.04 1039.1,552.86 1050.5,537.5 1056.3,529.72"]; + 101 -- 257 [weight="1.0", pos="1025.9,561.02 1016.9,545.08 990.58,498.64 980.85,481.45"]; + 73 -- 476 [weight="1.0", pos="437.99,510.7 439.47,508.25 441.14,505.5 442.55,503.18"]; + 73 -- 323 [weight="2.0", pos="415.03,518.18 357.39,521 185.07,529.46 131.36,532.09"]; + 73 -- 600 [weight="3.0", pos="437.44,523.85 445.45,539.35 465.41,577.98 473.76,594.14"]; + 73 -- 160 [weight="1.0", pos="444.67,511.69 466.81,500.14 517.71,473.59 541.42,461.22"]; + 73 -- 388 [weight="1.0", pos="435.45,524.08 437.31,532.92 440.49,548.11 442.13,555.96"]; + 73 -- 601 [weight="8.0", pos="444.77,511.8 454.82,506.71 469.81,499.12 480.33,493.79"]; + 73 -- 649 [weight="1.0", pos="432.65,510.58 429.6,495.82 422.31,460.49 419.26,445.74"]; + 340 -- 659 [weight="2.0", pos="489.42,347.47 482.02,347.58 473.94,347.71 467.02,347.82"]; + 340 -- 394 [weight="1.0", pos="520.98,352.3 530.33,357.95 545.23,366.95 554.92,372.81"]; + 76 -- 677 [weight="1.0", pos="793.67,290.65 787.32,307.45 767.28,360.53 759.99,379.84"]; + 76 -- 201 [weight="1.0", pos="793.77,280.5 789.2,268.22 777.4,236.5 772.28,222.76"]; + 311 -- 690 [weight="1.0", pos="97.028,494.64 98.112,497.28 99.435,500.5 100.51,503.12"]; + 311 -- 323 [weight="1.0", pos="97.281,494.57 100.93,502.39 108.02,517.57 112.1,526.29"]; + 62 -- 164 [weight="1.0", pos="914.58,156.79 911.69,173.48 903.24,222.26 900.18,239.97"]; + 62 -- 508 [weight="1.0", pos="921.45,145.77 927.8,140.01 937.82,130.92 943.97,125.34"]; + 67 -- 469 [weight="1.0", pos="154.53,456.74 170.42,454.57 197.89,450.81 214.56,448.53"]; + 198 -- 540 [weight="1.0", pos="876.39,701.57 866.87,712.07 844.22,737.06 834.45,747.85"]; + 198 -- 647 [weight="1.0", pos="879.45,701.78 877.6,709.07 874.16,722.55 872.29,729.91"]; + 139 -- 472 [weight="1.0", pos="688.75,631.33 644.89,649.13 520.19,699.73 480.91,715.67"]; + 139 -- 315 [weight="5.0", pos="736.19,624.35 750.59,624.02 766.95,623.65 778.75,623.39"]; + 139 -- 440 [weight="1.0", pos="688.58,618.83 657.85,606.55 590.09,579.48 562.39,568.41"]; + 139 -- 385 [weight="1.0", pos="677.36,621.13 655.01,617.84 623.47,613.21 601.88,610.04"]; + 139 -- 358 [weight="9.0", pos="698.7,632.25 692.85,639.91 683.64,651.96 677.89,659.48"]; + 389 -- 452 [weight="1.0", pos="966.87,227.25 971.06,225.17 976.45,222.48 980.91,220.27"]; + 389 -- 423 [weight="1.0", pos="955.91,226.11 950.6,220.39 941.5,210.57 936.1,204.75"]; + 327 -- 373 [weight="1.0", pos="356.29,427.18 363.03,434.26 377.69,449.62 385.8,458.13"]; + 327 -- 641 [weight="1.0", pos="347.92,425.19 343.48,426.83 336.71,429.32 330.98,431.43"]; + 327 -- 601 [weight="1.0", pos="357.36,425.56 376.43,434.3 448.94,467.54 479.22,481.42"]; + 280 -- 618 [weight="1.0", pos="987.11,523.39 995.17,516.21 1009.6,503.3 1017.5,496.27"]; + 280 -- 282 [weight="1.0", pos="984.37,534.25 991.66,547.87 1010.1,582.22 1017.2,595.6"]; + 280 -- 558 [weight="1.0", pos="986.64,523.34 989.61,520.42 993.28,516.81 996.14,514"]; + 280 -- 396 [weight="1.0", pos="994.36,531.78 1005.9,534.62 1022.7,538.76 1034.6,541.7"]; + 280 -- 464 [weight="1.0", pos="986.88,533.75 989.9,536.55 993.6,540 996.54,542.75"]; + 280 -- 453 [weight="1.0", pos="993.41,524.84 1010.2,519.67 1040.2,510.42 1055.8,505.62"]; + 280 -- 664 [weight="1.0", pos="997.29,528.15 1003.9,527.98 1011.4,527.79 1017.4,527.63"]; + 280 -- 657 [weight="1.0", pos="997.21,527.83 1012.1,527.14 1034,526.12 1047.6,525.5"]; + 471 -- 522 [weight="1.0", pos="486.49,443.16 483.52,434.25 477.35,415.77 474.28,406.58"]; + 236 -- 579 [weight="1.0", pos="953.26,634.56 940.55,640.47 917.17,651.32 904.11,657.39"]; + 236 -- 505 [weight="1.0", pos="959.6,625.4 953.34,612.51 936.84,578.61 930.4,565.37"]; + 361 -- 370 [weight="1.0", pos="260.01,308.15 258.83,305.64 257.4,302.6 256.2,300.03"]; + 168 -- 282 [weight="1.0", pos="1051.3,647.03 1044.8,637.45 1030.8,616.77 1024,606.75"]; + 168 -- 460 [weight="1.0", pos="1048.6,656.6 1039.2,663.46 1021.4,676.52 1011.6,683.68"]; + 622 -- 701 [weight="1.0", pos="365.89,472.51 380.78,469.75 411.13,464.12 428.64,460.88"]; + 622 -- 641 [weight="1.0", pos="352.32,469.07 345.45,461.85 332.87,448.63 325.69,441.08"]; + 622 -- 642 [weight="1.0", pos="359.84,468.75 362.69,463.08 367.15,454.2 369.98,448.55"]; + 184 -- 328 [weight="1.0", pos="218.65,520.28 233.15,517.89 260.61,513.36 276,510.83"]; + 184 -- 390 [weight="1.0", pos="216.72,525.26 235.95,533.84 286.45,556.35 309.06,566.43"]; + 184 -- 303 [weight="1.0", pos="219.01,522.46 248.45,524.23 335.38,529.47 372.32,531.7"]; + 184 -- 597 [weight="1.0", pos="214.13,526.5 224.79,536.26 249.54,558.95 261.6,569.99"]; + 184 -- 288 [weight="1.0", pos="217.81,524.35 236.4,529.66 279.85,542.07 300.41,547.94"]; + 184 -- 537 [weight="1.0", pos="215.5,517.88 220.03,515.08 226.1,511.32 230.8,508.42"]; + 184 -- 294 [weight="1.0", pos="219.03,522.58 257.09,525.34 393.77,535.25 444.19,538.91"]; + 184 -- 637 [weight="1.0", pos="218.56,523.83 244.65,529.26 317.48,544.43 347.57,550.69"]; + 14 -- 40 [weight="1.0", pos="1068.8,698.52 1072.3,688.7 1079.3,668.89 1082.7,659.32"]; + 14 -- 282 [weight="1.0", pos="1064.3,698.75 1056.2,680.83 1030.8,624.61 1022.7,606.65"]; + 14 -- 561 [weight="1.0", pos="1067.6,710.01 1068.1,713.67 1068.7,718.38 1069.2,721.9"]; + 14 -- 168 [weight="1.0", pos="1065.5,698.72 1063.1,688.52 1058.1,667.01 1055.9,657.2"]; + 14 -- 460 [weight="2.0", pos="1051.5,700.44 1041,697.8 1027.3,694.34 1017.4,691.85"]; + 135 -- 200 [weight="1.0", pos="884.21,540.65 882.89,538.16 881.33,535.2 879.94,532.57"]; + 135 -- 433 [weight="1.0", pos="895.94,551.28 906.76,557.43 925.12,567.87 936.47,574.32"]; + 135 -- 534 [weight="1.0", pos="889.89,551.88 896.4,565.33 912.91,599.44 919.11,612.25"]; + 135 -- 539 [weight="1.0", pos="891.57,551.99 899.64,562.45 916.74,584.63 924.31,594.45"]; + 348 -- 677 [weight="2.0", pos="745.57,350.87 748.03,358.43 752.32,371.61 754.97,379.78"]; + 145 -- 598 [weight="1.0", pos="849.94,102.15 843.41,103.88 835.03,106.1 827.97,107.96"]; + 145 -- 342 [weight="1.0", pos="855.69,104.04 846.66,112.33 828.15,129.33 818.46,138.23"]; + 178 -- 261 [weight="1.0", pos="565.88,747.95 594.28,733.89 683.39,689.76 717.11,673.06"]; + 178 -- 385 [weight="1.0", pos="557.84,746.78 561.03,724.2 573.05,639.09 576.64,613.68"]; + 178 -- 357 [weight="1.0", pos="567.94,748.95 573.28,747.29 579.73,745.3 585.18,743.61"]; + 24 -- 445 [weight="1.0", pos="1118.9,307.36 1110.6,300.45 1095.4,287.62 1087.2,280.78"]; + 24 -- 687 [weight="1.0", pos="1115.6,316.26 1098.9,324.2 1062.9,341.33 1045.4,349.64"]; + 24 -- 93 [weight="1.0", pos="1119.8,307.15 1117.4,304.66 1114.5,301.65 1112.1,299.14"]; + 24 -- 65 [weight="1.0", pos="1124.8,306.86 1125.4,298.83 1126.4,283.45 1127,275.23"]; + 285 -- 636 [weight="1.0", pos="1124,641.55 1128.6,634.56 1136.5,622.77 1141,616.08"]; + 285 -- 554 [weight="1.0", pos="1122.4,652.82 1125.1,660.09 1129.9,672.69 1132.6,679.85"]; + 285 -- 696 [weight="1.0", pos="1118.8,652.83 1116,663.78 1109.9,687.81 1107.2,698.47"]; + 285 -- 583 [weight="1.0", pos="1123.2,652.69 1124.5,655.26 1126.2,658.31 1127.5,660.82"]; + 285 -- 407 [weight="1.0", pos="1111.9,642.41 1105.4,638.68 1096.4,633.54 1090.2,629.93"]; + 104 -- 402 [weight="1.0", pos="686.5,251.83 679.27,260.05 664.93,276.35 657.43,284.88"]; + 104 -- 324 [weight="1.0", pos="673.51,245.27 666.29,244.62 658.1,243.88 651.57,243.29"]; + 104 -- 673 [weight="1.0", pos="682.75,251.41 674.64,255.96 662.28,262.89 654.29,267.37"]; + 124 -- 221 [weight="1.0", pos="1061.8,581.84 1039.9,574.38 995.4,559.18 975.12,552.25"]; + 124 -- 636 [weight="1.0", pos="1086.5,590.47 1100,595.27 1121.5,602.91 1134.1,607.41"]; + 124 -- 280 [weight="2.0", pos="1066.1,581.02 1048.3,570.02 1006.6,544.19 989.16,533.41"]; + 124 -- 618 [weight="1.0", pos="1071.3,580.49 1062,563.44 1034.5,512.62 1025.7,496.41"]; + 124 -- 282 [weight="1.0", pos="1060.4,589.98 1052.6,592.12 1042.9,594.79 1035,596.97"]; + 124 -- 558 [weight="1.0", pos="1069,580.62 1055.2,566.19 1018.1,527.53 1005.3,514.11"]; + 124 -- 396 [weight="1.0", pos="1070.8,580.45 1065.9,572.47 1056.9,558.05 1052.1,550.38"]; + 124 -- 153 [weight="1.0", pos="1066.7,580.83 1045.6,566.16 986.59,525.14 965.64,510.58"]; + 124 -- 407 [weight="2.0", pos="1075.6,591.96 1077.1,599.5 1079.9,612.57 1081.4,620"]; + 124 -- 464 [weight="1.0", pos="1065.1,581.24 1050.8,573.62 1023.3,559.01 1009.7,551.79"]; + 124 -- 664 [weight="1.0", pos="1070.1,580.71 1061.2,569.34 1040.8,543.16 1032.3,532.26"]; + 124 -- 453 [weight="1.0", pos="1073.7,580.39 1072.2,564.9 1067.8,522.45 1066.3,507.69"]; + 124 -- 657 [weight="1.0", pos="1073,580.49 1070.2,568.65 1063.7,541.4 1061,530.04"]; + 124 -- 257 [weight="1.0", pos="1069.6,580.77 1053.4,562.2 999.7,500.73 982.51,481.06"]; + 124 -- 285 [weight="1.0", pos="1078.6,591.77 1087.4,603.46 1107.5,630.23 1116.1,641.76"]; + 131 -- 410 [weight="1.0", pos="615.6,1081.5 614.48,1086.8 612.72,1095.2 611.6,1100.5"]; + 385 -- 427 [weight="7.0", pos="581.8,613.72 592.16,631.83 619.09,678.89 629.01,696.25"]; + 385 -- 494 [weight="1.0", pos="574.21,613.61 562.73,637.4 525.91,713.67 516.06,734.09"]; + 385 -- 484 [weight="1.0", pos="581.61,599.34 590.45,583.36 611.74,544.91 620.33,529.4"]; + 385 -- 680 [weight="2.0", pos="577.24,613.5 577.09,616.13 576.91,619.09 576.76,621.58"]; + 385 -- 570 [weight="1.0", pos="577.44,599.42 577.05,586.92 576.26,561.16 575.92,550.13"]; + 594 -- 595 [weight="1.0", pos="708.37,310.03 728.31,295.87 777.85,260.69 796.44,247.49"]; + 594 -- 688 [weight="1.0", pos="704.92,309.47 711.82,300.44 724.06,284.43 730.24,276.35"]; + 307 -- 613 [weight="2.0", pos="739.69,692.87 737.22,695.79 734.21,699.36 731.76,702.26"]; + 307 -- 358 [weight="2.0", pos="732.55,683.84 720.38,680.27 701.37,674.71 688.04,670.8"]; + 154 -- 522 [weight="1.0", pos="281.63,390.11 328.26,392.81 433.86,398.92 464.18,400.67"]; + 388 -- 600 [weight="1.0", pos="447.39,565.94 453.48,573.11 464.77,586.4 471.67,594.53"]; + 388 -- 601 [weight="1.0", pos="446.43,556.16 454.94,543.53 477.92,509.4 487.9,494.58"]; + 96 -- 365 [weight="1.0", pos="952.32,326.25 949.44,322.97 945.64,318.65 942.7,315.31"]; + 96 -- 432 [weight="1.0", pos="944.57,330.92 935.99,330.78 924.39,330.61 915.17,330.46"]; + 364 -- 600 [weight="3.0", pos="430.33,621.03 439.27,617.32 453.08,611.58 463.46,607.27"]; + 553 -- 705 [weight="1.0", pos="1232.1,932.45 1225.9,930.14 1217.8,927.08 1211.1,924.6"]; + 159 -- 304 [weight="1.0", pos="499.06,200.22 510.62,203.49 530.86,209.21 543.91,212.9"]; + 326 -- 468 [weight="1.0", pos="361.16,51.288 359.05,41.931 354.78,23.057 352.73,13.947"]; + 160 -- 659 [weight="3.0", pos="547.17,447.67 528.05,428.12 474.26,373.15 455.95,354.42"]; + 160 -- 594 [weight="2.0", pos="561.44,447.59 586.75,423.54 669.34,345.07 693.3,322.3"]; + 160 -- 593 [weight="1.0", pos="582.67,450.77 604.23,447.84 632.65,443.98 648.31,441.86"]; + 160 -- 600 [weight="1.0", pos="550.32,461.74 537.37,486.59 494.07,569.68 481.17,594.42"]; + 160 -- 394 [weight="3.0", pos="554.97,447.63 556.96,433.06 561.51,399.69 563.47,385.33"]; + 160 -- 294 [weight="2.0", pos="546.56,461.66 529.42,477.8 487.33,517.42 470.34,533.41"]; + 160 -- 522 [weight="1.0", pos="543.68,447.88 526.37,436.52 492.04,413.99 478.33,404.99"]; + 160 -- 214 [weight="2.0", pos="572.48,448.7 593.49,441.93 627.41,431 647.2,424.62"]; + 160 -- 654 [weight="1.0", pos="554.19,447.64 554.27,445.01 554.34,442.05 554.41,439.56"]; + 160 -- 185 [weight="1.0", pos="550.18,461.94 538.63,483.95 504.22,549.54 493.24,570.46"]; + 160 -- 303 [weight="1.0", pos="540.24,461.18 508.38,476.28 430.01,513.4 400.62,527.33"]; + 160 -- 471 [weight="1.0", pos="523.02,451.62 516.61,450.99 510.11,450.35 504.49,449.8"]; + 160 -- 649 [weight="1.0", pos="524.14,451.24 497.53,448.2 459.41,443.84 436.8,441.25"]; + 160 -- 601 [weight="2.0", pos="541.59,461.32 530.8,467.1 515.27,475.42 504.61,481.14"]; + 160 -- 581 [weight="1.0", pos="550.91,447.48 544.82,433.33 531.38,402.15 526.18,390.07"]; + 160 -- 527 [weight="1.0", pos="554.37,447.65 555.44,426.76 558.6,365.11 559.68,344.08"]; + 160 -- 362 [weight="1.0", pos="559.1,447.62 570.1,432.42 595.85,396.84 605.49,383.53"]; + 160 -- 340 [weight="2.0", pos="551.28,447.6 543.54,427.6 521.56,370.81 514.56,352.72"]; + 160 -- 478 [weight="2.0", pos="542.72,447.83 534.4,442.8 523.21,436.03 515.24,431.21"]; + 569 -- 684 [weight="1.0", pos="249.6,1156.1 261.17,1153.2 279.47,1148.5 291.78,1145.4"]; + 555 -- 644 [weight="1.0", pos="740.83,538.48 745.96,535.85 752.42,532.53 757.89,529.72"]; + 555 -- 691 [weight="1.0", pos="736.4,548.28 743.24,555.74 755.88,569.53 762.78,577.06"]; + 555 -- 614 [weight="1.0", pos="731.45,548.34 731.08,555.37 730.43,567.89 730.06,575.02"]; + 8 -- 334 [weight="1.0", pos="761.47,366.09 753.19,366.01 742.18,365.9 732.07,365.79"]; + 8 -- 677 [weight="4.0", pos="770.23,371.46 768.07,374.05 765.43,377.21 763.1,380"]; + 37 -- 294 [weight="1.0", pos="315.57,595.28 343.14,585 418.33,556.95 449.37,545.38"]; + 37 -- 303 [weight="1.0", pos="311.53,594.15 326.57,582.27 364.48,552.29 381.15,539.11"]; + 37 -- 390 [weight="2.0", pos="308.27,593.54 310.75,588.99 314.24,582.56 316.83,577.81"]; + 37 -- 597 [weight="2.0", pos="297.42,594.29 291.85,590.83 284.32,586.15 278.33,582.42"]; + 43 -- 630 [weight="1.0", pos="1292.5,626.66 1287.9,621.22 1280.4,612.48 1275.3,606.47"]; + 43 -- 297 [weight="1.0", pos="1279,629.71 1271.9,628.95 1263.8,628.08 1257.3,627.38"]; + 5 -- 310 [weight="1.0", pos="794.55,573.37 775.96,570.82 739.45,565.82 719.42,563.07"]; + 5 -- 102 [weight="1.0", pos="794.91,576.92 768.8,581.53 703.8,593.01 673.38,598.39"]; + 5 -- 614 [weight="1.0", pos="794.17,575.8 779.84,576.82 755.92,578.53 741.62,579.55"]; + 5 -- 555 [weight="1.0", pos="797.57,571.3 783.83,565.43 756.85,553.9 742.05,547.58"]; + 5 -- 20 [weight="1.0", pos="795.36,572.53 786.11,570.45 772.68,567.43 762.4,565.12"]; + 5 -- 200 [weight="1.0", pos="812.57,570.39 825.19,561.51 853.09,541.88 867.4,531.81"]; + 5 -- 18 [weight="1.0", pos="797.82,578.93 787.59,583.86 770.11,592.27 758.44,597.88"]; + 5 -- 644 [weight="1.0", pos="802.44,569.86 795.76,560.57 781.59,540.85 774.14,530.5"]; + 5 -- 691 [weight="1.0", pos="795.17,577.04 791.07,577.82 786.36,578.72 782,579.55"]; + 5 -- 284 [weight="1.0", pos="798.3,571.05 780.49,562.14 736.69,540.24 714.99,529.38"]; + 5 -- 380 [weight="1.0", pos="802.96,570.05 801.37,567.56 799.43,564.55 797.83,562.04"]; + 485 -- 667 [weight="2.0", pos="546.34,669.51 543,688.87 533.2,745.65 529.71,765.84"]; + 485 -- 608 [weight="1.0", pos="532.05,668.4 523.18,671.52 512.35,675.34 504.9,677.97"]; + 391 -- 687 [weight="1.0", pos="1149.1,354.41 1124.8,354.39 1073.1,354.37 1048.7,354.35"]; + 391 -- 536 [weight="1.0", pos="1169.7,349.74 1181.5,342.34 1204.5,328.02 1216.1,320.75"]; + 538 -- 679 [weight="1.0", pos="773.83,739.06 785.4,734.62 803.91,727.51 815.73,722.97"]; + 21 -- 128 [weight="1.0", pos="994.37,655.38 987.6,656.79 979.76,658.43 973.27,659.79"]; + 21 -- 88 [weight="1.0", pos="1010.5,646.85 1010.7,644.53 1011,641.82 1011.2,639.51"]; + 21 -- 433 [weight="1.0", pos="1005.3,646.94 993.97,634.02 964.42,600.42 952.03,586.34"]; + 554 -- 696 [weight="1.0", pos="1127.4,689.91 1122.7,692.91 1116.8,696.77 1112.3,699.65"]; + 554 -- 583 [weight="1.0", pos="1133.5,679.94 1132.8,677.15 1132,673.75 1131.4,670.99"]; + 552 -- 669 [weight="2.0", pos="1023.3,191.8 1015.2,188.74 1004.8,184.82 996.68,181.75"]; + 288 -- 294 [weight="1.0", pos="325.55,550.13 352.8,548.18 413.04,543.86 443.94,541.64"]; + 288 -- 328 [weight="1.0", pos="308.58,545.96 303.85,537.79 294.69,521.97 290.03,513.93"]; + 288 -- 637 [weight="1.0", pos="325.56,551.79 331.93,552.09 339.48,552.45 345.95,552.75"]; + 288 -- 390 [weight="1.0", pos="313.77,556.25 314.91,558.89 316.29,562.12 317.5,564.93"]; + 288 -- 303 [weight="1.0", pos="323.37,548.33 337.03,545.09 359.56,539.75 374.4,536.24"]; + 288 -- 597 [weight="1.0", pos="304.06,555.51 297.11,559.56 286.71,565.62 278.94,570.15"]; + 288 -- 537 [weight="1.0", pos="304.52,546.61 290.43,537.56 258.93,517.36 244.94,508.39"]; + 193 -- 398 [weight="1.0", pos="845.52,467.88 828.66,465.35 798.18,460.77 778.83,457.87"]; + 193 -- 458 [weight="1.0", pos="844.73,469.41 817.8,468.78 755.77,467.31 723,466.54"]; + 460 -- 561 [weight="1.0", pos="1012.8,693.35 1025.6,700.85 1050.4,715.44 1062.7,722.66"]; + 460 -- 678 [weight="1.0", pos="1010.3,693.8 1013.2,696.59 1016.9,700.01 1019.7,702.73"]; + 460 -- 579 [weight="1.0", pos="992.16,685.58 970.46,680.29 926.45,669.55 905.81,664.52"]; + 453 -- 464 [weight="1.0", pos="1059.4,507.03 1047.1,515.65 1020.3,534.47 1008,543.08"]; + 453 -- 664 [weight="1.0", pos="1059.3,506.87 1052.4,511.42 1041.7,518.55 1034.9,523.08"]; + 453 -- 657 [weight="1.0", pos="1064.4,507.74 1063.4,511.36 1062.2,516.16 1061.2,519.77"]; + 453 -- 618 [weight="1.0", pos="1055.4,499.85 1049.3,498.25 1041.5,496.21 1035.1,494.53"]; + 453 -- 558 [weight="1.0", pos="1053.8,503.82 1041.8,505.09 1023.4,507.04 1011.8,508.27"]; + 324 -- 402 [weight="1.0", pos="640.95,247.36 643.42,256.48 648.55,275.39 651.1,284.8"]; + 324 -- 673 [weight="1.0", pos="640.76,247.35 642.03,252.77 644.03,261.26 645.3,266.66"]; + 180 -- 198 [weight="1.0", pos="861.05,699.26 864.25,698.86 867.69,698.42 870.79,698.03"]; + 180 -- 540 [weight="1.0", pos="847.43,705.93 843.68,715.94 835.51,737.78 831.77,747.77"]; + 180 -- 647 [weight="1.0", pos="852.56,705.79 856.6,712.2 863.53,723.2 867.64,729.72"]; + 244 -- 588 [weight="1.0", pos="867.54,254.88 881.43,254.11 909.94,252.53 930.99,251.36"]; + 244 -- 432 [weight="5.0", pos="862.56,261.46 870.08,275.3 888.32,308.87 896.2,323.37"]; + 244 -- 449 [weight="1.0", pos="856.83,249.04 854.94,244.08 852.34,237.23 850.53,232.49"]; + 433 -- 526 [weight="1.0", pos="945.8,586.6 944,605.34 938.89,658.54 937.27,675.49"]; + 433 -- 579 [weight="1.0", pos="942.37,586.41 932.64,601.77 908.11,640.52 898.54,655.63"]; + 351 -- 527 [weight="1.0", pos="618.61,391.85 606.27,380.28 579.5,355.19 566.88,343.36"]; + 240 -- 553 [weight="2.0", pos="1263.8,956.49 1258.9,952.02 1251.9,945.62 1247.1,941.15"]; + 240 -- 513 [weight="2.0", pos="1275.2,956.55 1279.7,952.42 1286,946.66 1290.5,942.53"]; + 595 -- 688 [weight="1.0", pos="793.07,246.78 779.53,252.42 756.28,262.12 743.36,267.5"]; + 74 -- 315 [weight="1.0", pos="870.09,639.25 853.21,635.61 825.88,629.7 809.25,626.11"]; + 74 -- 414 [weight="1.0", pos="884.47,637.35 884.18,634.26 883.82,630.34 883.53,627.26"]; + 334 -- 402 [weight="1.0", pos="700.23,358.85 690.04,344.19 665.85,309.4 656.45,295.87"]; + 334 -- 348 [weight="1.0", pos="716.3,359.48 721.94,356.51 728.66,352.97 734.03,350.13"]; + 334 -- 677 [weight="4.0", pos="718.64,371.15 725.93,374.13 734.88,377.79 742.33,380.84"]; + 334 -- 594 [weight="1.0", pos="704.17,358.64 703.21,349.09 701.48,331.92 700.53,322.56"]; + 334 -- 458 [weight="1.0", pos="704.67,372.11 704.12,390.2 702.61,440.45 702.05,459.02"]; + 440 -- 472 [weight="1.0", pos="547.34,569.14 534.72,593.5 484.57,690.31 471.86,714.86"]; + 488 -- 596 [weight="1.0", pos="791.04,431.57 814.61,439.35 866.04,456.33 889.57,464.09"]; + 488 -- 510 [weight="2.0", pos="766.19,431.4 755.47,434.68 740.35,439.32 730.86,442.23"]; + 488 -- 490 [weight="1.0", pos="792.54,430.89 803.48,433.56 818.53,437.24 828.28,439.62"]; + 61 -- 201 [weight="1.0", pos="812.69,177.2 803.8,185.31 785.56,201.93 776.01,210.64"]; + 61 -- 681 [weight="1.0", pos="817.2,177.54 816.84,180.49 816.38,184.21 816.01,187.19"]; + 299 -- 687 [weight="1.0", pos="1110.2,338.34 1093.4,341.95 1064.1,348.22 1047.7,351.75"]; + 115 -- 294 [weight="1.0", pos="285.56,633.19 314.22,618.19 417.13,564.31 451.66,546.24"]; + 115 -- 568 [weight="1.0", pos="283.44,632.4 286.59,629.64 290.56,626.16 293.74,623.37"]; + 377 -- 616 [weight="1.0", pos="225.69,370.52 241.51,367.71 267.02,363.18 282.85,360.37"]; + 103 -- 127 [weight="1.0", pos="545.47,1104.4 551.08,1101 558.68,1096.3 563.93,1093.1"]; + 103 -- 509 [weight="1.0", pos="537.94,1103.9 537.77,1096.6 537.47,1083.1 537.3,1075.7"]; + 602 -- 652 [weight="4.0", pos="767.57,188.26 767.43,180.52 767.21,168.02 767.08,160.34"]; + 602 -- 603 [weight="4.0", pos="759.78,189.22 756.05,186.44 751.6,183.13 747.85,180.34"]; + 201 -- 517 [weight="2.0", pos="764.32,210.35 752.7,197.98 725.95,169.52 714.81,157.65"]; + 201 -- 626 [weight="1.0", pos="759.57,212.68 738.58,205.39 691.15,188.94 671.4,182.08"]; + 201 -- 681 [weight="1.0", pos="778.64,211.65 787.11,207.22 799.8,200.57 807.83,196.36"]; + 201 -- 677 [weight="1.0", pos="769.36,223.15 767.34,250.6 759.89,351.85 757.83,379.78"]; + 201 -- 652 [weight="5.0", pos="769.55,209.55 769,197.56 767.84,172.56 767.28,160.47"]; + 201 -- 602 [weight="5.0", pos="769.18,209.56 768.92,207.04 768.62,204.19 768.37,201.68"]; + 201 -- 255 [weight="1.0", pos="781.84,215.09 797.64,213.56 825.51,210.86 842.98,209.17"]; + 201 -- 603 [weight="5.0", pos="765.43,210.07 759.82,202.24 750.19,188.81 744.47,180.84"]; + 201 -- 674 [weight="1.0", pos="759.77,212.46 746.37,207.43 722.86,198.6 709.48,193.58"]; + 423 -- 452 [weight="1.0", pos="941.75,202.81 952.19,205.72 968.47,210.26 979.01,213.21"]; + 415 -- 630 [weight="1.0", pos="1267.6,658.04 1268,646.4 1269,619.01 1269.5,606.43"]; + 152 -- 553 [weight="1.0", pos="1211.9,942.13 1217.9,940.89 1224.7,939.45 1230.3,938.27"]; + 152 -- 705 [weight="1.0", pos="1198.6,939.74 1198.8,935.54 1199,929.67 1199.2,925.47"]; + 189 -- 468 [weight="1.0", pos="333.36,7.6759 336.38,7.862 339.59,8.0591 342.45,8.2352"]; + 189 -- 326 [weight="2.0", pos="325.85,12.279 333.77,21.924 350.37,42.141 358.18,51.647"]; + 189 -- 300 [weight="1.0", pos="320.08,12.455 319.43,15.042 318.66,18.103 318.02,20.625"]; + 342 -- 592 [weight="1.0", pos="805.38,138.06 797.1,130.91 783.36,119.05 775.93,112.63"]; + 342 -- 512 [weight="1.0", pos="812.38,150.52 812.9,171.69 814.54,238.1 815.06,259.32"]; + 342 -- 598 [weight="1.0", pos="812.51,137.44 812.79,131.41 813.19,122.56 813.44,116.98"]; + 342 -- 347 [weight="1.0", pos="807.18,137.9 797.77,126.58 777.74,102.47 769.14,92.124"]; + 452 -- 669 [weight="2.0", pos="988.44,210.27 987.29,202.74 985.31,189.7 984.18,182.29"]; + 452 -- 552 [weight="2.0", pos="998.41,212.35 1005.7,209.37 1016,205.16 1024,201.86"]; + 91 -- 667 [weight="1.0", pos="543.27,816.77 540.26,807.89 534.17,789.9 530.81,779.99"]; + 579 -- 678 [weight="1.0", pos="904.85,665.38 929.42,674 991.55,695.81 1015.3,704.16"]; + 341 -- 358 [weight="1.0", pos="715.13,760.59 707.72,744.14 684.33,692.18 675.81,673.27"]; + 480 -- 601 [weight="1.0", pos="293.36,441.66 329.09,449.89 429.22,472.95 472.39,482.9"]; + 107 -- 682 [weight="1.0", pos="829.16,1080 835.89,1078.4 843.95,1076.5 850.61,1075"]; + 107 -- 345 [weight="1.0", pos="817.62,1077.8 822.94,1065.1 836.27,1033.1 841.66,1020.1"]; + 107 -- 624 [weight="1.0", pos="814.21,1077.8 811.79,1066.6 806.25,1041 803.87,1029.9"]; + 535 -- 623 [weight="1.0", pos="997.35,295.62 998.29,298.6 999.47,302.33 1000.4,305.38"]; + 467 -- 503 [weight="1.0", pos="1030.2,432.84 1032.9,435.41 1036.2,438.55 1038.8,441.1"]; + 87 -- 498 [weight="1.0", pos="1064.8,369.78 1067.5,366.69 1070.8,362.76 1073.4,359.69"]; + 87 -- 687 [weight="1.0", pos="1054.7,370.12 1051.1,367.18 1046.5,363.39 1042.7,360.26"]; + 481 -- 596 [weight="1.0", pos="762.96,410.64 788.65,421.28 863.55,452.29 891.28,463.78"]; + 481 -- 510 [weight="1.0", pos="749.96,411.96 743.83,419.19 732.49,432.56 726.31,439.86"]; + 481 -- 488 [weight="1.0", pos="759.88,411.76 763.63,414.89 768.54,418.98 772.42,422.22"]; + 77 -- 659 [weight="1.0", pos="509.75,363.3 496.98,360.07 477.31,355.08 464,351.7"]; + 77 -- 160 [weight="2.0", pos="524.38,372.03 529.87,387.33 545.28,430.32 551.43,447.47"]; + 77 -- 340 [weight="1.0", pos="519.45,360.8 518.12,358.2 516.54,355.15 515.22,352.58"]; + 77 -- 394 [weight="1.0", pos="534.33,369.93 539.27,371.34 545.05,373 550.22,374.48"]; + 174 -- 387 [weight="1.0", pos="1374.2,1137.6 1384.7,1142.5 1401.9,1150.6 1412.1,1155.3"]; + 174 -- 216 [weight="1.0", pos="1364.4,1138.5 1363.5,1145.6 1361.9,1158.2 1361,1165.3"]; + 174 -- 245 [weight="1.0", pos="1379.7,1130.5 1383.7,1129.7 1388,1128.9 1391.7,1128.2"]; + 174 -- 381 [weight="1.0", pos="1368,1138.6 1373.7,1149 1386.2,1171.7 1391.8,1181.7"]; + 214 -- 398 [weight="3.0", pos="677.85,424.96 697.27,432.02 730.86,444.21 748.87,450.76"]; + 214 -- 309 [weight="1.0", pos="661.99,412.28 659.63,394.18 653.54,347.49 651.52,331.97"]; + 214 -- 594 [weight="2.0", pos="665.47,412.43 672.29,393.35 690.91,341.19 697.51,322.68"]; + 214 -- 703 [weight="1.0", pos="680.49,415.18 685.52,413.93 690.82,412.61 695.19,411.52"]; + 214 -- 394 [weight="1.0", pos="649.23,413.85 629.88,405.79 594.85,391.21 576.44,383.55"]; + 214 -- 435 [weight="1.0", pos="663.9,426.66 666.12,443.04 671.56,483.15 673.52,497.62"]; + 214 -- 402 [weight="1.0", pos="662.35,412.23 660.49,388.96 654.74,316.94 653.07,296.08"]; + 214 -- 281 [weight="1.0", pos="657.93,412.65 645.11,394.98 611.3,348.38 600.06,332.88"]; + 214 -- 677 [weight="1.0", pos="678.1,414.31 695.19,408.41 722.89,398.85 740.59,392.73"]; + 214 -- 481 [weight="1.0", pos="683.18,416.76 701.45,414.25 727.68,410.64 742.6,408.59"]; + 214 -- 352 [weight="1.0", pos="649.31,414.01 608.03,397.24 484.84,347.2 445.98,331.42"]; + 214 -- 355 [weight="3.0", pos="664.76,412.45 668.52,397.82 677.05,364.59 680.49,351.22"]; + 214 -- 422 [weight="1.0", pos="660.52,426.63 651.32,453.61 618.5,549.83 609.21,577.08"]; + 214 -- 334 [weight="2.0", pos="668.42,412.48 676.59,401.96 691.84,382.3 699.78,372.08"]; + 214 -- 488 [weight="2.0", pos="684.46,421.03 706.84,422.57 741.41,424.95 761.9,426.37"]; + 214 -- 497 [weight="1.0", pos="641.89,417.45 610.53,414.33 552.37,408.55 525.65,405.89"]; + 214 -- 458 [weight="9.0", pos="668.68,426.41 676.03,435.2 688.71,450.35 696.08,459.15"]; + 214 -- 596 [weight="1.0", pos="681.68,423.36 727.75,432.73 845.81,456.74 887.18,465.15"]; + 214 -- 527 [weight="1.0", pos="654.52,412.79 634.93,397.07 586.57,358.25 567.73,343.13"]; + 214 -- 510 [weight="3.0", pos="676.04,425.18 687.6,430.15 704.07,437.24 713.83,441.44"]; + 214 -- 478 [weight="1.0", pos="641.02,420.34 610.99,421.42 557.37,423.35 527.31,424.43"]; + 422 -- 650 [weight="1.0", pos="595.65,590.58 567.1,606.71 491.59,649.35 467.03,663.22"]; + 422 -- 572 [weight="1.0", pos="593.98,590.39 570.8,601.41 522.43,624.41 503.4,633.46"]; + 422 -- 667 [weight="6.0", pos="603.77,591.49 591.37,621.39 543.84,735.99 531.44,765.9"]; + 422 -- 680 [weight="1.0", pos="601.74,591.4 595.68,599.97 585.63,614.2 580.2,621.89"]; + 422 -- 458 [weight="1.0", pos="612.41,577.28 629.36,556.19 679.57,493.74 696.33,472.9"]; + 422 -- 600 [weight="1.0", pos="584.82,587.22 561.06,590.37 523.35,595.36 499.55,598.51"]; + 422 -- 435 [weight="1.0", pos="612.5,577.38 625.76,561.39 658.23,522.23 669.94,508.11"]; + 422 -- 608 [weight="1.0", pos="599.14,590.97 578.04,609.42 519.17,660.89 501.29,676.52"]; + 422 -- 634 [weight="1.0", pos="590.39,589.51 560.12,599.11 496.3,619.34 472.98,626.74"]; + 422 -- 485 [weight="6.0", pos="601.48,591.3 590.15,606.33 563.56,641.61 552.47,656.33"]; + 221 -- 280 [weight="1.0", pos="968.84,543.59 971.24,540.71 974.24,537.09 976.7,534.13"]; + 221 -- 618 [weight="1.0", pos="969.61,543.78 980.64,532.96 1007,507.06 1018,496.25"]; + 221 -- 282 [weight="1.0", pos="969.76,553.5 980.07,563.23 1003.3,585.12 1014.2,595.46"]; + 221 -- 558 [weight="1.0", pos="969.07,543.86 976.01,536.33 989.36,521.84 996.32,514.29"]; + 221 -- 396 [weight="1.0", pos="979.71,548.06 993.45,547.5 1013.8,546.68 1029,546.07"]; + 221 -- 464 [weight="1.0", pos="979.7,548.21 982.27,548.13 984.92,548.05 987.46,547.97"]; + 221 -- 453 [weight="1.0", pos="973.61,544.58 993.04,535.72 1038.8,514.86 1057.5,506.31"]; + 221 -- 664 [weight="1.0", pos="975.47,545.05 987.85,540.92 1007.9,534.22 1019.5,530.36"]; + 221 -- 657 [weight="1.0", pos="976.69,545.66 995.51,540.97 1031.5,531.99 1049.3,527.55"]; + 221 -- 257 [weight="1.0", pos="965.54,543.37 967.78,530.16 973.62,495.83 976.07,481.44"]; + 39 -- 238 [weight="2.0", pos="903.64,1024.7 896.32,1028.6 885.9,1034.1 878.42,1038.1"]; + 39 -- 682 [weight="1.0", pos="907.22,1025.5 897.84,1035.6 878.18,1056.6 868.93,1066.5"]; + 39 -- 345 [weight="1.0", pos="896.54,1018.7 885.17,1017.8 869.96,1016.6 858.82,1015.8"]; + 39 -- 462 [weight="1.0", pos="917.74,1025.4 925.13,1033 938.43,1046.6 945.67,1054"]; + 64 -- 497 [weight="1.0", pos="405.59,400.77 428.03,397.23 478.21,397.02 500.51,400.39"]; + 64 -- 383 [weight="1.0", pos="374.31,405.2 368.98,405.26 363.34,405.32 358.41,405.37"]; + 64 -- 649 [weight="1.0", pos="404.6,409.61 410.69,415.63 417.1,425.65 418.85,432.46"]; + 558 -- 664 [weight="1.0", pos="1007.2,513.59 1011.7,516.48 1017.6,520.33 1022.1,523.21"]; + 558 -- 657 [weight="1.0", pos="1010.5,511.99 1021.3,514.81 1038.5,519.33 1049.5,522.21"]; + 558 -- 618 [weight="1.0", pos="1006.4,504.88 1009.7,502.2 1013.8,498.83 1017.2,496.12"]; + 12 -- 416 [weight="1.0", pos="1148.6,505.07 1146.1,507.91 1142.9,511.39 1140.5,514.17"]; + 12 -- 121 [weight="1.0", pos="1144.6,495.02 1133.3,488.77 1113.6,477.88 1101.4,471.13"]; + 668 -- 689 [weight="1.0", pos="1171.2,416.22 1177.1,416.98 1184.4,417.91 1190.6,418.71"]; + 52 -- 319 [weight="1.0", pos="269.3,356.41 289.9,356.19 331.89,355.74 354.44,355.49"]; + 52 -- 638 [weight="1.0", pos="260.95,351.59 262.81,349.08 265.06,346.04 266.93,343.51"]; + 657 -- 664 [weight="1.0", pos="1047.8,525.86 1045,526.07 1042.1,526.3 1039.4,526.5"]; + 229 -- 382 [weight="1.0", pos="81.143,586.5 73.411,580.63 60.545,570.87 52.773,564.98"]; + 229 -- 582 [weight="1.0", pos="88.523,586.14 89.552,580.19 91.216,570.57 92.238,564.66"]; + 229 -- 292 [weight="1.0", pos="73.836,588.43 68.856,587.35 63.288,586.15 58.515,585.11"]; + 229 -- 323 [weight="1.0", pos="89.962,586.42 94.91,575.91 106.41,551.52 112,539.63"]; + 260 -- 263 [weight="1.0", pos="493.84,263.21 496.75,263.12 499.76,263.03 502.56,262.95"]; + 260 -- 340 [weight="1.0", pos="480.89,268.62 486.75,283.22 503.88,325.91 510.1,341.4"]; + 573 -- 671 [weight="1.0", pos="715.73,837.44 724.83,839.29 736.41,841.64 745.16,843.42"]; + 237 -- 536 [weight="1.0", pos="1268.6,307.84 1258.1,309.8 1243.6,312.5 1233.8,314.31"]; + 237 -- 411 [weight="1.0", pos="1277.1,310.45 1274.8,312.95 1271.9,315.96 1269.5,318.51"]; + 237 -- 475 [weight="1.0", pos="1277.6,300.28 1275.6,297.78 1273,294.76 1270.9,292.22"]; + 370 -- 670 [weight="2.0", pos="244.8,289.4 238.31,285.63 229.57,280.56 223.35,276.94"]; + 309 -- 355 [weight="1.0", pos="658.7,331.57 663.74,334.59 670.23,338.47 675.07,341.36"]; + 68 -- 526 [weight="1.0", pos="930.27,693.66 931.52,691.19 932.91,688.4 934.09,686.06"]; + 68 -- 433 [weight="2.0", pos="928.05,693.46 931.48,672.29 941.93,607.79 945.35,586.72"]; + 68 -- 579 [weight="1.0", pos="921.32,693.57 915.25,686.33 905.65,674.91 899.77,667.91"]; + 68 -- 404 [weight="3.0", pos="932.66,706.84 941.7,717.23 959.17,737.32 968.06,747.53"]; + 402 -- 673 [weight="1.0", pos="650.81,284.87 649.97,282.3 648.97,279.25 648.14,276.74"]; + 402 -- 594 [weight="1.0", pos="661.72,295.31 669.66,299.63 681.17,305.89 689.47,310.4"]; + 315 -- 612 [weight="1.0", pos="797.85,616.44 804.98,600.21 823.28,558.57 829.63,544.13"]; + 315 -- 339 [weight="1.0", pos="796.3,616.3 796.8,613.78 797.37,610.91 797.87,608.39"]; + 315 -- 414 [weight="1.0", pos="811.12,622.88 828.41,622.72 855.43,622.48 870.97,622.34"]; + 315 -- 358 [weight="3.0", pos="782.79,627.33 760.07,635.37 711.34,652.62 687.05,661.22"]; + 567 -- 659 [weight="1.0", pos="467.83,311.14 464,318.97 457.02,333.22 452.94,341.55"]; + 567 -- 648 [weight="1.0", pos="454.47,304.74 428.67,303.39 378.93,300.8 359.45,299.78"]; + 567 -- 584 [weight="1.0", pos="454.49,305.7 441.12,305.8 422.71,305.94 412.73,306.02"]; + 567 -- 698 [weight="1.0", pos="460.54,301.06 454.04,298.13 445.61,294.33 439.13,291.4"]; + 641 -- 642 [weight="1.0", pos="334.3,437.48 341.46,438.55 350.16,439.86 357.47,440.95"]; + 144 -- 700 [weight="1.0", pos="559.53,503.3 555.24,500.27 549.46,496.17 545.1,493.08"]; + 144 -- 587 [weight="1.0", pos="555.24,507.54 550.93,507.56 545.86,507.58 541.27,507.6"]; + 338 -- 687 [weight="1.0", pos="1066.7,305.76 1060.4,315.68 1046.8,336.83 1039.8,347.66"]; + 100 -- 134 [weight="1.0", pos="1321.6,568.31 1310.5,570.36 1293.5,573.53 1280.7,575.92"]; + 100 -- 630 [weight="1.0", pos="1325,570.36 1313.8,576.33 1293.1,587.4 1280.5,594.16"]; + 380 -- 644 [weight="1.0", pos="790.67,551.84 786.22,546.01 779.01,536.52 774.22,530.23"]; + 380 -- 691 [weight="1.0", pos="789.4,561.9 784.62,566.38 777.56,572.98 772.78,577.45"]; + 380 -- 614 [weight="1.0", pos="783.02,561.21 770.49,565.72 750.77,572.83 739.17,577.02"]; + 380 -- 555 [weight="1.0", pos="779.39,553.67 769.5,551.49 756.66,548.66 746.8,546.49"]; + 222 -- 397 [weight="1.0", pos="973.7,799.1 969.7,802.21 964.38,806.34 960.38,809.45"]; + 222 -- 290 [weight="1.0", pos="968.84,797.16 958.75,799.57 943.67,803.16 933.6,805.55"]; + 222 -- 404 [weight="1.0", pos="978.73,789.63 977.66,782.31 975.68,768.66 974.49,760.49"]; + 616 -- 649 [weight="2.0", pos="305.29,363.44 327.16,378.14 386.21,417.81 408.87,433.03"]; + 300 -- 468 [weight="1.0", pos="324.48,21.91 330.41,19.04 338.54,15.105 344.34,12.296"]; + 300 -- 326 [weight="1.0", pos="323.11,29.981 331.83,35.931 347.42,46.57 356.11,52.501"]; + 25 -- 659 [weight="1.0", pos="352.53,319.14 368.54,323.9 413.47,337.28 436.2,344.05"]; + 25 -- 206 [weight="1.0", pos="352.83,318.61 359.36,319.9 369.87,321.98 378.18,323.62"]; + 25 -- 319 [weight="1.0", pos="349.5,322.05 353.46,328.62 360.72,340.66 365.34,348.32"]; + 25 -- 567 [weight="1.0", pos="352.67,316.83 371.03,315.08 427.07,309.73 454.74,307.09"]; + 25 -- 352 [weight="1.0", pos="352.7,318.03 365.9,319.42 397.78,322.77 417.5,324.84"]; + 25 -- 648 [weight="1.0", pos="347.96,312.47 348.61,309.96 349.39,306.93 350.04,304.41"]; + 25 -- 372 [weight="1.0", pos="348,312.35 350.64,302.07 356.62,278.83 359.36,268.17"]; + 25 -- 550 [weight="1.0", pos="350.27,321.92 352.5,324.74 355.35,328.34 357.53,331.09"]; + 25 -- 584 [weight="1.0", pos="352.56,316.27 363.5,314.17 386.98,309.65 398.68,307.4"]; + 25 -- 504 [weight="1.0", pos="350.64,313.53 357.33,306.98 370.89,293.69 378.35,286.38"]; + 25 -- 698 [weight="1.0", pos="352.37,315.31 365.77,310.36 399.6,297.87 417.58,291.23"]; + 286 -- 458 [weight="1.0", pos="859.38,443.62 828.39,448.03 756.29,458.29 721.42,463.25"]; + 120 -- 315 [weight="1.0", pos="710.7,601.45 728.75,606.07 762.44,614.7 781.29,619.52"]; + 120 -- 339 [weight="1.0", pos="713.78,598.85 732.81,599.51 765.13,600.62 784.08,601.27"]; + 120 -- 284 [weight="1.0", pos="698.76,592.91 699.45,579.57 701.23,545.09 702.01,530.15"]; + 83 -- 470 [weight="1.0", pos="1524.7,236.07 1524.6,239.69 1524.6,244.48 1524.5,248.16"]; + 484 -- 677 [weight="1.0", pos="629.74,516.92 651.27,494.99 727.28,417.55 750.51,393.88"]; + 484 -- 601 [weight="1.0", pos="612.81,519.75 590.35,513.73 539.57,500.13 511.75,492.68"]; + 305 -- 477 [weight="1.0", pos="422.86,765.93 416.11,762.32 405.31,756.53 397.77,752.5"]; + 381 -- 387 [weight="1.0", pos="1398.8,1182.2 1403.5,1177.2 1411,1169.1 1415.8,1164"]; + 581 -- 659 [weight="1.0", pos="517.2,381.73 504.12,375.21 475.55,360.96 460.12,353.26"]; + 308 -- 596 [weight="1.0", pos="920.07,481.85 916.51,479.18 912.1,475.87 908.51,473.17"]; + 308 -- 420 [weight="1.0", pos="929.2,481.66 931.01,478.12 933.41,473.42 935.22,469.89"]; + 177 -- 337 [weight="1.0", pos="410.66,368.19 413.7,372.25 417.95,377.93 421,382"]; + 177 -- 478 [weight="1.0", pos="413.62,367.37 430.83,378.23 476.28,406.9 495.99,419.33"]; + 496 -- 560 [weight="1.0", pos="1156.3,438.59 1156.4,442.73 1156.4,448.51 1156.5,452.65"]; + 496 -- 668 [weight="1.0", pos="1157.3,428.33 1157.9,425.83 1158.5,422.82 1159,420.27"]; + 373 -- 615 [weight="1.0", pos="387.75,470.33 384.6,475.6 380.14,483.08 377.14,488.11"]; + 373 -- 701 [weight="1.0", pos="404.21,462.65 411.33,461.85 420.22,460.85 427.59,460.03"]; + 373 -- 641 [weight="1.0", pos="381.28,459.97 367.74,454.51 343.98,444.94 330.45,439.48"]; + 373 -- 622 [weight="1.0", pos="380.24,467.37 375.39,468.79 369.82,470.42 365.36,471.73"]; + 373 -- 601 [weight="5.0", pos="403.48,466.87 420.44,470.8 451.63,478.04 472.26,482.83"]; + 328 -- 637 [weight="1.0", pos="294.23,513.25 308.06,521.6 338.61,540.04 353.02,548.74"]; + 328 -- 390 [weight="1.0", pos="289.76,513.89 295.68,525.04 310.16,552.34 316.83,564.91"]; + 328 -- 597 [weight="1.0", pos="285.7,514.26 282.32,526.41 274,556.3 270.28,569.65"]; + 328 -- 537 [weight="1.0", pos="275.27,507.77 268.45,507.07 259.84,506.18 252.62,505.44"]; + 239 -- 661 [weight="1.0", pos="624.08,482.06 629.57,482.45 636.4,482.93 642.16,483.34"]; + 239 -- 492 [weight="1.0", pos="614.43,476.23 614.69,473.64 615.01,470.5 615.27,467.88"]; + 158 -- 342 [weight="1.0", pos="857.65,130.69 847.52,133.65 833.4,137.78 823.6,140.64"]; + 464 -- 664 [weight="1.0", pos="1007.9,542.85 1012.4,539.5 1018.3,535.01 1022.7,531.73"]; + 464 -- 657 [weight="1.0", pos="1011.3,543.8 1022.3,539.54 1040.1,532.61 1050.8,528.44"]; + 464 -- 618 [weight="1.0", pos="1003.6,542.35 1007.7,531.6 1017.1,506.99 1021.1,496.38"]; + 464 -- 558 [weight="1.0", pos="1001.6,542.24 1001.4,534.88 1001.1,521.65 1000.9,514.45"]; + 269 -- 538 [weight="1.0", pos="780.88,706.99 776.95,715.08 769.61,730.19 765.79,738.05"]; + 269 -- 369 [weight="2.0", pos="784.93,696.09 786.03,691.82 787.55,685.91 788.67,681.56"]; + 269 -- 679 [weight="1.0", pos="794.02,705.71 800.73,708.36 809.42,711.79 816.18,714.46"]; + 22 -- 35 [weight="1.0", pos="1239.8,343.18 1246.2,343.14 1253.5,343.09 1259.8,343.05"]; + 22 -- 60 [weight="1.0", pos="1220.5,348.91 1217.6,356.35 1212.5,369.36 1209.8,376.43"]; + 22 -- 272 [weight="1.0", pos="1216.2,348.43 1207.7,355.08 1193.2,366.6 1184.9,373.15"]; + 22 -- 631 [weight="2.0", pos="1227.2,349.01 1229.3,351.6 1231.7,354.64 1233.8,357.2"]; + 22 -- 411 [weight="1.0", pos="1232.7,338.62 1239.3,335.59 1247.8,331.64 1254.4,328.62"]; + 42 -- 667 [weight="2.0", pos="597.09,670.51 584.94,688.66 546.2,746.57 532.95,766.36"]; + 42 -- 261 [weight="3.0", pos="618.77,665.22 640.03,665.48 675.69,665.91 700.94,666.21"]; + 42 -- 680 [weight="2.0", pos="597.18,659.43 592.53,652.2 584.46,639.69 579.88,632.57"]; + 42 -- 102 [weight="3.0", pos="605.58,659.57 615.5,648.36 638.26,622.65 649.97,609.43"]; + 42 -- 358 [weight="1.0", pos="618.92,665.33 629.15,665.52 641.96,665.75 652.51,665.94"]; + 42 -- 163 [weight="2.0", pos="605.97,659.31 608.33,656.73 611.1,653.69 613.43,651.14"]; + 42 -- 215 [weight="1.0", pos="590.48,660.45 577.88,654.87 556.8,645.55 545.12,640.38"]; + 42 -- 608 [weight="1.0", pos="584.41,667.52 562.67,670.86 524.88,676.66 506.59,679.47"]; + 42 -- 171 [weight="1.0", pos="611.81,669.53 617.4,671.82 624.01,674.52 628.85,676.51"]; + 42 -- 485 [weight="2.0", pos="582.73,664.31 580.07,664.21 577.28,664.1 574.49,663.99"]; + 42 -- 422 [weight="3.0", pos="601.18,659.46 602.24,645.22 605.04,607.37 606.21,591.49"]; + 363 -- 677 [weight="1.0", pos="799.11,357.96 791.26,363.4 776.6,373.57 766.9,380.3"]; + 644 -- 677 [weight="1.0", pos="768.77,517.23 766.75,494.27 760.04,417.99 757.94,394.15"]; + 644 -- 691 [weight="1.0", pos="769.15,530.54 768.79,542.3 768.06,566.4 767.74,577.05"]; + 235 -- 326 [weight="1.0", pos="370.67,70.34 369.09,67.753 367.18,64.615 365.59,62.011"]; + 301 -- 600 [weight="1.0", pos="405.84,710.1 417.42,692.55 458.98,629.54 472.92,608.4"]; + 6 -- 315 [weight="1.0", pos="770.05,625.18 773.01,624.92 776.21,624.65 779.3,624.38"]; + 6 -- 56 [weight="1.0", pos="770.19,625.77 783.29,625.27 804.28,624.48 820.02,623.89"]; + 6 -- 102 [weight="3.0", pos="747.15,623.56 729.18,619.1 693.07,610.14 672.49,605.03"]; + 6 -- 139 [weight="3.0", pos="745.73,625.97 742.88,625.91 739.72,625.84 736.44,625.77"]; + 6 -- 358 [weight="1.0", pos="749.44,630.22 734.19,637.39 702.13,652.46 684.66,660.67"]; + 436 -- 478 [weight="1.0", pos="320.79,407.6 355.65,410.93 443.65,419.33 484.23,423.21"]; + 36 -- 99 [weight="1.0", pos="1116.5,359.28 1113.4,361.96 1109.7,365.21 1106.7,367.87"]; + 36 -- 687 [weight="2.0", pos="1107.2,354.22 1090.7,354.25 1064.5,354.3 1048.8,354.32"]; + 36 -- 47 [weight="1.0", pos="1130.7,349.49 1139.8,344.4 1154.2,336.38 1162.9,331.46"]; + 213 -- 569 [weight="1.0", pos="258.09,1189.5 253.83,1182.8 246.26,1170.8 241.94,1164"]; + 213 -- 406 [weight="1.0", pos="261.57,1189.1 262.4,1176.4 264.49,1144.2 265.3,1131.7"]; + 213 -- 684 [weight="1.0", pos="265.56,1189.3 273.98,1179.1 292.48,1156.9 300.68,1147"]; + 518 -- 677 [weight="1.0", pos="874.82,369.35 856.49,372.1 810.21,379.03 781.51,383.33"]; + 94 -- 306 [weight="2.0", pos="1429.3,10.528 1423.6,13.799 1415.5,18.414 1409.6,21.825"]; + 94 -- 629 [weight="2.0", pos="1440.8,11.839 1443.8,15.365 1447.7,19.93 1450.5,23.249"]; + 94 -- 298 [weight="1.0", pos="1436.1,12.127 1436,19.86 1435.7,33.685 1435.6,41.392"]; + 497 -- 527 [weight="3.0", pos="516.03,398.25 525.13,385.58 545.71,356.92 555.15,343.77"]; + 497 -- 666 [weight="2.0", pos="498.18,402.22 473.88,398.1 422.48,389.4 395.14,384.77"]; + 497 -- 616 [weight="1.0", pos="498.77,401.71 460.88,393.47 349.36,369.24 310.51,360.8"]; + 497 -- 649 [weight="4.0", pos="500.44,408.59 483.19,414.96 450.02,427.22 431.41,434.1"]; + 51 -- 432 [weight="1.0", pos="938.55,285.26 930.98,294.07 914.34,313.45 905.58,323.65"]; + 456 -- 677 [weight="2.0", pos="902.65,441.32 876.16,431.41 805.03,404.81 773.15,392.89"]; + 456 -- 686 [weight="1.0", pos="907.56,439.97 900.2,432.78 886.98,419.87 879.77,412.84"]; + 439 -- 689 [weight="1.0", pos="1195.2,405.44 1197,408.5 1199.3,412.39 1201.1,415.44"]; + 439 -- 668 [weight="1.0", pos="1183.8,404.16 1179.1,406.3 1173.2,408.96 1168.4,411.08"]; + 362 -- 594 [weight="1.0", pos="615.74,373.89 631.81,362.84 673.35,334.29 691.35,321.92"]; + 296 -- 667 [weight="1.0", pos="525.3,841.19 525.92,827.85 527.45,795.01 528.13,780.35"]; + 296 -- 660 [weight="1.0", pos="528.73,852.38 533,858.61 539.96,868.77 544.07,874.76"]; + 296 -- 576 [weight="1.0", pos="522.2,852.37 517.99,860.39 510.11,875.36 506.02,883.15"]; + 265 -- 434 [weight="1.0", pos="230.62,337.85 229.57,340.38 228.3,343.42 227.23,345.99"]; + 265 -- 616 [weight="1.0", pos="241.97,336.31 253.48,340.82 273.19,348.54 285.63,353.41"]; + 608 -- 667 [weight="1.0", pos="497.81,686.03 503.23,701.41 519.77,748.4 526.03,766.17"]; + 411 -- 536 [weight="1.0", pos="1249.6,321.2 1244.4,320.23 1238.7,319.17 1234,318.28"]; + 411 -- 631 [weight="1.0", pos="1260.7,329.36 1255.8,336.67 1247,349.67 1241.9,357.08"]; + 411 -- 475 [weight="1.0", pos="1264.7,318.16 1265,311.13 1265.7,299.36 1266,292.4"]; + 171 -- 261 [weight="1.0", pos="643.72,678.21 657.03,676.42 684.15,672.77 704.49,670.03"]; + 171 -- 680 [weight="1.0", pos="631.01,675.21 620.32,665.81 594.01,642.67 582.26,632.34"]; + 478 -- 659 [weight="1.0", pos="500.59,418.65 490.09,404.07 464.96,369.2 454.47,354.65"]; + 478 -- 581 [weight="1.0", pos="508.42,418.61 512.16,410.6 518.37,397.32 521.73,390.13"]; + 384 -- 630 [weight="1.0", pos="1303.3,608.57 1298.1,607.23 1292,605.65 1286.4,604.21"]; + 398 -- 596 [weight="1.0", pos="780.39,456.98 808.22,459.53 859.21,464.21 885.36,466.61"]; + 398 -- 481 [weight="1.0", pos="760.33,449.68 758.97,440.28 756.23,421.32 754.91,412.17"]; + 398 -- 510 [weight="1.0", pos="746.56,451.39 741.51,450.06 736,448.62 731.47,447.43"]; + 398 -- 488 [weight="1.0", pos="764.7,449.61 767.77,444.8 772.16,437.92 775.22,433.12"]; + 398 -- 458 [weight="4.0", pos="744.3,458.28 736.9,459.63 728.19,461.22 720.59,462.61"]; + 537 -- 637 [weight="1.0", pos="247.66,507.83 270.39,517 327.19,539.89 350.55,549.31"]; + 537 -- 597 [weight="1.0", pos="240.21,509.15 245.6,521.97 259.54,555.11 265.58,569.47"]; + 407 -- 636 [weight="1.0", pos="1093.4,623.06 1104.3,620.49 1121.1,616.52 1132.4,613.85"]; + 445 -- 687 [weight="1.0", pos="1078.8,281.33 1070.7,294.91 1048.9,331.84 1039.7,347.34"]; + 200 -- 310 [weight="1.0", pos="860.79,528.8 827.45,535.75 749.29,552.02 718.36,558.47"]; + 200 -- 386 [weight="1.0", pos="893.24,524.52 897.76,524.24 902.5,523.95 906.54,523.7"]; + 200 -- 614 [weight="1.0", pos="863.51,530.35 834.55,541.19 764.37,567.45 739.07,576.92"]; + 200 -- 555 [weight="1.0", pos="859.67,527.6 832.38,530.92 778.22,537.5 749.91,540.95"]; + 200 -- 505 [weight="1.0", pos="885.22,531.57 895.25,538.26 911.3,548.97 920.56,555.15"]; + 200 -- 454 [weight="1.0", pos="881.05,518.7 895.68,497.71 939.55,434.77 952.9,415.62"]; + 200 -- 644 [weight="6.0", pos="859.07,525.3 841.37,525.01 813.61,524.56 793.65,524.23"]; + 200 -- 433 [weight="1.0", pos="884.3,531.82 897.84,542.32 925.01,563.37 938.48,573.82"]; + 200 -- 691 [weight="1.0", pos="865.43,531.23 843.85,542.49 795.84,567.56 776.2,577.81"]; + 200 -- 405 [weight="1.0", pos="880.61,518.35 882.13,515.84 883.79,513.07 885.19,510.75"]; + 200 -- 284 [weight="1.0", pos="858.94,525.33 829.13,524.9 767.81,524.02 731.39,523.49"]; + 200 -- 380 [weight="1.0", pos="863.49,530.5 847.62,536.61 820.77,546.95 805.71,552.75"]; + 18 -- 310 [weight="1.0", pos="740.11,596.98 731.8,588.4 717.52,573.65 710.15,566.03"]; + 18 -- 139 [weight="1.0", pos="734.96,609.48 729.38,612.31 722.66,615.71 716.94,618.61"]; + 18 -- 102 [weight="2.0", pos="722.59,602.98 707.4,602.58 688.1,602.06 674.41,601.7"]; + 18 -- 614 [weight="1.0", pos="741.59,596.78 738.97,593.14 735.8,588.74 733.4,585.42"]; + 18 -- 555 [weight="1.0", pos="744.83,596.68 741.82,584.4 735.62,559.1 732.97,548.27"]; + 18 -- 358 [weight="1.0", pos="739.18,609.86 725.17,621.75 694.77,647.55 680.44,659.71"]; + 18 -- 20 [weight="1.0", pos="746.69,597.08 746.88,588.99 747.21,575.34 747.4,567.6"]; + 18 -- 200 [weight="2.0", pos="756.71,597.49 781.08,582.83 842.52,545.87 866.47,531.46"]; + 18 -- 644 [weight="2.0", pos="748.4,597.09 752.65,582.2 763.05,545.86 767.39,530.68"]; + 18 -- 691 [weight="1.0", pos="753.19,596.87 756.27,593.75 759.87,590.11 762.7,587.25"]; + 18 -- 284 [weight="2.0", pos="742.91,597.03 734.76,582.15 714.97,546.04 706.42,530.45"]; + 18 -- 380 [weight="1.0", pos="753.21,597.14 762.92,587.74 780.7,570.51 789.46,562.02"]; + 125 -- 319 [weight="1.0", pos="482.9,461.44 463.11,442.91 397.8,381.76 376.41,361.74"]; + 125 -- 440 [weight="1.0", pos="492.13,472.29 502.92,489.24 535.69,540.71 546.63,557.9"]; + 125 -- 663 [weight="1.0", pos="487.5,461.23 483.95,443.94 473.18,391.45 469.58,373.92"]; + 125 -- 378 [weight="2.0", pos="494.13,472.31 505.4,483.58 531.03,509.24 542.43,520.66"]; + 329 -- 358 [weight="1.0", pos="714.08,778.8 707.22,760.17 683.33,695.25 675.32,673.48"]; + 44 -- 200 [weight="1.0", pos="919.9,539.02 912.11,536.62 899.78,532.83 890.21,529.88"]; + 587 -- 700 [weight="1.0", pos="531.08,502.47 532.61,499.74 534.48,496.41 536,493.71"]; + 667 -- 680 [weight="1.0", pos="530.78,766.04 539.05,740.89 567.06,655.71 574.57,632.88"]; + 27 -- 397 [weight="1.0", pos="938.27,777.08 941.98,785.42 948.95,801.07 952.49,809.01"]; + 27 -- 194 [weight="1.0", pos="939.01,777.03 940.52,779.6 942.3,782.65 943.77,785.16"]; + 27 -- 68 [weight="1.0", pos="935.11,765.95 933.49,752.96 929.5,720.77 927.77,706.86"]; + 27 -- 290 [weight="1.0", pos="933.81,777.25 931.34,784.31 927.17,796.23 924.81,802.99"]; + 27 -- 222 [weight="1.0", pos="944.64,776.22 952.61,780.44 964.22,786.58 971.8,790.59"]; + 27 -- 404 [weight="2.0", pos="945.32,767.07 951,764.4 958.18,761.03 963.88,758.35"]; + 272 -- 391 [weight="1.0", pos="1174.8,372.59 1172.2,368.76 1168.6,363.69 1166,359.87"]; + 272 -- 439 [weight="1.0", pos="1182.1,383.7 1184.3,387.31 1187.1,391.96 1189.2,395.43"]; + 272 -- 689 [weight="1.0", pos="1182,383.61 1186.9,391.86 1196.1,407.28 1200.9,415.29"]; + 272 -- 631 [weight="1.0", pos="1189.3,375.32 1199,372.79 1213.6,369.03 1224.2,366.27"]; + 272 -- 668 [weight="1.0", pos="1175.9,383.49 1172.5,390.35 1166.6,402.13 1163,409.11"]; + 190 -- 600 [weight="1.0", pos="417.01,677.6 427.94,663.84 459.3,624.36 472.04,608.33"]; + 190 -- 301 [weight="1.0", pos="411.56,687.46 409.6,693.56 406.33,703.75 404.4,709.78"]; + 298 -- 306 [weight="3.0", pos="1428.3,42.61 1422.7,39.214 1415,34.511 1409.3,31.045"]; + 298 -- 629 [weight="2.0", pos="1440.6,41.695 1443.6,38.657 1447.2,34.885 1450,32.017"]; + 95 -- 102 [weight="2.0", pos="743.97,642.01 727.4,634.22 689.47,616.4 669.7,607.11"]; + 95 -- 139 [weight="2.0", pos="743.72,642.19 736.86,639.22 726.98,634.94 718.81,631.4"]; + 95 -- 358 [weight="1.0", pos="742,648.4 728.65,651.85 704.91,657.98 688.98,662.09"]; + 534 -- 539 [weight="1.0", pos="923.44,611.94 924.28,609.63 925.27,606.92 926.12,604.6"]; + 400 -- 630 [weight="1.0", pos="1340.2,621.11 1326.5,616.97 1301.4,609.43 1285.2,604.55"]; + 20 -- 200 [weight="1.0", pos="760.83,558.04 785.23,551.18 836.99,536.62 862.06,529.57"]; + 20 -- 644 [weight="1.0", pos="750.76,556.18 754.69,549.34 761.34,537.77 765.53,530.48"]; + 20 -- 310 [weight="1.0", pos="729.44,561.51 726.49,561.47 723.47,561.43 720.61,561.38"]; + 20 -- 691 [weight="1.0", pos="753.01,567.39 756.08,570.52 759.85,574.39 762.79,577.4"]; + 20 -- 102 [weight="1.0", pos="737.18,566.31 720.59,573.56 688.1,587.75 670.06,595.63"]; + 20 -- 284 [weight="2.0", pos="741.26,556.4 733.21,549.5 719.25,537.54 710.43,529.98"]; + 20 -- 380 [weight="1.0", pos="764.8,560.04 768.37,559.68 772.14,559.3 775.77,558.93"]; + 20 -- 614 [weight="1.0", pos="742.31,567.27 739.77,569.93 736.75,573.09 734.31,575.65"]; + 20 -- 555 [weight="1.0", pos="742.88,556.3 740.69,553.72 738.1,550.67 735.97,548.16"]; + 601 -- 615 [weight="2.0", pos="465.98,488.91 440,490.22 401.85,492.15 383.91,493.05"]; + 601 -- 693 [weight="1.0", pos="488.97,480.56 481.82,466.89 466.16,436.94 459.87,424.91"]; + 601 -- 712 [weight="2.0", pos="472.47,492.32 417.93,505.19 267.86,540.59 212.96,553.55"]; + 601 -- 622 [weight="2.0", pos="467.15,485.04 436.48,482 386.59,477.05 366.23,475.04"]; + 601 -- 649 [weight="1.0", pos="482.55,481.02 467.89,471.52 440.9,454.01 426.88,444.92"]; + 601 -- 701 [weight="1.0", pos="481.37,481.09 471.69,475.53 457.97,467.64 449.52,462.79"]; + 601 -- 677 [weight="1.0", pos="508,481.72 554.78,463.94 695.05,410.62 741.89,392.82"]; + 601 -- 641 [weight="2.0", pos="474.83,482.17 439.57,471.5 361.67,447.91 332.03,438.94"]; + 601 -- 642 [weight="1.0", pos="476.95,481.77 452.17,472.61 404.63,455.04 383.38,447.19"]; + 151 -- 398 [weight="1.0", pos="740.01,430.77 744.59,436.07 751.69,444.29 756.38,449.71"]; + 151 -- 596 [weight="1.0", pos="745.45,428.14 773.83,435.4 855.49,456.28 888.09,464.62"]; + 151 -- 481 [weight="1.0", pos="740.64,420.53 743.4,417.77 746.78,414.39 749.47,411.69"]; + 151 -- 510 [weight="1.0", pos="731.85,430.9 729.91,433.67 727.53,437.05 725.6,439.8"]; + 151 -- 488 [weight="1.0", pos="746.92,426.12 751.42,426.32 756.7,426.55 761.65,426.77"]; + 151 -- 458 [weight="1.0", pos="731.15,430.9 725.08,438.17 714.15,451.28 707.49,459.27"]; + 151 -- 214 [weight="2.0", pos="724.53,424.69 713.89,423.8 697.52,422.44 684.32,421.33"]; + 529 -- 667 [weight="3.0", pos="502.1,817.71 507.51,808.54 518.55,789.85 524.49,779.81"]; + 504 -- 567 [weight="1.0", pos="395.65,284.65 412.09,289.24 441.32,297.41 457.99,302.07"]; + 504 -- 659 [weight="1.0", pos="388.32,286.07 400.06,297.92 430.38,328.54 443.52,341.8"]; + 504 -- 648 [weight="1.0", pos="375.76,285.65 370.1,288.82 362.55,293.06 357.35,295.98"]; + 504 -- 584 [weight="1.0", pos="388.23,286.53 392.18,290.97 397.77,297.25 401.53,301.49"]; + 504 -- 550 [weight="1.0", pos="381.46,286.25 377.12,296.6 367.17,320.28 362.89,330.48"]; + 504 -- 698 [weight="1.0", pos="398.51,283.12 402.36,283.6 406.55,284.12 410.56,284.62"]; + 557 -- 599 [weight="3.0", pos="123.08,646.5 102.21,645.31 70.051,643.47 48.297,642.23"]; + 475 -- 536 [weight="1.0", pos="1258.8,291.89 1250.6,297.5 1237.7,306.41 1229.9,311.77"]; + 397 -- 404 [weight="1.0", pos="956.27,808.77 959.69,797.87 967.69,772.41 971.47,760.36"]; + 294 -- 328 [weight="1.0", pos="445.86,537.22 410.08,530.85 328.4,516.32 298.45,510.99"]; + 294 -- 497 [weight="1.0", pos="465.66,532.97 474.16,509.18 500.99,434.06 509.17,411.17"]; + 294 -- 390 [weight="6.0", pos="446.67,543.85 418.7,549.96 362.12,562.31 335.19,568.19"]; + 294 -- 597 [weight="10.0", pos="445.78,543.47 410.06,550.08 328.17,565.22 289.45,572.38"]; + 294 -- 303 [weight="12.0", pos="444.42,538.37 432.64,537.16 417.52,535.61 406.09,534.44"]; + 294 -- 600 [weight="1.0", pos="464.71,547.29 467.47,558.96 472.98,582.25 475.79,594.11"]; + 294 -- 695 [weight="1.0", pos="450.53,545.6 410.53,562.6 286.37,615.37 251.32,630.27"]; + 294 -- 537 [weight="1.0", pos="445.39,537.42 401.98,530.42 290.74,512.46 251.76,506.17"]; + 294 -- 601 [weight="1.0", pos="466.92,533.38 472.55,523.34 482.98,504.76 488.67,494.62"]; + 294 -- 527 [weight="1.0", pos="466.5,533.04 481.62,501.35 541.9,374.99 556.73,343.9"]; + 294 -- 568 [weight="2.0", pos="451.27,545.9 419.89,560.89 334.79,601.53 307.71,614.46"]; + 294 -- 521 [weight="1.0", pos="453.51,546.72 421.85,568.14 320.64,636.58 292.8,655.4"]; + 294 -- 692 [weight="1.0", pos="448.97,545.1 408.53,558.97 292.52,598.75 255.12,611.58"]; + 294 -- 566 [weight="1.0", pos="454.51,546.68 432.22,563.39 372.75,607.98 354.71,621.5"]; + 294 -- 637 [weight="2.0", pos="444.78,542.63 424.79,545.21 393.19,549.28 375,551.63"]; + 294 -- 478 [weight="1.0", pos="465.69,533.08 473.36,512.22 495.51,451.94 502.9,431.84"]; + 275 -- 527 [weight="2.0", pos="610.76,265.81 601.33,279.05 575.68,315.03 564.91,330.13"]; + 275 -- 651 [weight="1.0", pos="606.36,260.02 601.76,259.56 595.92,258.97 590.9,258.47"]; + 157 -- 170 [weight="1.0", pos="173.21,531.59 193.22,518.85 244.14,486.42 265.45,472.85"]; + 157 -- 294 [weight="3.0", pos="190.09,537.15 248.49,537.82 392.19,539.46 444.02,540.06"]; + 157 -- 390 [weight="2.0", pos="182.76,540.83 213.68,547.71 276.72,561.74 305.44,568.13"]; + 157 -- 597 [weight="2.0", pos="177.62,541.69 196.95,549.05 233.65,563.02 253.98,570.76"]; + 157 -- 303 [weight="3.0", pos="190.23,536.39 236.29,535.54 332.7,533.76 372,533.04"]; + 157 -- 227 [weight="1.0", pos="169.97,542.54 179.76,553.58 201.25,577.8 210.78,588.55"]; + 65 -- 445 [weight="1.0", pos="1112.4,271.85 1105.9,272.78 1098.4,273.85 1092.4,274.7"]; + 65 -- 687 [weight="1.0", pos="1121.6,275.03 1105.4,289.93 1059.6,332.21 1042.3,348.16"]; + 65 -- 93 [weight="1.0", pos="1122.7,275.39 1119.3,279.56 1114.7,285.17 1111.4,289.16"]; + 65 -- 399 [weight="1.0", pos="1139.6,265.94 1146,263.94 1154,261.47 1160.6,259.42"]; + 65 -- 133 [weight="1.0", pos="1132.6,264.38 1138.7,258.2 1148.6,248.11 1154.5,242.16"]; + 197 -- 214 [weight="1.0", pos="648.39,363.57 651.24,374.55 657.87,400.07 661.1,412.49"]; + 203 -- 567 [weight="1.0", pos="525.07,313.54 512.84,311.76 496.83,309.42 485.32,307.74"]; + 203 -- 527 [weight="2.0", pos="547.64,321.84 549.77,324.44 552.31,327.54 554.54,330.25"]; + 203 -- 351 [weight="1.0", pos="548.37,321.52 562.92,336.02 602.99,375.92 618.67,391.54"]; + 261 -- 385 [weight="8.0", pos="715.04,660.59 685.79,649.07 621.98,623.93 592.78,612.43"]; + 261 -- 680 [weight="3.0", pos="710.12,661.42 677.87,653.17 615.54,637.22 588.94,630.42"]; + 261 -- 579 [weight="1.0", pos="759.24,665.73 795.74,664.66 856.78,662.89 882.56,662.14"]; + 261 -- 341 [weight="1.0", pos="729.3,673.69 726.85,692.69 720.19,744.18 718.07,760.57"]; + 261 -- 358 [weight="7.0", pos="701.11,666.43 698.32,666.42 695.54,666.41 692.87,666.4"]; + 261 -- 427 [weight="8.0", pos="714.13,672.55 695.1,679.63 663.78,691.27 646.06,697.86"]; + 261 -- 494 [weight="1.0", pos="713.23,672.26 670.54,686.57 559.74,723.7 524.53,735.49"]; + 261 -- 422 [weight="2.0", pos="720.12,659.84 696.85,644.34 639.71,606.28 616.64,590.91"]; + 261 -- 667 [weight="1.0", pos="717.91,673.07 680.94,692.58 571.49,750.36 538.19,767.94"]; + 261 -- 339 [weight="1.0", pos="737.6,659.64 751.22,646.84 780.09,619.73 792.87,607.73"]; + 261 -- 291 [weight="1.0", pos="721.19,673.45 696.03,692.61 625.61,746.23 604.74,762.13"]; + 261 -- 484 [weight="3.0", pos="725.1,659.63 706.95,635.06 645.88,552.35 628.6,528.96"]; + 261 -- 424 [weight="1.0", pos="727.18,673.63 717.43,696.32 687.07,766.95 678.73,786.37"]; + 261 -- 706 [weight="2.0", pos="723.83,673.58 708.21,690.69 668.37,734.35 653.98,750.11"]; + 261 -- 395 [weight="1.0", pos="725.3,673.81 716.5,686.76 698.28,713.58 690.73,724.69"]; + 261 -- 357 [weight="3.0", pos="718.39,673.08 691.88,687.68 628.24,722.72 605.31,735.35"]; + 261 -- 409 [weight="2.0", pos="752.8,662.04 770.09,658.58 793.52,653.89 809.05,650.77"]; + 261 -- 284 [weight="2.0", pos="728.8,659.25 724.01,634.58 708.49,554.59 703.76,530.2"]; + 261 -- 485 [weight="1.0", pos="701.26,666 666.44,665.31 608.45,664.16 574.5,663.49"]; + 138 -- 274 [weight="1.0", pos="502.24,175.85 507.79,172.73 515.62,168.34 521.4,165.1"]; + 138 -- 546 [weight="1.0", pos="504.79,181.79 515.77,184.26 534.28,188.42 548.7,191.67"]; + 138 -- 511 [weight="1.0", pos="504.86,177.64 518.13,174.77 542.1,169.58 554.84,166.83"]; + 81 -- 170 [weight="1.0", pos="354.25,568.98 340.81,551.62 295.33,492.89 280.09,473.21"]; + 81 -- 328 [weight="1.0", pos="352.94,569.2 339.86,557.23 305.24,525.53 292.22,513.61"]; + 81 -- 390 [weight="1.0", pos="346.09,573.1 343.24,572.91 340.15,572.71 337.12,572.52"]; + 81 -- 303 [weight="1.0", pos="361.86,568.82 367.46,561.44 377.89,547.68 384.14,539.44"]; + 81 -- 597 [weight="1.0", pos="345.95,574.19 332.86,574.54 311.58,575.11 294.63,575.56"]; + 81 -- 108 [weight="1.0", pos="357.05,568.83 355.51,560.97 352.56,545.83 351.02,537.93"]; + 81 -- 288 [weight="1.0", pos="349.94,569.9 341.52,565.78 328.39,559.36 319.89,555.2"]; + 81 -- 184 [weight="1.0", pos="348.71,570.61 321.58,561.14 242.93,533.68 217.27,524.72"]; + 81 -- 537 [weight="1.0", pos="350.88,569.7 329.69,557.35 267.32,521.02 245.59,508.36"]; + 81 -- 294 [weight="1.0", pos="367.72,570.76 386.21,564.85 426.59,551.94 448.39,544.96"]; + 81 -- 172 [weight="1.0", pos="347.48,571.19 323.82,565.19 266.46,550.65 238.86,543.65"]; + 81 -- 637 [weight="1.0", pos="358.74,568.71 359.14,565.78 359.64,562.11 360.06,559.1"]; + 137 -- 402 [weight="2.0", pos="607.17,352.27 616.65,339.35 639.46,308.27 648.66,295.73"]; + 137 -- 334 [weight="1.0", pos="621.63,359.41 637.73,360.59 661.11,362.31 679,363.62"]; + 137 -- 497 [weight="1.0", pos="593.5,362.84 575.99,371.74 538.65,390.71 521.08,399.65"]; + 137 -- 594 [weight="1.0", pos="613.68,353.39 631.92,345.49 668.81,329.51 687.87,321.26"]; + 137 -- 214 [weight="2.0", pos="608.48,363.72 619.5,375.02 644.16,400.3 656.14,412.58"]; + 60 -- 272 [weight="1.0", pos="1199.9,380.45 1197,380.13 1193.8,379.77 1190.7,379.42"]; + 60 -- 631 [weight="1.0", pos="1213.7,377.74 1218.4,374.86 1225,370.78 1230.2,367.6"]; + 459 -- 543 [weight="2.0", pos="969.19,286.16 970.21,283.41 971.45,280.08 972.48,277.31"]; + 432 -- 535 [weight="1.0", pos="911.29,325.5 930.81,317.38 970.27,300.96 987.43,293.83"]; + 432 -- 588 [weight="5.0", pos="904.76,323.38 915.48,308.22 941.13,271.92 951.84,256.77"]; + 432 -- 512 [weight="2.0", pos="891.8,324.06 875.57,311.74 839.31,284.2 823.2,271.96"]; + 432 -- 623 [weight="3.0", pos="914.15,327.57 931.61,324.31 961.37,318.76 981.41,315.02"]; + 432 -- 459 [weight="2.0", pos="909.56,324.69 923.36,316.76 948.42,302.36 960.42,295.46"]; + 432 -- 449 [weight="4.0", pos="896.39,323.13 886.75,303.82 860.19,250.55 851.34,232.81"]; + 432 -- 543 [weight="2.0", pos="907.63,324.19 922.22,312.76 953.69,288.1 967.63,277.17"]; + 284 -- 661 [weight="1.0", pos="693.98,516.3 684.38,508.55 668.89,496.05 660.34,489.16"]; + 284 -- 339 [weight="2.0", pos="710.63,529.78 729.28,544.95 774.44,581.67 792.02,595.96"]; + 284 -- 310 [weight="1.0", pos="702.96,530.42 703.56,537.85 704.47,549.17 705,555.8"]; + 284 -- 346 [weight="1.0", pos="723.63,518.29 741.6,514.25 766.24,508.71 778.06,506.05"]; + 284 -- 614 [weight="1.0", pos="705.73,530.1 711.34,541.82 722.46,565.08 727.36,575.34"]; + 284 -- 555 [weight="1.0", pos="712.31,529.87 716.43,532.7 721.11,535.9 724.85,538.46"]; + 284 -- 315 [weight="1.0", pos="708.74,529.94 725.9,548.47 772.92,599.23 789.27,616.88"]; + 284 -- 447 [weight="1.0", pos="712.33,516.21 718.4,512.03 726.02,506.78 731.52,502.99"]; + 284 -- 527 [weight="1.0", pos="696.97,516 674.32,486.39 587.23,372.51 565.15,343.64"]; + 284 -- 644 [weight="2.0", pos="731.55,523.4 736.07,523.45 740.68,523.51 745.07,523.56"]; + 284 -- 433 [weight="1.0", pos="723.6,528.02 771.5,539.19 887.12,566.15 930.04,576.16"]; + 284 -- 691 [weight="1.0", pos="709.85,529.87 723.1,541.9 750.39,566.69 762.08,577.3"]; + 284 -- 351 [weight="2.0", pos="698,515.98 684.26,493.75 642.17,425.58 629.04,404.32"]; + 284 -- 380 [weight="1.0", pos="718.44,528.99 737.02,535.83 767.13,546.91 783.37,552.89"]; + 624 -- 682 [weight="1.0", pos="808.83,1029.4 820.32,1038.2 845.1,1057.4 857.12,1066.6"]; + 346 -- 447 [weight="1.0", pos="777.73,503.48 770.94,502.52 760.59,501.05 752.27,499.87"]; + 435 -- 458 [weight="1.0", pos="678.08,497.8 682.94,491.3 691.32,480.1 696.72,472.88"]; + 427 -- 494 [weight="1.0", pos="618.15,707.26 594.04,714.61 546.44,729.13 524.8,735.74"]; + 427 -- 706 [weight="2.0", pos="634.72,709.31 637.87,719.84 644.04,740.41 647.02,750.31"]; + 677 -- 686 [weight="1.0", pos="780.23,391.06 805.34,395.54 844.55,402.55 863.61,405.95"]; + 186 -- 687 [weight="1.0", pos="1083.5,325.66 1073.7,331.53 1055.4,342.46 1044.5,349"]; + 186 -- 338 [weight="2.0", pos="1085.6,316.72 1082.3,313.29 1078,308.73 1074.8,305.3"]; + 110 -- 661 [weight="1.0", pos="770.9,484.43 744.52,484.37 690.61,484.26 666.41,484.21"]; + 110 -- 512 [weight="1.0", pos="787,477.19 791.47,443.71 810.05,304.68 814.34,272.55"]; + 110 -- 339 [weight="1.0", pos="786.85,491.8 789.24,513.07 796.13,574.54 798.43,595.05"]; + 110 -- 612 [weight="1.0", pos="791.64,491.16 800.91,502.22 819.22,524.05 827.54,533.98"]; + 110 -- 486 [weight="1.0", pos="801.17,484.94 821.32,485.58 856.5,486.71 874.46,487.28"]; + 110 -- 593 [weight="1.0", pos="773.94,480.23 749.03,471.5 692.43,451.68 669.67,443.7"]; + 110 -- 160 [weight="4.0", pos="771.51,482.6 734.01,477.78 633.33,464.85 583.2,458.41"]; + 110 -- 604 [weight="1.0", pos="796.82,489.35 806.15,493.57 819.48,499.61 828.16,503.54"]; + 110 -- 454 [weight="1.0", pos="797.23,479.58 828.84,465.8 918.32,426.8 947.48,414.09"]; + 110 -- 135 [weight="1.0", pos="795.36,490.17 815.03,502.19 860.43,529.95 879.03,541.32"]; + 110 -- 315 [weight="1.0", pos="786.48,491.52 788.03,515.46 793.04,593.3 794.54,616.46"]; + 110 -- 200 [weight="2.0", pos="797.09,489.5 814.31,497.35 847.36,512.42 864.81,520.37"]; + 110 -- 432 [weight="1.0", pos="790.92,477.83 809.57,452.58 876.08,362.51 894.92,337.01"]; + 110 -- 433 [weight="2.0", pos="795.58,490.15 824.05,507.1 908.07,557.14 936.73,574.21"]; + 110 -- 284 [weight="2.0", pos="775.09,489.51 759.94,496.5 732.59,509.13 716.09,516.74"]; + 147 -- 213 [weight="1.0", pos="291.7,1186.7 286.23,1188.1 279.46,1189.8 273.69,1191.3"]; + 147 -- 569 [weight="1.0", pos="293.19,1180.6 281.23,1175.8 259.95,1167.4 247.82,1162.5"]; + 147 -- 406 [weight="1.0", pos="298.89,1179.2 292.02,1168.3 275.59,1142.3 268.72,1131.5"]; + 147 -- 684 [weight="1.0", pos="302.33,1179 302.86,1170.9 303.87,1155.4 304.4,1147.3"]; + 339 -- 604 [weight="1.0", pos="801.78,595.31 808.84,577.67 828.29,529.02 834.77,512.82"]; + 339 -- 491 [weight="2.0", pos="813.19,599.1 828.96,596.06 854.54,591.13 870.88,587.99"]; + 323 -- 421 [weight="1.0", pos="98.868,532.56 85.61,532.29 67.213,531.92 55.28,531.68"]; + 323 -- 582 [weight="1.0", pos="110.07,539.06 106.2,543.72 100.96,550.05 97.332,554.42"]; + 323 -- 690 [weight="1.0", pos="111.86,526.35 109.69,522.09 106.91,516.63 104.95,512.78"]; + 323 -- 382 [weight="3.0", pos="103.48,537.49 90.416,542.62 69.449,550.87 56.836,555.83"]; + 323 -- 683 [weight="1.0", pos="98.963,532.06 96.087,531.91 93.128,531.76 90.359,531.62"]; + 323 -- 601 [weight="2.0", pos="130.92,531 189.66,523.94 396.36,499.12 467.98,490.52"]; + 531 -- 625 [weight="1.0", pos="1136.8,588.24 1144.1,597.81 1157.5,615.34 1164.1,623.98"]; + 531 -- 630 [weight="3.0", pos="1149.5,584 1175.1,587.39 1222.3,593.63 1249.3,597.2"]; + 268 -- 350 [weight="1.0", pos="329.77,199.09 330.95,191.67 332.86,179.74 333.94,173.01"]; + 268 -- 483 [weight="1.0", pos="320.44,200.09 314.43,196.05 306.41,190.66 300.9,186.95"]; + 268 -- 372 [weight="2.0", pos="332.4,212.19 338.78,223.54 351.79,246.66 357.72,257.2"]; + 268 -- 336 [weight="1.0", pos="339.17,200.89 346.55,197.52 356.34,193.05 363.27,189.89"]; + 69 -- 596 [weight="1.0", pos="1081.5,534.92 1051.3,523.72 947.87,485.26 913.2,472.37"]; + 69 -- 531 [weight="1.0", pos="1094.6,543.02 1102.3,550.99 1117.2,566.55 1125.7,575.3"]; + 69 -- 257 [weight="1.0", pos="1082.7,534.07 1063.2,523.12 1008.3,492.36 986.36,480.09"]; + 69 -- 153 [weight="1.0", pos="1080.3,535.66 1058,530.14 1002.1,516.25 974.28,509.37"]; + 345 -- 682 [weight="2.0", pos="845.96,1020.3 849.78,1031.3 858.13,1055.2 861.95,1066.2"]; + 345 -- 624 [weight="1.0", pos="831.38,1017.7 826.45,1018.9 820.8,1020.3 815.83,1021.5"]; + 172 -- 328 [weight="1.0", pos="233.19,535.09 245.71,529.03 267.31,518.59 279.03,512.92"]; + 172 -- 390 [weight="1.0", pos="236.57,544.03 255.04,550.08 288.62,561.07 307.14,567.13"]; + 172 -- 303 [weight="1.0", pos="247.26,538.75 281.09,537.31 342.35,534.71 372.1,533.45"]; + 172 -- 597 [weight="1.0", pos="229.77,544.84 237.87,551.42 251.99,562.9 260.74,570.01"]; + 172 -- 288 [weight="1.0", pos="243.94,542.4 260.71,544.56 283.96,547.56 298.37,549.42"]; + 172 -- 184 [weight="1.0", pos="219.26,534.48 217.27,532.01 214.9,529.08 212.95,526.67"]; + 172 -- 537 [weight="1.0", pos="225.66,534.48 228.43,527.63 233.24,515.77 235.97,509.02"]; + 172 -- 294 [weight="1.0", pos="247.81,539.81 295.5,539.91 400.52,540.14 443.81,540.23"]; + 172 -- 637 [weight="1.0", pos="245.28,541.93 273.56,544.75 322.18,549.6 346.34,552.01"]; + 191 -- 456 [weight="3.0", pos="832.7,459.47 852.94,455.85 883.79,450.34 900.71,447.31"]; + 191 -- 677 [weight="2.0", pos="808.22,456.52 797.81,442.29 773.05,408.46 762.36,393.86"]; + 191 -- 200 [weight="1.0", pos="819.74,469.7 831.86,481.68 857.11,506.66 869.33,518.74"]; + 191 -- 527 [weight="1.0", pos="801.44,457.26 759.02,436.12 611.88,362.79 570.78,342.31"]; + 191 -- 405 [weight="1.0", pos="823.45,468.92 839.14,477.77 868.31,494.24 881.52,501.7"]; + 191 -- 284 [weight="1.0", pos="801.96,468.98 781.09,480.32 735.92,504.85 714.34,516.57"]; + 191 -- 257 [weight="1.0", pos="835.45,464.64 869.53,467.12 933.35,471.76 962.26,473.86"]; + 191 -- 686 [weight="1.0", pos="820.06,456.69 832.61,445.5 858.47,422.46 869.55,412.59"]; + 319 -- 559 [weight="1.0", pos="381.26,350.8 408.84,340.09 477.33,313.52 499.57,304.89"]; + 319 -- 370 [weight="1.0", pos="359.28,349.93 337,338.25 284.56,310.75 263.06,299.48"]; + 319 -- 659 [weight="1.0", pos="384.65,353.97 398.44,352.72 418.8,350.88 433.07,349.59"]; + 319 -- 565 [weight="1.0", pos="359.6,349.96 345.77,342.5 321.02,329.16 308.2,322.25"]; + 319 -- 638 [weight="1.0", pos="355.4,352.91 336.6,349.7 303.61,344.07 284.82,340.86"]; + 319 -- 567 [weight="1.0", pos="379.99,350.19 399.75,340.46 442.33,319.48 461.21,310.18"]; + 319 -- 352 [weight="1.0", pos="380.52,350.46 392.31,345.2 410.99,336.89 422.88,331.59"]; + 319 -- 663 [weight="1.0", pos="384.15,357.22 399.83,359.26 425.03,362.52 443.79,364.96"]; + 319 -- 653 [weight="1.0", pos="379.23,349.98 403.87,336.32 468.65,300.4 490.67,288.2"]; + 319 -- 361 [weight="1.0", pos="357.69,350.67 336,342.16 290.46,324.28 271.25,316.75"]; + 319 -- 527 [weight="4.0", pos="384.51,353.89 419.86,350.48 508.31,341.95 544.37,338.47"]; + 319 -- 648 [weight="1.0", pos="367.18,348.01 363.44,336.52 356.27,314.5 353.01,304.51"]; + 319 -- 372 [weight="2.0", pos="368.88,348.06 367.18,330.13 362.82,284.14 361.31,268.19"]; + 319 -- 584 [weight="2.0", pos="374.58,348.48 381.93,338.44 395.46,319.94 401.95,311.07"]; + 319 -- 550 [weight="1.0", pos="366.43,348.1 365.26,345.41 363.96,342.43 362.91,340.02"]; + 319 -- 698 [weight="1.0", pos="375.29,348.77 387.18,335.13 414.36,303.96 424.91,291.86"]; + 319 -- 504 [weight="1.0", pos="370.91,348.23 373.7,333.46 380.08,299.71 382.55,286.6"]; + 224 -- 690 [weight="1.0", pos="85.059,507.85 88.8,507.88 92.492,507.92 95.511,507.95"]; + 224 -- 323 [weight="1.0", pos="74.923,512.29 83.485,516.67 96.315,523.23 105.18,527.77"]; + 224 -- 311 [weight="1.0", pos="73.521,502.92 77.829,500.24 83.189,496.92 87.472,494.26"]; + 187 -- 560 [weight="1.0", pos="1125.9,442.34 1132.4,445.63 1141.3,450.12 1147.8,453.41"]; + 187 -- 496 [weight="1.0", pos="1130.8,436.34 1133.9,435.99 1137.2,435.61 1140.4,435.25"]; + 187 -- 668 [weight="1.0", pos="1125.4,433.46 1133.3,429.26 1144.9,423.02 1152.5,418.93"]; + 404 -- 433 [weight="1.0", pos="972.5,747.21 968.21,719.68 951.76,614.14 947.47,586.6"]; + 404 -- 579 [weight="1.0", pos="968.35,747.78 954.09,731.14 914.34,684.78 899.93,667.97"]; + 282 -- 618 [weight="1.0", pos="1020.3,595.48 1020.8,576.62 1022.4,515.47 1022.9,496.82"]; + 282 -- 558 [weight="1.0", pos="1019,595.34 1015.4,578.72 1005.3,530.72 1001.9,514.7"]; + 282 -- 460 [weight="1.0", pos="1019.2,606.82 1016.4,622.65 1008.6,666.78 1005.8,682.78"]; + 282 -- 396 [weight="1.0", pos="1023,595.51 1028.6,584.71 1040.9,560.99 1046.3,550.47"]; + 282 -- 464 [weight="1.0", pos="1018.2,595.34 1014.6,584.87 1007,562.82 1003.5,552.75"]; + 282 -- 453 [weight="1.0", pos="1022.7,595.49 1030.8,578.07 1055.4,524.83 1063.3,507.83"]; + 282 -- 664 [weight="1.0", pos="1020.8,595.28 1022.4,581.3 1026.4,545.83 1027.9,532.51"]; + 282 -- 657 [weight="1.0", pos="1023,595.59 1030.4,581.41 1050.1,543.62 1057.2,529.95"]; + 420 -- 596 [weight="1.0", pos="927.95,465.73 924.95,466.01 921.57,466.32 918.25,466.62"]; + 121 -- 467 [weight="1.0", pos="1080.1,459.21 1066.8,451.64 1044.2,438.8 1032.6,432.18"]; + 121 -- 560 [weight="1.0", pos="1112.9,462.7 1121.9,461.69 1132,460.56 1140.3,459.64"]; + 121 -- 503 [weight="1.0", pos="1077.3,459.71 1069.8,456.58 1060.4,452.73 1053.5,449.89"]; + 121 -- 416 [weight="1.0", pos="1096.2,471.79 1105.5,482.79 1124,504.62 1132.1,514.25"]; + 121 -- 321 [weight="1.0", pos="1110,469.12 1115.7,470.3 1121.9,471.56 1127.4,472.67"]; + 121 -- 496 [weight="1.0", pos="1102.4,459.51 1115.2,453.3 1135.5,443.48 1147.2,437.82"]; + 121 -- 257 [weight="1.0", pos="1067.7,467.17 1045.1,469.1 1011.4,472 992.14,473.66"]; + 121 -- 187 [weight="2.0", pos="1096.8,458.87 1101.4,454.08 1107.7,447.6 1112.1,443.11"]; + 121 -- 668 [weight="1.0", pos="1099.2,459.01 1113.2,448.82 1141,428.68 1153.7,419.53"]; + 212 -- 512 [weight="1.0", pos="756.98,239.05 768.32,244.28 789.86,254.21 803.33,260.42"]; + 212 -- 533 [weight="1.0", pos="751.76,240.47 752.94,242.95 754.37,245.97 755.55,248.47"]; + 212 -- 318 [weight="1.0", pos="752.09,240.57 758.63,252.92 775.52,284.8 782.84,298.62"]; + 352 -- 659 [weight="1.0", pos="438.71,332.92 440.73,335.7 443.1,338.95 445.12,341.72"]; + 352 -- 567 [weight="1.0", pos="443.68,321.07 449.41,317.76 456.64,313.6 462.15,310.42"]; + 352 -- 360 [weight="2.0", pos="429.96,320.17 417.86,301.4 382.67,246.81 371.45,229.4"]; + 352 -- 619 [weight="1.0", pos="427.22,320.6 409.4,305.09 361.94,263.77 344.76,248.82"]; + 352 -- 648 [weight="1.0", pos="421.17,322.33 403.53,316.53 372.52,306.33 358.53,301.73"]; + 352 -- 372 [weight="1.0", pos="427.07,320.46 412.74,307.96 380.34,279.7 366.86,267.94"]; + 352 -- 550 [weight="1.0", pos="417.85,328.52 401.33,330.49 376.7,333.42 366.06,334.69"]; + 352 -- 584 [weight="1.0", pos="426.01,320.77 421.14,317.26 415.08,312.9 410.84,309.84"]; + 352 -- 504 [weight="1.0", pos="427.07,320.29 416.88,311.14 398.19,294.38 388.98,286.13"]; + 352 -- 478 [weight="1.0", pos="438.78,333.06 451.65,350.89 487.54,400.59 500.55,418.6"]; + 352 -- 616 [weight="1.0", pos="419.43,329.94 392.62,336.05 336.12,348.93 310.33,354.81"]; + 352 -- 698 [weight="1.0", pos="433.29,320.04 432.34,312.3 430.77,299.55 429.88,292.34"]; + 126 -- 306 [weight="2.0", pos="1360.2,14.755 1368.8,17.182 1382.9,21.126 1392.2,23.742"]; + 126 -- 580 [weight="1.0", pos="1353.6,18.225 1354.8,23.899 1356.5,32.584 1357.6,38.094"]; + 238 -- 682 [weight="1.0", pos="868.07,1048.7 867.16,1053.8 865.82,1061.3 864.91,1066.3"]; + 238 -- 345 [weight="1.0", pos="864.22,1037.6 859.78,1032.6 853.23,1025.1 848.8,1020.1"]; + 238 -- 462 [weight="1.0", pos="885.58,1046.4 899.37,1049.1 918.98,1052.9 933.07,1055.7"]; + 251 -- 593 [weight="1.0", pos="684.9,394.45 679.64,404.11 668.21,425.06 662.83,434.93"]; + 577 -- 712 [weight="1.0", pos="181.54,606.07 183.85,596.02 188.86,574.22 191.22,563.94"]; + 369 -- 538 [weight="1.0", pos="787.89,681.47 782.72,694.45 770.2,725.87 765.33,738.1"]; + 369 -- 679 [weight="1.0", pos="794.67,681 801.8,689.33 815.57,705.45 822.57,713.64"]; + 279 -- 521 [weight="1.0", pos="308.86,642.72 304,646.39 297.27,651.47 292.3,655.22"]; + 279 -- 294 [weight="1.0", pos="322.25,633.29 346.6,617.2 426.46,564.45 453.78,546.4"]; + 209 -- 661 [weight="2.0", pos="624.33,496.68 630.71,494.01 638.88,490.59 645.06,488"]; + 209 -- 492 [weight="1.0", pos="614.49,495.25 614.78,487.94 615.29,475.27 615.58,468.07"]; + 209 -- 239 [weight="1.0", pos="614.16,495.14 614.11,492.43 614.06,489.23 614.01,486.59"]; + 498 -- 687 [weight="1.0", pos="1060.6,354.53 1056.6,354.5 1052.3,354.47 1048.5,354.44"]; + 357 -- 427 [weight="2.0", pos="602.19,734.49 608.73,727.71 619.86,716.18 626.73,709.05"]; + 357 -- 385 [weight="3.0", pos="596.07,734.24 592.97,712.78 582.09,637.25 578.68,613.61"]; + 216 -- 387 [weight="1.0", pos="1373.4,1168.2 1384.1,1166.2 1399.2,1163.3 1409.3,1161.3"]; + 216 -- 245 [weight="1.0", pos="1365.1,1165.6 1373.3,1156.9 1389.6,1139.4 1397.6,1131"]; + 216 -- 381 [weight="1.0", pos="1369.3,1174.9 1374.9,1177.5 1381.9,1180.8 1387.1,1183.2"]; + 372 -- 567 [weight="1.0", pos="371.71,266.92 392.75,275.15 438.66,293.11 459.67,301.32"]; + 372 -- 659 [weight="1.0", pos="366.35,267.99 382.02,283.04 426.47,325.74 443.24,341.84"]; + 372 -- 648 [weight="1.0", pos="359.31,268.38 357.48,275.48 354.4,287.46 352.65,294.25"]; + 372 -- 584 [weight="1.0", pos="366.28,267.97 375.26,276.67 392.89,293.75 401.15,301.75"]; + 372 -- 550 [weight="1.0", pos="360.79,268.35 360.81,282.13 360.84,317.09 360.86,330.22"]; + 372 -- 504 [weight="1.0", pos="367.5,268.13 370.75,270.79 374.62,273.96 377.75,276.51"]; + 372 -- 698 [weight="1.0", pos="372.39,266.77 384.9,271.21 404.7,278.23 417.32,282.71"]; + 574 -- 712 [weight="1.0", pos="264.84,490.79 251.12,503.61 213.33,538.92 198.54,552.73"]; + 574 -- 601 [weight="1.0", pos="283.19,486.14 318.87,486.38 417.42,487.05 465.52,487.38"]; + 170 -- 328 [weight="1.0", pos="276.96,473.33 279.38,481.78 283.52,496.24 285.71,503.89"]; + 170 -- 597 [weight="1.0", pos="274.68,473.25 273.5,492.69 270.03,550.07 268.84,569.64"]; + 170 -- 390 [weight="3.0", pos="277.9,473.28 286.02,492.08 309.35,546.09 317.47,564.89"]; + 170 -- 303 [weight="6.0", pos="285.61,472.82 307.47,485.45 357.5,514.38 379.06,526.83"]; + 170 -- 288 [weight="1.0", pos="277.94,473.35 285,489.67 303.11,531.55 309.39,546.08"]; + 170 -- 184 [weight="1.0", pos="267.5,473.05 253.96,484.36 225.91,507.79 214.29,517.5"]; + 170 -- 537 [weight="1.0", pos="268.62,473.21 261.32,480.54 249.59,492.32 242.98,498.97"]; + 170 -- 294 [weight="2.0", pos="288.89,472.13 323.83,485.8 415.31,521.6 449.71,535.06"]; + 170 -- 319 [weight="1.0", pos="280.7,460.09 297.47,440.33 346.97,381.97 363.85,362.07"]; + 170 -- 172 [weight="1.0", pos="270.31,473.47 260.14,487.87 236.47,521.42 227.27,534.45"]; + 170 -- 637 [weight="1.0", pos="281.52,473.24 297.88,489.79 340.77,533.16 355.66,548.22"]; + 33 -- 294 [weight="1.0", pos="351.49,602.49 372.24,590.91 428.66,559.45 452.35,546.24"]; + 33 -- 566 [weight="1.0", pos="345.24,611.93 346.07,614.6 347.09,617.85 347.91,620.5"]; + 33 -- 303 [weight="1.0", pos="346.93,601.52 355.02,588.38 375.9,554.41 384.95,539.69"]; + 63 -- 71 [weight="1.0", pos="385.86,114.51 390.73,117.85 397.26,122.33 402.32,125.79"]; + 63 -- 520 [weight="1.0", pos="386.99,105.07 391.81,102.25 397.88,98.698 402.51,95.987"]; + 7 -- 548 [weight="1.0", pos="1487.6,239.1 1483.3,237.4 1478,235.28 1473.7,233.59"]; + 7 -- 83 [weight="1.0", pos="1503,239.12 1507.2,237.48 1512.4,235.46 1516.7,233.81"]; + 7 -- 470 [weight="2.0", pos="1502.9,245.2 1506.7,246.71 1511.3,248.55 1515.2,250.14"]; + 7 -- 325 [weight="1.0", pos="1487.7,245.21 1482.3,247.45 1475.1,250.38 1470.7,252.2"]; + 227 -- 577 [weight="1.0", pos="206.26,598.46 200.72,601.21 193.75,604.67 188.43,607.31"]; + 227 -- 712 [weight="1.0", pos="211.91,588.33 207.66,581.77 200.63,570.92 196.3,564.24"]; + 227 -- 390 [weight="1.0", pos="228.77,591.03 248.38,586.83 284.97,579 305.44,574.62"]; + 227 -- 597 [weight="1.0", pos="226.73,590.14 234.25,587.63 244.28,584.3 252.61,581.53"]; + 227 -- 303 [weight="2.0", pos="226.37,590.05 256.83,579.33 342.94,549.01 376.05,537.36"]; + 227 -- 431 [weight="1.0", pos="201.94,591.23 186,588.13 159.73,583.03 144.05,579.98"]; + 227 -- 501 [weight="1.0", pos="202.35,596.68 177.26,602.05 122.63,613.73 95.008,619.64"]; + 227 -- 294 [weight="1.0", pos="228.46,591.07 270.05,582.06 400.09,553.91 446.44,543.87"]; + 80 -- 427 [weight="1.0", pos="558.03,686.81 574.74,690.39 599.52,695.69 615.9,699.19"]; + 80 -- 261 [weight="1.0", pos="562.73,681.05 597.73,678.02 665.03,672.2 702.8,668.94"]; + 80 -- 90 [weight="2.0", pos="550.93,688.02 558.11,691.37 567.49,695.76 574.52,699.04"]; + 80 -- 385 [weight="1.0", pos="542.88,677.49 549.52,663.92 566.69,628.86 574.13,613.67"]; + 80 -- 102 [weight="1.0", pos="547.86,677.63 568.3,663.35 624.06,624.4 647.07,608.33"]; + 26 -- 164 [weight="1.0", pos="899.28,174.76 899.23,188.11 899.12,224.38 899.07,239.61"]; + 26 -- 62 [weight="1.0", pos="903.74,164.64 905.92,162.14 908.56,159.13 910.78,156.58"]; + 600 -- 634 [weight="1.0", pos="474.16,608.51 471.82,613.46 468.75,619.93 466.64,624.38"]; + 600 -- 601 [weight="5.0", pos="478.47,594.3 481.18,573.85 488.97,515.13 491.69,494.68"]; + 99 -- 687 [weight="1.0", pos="1089,369.43 1077.2,366.1 1059.3,361.04 1047.5,357.71"]; + 457 -- 513 [weight="1.0", pos="1326.1,939.25 1321.5,938.97 1316.1,938.63 1311.1,938.32"]; + 72 -- 373 [weight="1.0", pos="408.61,479.06 405.43,476.28 401.47,472.81 398.15,469.91"]; + 72 -- 476 [weight="1.0", pos="422.95,487.89 427.45,489.87 432.93,492.28 437.39,494.25"]; + 72 -- 73 [weight="1.0", pos="417.63,489.58 421.03,495.32 426.37,504.34 430.03,510.5"]; + 72 -- 601 [weight="2.0", pos="425.6,484.61 436.08,485.07 452.13,485.78 465.9,486.38"]; + 383 -- 497 [weight="1.0", pos="358.6,405.43 390.19,405.23 465.78,404.77 497.33,404.57"]; + 383 -- 649 [weight="1.0", pos="353.07,409.5 366.31,415.54 391.5,427.04 406.28,433.79"]; + 264 -- 527 [weight="1.0", pos="549.23,284.78 551.37,295.12 556.11,317.98 558.54,329.7"]; + 297 -- 591 [weight="1.0", pos="1254.2,629.77 1265.6,634.19 1284.3,641.46 1295.6,645.84"]; + 297 -- 630 [weight="4.0", pos="1249.5,620.71 1253.6,616.54 1259.2,610.71 1263.5,606.28"]; + 297 -- 531 [weight="1.0", pos="1234.8,622.21 1214.5,614.21 1167.1,595.57 1144.4,586.62"]; + 297 -- 415 [weight="1.0", pos="1247.8,631.52 1252.2,638.69 1259.8,651.1 1264.2,658.15"]; + 108 -- 170 [weight="1.0", pos="344.64,528.11 331.34,516.38 297,486.07 282.12,472.94"]; + 108 -- 328 [weight="1.0", pos="340.75,529.34 328.73,524.77 307.91,516.87 296.07,512.37"]; + 108 -- 390 [weight="1.0", pos="346.14,537.91 340.79,544.85 331.15,557.36 325.27,564.98"]; + 108 -- 303 [weight="1.0", pos="363.3,532.82 366.15,532.8 369.19,532.79 372.15,532.78"]; + 108 -- 597 [weight="1.0", pos="342.2,537.03 327.69,544.75 296.53,561.32 279.73,570.26"]; + 108 -- 288 [weight="1.0", pos="341.49,536.92 335.12,539.94 326.45,544.06 320.08,547.09"]; + 108 -- 184 [weight="1.0", pos="337.02,531.85 309.08,529.67 243.84,524.57 218.95,522.63"]; + 108 -- 537 [weight="1.0", pos="338.88,529.99 317.74,524.53 272,512.72 250.14,507.08"]; + 108 -- 294 [weight="1.0", pos="362.99,533.71 382.94,535.02 421.25,537.53 444.24,539.04"]; + 108 -- 172 [weight="1.0", pos="336.97,533.58 315.75,534.73 273.53,537.03 247,538.48"]; + 108 -- 637 [weight="1.0", pos="352.75,538.06 354.35,541.11 356.37,544.96 357.99,548.04"]; + 64 -- 666 [weight="1.0", pos="390.72,400.06 387.96,396.32 384.16,391.19 381.29,387.3"]; + 64 -- 497 [weight="1.0", pos="406.06,409.19 428.76,412.47 478.56,412.21 500.64,408.66"]; + 64 -- 649 [weight="1.0", pos="393.1,410.16 394.17,416.65 400.57,427.11 406.86,433.66"]; + 232 -- 284 [weight="2.0", pos="661.56,465.01 669.65,476.53 688.56,503.43 697.51,516.16"]; + 232 -- 351 [weight="2.0", pos="654.74,453.91 648.67,442.46 635.02,416.69 628.58,404.52"]; + 10 -- 385 [weight="1.0", pos="574.61,488.67 575.17,510.19 576.91,577.45 577.47,599.44"]; + 10 -- 492 [weight="1.0", pos="585.31,476.9 591.82,473.86 600.02,470.03 606.27,467.11"]; + 10 -- 239 [weight="1.0", pos="590.5,481.72 594.94,481.65 599.64,481.57 603.65,481.51"]; + 10 -- 700 [weight="1.0", pos="559.55,484.77 556.04,485.43 552.38,486.11 549.13,486.72"]; + 10 -- 294 [weight="2.0", pos="564.56,487.15 543.79,498.02 495.76,523.15 474.06,534.52"]; + 10 -- 144 [weight="1.0", pos="572.17,488.42 570.62,492.79 568.61,498.48 567.19,502.5"]; + 10 -- 214 [weight="1.0", pos="582.61,476.22 599.12,464.57 636.39,438.27 653.74,426.04"]; + 10 -- 570 [weight="1.0", pos="574.58,488.72 574.85,501.41 575.42,528.58 575.65,539.86"]; + 10 -- 587 [weight="1.0", pos="564.62,487.43 556.03,492.2 543.71,499.04 535.82,503.42"]; + 10 -- 110 [weight="1.0", pos="590.69,482.17 630.46,482.64 732.25,483.83 770.87,484.28"]; + 10 -- 661 [weight="3.0", pos="590.58,482.43 605.78,482.85 628.21,483.47 641.97,483.85"]; + 10 -- 497 [weight="3.0", pos="569.29,475.64 557.44,461.04 528.34,425.18 516.6,410.7"]; + 10 -- 303 [weight="1.0", pos="561.12,485.63 527.28,494.9 438.23,519.3 403.44,528.83"]; + 10 -- 160 [weight="2.0", pos="569.7,475.64 566.59,471.48 562.51,466.03 559.29,461.73"]; + 10 -- 209 [weight="2.0", pos="584.9,486.95 591.17,489.93 599.07,493.68 605.09,496.54"]; + 10 -- 527 [weight="6.0", pos="573.78,475.37 571.41,451.43 563.26,369.35 560.77,344.28"]; + 10 -- 284 [weight="1.0", pos="587.17,486.07 610.18,493.46 658.7,509.04 684.83,517.44"]; + 10 -- 478 [weight="1.0", pos="567.3,476.12 554.2,465.36 526.41,442.53 512.95,431.48"]; + 550 -- 567 [weight="1.0", pos="365.86,333.95 382.12,329.54 433.86,315.52 457.96,308.99"]; + 550 -- 659 [weight="1.0", pos="365.9,336.03 378.75,337.88 413.21,342.83 433.74,345.78"]; + 550 -- 648 [weight="1.0", pos="359.54,330.31 357.74,323.52 354.53,311.43 352.71,304.55"]; + 550 -- 584 [weight="1.0", pos="365.32,332.39 373.54,327.02 391.08,315.56 400.06,309.7"]; + 550 -- 698 [weight="1.0", pos="365.35,332.13 376.99,323.89 408.24,301.77 422.25,291.86"]; + 225 -- 613 [weight="1.0", pos="702.07,709.58 705.16,709.35 708.33,709.11 711.33,708.88"]; + 225 -- 358 [weight="2.0", pos="681.36,705.21 679.54,697.06 676.25,682.3 674.28,673.49"]; + 142 -- 261 [weight="1.0", pos="709.3,742.29 713.19,728.2 723.77,689.91 728.22,673.83"]; + 142 -- 358 [weight="1.0", pos="705.52,742.27 699.41,728.14 682.8,689.72 675.83,673.59"]; + 207 -- 281 [weight="1.0", pos="621.32,313.52 615.99,316.57 609.03,320.55 603.81,323.53"]; + 207 -- 214 [weight="1.0", pos="630.83,314.01 636.25,331.84 654.55,391.97 660.81,412.56"]; + 263 -- 340 [weight="1.0", pos="514.49,267.63 514.1,282.41 512.96,325.64 512.54,341.33"]; + 394 -- 659 [weight="2.0", pos="549.88,374.68 527.71,368.79 485.68,357.63 463.79,351.82"]; + 394 -- 594 [weight="1.0", pos="575.95,373.21 601.55,361.41 662.79,333.16 688.35,321.37"]; + 394 -- 478 [weight="1.0", pos="556.68,384.64 545.42,393.54 524.61,409.99 513.24,418.97"]; + 394 -- 581 [weight="1.0", pos="547.99,381.23 542.76,382.09 537.17,383 532.71,383.73"]; + 167 -- 630 [weight="1.0", pos="1311.1,595.09 1305,595.8 1297.5,596.67 1290.6,597.47"]; + 505 -- 644 [weight="1.0", pos="916.12,557.3 888.89,551.09 820.91,535.59 787.91,528.07"]; + 505 -- 579 [weight="1.0", pos="925.99,565.43 920.34,582.78 902.86,636.51 896.76,655.26"]; + 360 -- 619 [weight="1.0", pos="360.52,228.87 356.14,231.74 350.63,235.35 346.2,238.24"]; + 692 -- 695 [weight="1.0", pos="242.92,621.51 242.75,623.89 242.56,626.63 242.39,628.95"]; + 133 -- 399 [weight="1.0", pos="1163.2,242.24 1165.3,244.73 1167.7,247.76 1169.8,250.27"]; + 513 -- 553 [weight="2.0", pos="1281.2,936.99 1272.5,936.76 1261.6,936.47 1253.4,936.26"]; + 290 -- 397 [weight="1.0", pos="934.1,810.1 937.66,810.76 941.58,811.48 945.03,812.12"]; + 290 -- 404 [weight="1.0", pos="927.69,803.06 936.97,793.09 957.72,770.79 967.81,759.96"]; + 123 -- 559 [weight="1.0", pos="500.83,319.18 502.09,315.49 503.72,310.74 504.93,307.19"]; + 123 -- 319 [weight="1.0", pos="485.52,328.07 460.74,333.89 407.91,346.32 383.04,352.16"]; + 123 -- 527 [weight="2.0", pos="513.06,327.72 522.66,329.61 535.32,332.09 545.08,334.01"]; + 304 -- 527 [weight="1.0", pos="556.47,222.21 557.09,242.15 559.13,307.76 559.82,329.72"]; + 304 -- 704 [weight="1.0", pos="551.05,221.7 545.99,226.83 538.4,234.51 533.61,239.37"]; + 50 -- 124 [weight="2.0", pos="1100.7,600.98 1095.5,598.04 1088.6,594.18 1083.2,591.14"]; + 50 -- 636 [weight="1.0", pos="1121.2,607.42 1124.4,607.93 1127.8,608.47 1131.1,608.98"]; + 50 -- 101 [weight="1.0", pos="1100.2,601.3 1085.3,594.02 1054.7,579.07 1038.9,571.34"]; + 50 -- 285 [weight="1.0", pos="1110.3,611.27 1112.5,619.34 1116.5,633.82 1118.7,641.72"]; + 50 -- 407 [weight="2.0", pos="1102.4,610.34 1098.3,613.5 1093,617.61 1088.9,620.76"]; + 476 -- 601 [weight="1.0", pos="456.61,495.52 461.15,494.52 466.6,493.31 471.85,492.15"]; + 406 -- 569 [weight="1.0", pos="261.42,1131.6 256.33,1137.7 247.82,1147.9 242.78,1154"]; + 406 -- 684 [weight="1.0", pos="275.1,1130.3 280.98,1132.7 288.53,1135.7 294.54,1138.1"]; + 396 -- 464 [weight="1.0", pos="1029.2,546.21 1024.6,546.43 1019.9,546.66 1015.6,546.86"]; + 396 -- 664 [weight="1.0", pos="1043.4,540.36 1040.3,537.71 1036.6,534.46 1033.7,531.87"]; + 396 -- 453 [weight="1.0", pos="1051,540.02 1054.3,531.74 1060.6,515.71 1063.8,507.57"]; + 396 -- 657 [weight="1.0", pos="1051.7,540.13 1053.4,537.02 1055.5,533.08 1057.1,529.99"]; + 396 -- 618 [weight="1.0", pos="1046.6,540.29 1041.7,530.07 1030.4,506.83 1025.5,496.49"]; + 396 -- 558 [weight="1.0", pos="1042.3,540.28 1032.8,533.2 1015.5,520.37 1006.5,513.7"]; + 510 -- 596 [weight="1.0", pos="731.92,446.22 761.51,450.04 849.34,461.36 885.71,466.05"]; + 56 -- 538 [weight="1.0", pos="836.86,629.55 823.06,650.87 779.07,718.8 766.64,738"]; + 56 -- 118 [weight="1.0", pos="836.04,629.78 814.14,659.05 726.84,775.74 705.35,804.45"]; + 56 -- 679 [weight="1.0", pos="840.07,629.67 837.42,647.55 830.11,696.86 827.68,713.29"]; + 56 -- 198 [weight="1.0", pos="844.56,629.64 852.38,644.15 871.03,678.78 878.02,691.76"]; + 56 -- 102 [weight="6.0", pos="821.37,620.76 784.97,616.43 707.73,607.25 673.79,603.21"]; + 56 -- 139 [weight="4.0", pos="819.96,623.4 797.62,623.72 762.06,624.24 736.25,624.61"]; + 56 -- 358 [weight="3.0", pos="824.59,627.32 792.32,635.6 721.07,653.88 688.94,662.13"]; + 56 -- 269 [weight="2.0", pos="836.33,629.52 825.28,644.6 797.82,682.06 787.51,696.12"]; + 56 -- 315 [weight="3.0", pos="819.89,623.06 816.95,623.06 813.98,623.05 811.16,623.05"]; + 56 -- 180 [weight="1.0", pos="841.75,629.72 843.37,644.82 847.32,681.6 848.8,695.39"]; + 56 -- 433 [weight="1.0", pos="853.97,617.81 874.3,609.49 913.54,593.44 933.74,585.18"]; + 56 -- 110 [weight="1.0", pos="838.39,616.41 829.12,593.04 798.21,515.17 788.78,491.41"]; + 56 -- 647 [weight="1.0", pos="842.83,629.76 848.26,650.09 864.57,711.06 869.53,729.61"]; + 56 -- 369 [weight="2.0", pos="834.8,629.55 824.62,640.09 804.61,660.8 795.24,670.49"]; + 56 -- 534 [weight="1.0", pos="861.76,621.58 875.18,620.6 892.4,619.34 904.91,618.43"]; + 56 -- 540 [weight="1.0", pos="840.47,629.71 838.5,652.56 832,727.8 830.26,747.94"]; + 56 -- 135 [weight="1.0", pos="844.98,616.55 853.87,601.75 875.4,565.94 883.78,552"]; + 56 -- 539 [weight="1.0", pos="857,618.73 874.17,614.04 901.07,606.68 916.37,602.5"]; + 56 -- 284 [weight="1.0", pos="832.37,616.84 807.7,599.05 737.3,548.27 711.77,529.85"]; + 66 -- 261 [weight="1.0", pos="628.2,790.03 644.91,769.82 705.51,696.47 724.5,673.5"]; + 66 -- 424 [weight="1.0", pos="645.03,793.68 652.81,793.11 661.23,792.48 667.42,792.03"]; + 449 -- 512 [weight="1.0", pos="843.81,232.39 837.76,239.5 827.14,251.94 820.69,259.51"]; + 658 -- 677 [weight="1.0", pos="788.53,330.81 782.6,341.47 768.27,367.24 761.28,379.81"]; + 54 -- 352 [weight="1.0", pos="421.06,238.42 423.37,254.07 430.47,302.06 433.11,319.86"]; + 274 -- 546 [weight="1.0", pos="534.44,165.4 541.87,171.96 555.39,183.9 563.29,190.87"]; + 274 -- 511 [weight="1.0", pos="541.9,162.32 546,162.83 550.46,163.39 554.24,163.86"]; + 365 -- 432 [weight="1.0", pos="929.33,314.85 923.59,317.85 916.09,321.77 910.11,324.9"]; + 306 -- 629 [weight="3.0", pos="1411.8,26.646 1422.6,26.902 1439.2,27.299 1448.1,27.511"]; + 306 -- 580 [weight="1.0", pos="1392.9,29.818 1385.8,32.63 1375.6,36.612 1368.2,39.515"]; + 659 -- 698 [weight="1.0", pos="447.55,341.54 443.45,329.34 434.72,303.35 430.98,292.19"]; + 70 -- 467 [weight="1.0", pos="1051.9,479.69 1046.4,469.11 1033.4,443.94 1027.8,433.08"]; + 70 -- 503 [weight="1.0", pos="1053,479.46 1051,472.1 1047.2,458.48 1045.2,451.04"]; + 70 -- 257 [weight="1.0", pos="1046.4,483.53 1033.5,481.93 1008,478.77 991.79,476.76"]; + 70 -- 121 [weight="1.0", pos="1060.7,481.15 1065.9,478.38 1073.4,474.39 1079.6,471.1"]; + 469 -- 480 [weight="1.0", pos="242.52,444.47 249.71,443.37 258.48,442.03 265.77,440.92"]; + 469 -- 601 [weight="1.0", pos="242.48,448.74 285.23,455.38 415.66,475.62 469.26,483.93"]; + 166 -- 257 [weight="1.0", pos="984.38,433.98 982.9,442.43 979.99,458.93 978.36,468.21"]; + 88 -- 128 [weight="1.0", pos="1002.8,639.15 993.01,644.48 977.61,652.91 968.18,658.07"]; + 88 -- 433 [weight="1.0", pos="1005.8,629.2 993.75,619.24 966.89,596.96 953.84,586.13"]; + 141 -- 201 [weight="1.0", pos="677.02,163.82 695.03,173.99 742,200.51 761.34,211.44"]; + 141 -- 517 [weight="1.0", pos="681.17,157.65 685.42,156.85 690.31,155.94 694.83,155.1"]; + 30 -- 170 [weight="2.0", pos="313.03,524.24 305.03,512.12 287.68,485.83 279.5,473.44"]; + 30 -- 328 [weight="1.0", pos="309.95,525.36 304.94,521.76 298.36,517.03 293.56,513.58"]; + 30 -- 288 [weight="1.0", pos="315.44,537.09 314.63,540.01 313.7,543.39 312.96,546.11"]; + 30 -- 537 [weight="1.0", pos="307.51,527.33 292.64,522.32 264.33,512.8 248.83,507.58"]; + 30 -- 294 [weight="5.0", pos="328.18,531.32 352.96,532.97 413.5,536.99 444.34,539.03"]; + 30 -- 637 [weight="1.0", pos="325.63,535 333.26,539 344.45,544.86 352.15,548.9"]; + 30 -- 157 [weight="3.0", pos="305.78,531.06 281.22,532.07 223.01,534.47 189.61,535.84"]; + 30 -- 303 [weight="3.0", pos="328.48,530.93 340.18,531.27 358.66,531.82 372.17,532.22"]; + 30 -- 597 [weight="2.0", pos="311.24,536.19 302.18,544.67 285.03,560.73 275.42,569.73"]; + 30 -- 390 [weight="2.0", pos="317.73,537.34 318.3,544.95 319.23,557.26 319.8,564.82"]; + 30 -- 323 [weight="1.0", pos="306.07,530.72 272.32,531.1 171.14,532.25 131.43,532.7"]; + 30 -- 108 [weight="1.0", pos="328.33,531.36 331.15,531.56 334.21,531.77 337.12,531.97"]; + 30 -- 601 [weight="1.0", pos="327.41,528.09 355.71,521.15 435.62,501.55 472.96,492.39"]; + 30 -- 184 [weight="1.0", pos="306.06,529.69 284.9,527.98 239.29,524.3 219.07,522.66"]; + 30 -- 38 [weight="2.0", pos="308.26,526.42 289.67,517.75 247.11,497.92 228.78,489.37"]; + 30 -- 81 [weight="1.0", pos="322.9,536.61 331.04,545.25 345.9,561 353.42,568.97"]; + 30 -- 172 [weight="1.0", pos="306.11,531.68 291.17,533.14 264.32,535.77 245.29,537.63"]; + 30 -- 73 [weight="1.0", pos="328.42,529.31 348.63,527 391.38,522.12 415.83,519.32"]; + 128 -- 433 [weight="1.0", pos="959.05,657.16 956.68,642.66 950.2,602.99 947.57,586.9"]; + 403 -- 457 [weight="1.0", pos="1334.4,920.48 1334.8,924.66 1335.3,930.49 1335.7,934.67"]; + 403 -- 513 [weight="1.0", pos="1326.3,919.73 1319.9,923.47 1310.9,928.78 1304.3,932.6"]; + 252 -- 571 [weight="1.0", pos="588.25,290.71 591.68,279.04 599.57,252.19 602.86,241.01"]; + 252 -- 527 [weight="1.0", pos="582.92,301.93 578.13,309.26 569.78,322.06 564.6,329.99"]; + 252 -- 351 [weight="2.0", pos="588.69,301.74 595.24,319.06 615.53,372.68 622.61,391.39"]; + 466 -- 600 [weight="1.0", pos="363.28,690.87 383.66,674.92 446.34,625.84 469.13,608"]; + 28 -- 294 [weight="3.0", pos="281.31,593.28 313.25,583.96 410.58,555.58 448.09,544.64"]; + 28 -- 30 [weight="1.0", pos="274.92,590.69 283.48,578.53 303.73,549.76 312.75,536.94"]; + 28 -- 303 [weight="1.0", pos="279.11,591.92 299.98,580.7 355.46,550.88 378.73,538.37"]; + 28 -- 390 [weight="2.0", pos="279.12,592.19 287.55,587.94 300.74,581.3 309.91,576.67"]; + 28 -- 37 [weight="2.0", pos="282.95,597.29 285.58,597.51 288.38,597.74 291.08,597.97"]; + 28 -- 597 [weight="3.0", pos="270.23,590.39 269.94,588.09 269.6,585.42 269.3,583.04"]; + 40 -- 124 [weight="1.0", pos="1083.7,648.14 1081.8,635.33 1077.1,604.69 1075.2,591.9"]; + 40 -- 50 [weight="1.0", pos="1087.4,648.36 1092,639.01 1101.3,620.26 1106,610.96"]; + 40 -- 554 [weight="1.0", pos="1091.6,658.27 1100.9,664.12 1117.5,674.48 1127.1,680.52"]; + 40 -- 282 [weight="1.0", pos="1078.7,649.04 1066.6,639.12 1039.2,616.69 1026.7,606.4"]; + 40 -- 168 [weight="1.0", pos="1074.5,653.31 1072,653.16 1069.4,653 1066.9,652.85"]; + 40 -- 460 [weight="1.0", pos="1076.7,657.37 1062,663.76 1030.7,677.38 1014.7,684.36"]; + 40 -- 407 [weight="1.0", pos="1084.2,648.18 1083.9,643.27 1083.4,636.23 1083,631.31"]; + 40 -- 696 [weight="1.0", pos="1087.1,659.63 1091.2,669.45 1099.8,689.36 1103.7,698.69"]; + 40 -- 101 [weight="1.0", pos="1081.3,648.71 1071.5,633.26 1042.5,587.82 1032.5,571.98"]; + 40 -- 583 [weight="1.0", pos="1093.8,656.32 1101.3,658.28 1111.9,661.04 1119.7,663.08"]; + 40 -- 285 [weight="1.0", pos="1094.3,652.08 1097.7,651.44 1101.6,650.72 1105.3,650.02"]; + 310 -- 644 [weight="1.0", pos="713.27,556.58 724.74,549.89 746.11,537.4 758.9,529.93"]; + 310 -- 691 [weight="1.0", pos="715.97,564.75 727.2,568.56 744.88,574.58 756.36,578.49"]; + 310 -- 380 [weight="1.0", pos="720.56,560.46 735.47,559.77 758.33,558.71 774.71,557.95"]; + 310 -- 614 [weight="1.0", pos="711.33,565.82 715.15,568.84 720.12,572.77 723.94,575.79"]; + 310 -- 555 [weight="1.0", pos="712.06,556.62 715.96,553.95 720.87,550.59 724.81,547.89"]; + 283 -- 712 [weight="2.0", pos="313.97,497.79 290.71,509.39 228.53,540.4 203.33,552.97"]; + 283 -- 601 [weight="4.0", pos="337.99,492.81 366.71,491.84 429.64,489.7 465.74,488.47"]; + 283 -- 574 [weight="1.0", pos="308.73,491.37 300.51,490.24 290.26,488.84 282.36,487.75"]; + 75 -- 185 [weight="2.0", pos="406.23,601.13 424.76,595.77 456.13,586.7 474.72,581.33"]; + 75 -- 600 [weight="1.0", pos="413.93,604.4 426.21,603.82 441.37,603.12 453.81,602.53"]; + 75 -- 606 [weight="1.0", pos="388.58,611.07 385.1,618.33 379.08,630.92 375.66,638.07"]; + 134 -- 384 [weight="1.0", pos="1272.8,585.11 1283,591.49 1298.9,601.46 1308.1,607.19"]; + 134 -- 630 [weight="6.0", pos="1265.3,585.72 1266.1,588.09 1266.9,590.77 1267.6,593.16"]; + 134 -- 589 [weight="2.0", pos="1282.8,577.15 1287.6,576.66 1292.4,576.16 1296.3,575.77"]; + 134 -- 531 [weight="1.0", pos="1243.3,579.53 1218.3,580 1175.8,580.81 1151.1,581.28"]; + 134 -- 167 [weight="1.0", pos="1279.5,583.03 1289.9,585.55 1303.3,588.76 1312.5,590.98"]; + 618 -- 664 [weight="1.0", pos="1023.8,496.38 1024.8,503.17 1026.6,515.26 1027.7,522.15"]; + 618 -- 657 [weight="1.0", pos="1028.4,496.33 1035.5,502.74 1047.7,513.86 1054.6,520.18"]; + 303 -- 328 [weight="1.0", pos="374.18,529.22 353.32,524.37 316.17,515.73 297.91,511.48"]; + 303 -- 577 [weight="1.0", pos="376.48,537.52 337.86,552.05 222.77,595.37 189.46,607.9"]; + 303 -- 712 [weight="1.0", pos="372.8,534.86 339.55,539.2 263.92,549.06 221.94,554.53"]; + 303 -- 597 [weight="4.0", pos="376.31,537.38 353.79,545.5 307.49,562.19 283.53,570.82"]; + 303 -- 390 [weight="9.0", pos="379.06,538.43 365.88,545.84 343.05,558.66 330.06,565.95"]; + 303 -- 537 [weight="1.0", pos="373.62,529.75 343.74,524.06 278.96,511.74 251.15,506.45"]; + 303 -- 568 [weight="1.0", pos="382.48,539.16 365.33,555.52 320.36,598.41 304.75,613.29"]; + 303 -- 431 [weight="1.0", pos="373.48,535.45 326.51,543.59 188.07,567.58 144.42,575.14"]; + 303 -- 501 [weight="1.0", pos="375.07,536.84 323.51,551.85 146.12,603.47 93.272,618.85"]; + 303 -- 566 [weight="1.0", pos="386.25,539.69 378.58,557.55 358.38,604.64 351.66,620.3"]; + 303 -- 637 [weight="1.0", pos="380.87,538.83 376.68,541.89 371.67,545.54 367.71,548.43"]; + 303 -- 335 [weight="2.0", pos="378.16,538.09 342.51,555.38 231.08,609.43 197.96,625.49"]; + 303 -- 478 [weight="1.0", pos="396.15,526.32 416.85,507.15 478.14,450.4 498.6,431.46"]; + 589 -- 630 [weight="2.0", pos="1298.5,579.07 1293,583.06 1284.6,589.15 1278.3,593.72"]; + 192 -- 677 [weight="1.0", pos="820.92,341.16 808.26,350.27 780.94,369.95 766.57,380.29"]; + 192 -- 518 [weight="1.0", pos="835.78,341 846.9,347.45 866.61,358.87 876.55,364.64"]; + 192 -- 318 [weight="1.0", pos="821.21,331.44 814.03,326.03 802.41,317.29 794.58,311.39"]; + 614 -- 644 [weight="1.0", pos="733.15,575.58 740.26,565.42 756.75,541.84 764.79,530.35"]; + 614 -- 691 [weight="1.0", pos="741.74,581 744.6,581.15 747.7,581.3 750.73,581.46"]; + 59 -- 630 [weight="1.0", pos="1221.5,605.37 1229.9,604.42 1240,603.27 1248.7,602.28"]; + 59 -- 332 [weight="1.0", pos="1207.5,602.09 1209.2,599.78 1211.1,597.07 1212.7,594.75"]; + 59 -- 531 [weight="1.0", pos="1192.3,603.24 1179.4,598.64 1158.6,591.21 1145,586.38"]; + 421 -- 683 [weight="1.0", pos="55.622,531.27 58.375,531.23 61.306,531.19 64.097,531.15"]; + 215 -- 667 [weight="1.0", pos="536.37,641.83 535.11,662.86 530.35,741.84 528.89,766"]; + 215 -- 261 [weight="1.0", pos="548.21,638.43 578.97,643.19 663.52,656.26 705.67,662.77"]; + 215 -- 680 [weight="1.0", pos="547.13,634.17 552.19,632.97 558.31,631.52 563.65,630.25"]; + 215 -- 422 [weight="1.0", pos="542.66,632.19 554.97,622.99 583.22,601.89 597.75,591.04"]; + 501 -- 577 [weight="1.0", pos="97.489,620.98 118.39,618.55 151.15,614.73 168.55,612.71"]; + 501 -- 712 [weight="1.0", pos="88.432,617.46 110.27,605.06 161.5,575.97 182.87,563.84"]; + 501 -- 599 [weight="4.0", pos="64.295,627.86 56.399,630.48 46.575,633.74 38.726,636.35"]; + 501 -- 557 [weight="3.0", pos="91.547,628.16 103.21,632.52 120.05,638.81 131.43,643.07"]; + 155 -- 304 [weight="1.0", pos="478.11,216.59 494.48,216.55 522.49,216.48 540.16,216.43"]; + 155 -- 527 [weight="2.0", pos="469.37,222.1 484.91,241.78 537.83,308.82 554.78,330.29"]; + 155 -- 610 [weight="1.0", pos="477.07,218.81 496.97,222.44 536.58,229.65 557.02,233.38"]; + 155 -- 704 [weight="1.0", pos="474.22,220.53 487.23,226.08 510.73,236.1 522.29,241.03"]; + 155 -- 195 [weight="1.0", pos="461.78,210.88 455.77,200.3 443.04,177.87 437.39,167.93"]; + 245 -- 387 [weight="1.0", pos="1404.7,1131.1 1408.1,1137.3 1414,1147.8 1417.5,1154.1"]; + 245 -- 381 [weight="1.0", pos="1401.4,1131.4 1400,1142.8 1396.6,1170.1 1395.2,1181.6"]; + 267 -- 600 [weight="1.0", pos="474.97,694.15 475.43,677.34 476.82,627.09 477.33,608.47"]; + 267 -- 634 [weight="1.0", pos="473.98,694.21 471.99,681.03 466.97,647.77 465.01,634.81"]; + 267 -- 305 [weight="1.0", pos="471.23,705.18 462.55,718.37 440.55,751.83 432.29,764.4"]; + 267 -- 477 [weight="1.0", pos="465.98,704.7 449.4,714.03 413.86,734.04 397.62,743.18"]; + 267 -- 422 [weight="1.0", pos="480.83,694.46 502.3,675.68 575.21,611.9 599.1,591.01"]; + 219 -- 600 [weight="1.0", pos="454.7,584.85 458.75,587.8 464.02,591.62 468.47,594.85"]; + 219 -- 601 [weight="2.0", pos="450.84,574.61 458.5,558.66 480.69,512.43 489.23,494.65"]; + 583 -- 696 [weight="1.0", pos="1127,670.78 1122.4,678.01 1113.8,691.37 1109.2,698.67"]; + 318 -- 677 [weight="6.0", pos="783.93,311.85 778.52,327.12 765.31,364.37 759.79,379.94"]; + 318 -- 363 [weight="1.0", pos="788.84,311.98 792.55,321.98 799.39,340.39 802.67,349.22"]; + 318 -- 512 [weight="1.0", pos="791.08,298.68 796.47,291.36 805.19,279.54 810.54,272.27"]; + 318 -- 533 [weight="1.0", pos="782.6,298.4 776.83,287.9 765.84,267.89 760.7,258.54"]; + 318 -- 518 [weight="1.0", pos="795.55,311.2 815.14,324.02 860.4,353.62 876.69,364.27"]; + 318 -- 658 [weight="1.0", pos="787.85,311.76 788.54,314.72 789.35,318.16 789.99,320.92"]; + 13 -- 472 [weight="1.0", pos="480.62,799.44 478.44,784.76 472.07,741.85 469.76,726.28"]; + 13 -- 316 [weight="1.0", pos="469.21,800.74 462.05,798.55 453.04,795.81 446.09,793.7"]; + 257 -- 503 [weight="1.0", pos="987.87,470.27 1000.7,464.68 1021.9,455.42 1034.2,450.05"]; + 257 -- 280 [weight="1.0", pos="977.68,481.52 978.5,492.15 980.11,512.91 980.88,522.91"]; + 257 -- 618 [weight="1.0", pos="988.74,479.09 996.05,481.72 1005.4,485.08 1012.5,487.62"]; + 257 -- 282 [weight="1.0", pos="979.48,481.73 987.09,504.03 1011.2,574.89 1018.2,595.44"]; + 257 -- 558 [weight="1.0", pos="981.5,481.27 986.08,487.96 993.21,498.38 997.4,504.49"]; + 257 -- 396 [weight="1.0", pos="983.29,480.94 997.13,494.49 1030.6,527.29 1043.7,540.05"]; + 257 -- 464 [weight="1.0", pos="979.43,481.64 984.27,495.96 995.53,529.3 999.9,542.26"]; + 257 -- 456 [weight="1.0", pos="966.84,470.16 954.34,464.36 933.51,454.71 921.72,449.24"]; + 257 -- 664 [weight="1.0", pos="983.06,480.96 993.38,491.49 1014.5,513.09 1023.9,522.63"]; + 257 -- 677 [weight="1.0", pos="965.97,470.46 929.47,455.86 814.01,409.65 772.42,393.01"]; + 257 -- 596 [weight="1.0", pos="962.27,473.6 949.57,472.45 931.33,470.8 918.2,469.61"]; + 257 -- 467 [weight="1.0", pos="983.44,468.8 993.08,459.35 1011.4,441.42 1020.2,432.81"]; + 257 -- 453 [weight="1.0", pos="989.49,478.78 1007.3,484.33 1039.8,494.46 1056,499.51"]; + 257 -- 657 [weight="1.0", pos="986.02,480.29 1002.5,490.27 1037.7,511.51 1052.7,520.63"]; + 85 -- 678 [weight="1.0", pos="1032.4,675.24 1030.7,682.31 1027.7,694.9 1026.1,702.07"]; + 85 -- 579 [weight="1.0", pos="1016.8,669.04 988.38,667.35 931.36,663.97 906.58,662.5"]; + 85 -- 460 [weight="1.0", pos="1026.3,674.73 1022.1,677.49 1016.7,680.97 1012.4,683.77"]; + 185 -- 294 [weight="1.0", pos="485.17,570.57 480.37,564 472.93,553.81 468.02,547.09"]; + 185 -- 278 [weight="1.0", pos="482.34,583.16 462.57,599.55 409.26,643.73 391.52,658.43"]; + 185 -- 208 [weight="1.0", pos="484.04,583.41 471.65,597.21 442.82,629.34 431.62,641.82"]; + 185 -- 600 [weight="5.0", pos="486.6,583.39 484.89,586.78 482.79,590.96 481.04,594.44"]; + 185 -- 364 [weight="3.0", pos="481.15,583.02 467.32,592.67 440.56,611.34 428.05,620.07"]; + 185 -- 601 [weight="1.0", pos="490.04,570.24 490.55,553.83 491.87,511.84 492.4,494.86"]; + 185 -- 606 [weight="1.0", pos="479.88,582.63 457.27,595.5 402.39,626.76 381.42,638.71"]; + 597 -- 692 [weight="1.0", pos="264.3,582.76 259.45,590.36 251.51,602.81 246.92,610"]; + 597 -- 637 [weight="1.0", pos="287.14,571.65 305.38,567.14 332.62,560.42 348.37,556.53"]; + 332 -- 630 [weight="1.0", pos="1231.3,592.36 1237.4,593.57 1244.6,594.98 1251.1,596.26"]; + 332 -- 531 [weight="1.0", pos="1199.3,587.87 1185.1,586.56 1164.9,584.71 1150.3,583.36"]; + 390 -- 637 [weight="1.0", pos="331.8,566.33 337.89,563.63 345.28,560.35 351.08,557.78"]; + 390 -- 597 [weight="5.0", pos="303.6,572.99 300.17,573.31 296.48,573.66 292.84,573.99"]; + 390 -- 537 [weight="1.0", pos="312.99,565.45 296.95,552.29 258.87,521.05 244.06,508.9"]; + 248 -- 452 [weight="1.0", pos="933.78,217.65 946.71,217.28 965.17,216.76 977.2,216.42"]; + 248 -- 389 [weight="1.0", pos="930.1,221.5 937.07,223.62 945.85,226.29 952.1,228.19"]; + 248 -- 423 [weight="1.0", pos="922.35,213.13 924.19,210.55 926.45,207.39 928.28,204.82"]; + 9 -- 90 [weight="1.0", pos="524.86,788.04 535.84,772.53 568.98,725.73 580.53,709.42"]; + 9 -- 80 [weight="1.0", pos="522.13,788.09 525.26,769.91 535.96,707.59 539.23,688.56"]; + 111 -- 677 [weight="1.0", pos="826.75,372.73 813.17,375.51 793.87,379.47 779.06,382.5"]; + 111 -- 192 [weight="1.0", pos="840.89,364.17 837.93,357.93 832.98,347.49 830.05,341.32"]; + 111 -- 518 [weight="1.0", pos="865.3,368.69 868.53,368.59 871.69,368.5 874.4,368.42"]; + 111 -- 318 [weight="1.0", pos="838.86,364.29 828.57,352.71 803.23,324.2 791.92,311.47"]; + 408 -- 501 [weight="1.0", pos="132.74,662.34 122.18,654.75 99.121,638.17 86.669,629.23"]; + 408 -- 599 [weight="1.0", pos="130.49,664.57 112.4,660.51 67.154,650.36 42.198,644.76"]; + 38 -- 170 [weight="1.0", pos="229.94,482.01 238.22,479.21 250.19,475.15 259.73,471.92"]; + 38 -- 294 [weight="1.0", pos="231.19,487.84 270.08,496.63 400.6,526.15 446.73,536.58"]; + 38 -- 303 [weight="1.0", pos="230.44,488.23 259.42,496.35 341.53,519.35 374.89,528.7"]; + 38 -- 157 [weight="2.0", pos="214.63,490.46 204.16,500.24 181.44,521.45 170.73,531.44"]; + 356 -- 600 [weight="1.0", pos="435.07,696.8 442.48,680.16 465.87,627.6 474.39,608.47"]; + 591 -- 630 [weight="1.0", pos="1301.6,644.59 1295.2,635.57 1281.5,616.43 1274.3,606.38"]; + 4 -- 527 [weight="1.0", pos="680.94,271.95 656.01,285.36 594.6,318.38 570.24,331.48"]; + 4 -- 512 [weight="1.0", pos="711.84,266.12 734.8,266.07 772.15,266 795.12,265.95"]; + 4 -- 533 [weight="1.0", pos="709.12,262.83 719.23,260.9 731.89,258.47 741.79,256.58"]; + 4 -- 212 [weight="1.0", pos="702.31,260.55 714.02,254.34 732.56,244.51 742.54,239.23"]; + 4 -- 318 [weight="1.0", pos="704.48,271.42 722.43,278.82 754.98,292.24 773.15,299.73"]; + 4 -- 143 [weight="1.0", pos="690.51,259.66 688.77,250.23 685.56,232.94 683.98,224.42"]; + 34 -- 677 [weight="1.0", pos="749.32,474.05 750.75,458.41 755.01,411.97 756.65,394.09"]; + 34 -- 644 [weight="1.0", pos="751.19,484.39 754.94,492.53 762.25,508.42 766.36,517.35"]; + 164 -- 595 [weight="1.0", pos="875.95,245.49 858.86,244.76 835.95,243.77 820.54,243.1"]; + 164 -- 512 [weight="2.0", pos="880.86,250.7 866.22,254.1 845.83,258.82 831.67,262.1"]; + 164 -- 452 [weight="1.0", pos="913.95,241.47 932.48,235.23 963.59,224.75 979.42,219.42"]; + 164 -- 248 [weight="1.0", pos="903.63,239.9 907.19,234.78 912.06,227.8 915.31,223.12"]; + 164 -- 389 [weight="1.0", pos="916.05,242.07 927.76,239.03 942.81,235.12 951.93,232.75"]; + 164 -- 393 [weight="2.0", pos="895.66,239.82 889.78,228.24 877.78,204.65 872.32,193.9"]; + 164 -- 432 [weight="1.0", pos="899.12,253.06 899.28,268.48 899.68,306.91 899.85,322.98"]; + 164 -- 449 [weight="1.0", pos="885.22,241.16 877.25,238.09 867.37,234.28 859.85,231.38"]; + 164 -- 423 [weight="1.0", pos="903.59,240.03 910.18,230.65 922.26,213.47 928.21,205"]; + 196 -- 342 [weight="1.0", pos="805.55,95.609 806.91,105.48 809.82,126.53 811.3,137.31"]; + 196 -- 347 [weight="1.0", pos="789.11,89.071 786.08,88.84 782.91,88.599 779.9,88.37"]; + 603 -- 652 [weight="3.0", pos="747.53,168.47 751.04,165.79 755.2,162.61 758.76,159.89"]; + 603 -- 674 [weight="1.0", pos="727.48,179.07 721.53,181.34 714.51,184.02 708.98,186.14"]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/helloworld.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/helloworld.gv.txt new file mode 100644 index 000000000..3f2b18926 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/helloworld.gv.txt @@ -0,0 +1 @@ +digraph G {Hello->World} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/kennedyanc.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/kennedyanc.gv.txt new file mode 100644 index 000000000..7f64972c6 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/kennedyanc.gv.txt @@ -0,0 +1,90 @@ +/* +Note: All images in the file is found at + +http://www.graphviz.org/Gallery/directed/images/ + +----------- + +from Kaarle Kaila: + + +I have implemented Genealogic descendant and ancestor graphs using Graphviz in FinFamily. I have made som description on how to use it with FinFamily at FinFamily wiki-pages at + +http://www.finfamily.fi/index.php/Handbook + +I attach a descendant graph from Joseph Patrick Kennedy and an ancestor graph from Caroline Bouvier Kennedy as samples from FinFamily. The file georg.jpg is a descendant graph w/o pictures from an imaginary person Georg af Charlow (who has some common attributes with my father) from my testdatabase like the person Charles Charlow has some resemblance to myself. + +If you wish to display the attached pictures or wish me to create another ones then feel free to do so. I wish to thank you for Graphviz that let's me create such nice graphs with FinFamily. + +regards +Kaarle Kaila + +I have this little kennedy database as a sample gedcom file on the download webpage to give international users a few wellknown persons to play with if they wish to try out my software. I originally got it from Michael Kay who is among others Editor at http://www.w3.org/TR/xslt20/. I added the pictures and some data myself. + +Attached are both the kennedyanc and kennedydesc files as you requested. I made them as zip-files so that tehy contain both source and destination files. As you email server does not accept zip-files I renamed them to anc.zip ->anc.files and desc.zip to desc.files. Hope these com through your filters. + +Graphviz dot program is called from withing FinFamily with a command line such as: + +dot -Tjpeg kennedyanc.txt -o kennedyanc.jpg + +On page http://www.finfamily.fi/index.php/Graphviz is a description on the different colors together with instructions for finFamily users how to create Graphviz reports. + +Kaarle Kaila + + +Colors and forms symbolize following + + * Blue box - man + * Red ellipse - woman + * Blue line - Father/Child relation + * Red line - Mother/Child relation + * Green line - Spouse relation + * Orange line - Ancestors (other) children + * Violet line - Ancestors (other) spouse + + + + + +*/ + +/* ancestor graph from Caroline Bouvier Kennedy */ + +graph G { +I5 [shape=ellipse,color=red,style=bold,label="Caroline Bouvier Kennedy\nb. 27.11.1957 New York",image="images/165px-Caroline_Kennedy.jpg",labelloc=b]; +I1 [shape=box,color=blue,style=bold,label="John Fitzgerald Kennedy\nb. 29.5.1917 Brookline\nd. 22.11.1963 Dallas",image="images/kennedyface.jpg",labelloc=b]; +I6 [shape=box,color=blue,style=bold,label="John Fitzgerald Kennedy\nb. 25.11.1960 Washington\nd. 16.7.1999 over the Atlantic Ocean, near Aquinnah, MA, USA",image="images/180px-JFKJr2.jpg",labelloc=b]; +I7 [shape=box,color=blue,style=bold,label="Patrick Bouvier Kennedy\nb. 7.8.1963\nd. 9.8.1963"]; +I2 [shape=ellipse,color=red,style=bold,label="Jaqueline Lee Bouvier\nb. 28.7.1929 Southampton\nd. 19.5.1994 New York City",image="images/jacqueline-kennedy-onassis.jpg",labelloc=b]; +I8 [shape=box,color=blue,style=bold,label="Joseph Patrick Kennedy\nb. 6.9.1888 East Boston\nd. 16.11.1969 Hyannis Port",image="images/1025901671.jpg",labelloc=b]; +I10 [shape=box,color=blue,style=bold,label="Joseph Patrick Kennedy Jr\nb. 1915\nd. 1944"]; +I11 [shape=ellipse,color=red,style=bold,label="Rosemary Kennedy\nb. 13.9.1918\nd. 7.1.2005",image="images/rosemary.jpg",labelloc=b]; +I12 [shape=ellipse,color=red,style=bold,label="Kathleen Kennedy\nb. 1920\nd. 1948"]; +I13 [shape=ellipse,color=red,style=bold,label="Eunice Mary Kennedy\nb. 10.7.1921 Brookline"]; +I9 [shape=ellipse,color=red,style=bold,label="Rose Elizabeth Fitzgerald\nb. 22.7.1890 Boston\nd. 22.1.1995 Hyannis Port",image="images/Rose_kennedy.JPG",labelloc=b]; +I15 [shape=box,color=blue,style=bold,label="Aristotle Onassis"]; +I3 [shape=box,color=blue,style=bold,label="John Vernou Bouvier III\nb. 1891\nd. 1957",image="images/BE037819.jpg",labelloc=b]; +I4 [shape=ellipse,color=red,style=bold,label="Janet Norton Lee\nb. 2.10.1877\nd. 3.1.1968",image="images/n48862003257_1275276_1366.jpg",labelloc=b]; + I1 -- I5 [style=bold,color=blue]; + I1 -- I6 [style=bold,color=orange]; + I2 -- I6 [style=bold,color=orange]; + I1 -- I7 [style=bold,color=orange]; + I2 -- I7 [style=bold,color=orange]; + I1 -- I2 [style=bold,color=violet]; + I8 -- I1 [style=bold,color=blue]; + I8 -- I10 [style=bold,color=orange]; + I9 -- I10 [style=bold,color=orange]; + I8 -- I11 [style=bold,color=orange]; + I9 -- I11 [style=bold,color=orange]; + I8 -- I12 [style=bold,color=orange]; + I9 -- I12 [style=bold,color=orange]; + I8 -- I13 [style=bold,color=orange]; + I9 -- I13 [style=bold,color=orange]; + I8 -- I9 [style=bold,color=violet]; + I9 -- I1 [style=bold,color=red]; + I2 -- I5 [style=bold,color=red]; + I2 -- I15 [style=bold,color=violet]; + I3 -- I2 [style=bold,color=blue]; + I3 -- I4 [style=bold,color=violet]; + I4 -- I2 [style=bold,color=red]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/lion_share.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/lion_share.gv.txt new file mode 100644 index 000000000..daf6defae --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/lion_share.gv.txt @@ -0,0 +1,109 @@ +##"A few people in the field of genetics are using dot to draw "marriage node diagram" pedigree drawings. Here is one I have done of a test pedigree from the FTREE pedigree drawing package (Lion Share was a racehorse)." Contributed by David Duffy. + +##Command to get the layout: "dot -Tpng thisfile > thisfile.png" + +digraph Ped_Lion_Share { +# page = "8.2677165,11.692913" ; +ratio = "auto" ; +mincross = 2.0 ; +label = "Pedigree Lion_Share" ; + +"001" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"002" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"003" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"004" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"005" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"006" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"007" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"009" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"014" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"015" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"016" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"ZZ01" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"ZZ02" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"017" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"012" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"008" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"011" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"013" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"010" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"023" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"020" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"021" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"018" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"025" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"019" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"022" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"024" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"027" [shape=circle , regular=1,style=filled,fillcolor=white ] ; +"026" [shape=box , regular=1,style=filled,fillcolor=white ] ; +"028" [shape=box , regular=1,style=filled,fillcolor=grey ] ; +"marr0001" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"001" -> "marr0001" [dir=none,weight=1] ; +"007" -> "marr0001" [dir=none,weight=1] ; +"marr0001" -> "017" [dir=none, weight=2] ; +"marr0002" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"001" -> "marr0002" [dir=none,weight=1] ; +"ZZ02" -> "marr0002" [dir=none,weight=1] ; +"marr0002" -> "012" [dir=none, weight=2] ; +"marr0003" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"002" -> "marr0003" [dir=none,weight=1] ; +"003" -> "marr0003" [dir=none,weight=1] ; +"marr0003" -> "008" [dir=none, weight=2] ; +"marr0004" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"002" -> "marr0004" [dir=none,weight=1] ; +"006" -> "marr0004" [dir=none,weight=1] ; +"marr0004" -> "011" [dir=none, weight=2] ; +"marr0005" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"002" -> "marr0005" [dir=none,weight=1] ; +"ZZ01" -> "marr0005" [dir=none,weight=1] ; +"marr0005" -> "013" [dir=none, weight=2] ; +"marr0006" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"004" -> "marr0006" [dir=none,weight=1] ; +"009" -> "marr0006" [dir=none,weight=1] ; +"marr0006" -> "010" [dir=none, weight=2] ; +"marr0007" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"005" -> "marr0007" [dir=none,weight=1] ; +"015" -> "marr0007" [dir=none,weight=1] ; +"marr0007" -> "023" [dir=none, weight=2] ; +"marr0008" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"005" -> "marr0008" [dir=none,weight=1] ; +"016" -> "marr0008" [dir=none,weight=1] ; +"marr0008" -> "020" [dir=none, weight=2] ; +"marr0009" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"005" -> "marr0009" [dir=none,weight=1] ; +"012" -> "marr0009" [dir=none,weight=1] ; +"marr0009" -> "021" [dir=none, weight=2] ; +"marr0010" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"008" -> "marr0010" [dir=none,weight=1] ; +"017" -> "marr0010" [dir=none,weight=1] ; +"marr0010" -> "018" [dir=none, weight=2] ; +"marr0011" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"011" -> "marr0011" [dir=none,weight=1] ; +"023" -> "marr0011" [dir=none,weight=1] ; +"marr0011" -> "025" [dir=none, weight=2] ; +"marr0012" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"013" -> "marr0012" [dir=none,weight=1] ; +"014" -> "marr0012" [dir=none,weight=1] ; +"marr0012" -> "019" [dir=none, weight=2] ; +"marr0013" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"010" -> "marr0013" [dir=none,weight=1] ; +"021" -> "marr0013" [dir=none,weight=1] ; +"marr0013" -> "022" [dir=none, weight=2] ; +"marr0014" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"019" -> "marr0014" [dir=none,weight=1] ; +"020" -> "marr0014" [dir=none,weight=1] ; +"marr0014" -> "024" [dir=none, weight=2] ; +"marr0015" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"022" -> "marr0015" [dir=none,weight=1] ; +"025" -> "marr0015" [dir=none,weight=1] ; +"marr0015" -> "027" [dir=none, weight=2] ; +"marr0016" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"024" -> "marr0016" [dir=none,weight=1] ; +"018" -> "marr0016" [dir=none,weight=1] ; +"marr0016" -> "026" [dir=none, weight=2] ; +"marr0017" [shape=diamond,style=filled,label="",height=.1,width=.1] ; +"026" -> "marr0017" [dir=none,weight=1] ; +"027" -> "marr0017" [dir=none,weight=1] ; +"marr0017" -> "028" [dir=none, weight=2] ; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/networkmap_twopi.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/networkmap_twopi.gv.txt new file mode 100644 index 000000000..336a23607 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/networkmap_twopi.gv.txt @@ -0,0 +1,2140 @@ +/* contributed by Sancho Lerena, http://pandorafms.org + +About the graph: this is an automated network map generated with Pandora +FMS, this map is a visual representation of the network discovery done by +the recon server, which sweeps the network, and identify hosts in a network +and the full chain of hosts in the route to discovered networks. + +command: + +twopi -Tcmapx -onetworkmap_twopi_1.map -Tpng -onetworkmap_twopi.png networkmap_twopi.gv.txt + +*/ + +graph networkmap { labeljust=l; margin=0; ratio=fill;root=0;size="8,5.4";300 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
109.217.106.212.
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=300", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=300"]; + 619 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
192.36.144.230
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=619", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=619"]; + 686 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.0.255
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=686", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=686"]; + 620 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.0.53
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=620", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=620"]; + 692 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.1
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=692", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=692"]; + 699 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.10
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=699", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=699"]; + 700 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.12
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=700", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=700"]; + 701 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.13
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=701", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=701"]; + 702 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.14
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=702", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=702"]; + 703 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.15
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=703", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=703"]; + 704 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.16
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=704", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=704"]; + 705 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.17
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=705", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=705"]; + 706 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.18
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=706", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=706"]; + 707 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.19
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=707", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=707"]; + 694 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.2
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=694", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=694"]; + 708 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.20
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=708", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=708"]; + 709 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.21
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=709", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=709"]; + 710 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.22
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=710", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=710"]; + 711 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.23
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=711", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=711"]; + 712 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.24
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=712", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=712"]; + 791 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.240
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=791", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=791"]; + 792 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.253
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=792", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=792"]; + 713 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.26
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=713", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=713"]; + 714 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.27
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=714", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=714"]; + 715 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.28
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=715", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=715"]; + 716 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.29
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=716", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=716"]; + 695 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.3
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=695", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=695"]; + 717 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.30
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=717", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=717"]; + 718 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.31
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=718", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=718"]; + 719 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.36
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=719", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=719"]; + 696 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.4
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=696", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=696"]; + 697 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.7
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=697", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=697"]; + 698 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.1.9
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=698", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=698"]; + 793 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.1
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=793", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=793"]; + 798 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.10
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=798", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=798"]; + 799 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.12
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=799", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=799"]; + 800 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.13
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=800", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=800"]; + 801 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.14
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=801", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=801"]; + 802 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.15
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=802", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=802"]; + 803 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.16
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=803", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=803"]; + 804 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.17
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=804", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=804"]; + 805 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.18
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=805", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=805"]; + 806 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.19
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=806", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=806"]; + 794 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.2
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=794", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=794"]; + 807 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.20
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=807", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=807"]; + 795 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.5
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=795", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=795"]; + 796 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.6
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=796", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=796"]; + 797 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.2.7
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=797", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=797"]; + 813 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
194.0.3.1
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=813", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=813"]; + 690 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
195.187.255.152
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=690", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=690"]; + 689 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
195.187.255.156
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=689", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=689"]; + 691 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
195.187.255.161
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=691", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=691"]; + 533 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
195.66.224.76
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=533", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=533"]; + 538 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
195.66.224.76
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=538", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=538"]; + 570 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
195.66.225.69
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=570", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=570"]; + 616 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
195.69.119.172
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=616", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=616"]; + 581 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
204.15.20.35
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=581", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=581"]; + 647 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
204.15.22.245
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=647", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=647"]; + 577 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
204.15.23.111
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=577", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=577"]; + 557 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.100
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=557", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=557"]; + 558 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.101
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=558", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=558"]; + 560 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.102
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=560", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=560"]; + 562 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.104
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=562", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=562"]; + 568 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.109
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=568", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=568"]; + 425 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.14
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=425", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=425"]; + 426 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.16
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=426", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=426"]; + 427 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.18
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=427", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=427"]; + 428 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.19
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=428", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=428"]; + 430 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.27
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=430", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=430"]; + 431 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.32
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=431", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=431"]; + 432 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.33
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=432", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=432"]; + 433 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.34
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=433", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=433"]; + 434 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.35
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=434", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=434"]; + 435 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.36
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=435", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=435"]; + 436 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.37
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=436", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=436"]; + 437 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.38
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=437", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=437"]; + 445 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.39
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=445", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=445"]; + 419 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.4
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=419", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=419"]; + 447 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.40
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=447", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=447"]; + 449 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.41
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=449", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=449"]; + 451 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.42
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=451", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=451"]; + 452 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.43
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=452", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=452"]; + 454 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.44
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=454", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=454"]; + 456 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.45
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=456", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=456"]; + 458 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.46
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=458", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=458"]; + 460 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.47
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=460", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=460"]; + 462 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.48
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=462", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=462"]; + 464 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.49
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=464", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=464"]; + 422 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.5
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=422", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=422"]; + 466 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.50
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=466", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=466"]; + 468 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.51
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=468", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=468"]; + 470 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.52
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=470", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=470"]; + 472 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.53
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=472", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=472"]; + 474 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.54
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=474", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=474"]; + 476 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.56
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=476", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=476"]; + 478 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.57
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=478", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=478"]; + 479 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.58
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=479", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=479"]; + 481 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.59
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=481", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=481"]; + 423 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.6
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=423", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=423"]; + 483 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.60
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=483", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=483"]; + 484 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.61
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=484", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=484"]; + 485 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.62
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=485", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=485"]; + 487 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.63
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=487", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=487"]; + 489 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.64
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=489", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=489"]; + 491 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.65
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=491", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=491"]; + 493 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.66
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=493", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=493"]; + 496 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.68
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=496", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=496"]; + 498 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.69
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=498", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=498"]; + 502 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.72
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=502", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=502"]; + 504 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.73
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=504", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=504"]; + 505 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.74
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=505", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=505"]; + 507 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.75
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=507", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=507"]; + 509 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.76
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=509", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=509"]; + 511 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.77
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=511", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=511"]; + 513 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.78
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=513", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=513"]; + 515 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.79
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=515", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=515"]; + 517 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.81
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=517", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=517"]; + 518 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.82
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=518", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=518"]; + 519 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.83
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=519", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=519"]; + 521 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.84
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=521", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=521"]; + 523 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.85
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=523", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=523"]; + 525 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.86
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=525", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=525"]; + 527 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.87
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=527", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=527"]; + 529 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.88
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=529", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=529"]; + 531 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.89
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=531", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=531"]; + 542 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.91
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=542", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=542"]; + 544 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.93
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=544", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=544"]; + 547 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.95
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=547", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=547"]; + 549 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.96
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=549", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=549"]; + 551 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.97
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=551", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=551"]; + 553 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.98
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=553", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=553"]; + 555 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.229.99
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=555", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=555"]; + 421 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.243.73
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=421", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=421"]; + 418 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.243.77
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=418", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=418"]; + 429 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.243.81
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=429", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=429"]; + 424 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.243.85
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=424", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=424"]; + 415 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.251.200
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=415", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=415"]; + 420 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
209.85.252.83
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=420", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=420"]; + 416 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
216.239.43.233
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=416", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=416"]; + 414 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
216.239.49.196
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=414", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=414"]; + 417 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
216.239.49.45
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=417", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=417"]; + 808 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
62.40.112.122
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=808", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=808"]; + 809 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
62.40.112.206
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=809", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=809"]; + 810 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
62.40.125.158
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=810", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=810"]; + 534 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
64.125.27.149
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=534", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=534"]; + 539 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
64.125.27.149
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=539", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=539"]; + 536 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
64.125.29.17
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=536", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=536"]; + 541 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
64.125.29.17
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=541", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=541"]; + 535 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
64.125.31.186
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=535", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=535"]; + 540 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
64.125.31.186
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=540", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=540"]; + 573 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.1
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=573", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=573"]; + 580 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.11
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=580", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=580"]; + 583 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.13
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=583", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=583"]; + 585 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.14
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=585", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=585"]; + 587 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.15
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=587", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=587"]; + 612 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.150
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=612", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=612"]; + 613 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.151
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=613", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=613"]; + 614 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.152
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=614", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=614"]; + 615 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.153
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=615", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=615"]; + 588 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.17
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=588", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=588"]; + 590 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.18
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=590", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=590"]; + 592 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.19
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=592", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=592"]; + 574 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.2
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=574", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=574"]; + 593 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.21
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=593", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=593"]; + 594 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.22
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=594", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=594"]; + 595 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.23
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=595", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=595"]; + 621 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.231
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=621", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=621"]; + 622 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.232
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=622", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=622"]; + 623 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.233
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=623", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=623"]; + 624 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.234
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=624", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=624"]; + 625 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.244
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=625", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=625"]; + 626 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.245
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=626", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=626"]; + 627 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.246
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=627", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=627"]; + 628 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.247
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=628", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=628"]; + 629 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.248
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=629", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=629"]; + 630 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.249
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=630", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=630"]; + 596 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.25
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=596", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=596"]; + 631 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.250
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=631", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=631"]; + 632 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.251
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=632", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=632"]; + 633 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.252
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=633", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=633"]; + 634 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.253
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=634", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=634"]; + 635 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.254
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=635", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=635"]; + 597 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.26
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=597", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=597"]; + 599 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.27
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=599", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=599"]; + 600 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.28
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=600", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=600"]; + 601 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.29
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=601", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=601"]; + 602 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.30
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=602", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=602"]; + 604 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.31
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=604", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=604"]; + 605 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.32
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=605", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=605"]; + 606 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.33
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=606", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=606"]; + 607 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.34
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=607", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=607"]; + 608 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.35
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=608", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=608"]; + 609 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.36
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=609", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=609"]; + 610 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.37
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=610", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=610"]; + 611 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.38
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=611", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=611"]; + 576 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.5
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=576", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=576"]; + 578 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.153.6
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=578", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=578"]; + 636 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.154.33
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=636", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=636"]; + 638 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.154.34
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=638", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=638"]; + 639 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.154.35
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=639", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=639"]; + 640 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.154.36
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=640", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=640"]; + 641 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.154.49
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=641", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=641"]; + 643 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.154.50
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=643", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=643"]; + 644 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.154.51
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=644", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=644"]; + 645 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.154.52
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=645", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=645"]; + 646 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.1
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=646", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=646"]; + 654 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.10
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=654", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=654"]; + 720 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.105
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=720", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=720"]; + 721 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.106
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=721", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=721"]; + 656 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.11
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=656", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=656"]; + 723 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.116
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=723", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=723"]; + 724 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.117
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=724", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=724"]; + 725 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.118
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=725", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=725"]; + 726 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.119
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=726", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=726"]; + 658 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.12
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=658", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=658"]; + 727 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.120
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=727", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=727"]; + 728 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.121
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=728", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=728"]; + 729 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.122
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=729", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=729"]; + 730 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.123
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=730", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=730"]; + 731 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.124
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=731", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=731"]; + 732 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.125
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=732", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=732"]; + 733 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.126
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=733", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=733"]; + 734 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.129
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=734", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=734"]; + 660 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.13
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=660", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=660"]; + 735 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.130
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=735", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=735"]; + 736 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.133
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=736", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=736"]; + 737 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.134
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=737", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=737"]; + 738 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.135
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=738", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=738"]; + 739 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.136
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=739", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=739"]; + 740 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.137
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=740", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=740"]; + 741 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.138
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=741", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=741"]; + 742 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.139
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=742", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=742"]; + 661 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.14
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=661", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=661"]; + 743 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.140
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=743", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=743"]; + 744 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.141
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=744", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=744"]; + 745 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.142
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=745", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=745"]; + 746 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.143
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=746", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=746"]; + 747 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.144
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=747", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=747"]; + 748 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.145
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=748", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=748"]; + 749 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.146
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=749", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=749"]; + 750 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.147
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=750", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=750"]; + 751 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.148
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=751", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=751"]; + 752 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.149
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=752", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=752"]; + 662 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.15
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=662", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=662"]; + 753 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.150
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=753", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=753"]; + 754 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.151
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=754", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=754"]; + 755 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.152
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=755", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=755"]; + 756 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.153
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=756", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=756"]; + 757 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.154
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=757", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=757"]; + 758 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.155
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=758", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=758"]; + 759 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.156
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=759", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=759"]; + 760 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.157
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=760", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=760"]; + 761 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.158
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=761", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=761"]; + 762 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.159
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=762", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=762"]; + 664 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.16
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=664", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=664"]; + 763 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.160
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=763", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=763"]; + 764 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.161
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=764", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=764"]; + 765 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.162
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=765", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=765"]; + 766 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.163
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=766", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=766"]; + 767 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.164
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=767", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=767"]; + 768 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.165
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=768", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=768"]; + 769 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.166
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=769", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=769"]; + 770 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.167
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=770", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=770"]; + 771 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.168
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=771", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=771"]; + 772 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.169
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=772", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=772"]; + 665 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.17
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=665", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=665"]; + 773 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.170
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=773", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=773"]; + 774 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.171
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=774", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=774"]; + 775 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.172
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=775", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=775"]; + 776 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.173
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=776", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=776"]; + 777 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.174
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=777", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=777"]; + 778 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.175
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=778", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=778"]; + 779 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.176
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=779", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=779"]; + 780 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.177
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=780", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=780"]; + 781 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.178
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=781", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=781"]; + 782 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.179
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=782", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=782"]; + 666 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.18
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=666", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=666"]; + 783 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.180
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=783", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=783"]; + 784 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.181
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=784", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=784"]; + 785 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.182
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=785", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=785"]; + 786 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.183
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=786", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=786"]; + 667 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.19
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=667", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=667"]; + 649 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.2
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=649", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=649"]; + 668 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.20
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=668", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=668"]; + 669 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.21
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=669", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=669"]; + 670 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.22
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=670", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=670"]; + 671 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.23
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=671", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=671"]; + 787 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.234
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=787", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=787"]; + 672 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.24
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=672", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=672"]; + 788 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.241
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=788", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=788"]; + 789 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.242
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=789", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=789"]; + 790 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.243
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=790", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=790"]; + 673 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.25
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=673", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=673"]; + 674 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.26
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=674", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=674"]; + 676 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.27
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=676", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=676"]; + 677 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.28
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=677", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=677"]; + 678 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.29
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=678", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=678"]; + 679 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.43
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=679", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=679"]; + 680 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.44
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=680", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=680"]; + 650 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.5
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=650", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=650"]; + 681 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.52
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=681", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=681"]; + 682 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.53
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=682", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=682"]; + 683 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.54
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=683", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=683"]; + 684 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.55
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=684", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=684"]; + 685 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.56
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=685", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=685"]; + 652 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.6
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=652", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=652"]; + 693 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.220.155.63
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=693", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=693"]; + 438 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.33.201.221
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=438", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=438"]; + 439 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
66.33.201.66
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=439", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=439"]; + 359 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.1
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=359", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=359"]; + 366 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.10
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=366", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=366"]; + 516 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.101
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=516", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=516"]; + 520 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.102
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=520", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=520"]; + 522 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.103
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=522", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=522"]; + 524 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.104
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=524", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=524"]; + 526 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.105
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=526", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=526"]; + 528 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.106
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=528", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=528"]; + 530 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.107
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=530", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=530"]; + 532 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.108
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=532", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=532"]; + 537 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.109
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=537", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=537"]; + 367 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.11
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=367", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=367"]; + 543 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.110
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=543", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=543"]; + 545 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.111
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=545", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=545"]; + 546 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.112
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=546", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=546"]; + 548 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.113
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=548", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=548"]; + 550 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.114
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=550", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=550"]; + 391 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.36
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=391", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=391"]; + 392 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.37
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=392", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=392"]; + 393 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.38
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=393", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=393"]; + 394 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.39
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=394", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=394"]; + 360 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.4
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=360", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=360"]; + 395 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.40
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=395", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=395"]; + 396 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.41
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=396", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=396"]; + 397 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.42
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=397", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=397"]; + 398 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.44
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=398", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=398"]; + 399 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.45
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=399", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=399"]; + 400 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.163.176.46
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=400", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=400"]; + 301 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
69.216.106.212.s
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=301", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=301"]; + 657 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.193
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=657", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=657"]; + 651 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.215
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=651", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=651"]; + 655 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.217
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=655", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=655"]; + 659 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.219
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=659", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=659"]; + 663 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.221
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=663", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=663"]; + 653 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.223
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=653", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=653"]; + 722 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.225
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=722", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=722"]; + 675 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.227
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=675", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=675"]; + 579 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.237
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=579", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=579"]; + 591 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.239
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=591", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=591"]; + 603 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.245
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=603", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=603"]; + 589 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.247
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=589", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=589"]; + 575 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.77
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=575", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=575"]; + 572 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.76.79
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=572", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=572"]; + 637 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.77.142
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=637", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=637"]; + 642 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.77.144
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=642", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=642"]; + 582 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.77.77
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=582", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=582"]; + 584 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.77.79
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=584", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=584"]; + 586 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.77.81
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=586", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=586"]; + 598 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.77.83
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=598", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=598"]; + 571 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.78.182
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=571", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=571"]; + 648 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
74.119.78.83
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=648", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=648"]; + 618 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
77.72.228.14
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=618", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=618"]; + 617 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
77.72.228.45
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=617", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=617"]; + 688 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
84.233.213.222
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=688", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=688"]; + 687 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
84.233.213.41
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=687", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=687"]; + 812 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
85.254.196.210
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=812", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=812"]; + 811 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
85.254.196.237
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=811", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=811"]; + 331 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.31
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=331", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=331"]; + 332 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.32
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=332", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=332"]; + 333 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.33
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=333", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=333"]; + 334 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.34
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=334", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=334"]; + 335 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.35
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=335", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=335"]; + 336 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.38
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=336", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=336"]; + 337 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.39
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=337", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=337"]; + 338 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.40
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=338", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=338"]; + 339 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.41
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=339", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=339"]; + 340 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.42
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=340", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=340"]; + 341 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.43
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=341", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=341"]; + 342 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.44
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=342", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=342"]; + 343 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.45
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=343", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=343"]; + 344 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.46
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=344", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=344"]; + 345 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.47
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=345", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=345"]; + 346 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.48
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=346", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=346"]; + 347 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.49
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=347", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=347"]; + 348 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.50
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=348", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=348"]; + 349 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.51
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=349", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=349"]; + 350 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.52
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=350", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=350"]; + 351 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.53
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=351", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=351"]; + 352 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.56
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=352", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=352"]; + 353 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.57
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=353", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=353"]; + 354 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.58
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=354", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=354"]; + 355 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.59
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=355", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=355"]; + 356 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.60
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=356", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=356"]; + 357 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.61
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=357", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=357"]; + 358 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
87.248.112.62
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=358", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=358"]; + 306 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
unknown-66-196-6
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=306", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=306"]; + 319 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
unknown-87-248-1
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=319", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=319"]; + 320 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
unknown-87-248-1
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=320", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=320"]; + 304 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
ae-1.msr1.ird.ya
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=304", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=304"]; + 307 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
ae-2.msr2.ird.ya
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=307", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=307"]; + 316 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
fe.gsp.search.vi
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=316", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=316"]; + 302 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
ge-1-1-0.pat1.th
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=302", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=302"]; + 305 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
ha1.vl-220.bas-b
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=305", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=305"]; + 308 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
ha2.vl-220.bas-b
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=308", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=308"]; + 1 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
metafora
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=1", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=1"]; + 2 [ color="#FF1D1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
metafora.artica.
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=2", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=2"]; + 325 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
p1.movies.ird.ya
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=325", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=325"]; + 323 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
p1.tv.ird.yahoo.
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=323", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=323"]; + 330 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
p2.movies.ird.ya
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=330", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=330"]; + 329 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
p2.tv.ird.yahoo.
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=329", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=329"]; + 321 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
p4.tv.ird.yahoo.
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=321", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=321"]; + 322 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
qa-eu.ent.ird.ya
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=322", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=322"]; + 315 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
rd.gsp.search.vi
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=315", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=315"]; + 326 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
rd01.gsp.search.
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=326", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=326"]; + 327 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
rd02.gsp.search.
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=327", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=327"]; + 328 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
rd03.gsp.search.
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=328", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=328"]; + 312 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
si-b34.vrrp.vl22
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=312", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=312"]; + 303 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
so-0-0-0.pat1.ir
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=303", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=303"]; + 314 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
te-7-4.bas-b1.ir
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=314", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=314"]; + 317 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
te-7-4.bas-b2.ir
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=317", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=317"]; + 324 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
te-8-4.bas-b1.ir
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=324", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=324"]; + 311 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
te-8-4.bas-b2.ir
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=311", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=311"]; + 309 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
vl-220.bas-b1.ir
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=309", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=309"]; + 310 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
vl-220.bas-b2.ir
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=310", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=310"]; + 313 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
yts1.yql.ird.yah
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=313", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=313"]; + 318 [ color="#8DFF1D", fontsize=12, style="filled", fixedsize=true, width=0.40, height=0.40, label=< +
z6po-feeder.sear
>, + shape="doublecircle", URL="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=318", + tooltip="ajax.php?page=operation/agentes/ver_agente&get_agent_status_tooltip=1&id_agent=318"]; + 619 -- 618[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=619&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];686 -- 618[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=686&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];620 -- 619[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=620&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];692 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=692&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];699 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=699&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];700 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=700&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];701 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=701&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];702 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=702&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];703 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=703&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];704 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=704&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];705 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=705&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];706 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=706&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];707 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=707&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];694 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=694&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];708 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=708&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];709 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=709&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];710 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=710&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];711 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=711&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];712 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=712&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];791 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=791&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];792 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=792&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];713 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=713&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];714 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=714&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];715 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=715&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];716 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=716&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];695 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=695&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];717 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=717&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];718 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=718&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];719 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=719&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];696 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=696&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];697 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=697&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];698 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=698&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];793 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=793&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];798 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=798&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];799 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=799&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];800 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=800&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];801 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=801&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];802 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=802&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];803 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=803&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];804 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=804&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];805 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=805&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];806 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=806&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];794 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=794&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];807 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=807&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];795 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=795&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];796 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=796&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];797 -- 691[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=797&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];813 -- 812[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=813&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];690 -- 689[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=690&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];689 -- 688[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=689&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];691 -- 690[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=691&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];533 -- 301[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=533&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];538 -- 301[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=538&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];570 -- 301[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=570&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];581 -- 571[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=581&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];647 -- 570[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=647&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];577 -- 571[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=577&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];557 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=557&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];558 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=558&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];560 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=560&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];562 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=562&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];568 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=568&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];425 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=425&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];426 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=426&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];427 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=427&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];428 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=428&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];430 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=430&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];431 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=431&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];432 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=432&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];433 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=433&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];434 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=434&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];435 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=435&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];436 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=436&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];437 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=437&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];445 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=445&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];419 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=419&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];447 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=447&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];449 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=449&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];451 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=451&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];452 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=452&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];454 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=454&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];456 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=456&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];458 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=458&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];460 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=460&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];462 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=462&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];464 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=464&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];422 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=422&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];466 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=466&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];468 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=468&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];470 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=470&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];472 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=472&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];474 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=474&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];476 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=476&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];478 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=478&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];479 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=479&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];481 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=481&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];423 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=423&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];483 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=483&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];484 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=484&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];485 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=485&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];487 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=487&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];489 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=489&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];491 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=491&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];493 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=493&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];496 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=496&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];498 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=498&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];502 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=502&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];504 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=504&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];505 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=505&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];507 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=507&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];509 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=509&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];511 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=511&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];513 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=513&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];515 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=515&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];517 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=517&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];518 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=518&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];519 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=519&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];521 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=521&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];523 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=523&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];525 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=525&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];527 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=527&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];529 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=529&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];531 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=531&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];542 -- 541[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=542&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];544 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=544&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];547 -- 429[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=547&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];549 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=549&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];551 -- 424[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=551&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];553 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=553&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];555 -- 418[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=555&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];421 -- 420[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=421&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];418 -- 417[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=418&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];429 -- 417[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=429&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];424 -- 420[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=424&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];415 -- 414[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=415&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];420 -- 416[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=420&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];416 -- 415[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=416&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];417 -- 416[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=417&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];809 -- 808[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=809&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];810 -- 809[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=810&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];534 -- 533[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=534&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];539 -- 538[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=539&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];536 -- 535[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=536&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];541 -- 540[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=541&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];535 -- 534[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=535&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];540 -- 539[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=540&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];573 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=573&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];580 -- 579[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=580&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];583 -- 582[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=583&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];585 -- 584[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=585&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];587 -- 586[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=587&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];612 -- 603[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=612&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];613 -- 603[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=613&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];614 -- 582[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=614&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];615 -- 579[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=615&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];588 -- 584[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=588&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];590 -- 589[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=590&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];592 -- 591[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=592&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];574 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=574&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];593 -- 579[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=593&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];594 -- 586[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=594&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];595 -- 579[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=595&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];621 -- 584[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=621&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];622 -- 584[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=622&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];623 -- 589[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=623&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];624 -- 591[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=624&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];625 -- 603[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=625&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];626 -- 598[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=626&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];627 -- 579[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=627&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];628 -- 603[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=628&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];629 -- 591[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=629&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];630 -- 589[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=630&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];596 -- 582[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=596&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];631 -- 591[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=631&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];632 -- 584[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=632&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];633 -- 598[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=633&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];634 -- 589[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=634&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];635 -- 586[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=635&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];597 -- 591[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=597&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];599 -- 598[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=599&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];600 -- 582[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=600&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];601 -- 589[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=601&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];602 -- 584[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=602&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];604 -- 603[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=604&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];605 -- 589[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=605&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];606 -- 603[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=606&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];607 -- 579[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=607&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];608 -- 591[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=608&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];609 -- 591[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=609&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];610 -- 582[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=610&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];611 -- 582[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=611&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];576 -- 575[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=576&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];578 -- 577[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=578&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];636 -- 575[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=636&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];638 -- 637[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=638&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];639 -- 637[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=639&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];640 -- 637[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=640&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];641 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=641&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];643 -- 642[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=643&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];644 -- 642[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=644&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];645 -- 642[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=645&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];646 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=646&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];654 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=654&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];720 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=720&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];721 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=721&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];656 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=656&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];723 -- 722[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=723&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];724 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=724&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];725 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=725&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];726 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=726&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];658 -- 657[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=658&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];727 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=727&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];728 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=728&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];729 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=729&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];730 -- 722[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=730&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];731 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=731&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];732 -- 657[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=732&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];733 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=733&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];734 -- 648[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=734&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];660 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=660&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];735 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=735&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];736 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=736&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];737 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=737&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];738 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=738&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];739 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=739&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];740 -- 722[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=740&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];741 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=741&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];742 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=742&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];661 -- 657[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=661&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];743 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=743&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];744 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=744&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];745 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=745&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];746 -- 722[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=746&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];747 -- 651[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=747&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];748 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=748&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];749 -- 657[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=749&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];750 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=750&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];751 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=751&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];752 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=752&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];662 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=662&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];753 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=753&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];754 -- 722[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=754&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];755 -- 651[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=755&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];756 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=756&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];757 -- 651[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=757&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];758 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=758&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];759 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=759&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];760 -- 722[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=760&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];761 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=761&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];762 -- 651[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=762&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];664 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=664&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];763 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=763&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];764 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=764&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];765 -- 651[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=765&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];766 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=766&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];767 -- 722[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=767&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];768 -- 657[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=768&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];769 -- 657[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=769&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];770 -- 657[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=770&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];771 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=771&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];772 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=772&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];665 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=665&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];773 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=773&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];774 -- 651[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=774&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];775 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=775&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];776 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=776&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];777 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=777&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];778 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=778&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];779 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=779&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];780 -- 722[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=780&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];781 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=781&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];782 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=782&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];666 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=666&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];783 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=783&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];784 -- 657[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=784&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];785 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=785&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];786 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=786&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];667 -- 651[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=667&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];649 -- 648[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=649&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];668 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=668&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];669 -- 657[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=669&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];670 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=670&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];671 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=671&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];787 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=787&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];672 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=672&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];788 -- 651[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=788&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];789 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=789&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];790 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=790&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];673 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=673&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];674 -- 657[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=674&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];676 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=676&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];677 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=677&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];678 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=678&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];679 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=679&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];680 -- 651[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=680&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];650 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=650&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];681 -- 653[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=681&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];682 -- 659[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=682&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];683 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=683&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];684 -- 675[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=684&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];685 -- 655[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=685&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];652 -- 651[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=652&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];693 -- 663[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=693&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];439 -- 359[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=439&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];359 -- 438[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=359&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];366 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=366&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];516 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=516&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];522 -- 421[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=522&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];524 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=524&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];526 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=526&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];528 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=528&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];530 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=530&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];532 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=532&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];537 -- 536[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=537&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];367 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=367&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];543 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=543&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];545 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=545&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];546 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=546&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];548 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=548&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];550 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=550&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];391 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=391&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];392 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=392&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];393 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=393&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];394 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=394&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];360 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=360&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];395 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=395&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];396 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=396&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];397 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=397&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];398 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=398&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];399 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=399&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];400 -- 439[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=400&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];301 -- 300[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=301&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];657 -- 581[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=657&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];651 -- 575[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=651&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];655 -- 577[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=655&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];659 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=659&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];663 -- 575[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=663&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];653 -- 648[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=653&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];722 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=722&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];675 -- 577[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=675&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];579 -- 575[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=579&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];591 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=591&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];603 -- 575[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=603&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];589 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=589&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];575 -- 571[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=575&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];572 -- 571[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=572&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];637 -- 575[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=637&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];642 -- 572[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=642&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];582 -- 581[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=582&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];584 -- 577[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=584&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];586 -- 581[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=586&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];598 -- 577[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=598&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];571 -- 570[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=571&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];648 -- 647[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=648&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];618 -- 617[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=618&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];617 -- 616[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=617&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];688 -- 687[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=688&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];812 -- 811[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=812&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];811 -- 810[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=811&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];331 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=331&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];332 -- 317[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=332&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];333 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=333&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];334 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=334&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];335 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=335&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];336 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=336&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];337 -- 317[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=337&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];338 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=338&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];339 -- 317[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=339&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];340 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=340&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];341 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=341&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];342 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=342&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];343 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=343&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];344 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=344&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];345 -- 317[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=345&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];346 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=346&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];347 -- 317[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=347&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];348 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=348&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];349 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=349&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];350 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=350&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];351 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=351&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];352 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=352&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];353 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=353&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];354 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=354&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];355 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=355&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];356 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=356&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];357 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=357&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];358 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=358&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];306 -- 302[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=306&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];319 -- 317[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=319&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];320 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=320&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];304 -- 303[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=304&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];307 -- 306[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=307&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];316 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=316&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];302 -- 301[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=302&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];305 -- 304[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=305&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];308 -- 307[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=308&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];325 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=325&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];323 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=323&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];330 -- 317[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=330&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];329 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=329&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];321 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=321&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];322 -- 317[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=322&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];315 -- 314[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=315&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];326 -- 317[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=326&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];327 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=327&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];328 -- 324[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=328&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];312 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=312&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];303 -- 302[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=303&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];314 -- 307[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=314&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];317 -- 307[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=317&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];324 -- 304[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=324&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];311 -- 304[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=311&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];309 -- 307[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=309&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];310 -- 307[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=310&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];313 -- 311[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=313&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];318 -- 317[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=318&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];0 [ color="#364D1F", fontsize=12, style="filled", fixedsize=true, width=0.8, height=0.6, label=<
Pandora FMS
>, + shape="ellipse", URL="index.php?sec=estado&sec2=operation/agentes/group_view" ];0 -- 300[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=0&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];0 -- 616[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=0&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];0 -- 414[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=0&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];0 -- 808[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=0&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];0 -- 438[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=0&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];0 -- 520[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=0&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];0 -- 687[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=0&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];0 -- 1[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=0&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];0 -- 2[color="#BDBDBD", headclip=false, tailclip=false, + edgeURL="index.php?sec=estado&sec2=operation/agentes/networkmap&tab=topology&recenter_networkmap=1¢er=0&layout=radial&nooverlap=&pure=0&zoom=1&ranksep=2.5&simple=0®en=1&font_size=12&group=0&id_networkmap=1"];} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/philo.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/philo.gv.txt new file mode 100644 index 000000000..69ce90399 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/philo.gv.txt @@ -0,0 +1,40 @@ +## "It encodes the so-called philosophers dilemma. Neato pretty much approximates the way how humans would layout the graph." Contributed by Manfred Jeusfield. +## Command to generate the layout: "neato -Tpng thisfile > thisfile.png" + + +digraph PhiloDilemma { +node [shape=box]; bec3; rel3; bec2; rel2; acq2; acq3; bec1; rel1; acq1; +node [shape=circle,fixedsize=true,width=0.9]; hu3; th3; ri3; ea3; hu2; th2; ri2; ea2; hu1; th1; ri1; ea1; +ri3->acq2; +ri3->acq3; +hu3->acq3; +bec3->hu3; +th3->bec3; +rel3->th3; +rel3->ri3; +ea3->rel3; +acq3->ea3; +ri2->acq1; +ri2->acq2; +hu2->acq2; +bec2->hu2; +th2->bec2; +rel2->th2; +rel2->ri2; +ea2->rel2; +acq2->ea2; +ri1->acq3; +ri1->acq1; +hu1->acq1; +bec1->hu1; +th1->bec1; +rel1->th1; +rel1->ri1; +ea1->rel1; +acq1->ea1; + +overlap=false +label="PetriNet Model PhiloDilemma\nExtracted from ConceptBase and layed out by Graphviz " +fontsize=12; +} + diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/process.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/process.gv.txt new file mode 100644 index 000000000..34fe9fb5a --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/process.gv.txt @@ -0,0 +1,15 @@ +graph G { + run -- intr; + intr -- runbl; + runbl -- run; + run -- kernel; + kernel -- zombie; + kernel -- sleep; + kernel -- runmem; + sleep -- swap; + swap -- runswap; + runswap -- new; + runswap -- runmem; + new -- runmem; + sleep -- runmem; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/profile.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/profile.gv.txt new file mode 100644 index 000000000..ccfc7f76e --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/profile.gv.txt @@ -0,0 +1,150 @@ +digraph prof { + size="6,4"; ratio = fill; + node [style=filled]; + start -> main [color="0.002 0.999 0.999"]; + start -> on_exit [color="0.649 0.701 0.701"]; + main -> sort [color="0.348 0.839 0.839"]; + main -> merge [color="0.515 0.762 0.762"]; + main -> term [color="0.647 0.702 0.702"]; + main -> signal [color="0.650 0.700 0.700"]; + main -> sbrk [color="0.650 0.700 0.700"]; + main -> unlink [color="0.650 0.700 0.700"]; + main -> newfile [color="0.650 0.700 0.700"]; + main -> fclose [color="0.650 0.700 0.700"]; + main -> close [color="0.650 0.700 0.700"]; + main -> brk [color="0.650 0.700 0.700"]; + main -> setbuf [color="0.650 0.700 0.700"]; + main -> copyproto [color="0.650 0.700 0.700"]; + main -> initree [color="0.650 0.700 0.700"]; + main -> safeoutfil [color="0.650 0.700 0.700"]; + main -> getpid [color="0.650 0.700 0.700"]; + main -> sprintf [color="0.650 0.700 0.700"]; + main -> creat [color="0.650 0.700 0.700"]; + main -> rem [color="0.650 0.700 0.700"]; + main -> oldfile [color="0.650 0.700 0.700"]; + sort -> msort [color="0.619 0.714 0.714"]; + sort -> filbuf [color="0.650 0.700 0.700"]; + sort -> newfile [color="0.650 0.700 0.700"]; + sort -> fclose [color="0.650 0.700 0.700"]; + sort -> setbuf [color="0.650 0.700 0.700"]; + sort -> setfil [color="0.650 0.700 0.700"]; + msort -> qsort [color="0.650 0.700 0.700"]; + msort -> insert [color="0.650 0.700 0.700"]; + msort -> wline [color="0.650 0.700 0.700"]; + msort -> div [color="0.650 0.700 0.700"]; + msort -> cmpsave [color="0.650 0.700 0.700"]; + merge -> insert [color="0.650 0.700 0.700"]; + merge -> rline [color="0.650 0.700 0.700"]; + merge -> wline [color="0.650 0.700 0.700"]; + merge -> unlink [color="0.650 0.700 0.700"]; + merge -> fopen [color="0.650 0.700 0.700"]; + merge -> fclose [color="0.650 0.700 0.700"]; + merge -> setfil [color="0.650 0.700 0.700"]; + merge -> mul [color="0.650 0.700 0.700"]; + merge -> setbuf [color="0.650 0.700 0.700"]; + merge -> cmpsave [color="0.650 0.700 0.700"]; + insert -> cmpa [color="0.650 0.700 0.700"]; + wline -> flsbuf [color="0.649 0.700 0.700"]; + qsort -> cmpa [color="0.650 0.700 0.700"]; + rline -> filbuf [color="0.649 0.700 0.700"]; + xflsbuf -> write [color="0.650 0.700 0.700"]; + flsbuf -> xflsbuf [color="0.649 0.700 0.700"]; + filbuf -> read [color="0.650 0.700 0.700"]; + term -> unlink [color="0.650 0.700 0.700"]; + term -> signal [color="0.650 0.700 0.700"]; + term -> setfil [color="0.650 0.700 0.700"]; + term -> exit [color="0.650 0.700 0.700"]; + endopen -> open [color="0.650 0.700 0.700"]; + fopen -> endopen [color="0.639 0.705 0.705"]; + fopen -> findiop [color="0.650 0.700 0.700"]; + newfile -> fopen [color="0.634 0.707 0.707"]; + newfile -> setfil [color="0.650 0.700 0.700"]; + fclose -> fflush [color="0.642 0.704 0.704"]; + fclose -> close [color="0.650 0.700 0.700"]; + fflush -> xflsbuf [color="0.635 0.707 0.707"]; + malloc -> morecore [color="0.325 0.850 0.850"]; + malloc -> demote [color="0.650 0.700 0.700"]; + morecore -> sbrk [color="0.650 0.700 0.700"]; + morecore -> getfreehdr [color="0.650 0.700 0.700"]; + morecore -> free [color="0.650 0.700 0.700"]; + morecore -> getpagesize [color="0.650 0.700 0.700"]; + morecore -> putfreehdr [color="0.650 0.700 0.700"]; + morecore -> udiv [color="0.650 0.700 0.700"]; + morecore -> umul [color="0.650 0.700 0.700"]; + on_exit -> malloc [color="0.325 0.850 0.850"]; + signal -> sigvec [color="0.650 0.700 0.700"]; + moncontrol -> profil [color="0.650 0.700 0.700"]; + getfreehdr -> sbrk [color="0.650 0.700 0.700"]; + free -> insert [color="0.650 0.700 0.700"]; + insert -> getfreehdr [color="0.650 0.700 0.700"]; + setfil -> div [color="0.650 0.700 0.700"]; + setfil -> rem [color="0.650 0.700 0.700"]; + sigvec -> sigblock [color="0.650 0.700 0.700"]; + sigvec -> sigsetmask [color="0.650 0.700 0.700"]; + doprnt -> urem [color="0.650 0.700 0.700"]; + doprnt -> udiv [color="0.650 0.700 0.700"]; + doprnt -> strlen [color="0.650 0.700 0.700"]; + doprnt -> localeconv [color="0.650 0.700 0.700"]; + sprintf -> doprnt [color="0.650 0.700 0.700"]; +cmpa [color="0.000 1.000 1.000"]; +wline [color="0.201 0.753 1.000"]; +insert [color="0.305 0.625 1.000"]; +rline [color="0.355 0.563 1.000"]; +sort [color="0.408 0.498 1.000"]; +qsort [color="0.449 0.447 1.000"]; +write [color="0.499 0.386 1.000"]; +read [color="0.578 0.289 1.000"]; +msort [color="0.590 0.273 1.000"]; +merge [color="0.603 0.258 1.000"]; +unlink [color="0.628 0.227 1.000"]; +filbuf [color="0.641 0.212 1.000"]; +open [color="0.641 0.212 1.000"]; +sbrk [color="0.647 0.204 1.000"]; +signal [color="0.647 0.204 1.000"]; +moncontrol [color="0.647 0.204 1.000"]; +xflsbuf [color="0.650 0.200 1.000"]; +flsbuf [color="0.650 0.200 1.000"]; +div [color="0.650 0.200 1.000"]; +cmpsave [color="0.650 0.200 1.000"]; +rem [color="0.650 0.200 1.000"]; +setfil [color="0.650 0.200 1.000"]; +close [color="0.650 0.200 1.000"]; +fclose [color="0.650 0.200 1.000"]; +fflush [color="0.650 0.200 1.000"]; +setbuf [color="0.650 0.200 1.000"]; +endopen [color="0.650 0.200 1.000"]; +findiop [color="0.650 0.200 1.000"]; +fopen [color="0.650 0.200 1.000"]; +mul [color="0.650 0.200 1.000"]; +newfile [color="0.650 0.200 1.000"]; +sigblock [color="0.650 0.200 1.000"]; +sigsetmask [color="0.650 0.200 1.000"]; +sigvec [color="0.650 0.200 1.000"]; +udiv [color="0.650 0.200 1.000"]; +urem [color="0.650 0.200 1.000"]; +brk [color="0.650 0.200 1.000"]; +getfreehdr [color="0.650 0.200 1.000"]; +strlen [color="0.650 0.200 1.000"]; +umul [color="0.650 0.200 1.000"]; +doprnt [color="0.650 0.200 1.000"]; +copyproto [color="0.650 0.200 1.000"]; +creat [color="0.650 0.200 1.000"]; +demote [color="0.650 0.200 1.000"]; +exit [color="0.650 0.200 1.000"]; +free [color="0.650 0.200 1.000"]; +getpagesize [color="0.650 0.200 1.000"]; +getpid [color="0.650 0.200 1.000"]; +initree [color="0.650 0.200 1.000"]; +insert [color="0.650 0.200 1.000"]; +localeconv [color="0.650 0.200 1.000"]; +main [color="0.650 0.200 1.000"]; +malloc [color="0.650 0.200 1.000"]; +morecore [color="0.650 0.200 1.000"]; +oldfile [color="0.650 0.200 1.000"]; +on_exit [color="0.650 0.200 1.000"]; +profil [color="0.650 0.200 1.000"]; +putfreehdr [color="0.650 0.200 1.000"]; +safeoutfil [color="0.650 0.200 1.000"]; +sprintf [color="0.650 0.200 1.000"]; +term [color="0.650 0.200 1.000"]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/psg.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/psg.gv.txt new file mode 100644 index 000000000..be2199c16 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/psg.gv.txt @@ -0,0 +1,32 @@ +##"I made a program to generate dot files representing the LR(0) state graph along with computed LALR(1) lookahead for an arbitrary context-free grammar, to make the diagrams I used in this article: http://blog.lab49.com/archives/2471. The program also highlights errant nodes in red if the grammar would produce a shift/reduce or reduce/reduce conflict -- you may be able to go to http://kthielen.dnsalias.com:8082/ to produce a graph more to your liking". Contributed by Kalani Thielen. + +##Command to get the layout: "dot -Gsize=10,15 -Tpng thisfile > thisfile.png" + +digraph g { + graph [fontsize=30 labelloc="t" label="" splines=true overlap=false rankdir = "LR"]; + ratio = auto; + "state0" [ style = "filled, bold" penwidth = 5 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #0
(0) s -> •e $
(1) e -> •l '=' r
(2) e -> •r
(3) l -> •'*' r
(4) l -> •'n'
(5) r -> •l
> ]; + "state1" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #1
(3) l -> •'*' r
(3) l -> '*' •r
(4) l -> •'n'
(5) r -> •l
> ]; + "state2" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #2
(4) l -> 'n' •=$
> ]; + "state3" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #3
(5) r -> l •=$
> ]; + "state4" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #4
(3) l -> '*' r •=$
> ]; + "state5" [ style = "filled" penwidth = 1 fillcolor = "black" fontname = "Courier New" shape = "Mrecord" label =<
State #5
(0) s -> e •$
> ]; + "state6" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #6
(1) e -> l •'=' r
(5) r -> l •$
> ]; + "state7" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #7
(1) e -> l '=' •r
(3) l -> •'*' r
(4) l -> •'n'
(5) r -> •l
> ]; + "state8" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #8
(1) e -> l '=' r •$
> ]; + "state9" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #9
(2) e -> r •$
> ]; + state0 -> state5 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "e" ]; + state0 -> state6 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "l" ]; + state0 -> state9 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "r" ]; + state0 -> state1 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'*'" ]; + state0 -> state2 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'n'" ]; + state1 -> state1 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'*'" ]; + state1 -> state4 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "r" ]; + state1 -> state2 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'n'" ]; + state1 -> state3 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "l" ]; + state6 -> state7 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'='" ]; + state7 -> state8 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "r" ]; + state7 -> state1 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'*'" ]; + state7 -> state2 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'n'" ]; + state7 -> state3 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "l" ]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/root.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/root.gv.txt new file mode 100644 index 000000000..fff85a18b --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/root.gv.txt @@ -0,0 +1,2143 @@ +/* this graph is from the graphviz rtest/graph directory. Laid out and rendered as + sfdp -Gsize=67! -Goverlap=prism -Tpng root.gv > root.png +*/ +digraph G_component_0 { + graph [ranksep=3, root="189E"]; + 1 [label="02f5daf56e299b8a8ecea892", shape=hexagon, style=filled, color=green]; + "189E" [label=ca5af2, shape=box, style=filled, color=blue]; + "790E" [label=b4dfef6, shape=box, style=filled, color=grey]; + 2 [label="171192dc1f8e6ea551548a910c00", shape=hexagon, style=filled, color=green]; + "191E" [label="629e42", shape=box, style=filled, color=grey]; + 3 [label="6bce02baf91781a831e1b95", shape=hexagon, style=filled, color=green]; + "193E" [label="1c08373", shape=box, style=filled, color=grey]; + 4 [label="6236a67933a619a6a3d48", shape=hexagon, style=filled, color=green]; + "195E" [label=be8f4199f, shape=box, style=filled, color=grey]; + 5 [label="50962c93b4cb293f5beb59eb", shape=hexagon, style=filled, color=green]; + "197E" [label=be8f4199f, shape=box, style=filled, color=grey]; + 6 [label="05d4b1ed6a6135eec3abd3f2", shape=hexagon, style=filled, color=green]; + "199E" [shape=box, style=filled, color=grey]; + 7 [label="08769f73d31c1a99be2d9363f", shape=hexagon, style=filled, color=green]; + "201E" [label="629e42", shape=box, style=filled, color=grey]; + 8 [label=a6a196a504c3a7657d1fa41, shape=hexagon, style=filled, color=green]; + "203E" [label=cd856f, shape=box, style=filled, color=grey]; + 9 [label="837ebf4bde22e1f1535cb662", shape=hexagon, style=filled, color=green]; + "725E" [label=d0eb84, shape=box, style=filled, color=grey]; + "785E" [label=dd2ba36, shape=box, style=filled, color=grey]; + 10 [label="5f865c374cb3fe976dd376b8", shape=hexagon, style=filled, color=green]; + "205E" [label="23ad1", shape=box, style=filled, color=grey]; + 11 [label="8be752bc95d436a90493bec9", shape=hexagon, style=filled, color=green]; + "207E" [label=ee91c97828, shape=box, style=filled, color=grey]; + 12 [label="969a58db14386cb9d2f51ec", shape=hexagon, style=filled, color=green]; + "209E" [label="7c7c", shape=box, style=filled, color=grey]; + 13 [label=da24f74aad2ff519009d1f38c, shape=hexagon, style=filled, color=green]; + "211E" [label="460aed10cc9", shape=box, style=filled, color=grey]; + 14 [label="3124d3a6ed3381a6341c6", shape=hexagon, style=filled, color=green]; + "213E" [label=bbe0a8f93dc1, shape=box, style=filled, color=grey]; + 15 [label="71512ec7d43f958f2b6da", shape=hexagon, style=filled, color=green]; + "215E" [label="3f0a2b4eb62f", shape=box, style=filled, color=grey]; + 16 [label="3828a2c682419423cf", shape=hexagon, style=filled, color=green]; + "727E" [label=2, shape=box, style=filled, color=grey]; + "784E" [shape=box, style=filled, color=grey]; + 17 [label=aa868f65c34cdb64f1fad19a, shape=hexagon, style=filled, color=green]; + "217E" [label="3089106e3b", shape=box, style=filled, color=grey]; + "787E" [label="1aaaab063", shape=box, style=filled, color=grey]; + 18 [label=dca32af03698c988b22, shape=hexagon, style=filled, color=green]; + "219E" [label=eb8, shape=box, style=filled, color=grey]; + 19 [label=d8f4a9e463a1e89217f, shape=hexagon, style=filled, color=green]; + "221E" [label="4c6c8c", shape=box, style=filled, color=grey]; + 20 [label=c96782ef56711c5d6a3f69, shape=hexagon, style=filled, color=green]; + "223E" [label="6a8f5bafb1", shape=box, style=filled, color=grey]; + 21 [label="4f04c39708f", shape=hexagon, style=filled, color=green]; + "225E" [label=a49284e9, shape=box, style=filled, color=grey]; + 22 [label="97284d4c3a5d499853f0e", shape=hexagon, style=filled, color=green]; + "227E" [label="53069e384a2", shape=box, style=filled, color=grey]; + "792E" [label="79b69c612", shape=box, style=filled, color=grey]; + 23 [label=c4d32527b670afb370d643, shape=hexagon, style=filled, color=green]; + "231E" [label=e851f5ddd920, shape=box, style=filled, color=grey]; + 24 [label="5e9156098c064", shape=hexagon, style=filled, color=green]; + "233E" [shape=box, style=filled, color=grey]; + 25 [label="3d475ea3aeca51b60212dd", shape=hexagon, style=filled, color=green]; + "235E" [label="4280833ef80172", shape=box, style=filled, color=grey]; + 26 [label="966d271c22e75c7538", shape=hexagon, style=filled, color=green]; + "237E" [label=cab04b7c14a, shape=box, style=filled, color=grey]; + 27 [label=b630e1af6ae1997f0e8ba750, shape=hexagon, style=filled, color=green]; + "239E" [label=bb828f1a326, shape=box, style=filled, color=grey]; + "783E" [label="499f6985db294c", shape=box, style=filled, color=grey]; + 28 [label=ebd8ffc2ac3a90efb8af9, shape=hexagon, style=filled, color=green]; + "241E" [label="1ebeec", shape=box, style=filled, color=grey]; + "791E" [label=c0b727, shape=box, style=filled, color=grey]; + 29 [label="69fdd1a1f4768c5efe7", shape=hexagon, style=filled, color=green]; + "243E" [label="35b8742610", shape=box, style=filled, color=grey]; + 30 [label=d93a80739fc1edb41a11b7294, shape=hexagon, style=filled, color=green]; + "245E" [label=e03b8bc0435a, shape=box, style=filled, color=grey]; + 31 [label=bf65cfddeb00ff847feae0c, shape=hexagon, style=filled, color=green]; + "247E" [label="8df", shape=box, style=filled, color=grey]; + 32 [label="916c686a1e82dba72524a", shape=hexagon, style=filled, color=green]; + "249E" [label=a849f9d352e, shape=box, style=filled, color=grey]; + 33 [label=f496bcf0889b301d77819c, shape=hexagon, style=filled, color=green]; + "251E" [label=f29dfb9, shape=box, style=filled, color=grey]; + 34 [label="76889f7d35e", shape=hexagon, style=filled, color=green]; + "253E" [label=e7ef998, shape=box, style=filled, color=grey]; + 35 [label="668d636002", shape=hexagon, style=filled, color=green]; + "255E" [label="4379b5ed", shape=box, style=filled, color=grey]; + 36 [label=e1e4c23db39d8bd633c3a, shape=hexagon, style=filled, color=green]; + "257E" [label="1ed5d7f63b8c6", shape=box, style=filled, color=grey]; + 37 [label="842bc5775657c1e0d67", shape=hexagon, style=filled, color=green]; + "259E" [label=a387210a27b, shape=box, style=filled, color=grey]; + 38 [label=e4e2f4e6d, shape=hexagon, style=filled, color=green]; + "261E" [label="1f4f0fdf", shape=box, style=filled, color=grey]; + 39 [label="04390dec6f1779353c07f5", shape=hexagon, style=filled, color=green]; + "263E" [label=bac77c3f414a, shape=box, style=filled, color=grey]; + 40 [label="69f2611acc42c36ed7cc", shape=hexagon, style=filled, color=green]; + "265E" [label=cab04b7c14a, shape=box, style=filled, color=grey]; + 41 [label="1562abef0d8241", shape=hexagon, style=filled, color=green]; + "267E" [label="6a8f5bafb1", shape=box, style=filled, color=grey]; + 42 [label=e49aaa5cc4e44355d6a0, shape=hexagon, style=filled, color=green]; + "269E" [label=cc3f63d, shape=box, style=filled, color=grey]; + 43 [label=e8ebe1bf5f421c1223, shape=hexagon, style=filled, color=green]; + "271E" [label="96325ea", shape=box, style=filled, color=grey]; + 44 [label="2759e82e30d6d", shape=hexagon, style=filled, color=green]; + "273E" [label=ca5af2, shape=box, style=filled, color=grey]; + 45 [label="23c1ec53358d237c1", shape=hexagon, style=filled, color=green]; + "275E" [label=cab04b7c14a, shape=box, style=filled, color=grey]; + 46 [label="5838586c293d455", shape=hexagon, style=filled, color=green]; + "277E" [label="83c397b8bf7f", shape=box, style=filled, color=grey]; + 47 [label=f841118350a27b7ea29a9c9d, shape=hexagon, style=filled, color=green]; + "279E" [label="69f4ecb77d", shape=box, style=filled, color=grey]; + 48 [label="658d208447d8ec5d6de8", shape=hexagon, style=filled, color=green]; + "281E" [label=f7b22b9640, shape=box, style=filled, color=grey]; + 49 [label="11180ae7706510211bc4", shape=hexagon, style=filled, color=green]; + "283E" [label="052bb6e3", shape=box, style=filled, color=grey]; + 50 [label="5807acd8d58e006f43", shape=hexagon, style=filled, color=green]; + "285E" [shape=box, style=filled, color=grey]; + 51 [label=fe4e848cb5291ee59a2, shape=hexagon, style=filled, color=green]; + "287E" [label=e3aefac763, shape=box, style=filled, color=grey]; + 52 [label=c4f31ea3844e12da27ad47c6, shape=hexagon, style=filled, color=green]; + "289E" [label=fb16636aae, shape=box, style=filled, color=grey]; + 53 [label="00cbeb87c182ca0785f", shape=hexagon, style=filled, color=green]; + "291E" [label="3089106e3b", shape=box, style=filled, color=grey]; + 54 [label="11f088bfd8", shape=hexagon, style=filled, color=green]; + "293E" [label="6a80cbe", shape=box, style=filled, color=grey]; + 56 [label="3c2a62e0e5e9f7", shape=hexagon, style=filled, color=green]; + "295E" [label=ae32701, shape=box, style=filled, color=grey]; + 57 [label=dd84fe6a65cfac7bca03ebd, shape=hexagon, style=filled, color=green]; + "297E" [shape=box, style=filled, color=grey]; + 58 [label=b06bbfa920aa95dd, shape=hexagon, style=filled, color=green]; + "299E" [label=07, shape=box, style=filled, color=grey]; + 59 [label="6b5aaa4bdf44b2c898854", shape=hexagon, style=filled, color=green]; + "301E" [label="4c6c8c", shape=box, style=filled, color=grey]; + "789E" [label="3a0ff0", shape=box, style=filled, color=grey]; + 60 [label="855d26296eda4eb7", shape=hexagon, style=filled, color=green]; + "303E" [label="53069e384a2", shape=box, style=filled, color=grey]; + 61 [label=e82f47b8d4949ba4af69b38cbc19, shape=hexagon, style=filled, color=green]; + "305E" [label=b62cd1d0a0, shape=box, style=filled, color=grey]; + 62 [label="86569bffb49adf6b3d0ebac", shape=hexagon, style=filled, color=green]; + "307E" [label="660ffeb76fc59", shape=box, style=filled, color=grey]; + 63 [label=a96e47ff37983425a3e452095, shape=hexagon, style=filled, color=green]; + "309E" [label=cab04b7c14a, shape=box, style=filled, color=grey]; + 64 [label="71a48d11b2e7e56b1df128bd", shape=hexagon, style=filled, color=green]; + "311E" [label=be8f4199f, shape=box, style=filled, color=grey]; + 65 [label=a0befe6dd1ca7b165786835, shape=hexagon, style=filled, color=green]; + "313E" [label="3cfae", shape=box, style=filled, color=grey]; + 66 [label=f33ec11db496f7bfcb024f, shape=hexagon, style=filled, color=green]; + "315E" [label="71e6b", shape=box, style=filled, color=grey]; + 67 [label=fe6be3206549f5b5564acde84783, shape=hexagon, style=filled, color=green]; + "317E" [shape=box, style=filled, color=grey]; + 68 [label=e4dba079d5fcb1f165920a3bf, shape=hexagon, style=filled, color=green]; + "319E" [shape=box, style=filled, color=grey]; + 70 [label="16c508ab98483d430bbe", shape=hexagon, style=filled, color=green]; + "321E" [label=cab04b7c14a, shape=box, style=filled, color=grey]; + 71 [label="9c9e2e0f2da8758e436c", shape=hexagon, style=filled, color=green]; + "327E" [label=cd0d985a366cad7e, shape=box, style=filled, color=grey]; + 72 [label=fb039d7a2a9fe73b5f468eba9, shape=hexagon, style=filled, color=green]; + "329E" [label="81dabfaba8", shape=box, style=filled, color=grey]; + 73 [label="2ef949c4a39b", shape=hexagon, style=filled, color=green]; + "331E" [label="617809d979f", shape=box, style=filled, color=grey]; + 74 [label=a9497e0757b0969bde707ed5, shape=hexagon, style=filled, color=green]; + "333E" [label="541ab86a2e", shape=box, style=filled, color=grey]; + 75 [label="230cc6bbc66b24eae94fa03d", shape=hexagon, style=filled, color=green]; + "335E" [shape=box, style=filled, color=grey]; + 76 [label="1d163eac141def176461c", shape=hexagon, style=filled, color=green]; + "337E" [label="0acc5bb8ca4", shape=box, style=filled, color=grey]; + 77 [label="32979f8cf86", shape=hexagon, style=filled, color=green]; + "339E" [label=a7e89580, shape=box, style=filled, color=grey]; + 78 [label="37d80ae421dba4a70730338860", shape=hexagon, style=filled, color=green]; + "341E" [shape=box, style=filled, color=grey]; + 79 [label=fbba7215e7c13173a60206, shape=hexagon, style=filled, color=green]; + "343E" [label="617809d979f", shape=box, style=filled, color=grey]; + 80 [label="2dd8cc4d693415f93c0f8fc", shape=hexagon, style=filled, color=green]; + "345E" [label="94da691e20e3", shape=box, style=filled, color=grey]; + 81 [label="00880e6f50c765ebc1f85d3e9", shape=hexagon, style=filled, color=green]; + "347E" [label=e7ef998, shape=box, style=filled, color=grey]; + 82 [label=ef13d45b1277ac9a0444adb, shape=hexagon, style=filled, color=green]; + "349E" [label=a7fe7, shape=box, style=filled, color=grey]; + 83 [label="2573e1bf51f1b307f4640", shape=hexagon, style=filled, color=green]; + "351E" [label="84e4ede82074", shape=box, style=filled, color=grey]; + 84 [label="162d8039483d8", shape=hexagon, style=filled, color=green]; + "353E" [label=a8e9, shape=box, style=filled, color=grey]; + 85 [label=f490de272a7f6e4af346d40, shape=hexagon, style=filled, color=green]; + "355E" [label="460aed10cc9", shape=box, style=filled, color=grey]; + "788E" [label="391256c872", shape=box, style=filled, color=grey]; + 86 [label="678bf739c344b9ad41da1", shape=hexagon, style=filled, color=green]; + "357E" [label="396b16a892fe", shape=box, style=filled, color=grey]; + 87 [label="876d120b38b0e88817", shape=hexagon, style=filled, color=green]; + "359E" [label=e5, shape=box, style=filled, color=grey]; + 88 [label="503737b64d432c60d6ac557e0e6", shape=hexagon, style=filled, color=green]; + "361E" [label="9937ccba1469", shape=box, style=filled, color=grey]; + 89 [label=b36e0be6f67fc25286127456, shape=hexagon, style=filled, color=green]; + "363E" [label="87a7e69a72412", shape=box, style=filled, color=grey]; + 90 [label="4cc20a0b7651e486", shape=hexagon, style=filled, color=green]; + "365E" [label=e079d2c, shape=box, style=filled, color=grey]; + 91 [label="08dade990b2282", shape=hexagon, style=filled, color=green]; + "367E" [label="45827dbdd8", shape=box, style=filled, color=grey]; + 92 [label=f8128d574c356631b8a9, shape=hexagon, style=filled, color=green]; + "369E" [shape=box, style=filled, color=grey]; + 93 [label="88a4f0337c2189c3fc7b31", shape=hexagon, style=filled, color=green]; + "729E" [label=da0d7bbcf30, shape=box, style=filled, color=grey]; + 94 [label="1b13908a9f0763c0ae54af9062080", shape=hexagon, style=filled, color=green]; + "371E" [label="8b06a67a", shape=box, style=filled, color=grey]; + 95 [label=e2a5d11499b7e, shape=hexagon, style=filled, color=green]; + "373E" [label="66abc181ac4", shape=box, style=filled, color=grey]; + 96 [label="90cc275011c2013c61eb11", shape=hexagon, style=filled, color=green]; + "375E" [shape=box, style=filled, color=grey]; + 98 [label="1927c743a0d440a5a0", shape=hexagon, style=filled, color=green]; + "377E" [label=b12441ecff15fa12c, shape=box, style=filled, color=grey]; + 99 [label="155d892827c33ed3cae3", shape=hexagon, style=filled, color=green]; + "379E" [label="71e6b", shape=box, style=filled, color=grey]; + 100 [label="9f24ba80192c339a64c0", shape=hexagon, style=filled, color=green]; + "381E" [shape=box, style=filled, color=grey]; + 101 [label="3e814305b42beb41b8c706", shape=hexagon, style=filled, color=green]; + "383E" [label="1c08373", shape=box, style=filled, color=grey]; + 102 [label=eccfe5ff0af70fe9fbec8b2360f90, shape=hexagon, style=filled, color=green]; + "385E" [label=be8f4199f, shape=box, style=filled, color=grey]; + 103 [label="8fa622d9f842c5572a545ed72982", shape=hexagon, style=filled, color=green]; + "387E" [label="4dccb", shape=box, style=filled, color=grey]; + 104 [label=ad9142a65f5eab78b4ca5e, shape=hexagon, style=filled, color=green]; + "389E" [label=f36cce089, shape=box, style=filled, color=grey]; + 105 [label="20f234fdcd0e1fc50261ce8", shape=hexagon, style=filled, color=green]; + "391E" [label="67219ef689f0146b544", shape=box, style=filled, color=grey]; + 106 [label=e06cc38155ff6781cf944d745, shape=hexagon, style=filled, color=green]; + "393E" [label="87a7e69a72412", shape=box, style=filled, color=grey]; + 107 [label=cfdf1932665dcb4cd3c, shape=hexagon, style=filled, color=green]; + "395E" [label="964b86fc1bba0e", shape=box, style=filled, color=grey]; + 108 [label="6d4a4a5a5af91b895272c30", shape=hexagon, style=filled, color=green]; + "397E" [label=b5e86c73d1198f, shape=box, style=filled, color=grey]; + 109 [label=e0ad365c2fb444358201, shape=hexagon, style=filled, color=green]; + "399E" [label=bb5e89c8963, shape=box, style=filled, color=grey]; + 110 [label=b07bbdc8cca5985d4c4, shape=hexagon, style=filled, color=green]; + "401E" [label="50023f6f88", shape=box, style=filled, color=grey]; + 111 [label=df5dba74c75b228de48c, shape=hexagon, style=filled, color=green]; + "403E" [label="7e493ee44b28", shape=box, style=filled, color=grey]; + 112 [label="0b8694c9ef9b27b9c3d8", shape=hexagon, style=filled, color=green]; + "405E" [label="2342b759c03", shape=box, style=filled, color=grey]; + 113 [label="81e20155999fa64e0ae6fd", shape=hexagon, style=filled, color=green]; + "407E" [label="4280833ef80172", shape=box, style=filled, color=grey]; + 114 [label="3ef07ae75d29a707", shape=hexagon, style=filled, color=green]; + "409E" [label="4280833ef80172", shape=box, style=filled, color=grey]; + 115 [label="4a36db80f1ab1e97", shape=hexagon, style=filled, color=green]; + "411E" [label="460aed10cc9", shape=box, style=filled, color=grey]; + 116 [label="16da5f1301b36df4df0f", shape=hexagon, style=filled, color=green]; + "413E" [label="460aed10cc9", shape=box, style=filled, color=grey]; + 117 [label="6b3f3fa236bb90592d23a", shape=hexagon, style=filled, color=green]; + "415E" [label="83c397b8bf7f", shape=box, style=filled, color=grey]; + 118 [label=f2a57e4d4f0cec516891e3, shape=hexagon, style=filled, color=green]; + "417E" [label=bd2484, shape=box, style=filled, color=grey]; + 119 [label=deb3089920548bf1ecb23f0d, shape=hexagon, style=filled, color=green]; + "419E" [label="87a7e69a72412", shape=box, style=filled, color=grey]; + 120 [label=bf01c8a262, shape=hexagon, style=filled, color=green]; + "421E" [label=01, shape=box, style=filled, color=grey]; + 121 [label="23dc3a52fed9c119610b5e8", shape=hexagon, style=filled, color=green]; + "423E" [label="71e6b", shape=box, style=filled, color=grey]; + 123 [label="78cc16f965adc5f712ea2372c6", shape=hexagon, style=filled, color=green]; + "425E" [label="23ad1", shape=box, style=filled, color=grey]; + 124 [label="5be631dff7b97697be7dc0a2f07f2", shape=hexagon, style=filled, color=green]; + "427E" [shape=box, style=filled, color=grey]; + "786E" [label=421, shape=box, style=filled, color=grey]; + 125 [label="48398d080dfcccced48da1980", shape=hexagon, style=filled, color=green]; + "431E" [label="866808df", shape=box, style=filled, color=grey]; + 126 [label="03716a2c341e5edaa31", shape=hexagon, style=filled, color=green]; + "433E" [label="21407f8a6d7", shape=box, style=filled, color=grey]; + 127 [label=ddfeabe456a9de5f5784, shape=hexagon, style=filled, color=green]; + "435E" [label=aac615ae78, shape=box, style=filled, color=grey]; + 128 [label=d550a7f392c787661aadd48, shape=hexagon, style=filled, color=green]; + "437E" [label=e3aefac763, shape=box, style=filled, color=grey]; + 129 [label="4c82921f4ad3f07066540", shape=hexagon, style=filled, color=green]; + "439E" [label=a7fe7, shape=box, style=filled, color=grey]; + 130 [label="0bc7f8f513e0e74b270", shape=hexagon, style=filled, color=green]; + "441E" [label=a849f9d352e, shape=box, style=filled, color=grey]; + 131 [label="3b1563a23eb9", shape=hexagon, style=filled, color=green]; + "443E" [label=a8e9, shape=box, style=filled, color=grey]; + 132 [label=be233fafa38d931d894, shape=hexagon, style=filled, color=green]; + "445E" [label=a849f9d352e, shape=box, style=filled, color=grey]; + 134 [label=e7a887d88c2318beba51, shape=hexagon, style=filled, color=green]; + "447E" [label="9d8988c0945d6", shape=box, style=filled, color=grey]; + 135 [label=be6b73bd46a7a5183e8c91a, shape=hexagon, style=filled, color=green]; + "449E" [label=ee91c97828, shape=box, style=filled, color=grey]; + "769E" [label="444189d179b5db71fe", shape=box, style=filled, color=grey]; + "770E" [label="1e1fbbe14ac24e0518", shape=box, style=filled, color=grey]; + 136 [label="644f112bb0aa452ee7040a", shape=hexagon, style=filled, color=green]; + "451E" [label="52f247fc3b", shape=box, style=filled, color=grey]; + 137 [label="010957669f3770aac", shape=hexagon, style=filled, color=green]; + "453E" [label=78, shape=box, style=filled, color=grey]; + 138 [label="0a185946ee443342b07d8e1", shape=hexagon, style=filled, color=green]; + "455E" [label="87a7e69a72412", shape=box, style=filled, color=grey]; + 139 [label=f66fe4df3d189e69ce10c9c, shape=hexagon, style=filled, color=green]; + "457E" [label="21407f8a6d7", shape=box, style=filled, color=grey]; + 140 [label="247e407f45b353f8", shape=hexagon, style=filled, color=green]; + "459E" [shape=box, style=filled, color=grey]; + 141 [label="84907547f36d0ff7", shape=hexagon, style=filled, color=green]; + "461E" [label=e920b915087, shape=box, style=filled, color=grey]; + 142 [label="805004328dad9d315d", shape=hexagon, style=filled, color=green]; + "463E" [label="4280833ef80172", shape=box, style=filled, color=grey]; + 143 [label="4f0cbd3fbf0cb1e8c", shape=hexagon, style=filled, color=green]; + "465E" [label=403126, shape=box, style=filled, color=grey]; + 144 [label="4869e993f2bb10f", shape=hexagon, style=filled, color=green]; + "467E" [label=ff, shape=box, style=filled, color=grey]; + 145 [label="665b76844ff78fc2cf66ca2", shape=hexagon, style=filled, color=green]; + "469E" [label=af0268dddd, shape=box, style=filled, color=grey]; + 146 [label="3f16509139c7dad5163b91799", shape=hexagon, style=filled, color=green]; + "471E" [label="3089106e3b", shape=box, style=filled, color=grey]; + 147 [label="01db23a60422ba93a68611cc0", shape=hexagon, style=filled, color=green]; + "473E" [shape=box, style=filled, color=grey]; + 148 [label="46125fcc583c0f494a3a1d3", shape=hexagon, style=filled, color=green]; + "475E" [label=db6c4213a717bc, shape=box, style=filled, color=grey]; + 149 [label="731857fe189fb398e80a0594", shape=hexagon, style=filled, color=green]; + "477E" [label="3089106e3b", shape=box, style=filled, color=grey]; + 150 [label="6fb7a84e370ef70feac5cb", shape=hexagon, style=filled, color=green]; + "479E" [label="396b16a892fe", shape=box, style=filled, color=grey]; + 151 [label=e343cea291b79a2ed4e, shape=hexagon, style=filled, color=green]; + "481E" [label="88d8b220746882d", shape=box, style=filled, color=grey]; + 152 [label="5f2592b20f13356b7fc8b42", shape=hexagon, style=filled, color=green]; + "483E" [shape=box, style=filled, color=grey]; + 153 [label="275a0407e33e9b8aa9cdd051", shape=hexagon, style=filled, color=green]; + "731E" [shape=box, style=filled, color=grey]; + 155 [label="173fd00917644f0f1f3e3", shape=hexagon, style=filled, color=green]; + "485E" [label="0acc5bb8ca4", shape=box, style=filled, color=grey]; + 156 [label=c72df69b40156a3254, shape=hexagon, style=filled, color=green]; + "487E" [label=fff03efcd, shape=box, style=filled, color=grey]; + 157 [label="6c632ad9c42228bb337", shape=hexagon, style=filled, color=green]; + "489E" [label=eb8, shape=box, style=filled, color=grey]; + 158 [label=bbb13dc62adf2de2a42b6, shape=hexagon, style=filled, color=green]; + "491E" [label="69ce90c9b2", shape=box, style=filled, color=grey]; + 159 [label="6282bc21f6", shape=hexagon, style=filled, color=green]; + "495E" [label=de34214b4c258c9333ec3, shape=box, style=filled, color=grey]; + 160 [label="71cf45dd4e91bcca945137b40e", shape=hexagon, style=filled, color=green]; + "499E" [label="65fd8495", shape=box, style=filled, color=grey]; + 161 [label=a3b6df27179b175c88fa4c9cf9f, shape=hexagon, style=filled, color=green]; + "501E" [label=6577, shape=box, style=filled, color=grey]; + 162 [label="284f14a259991806654e74", shape=hexagon, style=filled, color=green]; + "503E" [label="4280833ef80172", shape=box, style=filled, color=grey]; + 163 [label=a7c99ccf6ddf6f5ebbe, shape=hexagon, style=filled, color=green]; + "505E" [label=c4fd8, shape=box, style=filled, color=grey]; + 164 [label=c32d2697e8, shape=hexagon, style=filled, color=green]; + "507E" [label="52f247fc3b", shape=box, style=filled, color=grey]; + 165 [label=d12bd75c24b110ef90cdd35d3, shape=hexagon, style=filled, color=green]; + "509E" [label=0668, shape=box, style=filled, color=grey]; + 166 [label="1c07453d584f3d14b1876fdb", shape=hexagon, style=filled, color=green]; + "511E" [label="460aed10cc9", shape=box, style=filled, color=grey]; + 167 [label=f713a8b311ffa05ce3683ad10, shape=hexagon, style=filled, color=green]; + "513E" [label="30d6138b63eb", shape=box, style=filled, color=grey]; + 168 [label="3cdc90c57243373efaba65a", shape=hexagon, style=filled, color=green]; + "515E" [label=fa2afbd869, shape=box, style=filled, color=grey]; + 169 [label=e3bdbca0e2256fffa8a59018, shape=hexagon, style=filled, color=green]; + "517E" [label="81dabfaba8", shape=box, style=filled, color=grey]; + 170 [label="75ba8d840070942eb4e737849", shape=hexagon, style=filled, color=green]; + "519E" [label="81dabfaba8", shape=box, style=filled, color=grey]; + 171 [label=fbdc3ca37406f66635c8b226e, shape=hexagon, style=filled, color=green]; + "521E" [label="8cbcf5cb5", shape=box, style=filled, color=grey]; + 172 [label="40b49a5a9bb256c7a3286e56", shape=hexagon, style=filled, color=green]; + "523E" [label=f72564578be, shape=box, style=filled, color=grey]; + 173 [label="3b2f08d52e4bca3f9ca7bbbd6", shape=hexagon, style=filled, color=green]; + "525E" [label="81dabfaba8", shape=box, style=filled, color=grey]; + 174 [label="4a38abc630c82b0c48dfbf5271", shape=hexagon, style=filled, color=green]; + "527E" [label=f0bd1521, shape=box, style=filled, color=grey]; + 175 [label="2d7b7fb6c9ad6821752651f7", shape=hexagon, style=filled, color=green]; + "529E" [label="47b2da3d", shape=box, style=filled, color=grey]; + 176 [label="910b00285f11bb90d0a15641", shape=hexagon, style=filled, color=green]; + "531E" [label="81dabfaba8", shape=box, style=filled, color=grey]; + 177 [label="24431c3eb075102f07cc2c1be", shape=hexagon, style=filled, color=green]; + "533E" [shape=box, style=filled, color=grey]; + 178 [label="07f8a9e55a16beddb3c9153b0", shape=hexagon, style=filled, color=green]; + "535E" [label="81dabfaba8", shape=box, style=filled, color=grey]; + 179 [label=c1c30f30d40c4f1f84924622f, shape=hexagon, style=filled, color=green]; + "537E" [label=c5d5be3942, shape=box, style=filled, color=grey]; + 180 [label="86276bb1e23f2c7ffcbe82a0", shape=hexagon, style=filled, color=green]; + "539E" [label="0f940646", shape=box, style=filled, color=grey]; + 181 [label=f78e145a127014eb43345a0c, shape=hexagon, style=filled, color=green]; + "541E" [label=d370c12dbc, shape=box, style=filled, color=grey]; + 182 [label=a27037332d9fa5c43bcfe94c0, shape=hexagon, style=filled, color=green]; + "543E" [label="80874aa8", shape=box, style=filled, color=grey]; + 183 [label=c29ce10bb8d19b498355aa04, shape=hexagon, style=filled, color=green]; + "545E" [label="1c08373", shape=box, style=filled, color=grey]; + 184 [label="4f8c642b53c349c687534bda35db", shape=hexagon, style=filled, color=green]; + "547E" [label="46969c4", shape=box, style=filled, color=grey]; + 185 [label="30cc206b1878485", shape=hexagon, style=filled, color=green]; + "549E" [label="23ad1", shape=box, style=filled, color=grey]; + 186 [label="5d69639a5e3bdd3d", shape=hexagon, style=filled, color=green]; + "551E" [label="6139fa6adc88d", shape=box, style=filled, color=grey]; + 187 [label=b656f0ed2202b8e46eb, shape=hexagon, style=filled, color=green]; + "553E" [label=f6e6236b48bc3, shape=box, style=filled, color=grey]; + 188 [label="3b566eaa70ed401479d43a9", shape=hexagon, style=filled, color=green]; + "555E" [label="4c6c8c", shape=box, style=filled, color=grey]; + 189 [label=d6125ef42bd9958, shape=hexagon, style=filled, color=green]; + "557E" [label="4c6c8c", shape=box, style=filled, color=grey]; + 190 [label=dd12f26f8d9bb55, shape=hexagon, style=filled, color=green]; + "559E" [label="83c397b8bf7f", shape=box, style=filled, color=grey]; + 191 [label=ea890ccca2f7c2107351, shape=hexagon, style=filled, color=green]; + "561E" [label=eb8, shape=box, style=filled, color=grey]; + 192 [label="84e4f1c582427a98d7b", shape=hexagon, style=filled, color=green]; + "563E" [label=eb8, shape=box, style=filled, color=grey]; + 193 [label=d378760b814eaecb6efe636e0efc4, shape=hexagon, style=filled, color=green]; + "565E" [label="81bcc35f82891", shape=box, style=filled, color=grey]; + 194 [label=f722890f70a32dce3baff371a, shape=hexagon, style=filled, color=green]; + "567E" [label="84e4ede82074", shape=box, style=filled, color=grey]; + 195 [label="666f11bb45c3a8dcf26e1ed79", shape=hexagon, style=filled, color=green]; + "569E" [label=c90f755c8b6612d, shape=box, style=filled, color=grey]; + 196 [label="91ecbe29a71f00ed5a3", shape=hexagon, style=filled, color=green]; + "571E" [label="0a963fef9", shape=box, style=filled, color=grey]; + 197 [label="30c3f3bf8463d3843dc57d8e98", shape=hexagon, style=filled, color=green]; + "573E" [label="3089106e3b", shape=box, style=filled, color=grey]; + 198 [label="8ea965ab6ee8dedb6c3333e9", shape=hexagon, style=filled, color=green]; + "575E" [label="84e4ede82074", shape=box, style=filled, color=grey]; + 199 [label="3eecb304bab2136a76deda", shape=hexagon, style=filled, color=green]; + "577E" [label="8df", shape=box, style=filled, color=grey]; + 200 [label=d886e4b76537a99bc71b8a9331c94, shape=hexagon, style=filled, color=green]; + "579E" [label="1172dca23", shape=box, style=filled, color=grey]; + 201 [label=dcc5d5e9d6c4e, shape=hexagon, style=filled, color=green]; + "581E" [label=a8e9, shape=box, style=filled, color=grey]; + 202 [label="8292af691429f8d9ed481ff71ffd", shape=hexagon, style=filled, color=green]; + "583E" [label="212af4", shape=box, style=filled, color=grey]; + 203 [label="12fcb26b3de00ef98719c2ca", shape=hexagon, style=filled, color=green]; + "585E" [shape=box, style=filled, color=grey]; + 204 [label=a141a557a60912051f3c135, shape=hexagon, style=filled, color=green]; + "587E" [shape=box, style=filled, color=grey]; + 206 [label=f5d636e14a6cd716362158d, shape=hexagon, style=filled, color=green]; + "589E" [label="32c958c9997", shape=box, style=filled, color=grey]; + 208 [label="52a6c2063bccd83110c32", shape=hexagon, style=filled, color=green]; + "597E" [shape=box, style=filled, color=grey]; + 209 [label="46f754ea06f070dbc023e571a876", shape=hexagon, style=filled, color=green]; + "599E" [label=ffccaa9e3, shape=box, style=filled, color=grey]; + 210 [label=c10cb9baf4dcb43e24, shape=hexagon, style=filled, color=green]; + "601E" [label=ac6e99186, shape=box, style=filled, color=grey]; + 211 [label="3dafe1619016463f521f", shape=hexagon, style=filled, color=green]; + "603E" [label=b9, shape=box, style=filled, color=grey]; + 212 [label="0f5db6ce12751ddcc64e", shape=hexagon, style=filled, color=green]; + "605E" [label=bb828f1a326, shape=box, style=filled, color=grey]; + 213 [label="34c8c8dc0f6e41c7e7b2", shape=hexagon, style=filled, color=green]; + "607E" [label="2832ed5cea6", shape=box, style=filled, color=grey]; + 214 [label="0a49c95f107c0aa57c9b5748", shape=hexagon, style=filled, color=green]; + "609E" [shape=box, style=filled, color=grey]; + 215 [label="3b4fdad8e0429d112", shape=hexagon, style=filled, color=green]; + "611E" [label=cab04b7c14a, shape=box, style=filled, color=grey]; + 216 [label="17dafa5ebaafd48440e3", shape=hexagon, style=filled, color=green]; + "613E" [label=b5f038f79a3, shape=box, style=filled, color=grey]; + 217 [label=f4c69e5e212f89348122e8, shape=hexagon, style=filled, color=green]; + "615E" [label="396b16a892fe", shape=box, style=filled, color=grey]; + 218 [label="4f2e020854dfacce46a12", shape=hexagon, style=filled, color=green]; + "617E" [label=e079d2c, shape=box, style=filled, color=grey]; + 219 [label="6448451ac2ceade90715378b", shape=hexagon, style=filled, color=green]; + "619E" [shape=box, style=filled, color=grey]; + 221 [label=d7c27cc6f7b02a31eb64d, shape=hexagon, style=filled, color=green]; + "623E" [label="87a7e69a72412", shape=box, style=filled, color=grey]; + 223 [label=eccf7c722ddf, shape=hexagon, style=filled, color=green]; + "625E" [label=df61d5f5fc, shape=box, style=filled, color=grey]; + 224 [label="86633c26be93ada8b", shape=hexagon, style=filled, color=green]; + "627E" [label="08500a6044", shape=box, style=filled, color=grey]; + 225 [label="3f9ddf1ffbc0d38b", shape=hexagon, style=filled, color=green]; + "629E" [label=07, shape=box, style=filled, color=grey]; + 226 [label=e33792703, shape=hexagon, style=filled, color=green]; + "631E" [label="6a8f5bafb1", shape=box, style=filled, color=grey]; + 227 [label="293a225dc56dd1e0564e6bb", shape=hexagon, style=filled, color=green]; + "633E" [label=e3aefac763, shape=box, style=filled, color=grey]; + 228 [label="57c77c341f94afddef07e6", shape=hexagon, style=filled, color=green]; + "635E" [label="5e80f85274", shape=box, style=filled, color=grey]; + 229 [label="3bbfc7bfdbbb1ba1bfad7517", shape=hexagon, style=filled, color=green]; + "637E" [shape=box, style=filled, color=grey]; + 230 [label=a7167d5eb5408b3839903, shape=hexagon, style=filled, color=green]; + "639E" [label="8c8b5bde6", shape=box, style=filled, color=grey]; + 231 [label="34d7bb6af4fcd8d630de72500c8", shape=hexagon, style=filled, color=green]; + "641E" [label="32fe7eee5283", shape=box, style=filled, color=grey]; + 232 [label="8e69341faa4489", shape=hexagon, style=filled, color=green]; + "643E" [label=cab04b7c14a, shape=box, style=filled, color=grey]; + 233 [label="459236f07c73814faf5", shape=hexagon, style=filled, color=green]; + "645E" [label="18083a711d", shape=box, style=filled, color=grey]; + 234 [label=c71aa521578164debd0c5, shape=hexagon, style=filled, color=green]; + "647E" [label=78, shape=box, style=filled, color=grey]; + 235 [label=a5520019b8a73bc141b5fd416a, shape=hexagon, style=filled, color=green]; + "649E" [label="3219b6b71443", shape=box, style=filled, color=grey]; + 236 [label="6c89dc59ee7aaebbbd6bb64", shape=hexagon, style=filled, color=green]; + "651E" [label="8c8b5bde6", shape=box, style=filled, color=grey]; + 237 [label=a9a36ef02f, shape=hexagon, style=filled, color=green]; + "653E" [label="6a80cbe", shape=box, style=filled, color=grey]; + 238 [label="3db761b596844f133c", shape=hexagon, style=filled, color=green]; + "655E" [label=e920b915087, shape=box, style=filled, color=grey]; + 239 [label="383db224d7508ef072bea21d0", shape=hexagon, style=filled, color=green]; + "657E" [label="975fedfb64df", shape=box, style=filled, color=grey]; + 240 [label="8e307415fb435445ced7", shape=hexagon, style=filled, color=green]; + "659E" [label="21dff35936370ae5f", shape=box, style=filled, color=grey]; + 241 [label=aff6d7896e0e142bbc3e78, shape=hexagon, style=filled, color=green]; + "661E" [label=d2498, shape=box, style=filled, color=grey]; + 242 [label=e153c6e676c7369b285b4e9033a, shape=hexagon, style=filled, color=green]; + "663E" [shape=box, style=filled, color=grey]; + 243 [label=f3c4311de0e931f08c232b, shape=hexagon, style=filled, color=green]; + "665E" [label=a849f9d352e, shape=box, style=filled, color=grey]; + 244 [label="0c72a426929600000f5", shape=hexagon, style=filled, color=green]; + "667E" [label="45827dbdd8", shape=box, style=filled, color=grey]; + 245 [label="38fa61352f5086d2cb51", shape=hexagon, style=filled, color=green]; + "669E" [label=af0268dddd, shape=box, style=filled, color=grey]; + 246 [label=ad1dd724f1c3e, shape=hexagon, style=filled, color=green]; + "671E" [label=cab04b7c14a, shape=box, style=filled, color=grey]; + 247 [label="11bb8ed3ae227d3acefc", shape=hexagon, style=filled, color=green]; + "673E" [label=eb8, shape=box, style=filled, color=grey]; + 248 [label=f2c7b3bb4d44f977d0ab8a42351, shape=hexagon, style=filled, color=green]; + "675E" [shape=box, style=filled, color=grey]; + 249 [label="51e045ca826077ae765", shape=hexagon, style=filled, color=green]; + "679E" [label=e842, shape=box, style=filled, color=grey]; + 251 [label="3b6b2c549de670d7bf5fc0ee", shape=hexagon, style=filled, color=green]; + "681E" [shape=box, style=filled, color=grey]; + 252 [label="5eea496cc301b2a9721", shape=hexagon, style=filled, color=green]; + "683E" [shape=box, style=filled, color=grey]; + 253 [label=bfc6564cbdeeffac00a141, shape=hexagon, style=filled, color=green]; + "685E" [label="3b0a8a1c2e5050bd", shape=box, style=filled, color=grey]; + 254 [label=c360aaeb167487c9578a8f, shape=hexagon, style=filled, color=green]; + "687E" [label=d, shape=box, style=filled, color=grey]; + 255 [label="39d025b265f9790490781cb201", shape=hexagon, style=filled, color=green]; + "689E" [label="5e80f85274", shape=box, style=filled, color=grey]; + 256 [label=b4ce21e0a3df1d097277d6, shape=hexagon, style=filled, color=green]; + "691E" [label=a849f9d352e, shape=box, style=filled, color=grey]; + 257 [label="8bdb6a91c6dee925b557c705b3", shape=hexagon, style=filled, color=green]; + "693E" [label="53069e384a2", shape=box, style=filled, color=grey]; + 258 [label=ac487676a04e4, shape=hexagon, style=filled, color=green]; + "695E" [label=a8e9, shape=box, style=filled, color=grey]; + 259 [label="18115fa32ff1cb99", shape=hexagon, style=filled, color=green]; + "697E" [label="45827dbdd8", shape=box, style=filled, color=grey]; + 260 [label=b7b899dc8bc6a32b28cb098fa16, shape=hexagon, style=filled, color=green]; + "699E" [label="32fe7eee5283", shape=box, style=filled, color=grey]; + 261 [label=b69e426d974e1907e88, shape=hexagon, style=filled, color=green]; + "703E" [label=e842, shape=box, style=filled, color=grey]; + 262 [label="60d0128bdb61ae40e98638bd1391", shape=hexagon, style=filled, color=green]; + "705E" [label="23ad1", shape=box, style=filled, color=grey]; + 264 [label="8fb60d769e4c387", shape=hexagon, style=filled, color=green]; + "709E" [label="6a8f5bafb1", shape=box, style=filled, color=grey]; + 265 [label=e1fa7f549e5a0893bb42da5, shape=hexagon, style=filled, color=green]; + "711E" [label="6a3c6921b0aeceda3", shape=box, style=filled, color=grey]; + 266 [label=a77622f2ff77ffeeb2, shape=hexagon, style=filled, color=green]; + "713E" [label="21dff35936370ae5f", shape=box, style=filled, color=grey]; + 267 [label="30d9d350943c0e3ff7594b50", shape=hexagon, style=filled, color=green]; + "715E" [label=b5e86c73d1198f, shape=box, style=filled, color=grey]; + 268 [label="89ced1a7906d58d687d5a04", shape=hexagon, style=filled, color=green]; + "717E" [label=c0174bbe7ae8, shape=box, style=filled, color=grey]; + 269 [label="1de26f6b12b0d292f94184", shape=hexagon, style=filled, color=green]; + "719E" [label="65fd8495", shape=box, style=filled, color=grey]; + 270 [label="26fa7360ab81be9d4434a", shape=hexagon, style=filled, color=green]; + "721E" [label=af0268dddd, shape=box, style=filled, color=grey]; + 272 [label="4a9d79c960b8d33e39251e5f66", shape=hexagon]; + "34E" [label="330342f283ef2", shape=box, style=filled, color=grey]; + "252E" [label="3dafb9a29c00", shape=box, style=filled, color=grey]; + "436E" [label="8d5137b16a", shape=box, style=filled, color=grey]; + 274 [label="10a7d61c201c67a5e78542807cd", shape=hexagon]; + "59E" [label=ef6361295eba07, shape=box, style=filled, color=grey]; + "500E" [label=a8f0fe2eb7bc1471, shape=box, style=filled, color=grey]; + "720E" [label=cfff3acd8e9d, shape=box, style=filled, color=grey]; + 275 [label=f8ff39eab120851f143bf19, shape=hexagon]; + "98E" [label="4e3cfd27a", shape=box, style=filled, color=grey]; + 278 [label="4995c71223c9f6067324d387a2", shape=hexagon]; + "35E" [label="57948adb5dead", shape=box, style=filled, color=grey]; + "488E" [label=a738ba39, shape=box, style=filled, color=grey]; + "598E" [label=be7d637c50c, shape=box, style=filled, color=grey]; + "604E" [label="8d52f183ec", shape=box, style=filled, color=grey]; + "628E" [label=cef12b6, shape=box, style=filled, color=grey]; + 279 [label=b9ae94e6935503603341ecf4, shape=hexagon]; + "99E" [label="14a3c17f3d", shape=box, style=filled, color=grey]; + 280 [label=fd28c194a46fde909b019c52f, shape=hexagon]; + "242E" [label="9fe65061641", shape=box, style=filled, color=grey]; + "270E" [label="34d06d1ed6", shape=box, style=filled, color=grey]; + "272E" [label="713db1c1", shape=box, style=filled, color=grey]; + "284E" [label="90dccb18c0", shape=box, style=filled, color=grey]; + "286E" [label=e17fea65, shape=box, style=filled, color=grey]; + "288E" [label=aebb7b91b, shape=box, style=filled, color=grey]; + "586E" [label="4348f3abcb7716", shape=box, style=filled, color=grey]; + "763E" [label=b082f7a5ff, shape=box, style=filled, color=grey]; + 281 [label="7c0ab977f5a3c4ab6d625f5033", shape=hexagon]; + "45E" [label="20949455f573f", shape=box, style=filled, color=grey]; + "470E" [label=c338481d79773, shape=box, style=filled, color=grey]; + "670E" [label=e1d01ef89f, shape=box, style=filled, color=grey]; + "722E" [label=c4507c22d19, shape=box, style=filled, color=grey]; + 282 [label="7e0b91491c8c8566892cd9a0889", shape=hexagon]; + "103E" [label=de9efa12873949, shape=box, style=filled, color=grey]; + 283 [label=d58478d9c273ad4f4b2e091324, shape=hexagon]; + "165E" [label="1a220eb692c", shape=box, style=filled, color=grey]; + 284 [label="8be0efdd94a6383e87fbfded4f", shape=hexagon]; + "39E" [label=c8a6c26d4fd9f, shape=box, style=filled, color=grey]; + "224E" [label="8cbae42a3900", shape=box, style=filled, color=grey]; + "268E" [label=fc73, shape=box, style=filled, color=grey]; + "632E" [shape=box, style=filled, color=grey]; + "710E" [label="102f1", shape=box, style=filled, color=grey]; + 285 [label="3aeb78ea51020a44f2d2615436dae", shape=hexagon]; + "53E" [label="96deede0c6b44119", shape=box, style=filled, color=grey]; + 286 [label="6bbd5b422edb8e358dcc20eecf9", shape=hexagon]; + "38E" [label="4f2de229621272", shape=box, style=filled, color=grey]; + "166E" [label=d495de0b35f6, shape=box, style=filled, color=grey]; + 288 [label="4856000a6802ddfc121ef40432297", shape=hexagon, style=filled, color="#ff0000"]; + "40E" [label="04904a458422a5b9", shape=box, style=filled, color=grey]; + "218E" [label="8cd4d", shape=box, style=filled, color=grey]; + "244E" [shape=box, style=filled, color=grey]; + "246E" [label="9be88247", shape=box, style=filled, color=grey]; + "258E" [label="4f05b", shape=box, style=filled, color=grey]; + "290E" [label="8b092", shape=box, style=filled, color=grey]; + "292E" [label=c3bbf4, shape=box, style=filled, color=grey]; + "308E" [label="6331b3f", shape=box, style=filled, color=grey]; + "318E" [shape=box, style=filled, color=grey]; + "388E" [label=3711, shape=box, style=filled, color=grey]; + "472E" [label=c5255d, shape=box, style=filled, color=grey]; + "478E" [label="5c6a2", shape=box, style=filled, color=grey]; + "566E" [label="51ec95518d1b3", shape=box, style=filled, color=grey]; + "570E" [label="82a65ed4b69", shape=box, style=filled, color=grey]; + "574E" [label="05fed5e", shape=box, style=filled, color=grey]; + "608E" [label=bf, shape=box, style=filled, color=grey]; + "614E" [label=ce, shape=box, style=filled, color=grey]; + "658E" [label="1a830d9f", shape=box, style=filled, color=grey]; + "664E" [shape=box, style=filled, color=grey]; + "682E" [shape=box, style=filled, color=grey]; + 289 [label="2e31175cbd52fcd08360fe86d20", shape=hexagon]; + "41E" [label="4ad5d68f07981a", shape=box, style=filled, color=grey]; + "636E" [label="51192117f9b4", shape=box, style=filled, color=grey]; + "642E" [label="6bf214d9e7fa5f2df", shape=box, style=filled, color=grey]; + "690E" [label="558d8534f92fddfe", shape=box, style=filled, color=grey]; + "700E" [label="6819fd5a6cdd280dd", shape=box, style=filled, color=grey]; + 290 [label="3aa0ce5efcf79bc3ecced1886e89", shape=hexagon]; + "56E" [label=ff9d64ddf49a20f, shape=box, style=filled, color=grey]; + "264E" [label="6c93f24516f01d", shape=box, style=filled, color=grey]; + "510E" [label="32b98f11f3d01d6", shape=box, style=filled, color=grey]; + "718E" [label="8f7c875500073", shape=box, style=filled, color=grey]; + 291 [label="7c1767485953d9c2", shape=hexagon]; + "66E" [label=086, shape=box, style=filled, color=grey]; + "76E" [shape=box, style=filled, color=grey]; + "610E" [label="450d3a2d49cbfd", shape=box, style=filled, color=grey]; + 292 [label="9c1305d59c37e9be9f13d7d049c", shape=hexagon]; + "73E" [label=817, shape=box, style=filled, color=grey]; + 293 [label=efe092824916a5637ee35d439589, shape=hexagon]; + "49E" [shape=box, style=filled, color=grey]; + "214E" [shape=box, style=filled, color=grey]; + "216E" [shape=box, style=filled, color=grey]; + "236E" [shape=box, style=filled, color=grey]; + "278E" [shape=box, style=filled, color=grey]; + "358E" [shape=box, style=filled, color=grey]; + "398E" [shape=box, style=filled, color=grey]; + "400E" [shape=box, style=filled, color=grey]; + "402E" [shape=box, style=filled, color=grey]; + "404E" [shape=box, style=filled, color=grey]; + "406E" [shape=box, style=filled, color=grey]; + "408E" [shape=box, style=filled, color=grey]; + "412E" [shape=box, style=filled, color=grey]; + "438E" [shape=box, style=filled, color=grey]; + "448E" [shape=box, style=filled, color=grey]; + "476E" [shape=box, style=filled, color=grey]; + "504E" [shape=box, style=filled, color=grey]; + "552E" [shape=box, style=filled, color=grey]; + "634E" [shape=box, style=filled, color=grey]; + "768E" [shape=box, style=filled, color=grey]; + 295 [label="70815f0352b43dc1562133ab6eb", shape=hexagon, style=filled, color="#A52A2A"]; + "44E" [label=ef2d4636934472, shape=box, style=filled, color=grey]; + "92E" [label="22bd92e302816", shape=box, style=filled, color=grey]; + "250E" [label="74e86", shape=box, style=filled, color=grey]; + "316E" [shape=box, style=filled, color=grey]; + "380E" [shape=box, style=filled, color=grey]; + "424E" [label=c, shape=box, style=filled, color=grey]; + "442E" [label=a5a, shape=box, style=filled, color=grey]; + "446E" [label=bce, shape=box, style=filled, color=grey]; + "454E" [shape=box, style=filled, color=grey]; + "460E" [shape=box, style=filled, color=grey]; + "462E" [shape=box, style=filled, color=grey]; + "648E" [shape=box, style=filled, color=grey]; + "656E" [label=e9, shape=box, style=filled, color=grey]; + "666E" [label=b701e7, shape=box, style=filled, color=grey]; + "692E" [label=f2e7cc, shape=box, style=filled, color=grey]; + "712E" [label="8a9eb2806b0aa", shape=box, style=filled, color=grey]; + 296 [label=e287d497450664a4c0f4efc338, shape=hexagon, style=filled, color="#ff0000"]; + "47E" [label="06eff1db45cdf", shape=box, style=filled, color=grey]; + "330E" [label=c0f34a600, shape=box, style=filled, color=grey]; + "514E" [label=bd7aca295ca, shape=box, style=filled, color=grey]; + "516E" [label="0da9135", shape=box, style=filled, color=grey]; + "518E" [label=fe821bce, shape=box, style=filled, color=grey]; + "520E" [label=e64f22a31, shape=box, style=filled, color=grey]; + "522E" [label="46e412a3", shape=box, style=filled, color=grey]; + "526E" [label="99da1f8a5", shape=box, style=filled, color=grey]; + "528E" [label="0f167280", shape=box, style=filled, color=grey]; + "530E" [label="82d201", shape=box, style=filled, color=grey]; + "532E" [label="1d529eb4", shape=box, style=filled, color=grey]; + "534E" [shape=box, style=filled, color=grey]; + "536E" [label=bf141dbce, shape=box, style=filled, color=grey]; + "538E" [label=e3fd0c7b3, shape=box, style=filled, color=grey]; + "540E" [label=c96cb3, shape=box, style=filled, color=grey]; + "542E" [label="0fabab47", shape=box, style=filled, color=grey]; + "544E" [label="1b82200", shape=box, style=filled, color=grey]; + 297 [label="2ced414a91575a48f2dd29a", shape=hexagon]; + "46E" [label="85221d5e9e", shape=box, style=filled, color=grey]; + "93E" [label="97a7eea3f", shape=box, style=filled, color=grey]; + "206E" [label="4d22e1", shape=box, style=filled, color=grey]; + "426E" [label=e65185ca, shape=box, style=filled, color=grey]; + "550E" [shape=box, style=filled, color=grey]; + "706E" [label=a9012b7bb5, shape=box, style=filled, color=grey]; + 298 [label="38f162cf917ce7298663a1f1c607", shape=hexagon]; + "36E" [label=a031c9192ae8e75, shape=box, style=filled, color=grey]; + "95E" [label="062fc905b9eb35", shape=box, style=filled, color=grey]; + "364E" [label=c8fc17180bea86, shape=box, style=filled, color=grey]; + "394E" [label="09e64744536c5e1", shape=box, style=filled, color=grey]; + "420E" [label=af4a1fac3e2076, shape=box, style=filled, color=grey]; + "456E" [label="238805e2194c3", shape=box, style=filled, color=grey]; + "624E" [label="73e6ed83012", shape=box, style=filled, color=grey]; + 299 [label="549fa15d68f0b3bee6192f888cd8", shape=hexagon]; + "48E" [label=d17f8f4eeb8e63d, shape=box, style=filled, color=grey]; + "168E" [label=cca7040e47789, shape=box, style=filled, color=grey]; + "260E" [label="47ebc3f17", shape=box, style=filled, color=grey]; + "282E" [label=cf5a6049ad, shape=box, style=filled, color=grey]; + "554E" [label="2a47a6a27", shape=box, style=filled, color=grey]; + "590E" [label=eff3468631dd4, shape=box, style=filled, color=grey]; + "767E" [label=efb52b499303115c33fd, shape=box, style=filled, color=grey]; + 300 [label="8593dcf973b110d00cecdc1e756", shape=hexagon, style=filled, color="#ff7f00"]; + "62E" [label="472a156cf2b55f", shape=box, style=filled, color=grey]; + "190E" [label=647, shape=box, style=filled, color=grey]; + "226E" [shape=box, style=filled, color=grey]; + "238E" [label="8a", shape=box, style=filled, color=grey]; + "254E" [shape=box, style=filled, color=grey]; + "256E" [shape=box, style=filled, color=grey]; + "262E" [shape=box, style=filled, color=grey]; + "266E" [label=e8b, shape=box, style=filled, color=grey]; + "274E" [shape=box, style=filled, color=grey]; + "276E" [label=f, shape=box, style=filled, color=grey]; + "294E" [shape=box, style=filled, color=grey]; + "296E" [shape=box, style=filled, color=grey]; + "310E" [label="1b34fb150", shape=box, style=filled, color=grey]; + "320E" [shape=box, style=filled, color=grey]; + "322E" [label=a7d2, shape=box, style=filled, color=grey]; + "332E" [shape=box, style=filled, color=grey]; + "340E" [shape=box, style=filled, color=grey]; + "344E" [label=f55670, shape=box, style=filled, color=grey]; + "346E" [label="1ed67841", shape=box, style=filled, color=grey]; + "348E" [label=07283, shape=box, style=filled, color=grey]; + "374E" [label="73ba1714ee", shape=box, style=filled, color=grey]; + "378E" [label=27709106, shape=box, style=filled, color=grey]; + "452E" [label="93ea0", shape=box, style=filled, color=grey]; + "508E" [shape=box, style=filled, color=grey]; + "524E" [label="1d792d81", shape=box, style=filled, color=grey]; + "612E" [label=a, shape=box, style=filled, color=grey]; + "626E" [shape=box, style=filled, color=grey]; + "638E" [shape=box, style=filled, color=grey]; + "644E" [shape=box, style=filled, color=grey]; + "654E" [shape=box, style=filled, color=grey]; + "672E" [shape=box, style=filled, color=grey]; + 302 [label="23f94655294d3ff537f2915fa", shape=hexagon]; + "797E" [shape=box, style=filled, color=grey]; + "798E" [label=a2eab7c9fa641e5f, shape=box, style=filled, color=grey]; + 303 [label=a9058241db5b6b6c25569acdf5, shape=hexagon]; + "52E" [label=b2babf3244213, shape=box, style=filled, color=grey]; + "650E" [label=b354cd9e9dbb0bfa, shape=box, style=filled, color=grey]; + 304 [label=bdbdb31bd777fb65dd6dd2d0e7, shape=hexagon]; + "50E" [label="3bec1c012b498", shape=box, style=filled, color=grey]; + "640E" [label=c54f0fc1e05, shape=box, style=filled, color=grey]; + "646E" [label="9ab6c66dc", shape=box, style=filled, color=grey]; + "652E" [label="699e3db878047", shape=box, style=filled, color=grey]; + 306 [label="1d4ea80c7194689d69f9592186", shape=hexagon]; + "55E" [label="8066f87a88f4e", shape=box, style=filled, color=grey]; + "220E" [label="3a8173d6c", shape=box, style=filled, color=grey]; + "338E" [label="24dfe1a997a", shape=box, style=filled, color=grey]; + "368E" [label="65a1", shape=box, style=filled, color=grey]; + "486E" [label="59a8b435ccd", shape=box, style=filled, color=grey]; + "490E" [label="86e9b0428", shape=box, style=filled, color=grey]; + "562E" [label="5a7a610a8a", shape=box, style=filled, color=grey]; + "564E" [label="8f143077e", shape=box, style=filled, color=grey]; + "600E" [label="6472c2861e0e0dd681", shape=box, style=filled, color=grey]; + "668E" [label=f0f45e707, shape=box, style=filled, color=grey]; + "674E" [label="95e93c4a13", shape=box, style=filled, color=grey]; + "698E" [label="33e1de", shape=box, style=filled, color=grey]; + 307 [label="7204950f6233bf9c9e1f00d4a870", shape=hexagon]; + "107E" [label=ccceeef40edda78, shape=box, style=filled, color=grey]; + 308 [label=a2c4b1d72e2da483a86ae0c62e5, shape=hexagon]; + "108E" [label=eedc819a68add6, shape=box, style=filled, color=grey]; + 309 [label=f603819d560c5603259aa05dca, shape=hexagon]; + "109E" [label=acacfc83af504, shape=box, style=filled, color=grey]; + 310 [label="2f43cba12702078b4e0d3bfdae2bc", shape=hexagon]; + "110E" [label="3c1edc8de4795936", shape=box, style=filled, color=grey]; + 311 [label="8f9cdc26798117dd3e9ee4a8770", shape=hexagon]; + "58E" [label="881d373", shape=box, style=filled, color=grey]; + "234E" [shape=box, style=filled, color=grey]; + "300E" [shape=box, style=filled, color=grey]; + "306E" [label="8c7cd9b93b1cbe48e1", shape=box, style=filled, color=grey]; + "314E" [label="616d8a7b", shape=box, style=filled, color=grey]; + "342E" [shape=box, style=filled, color=grey]; + "354E" [shape=box, style=filled, color=grey]; + "370E" [shape=box, style=filled, color=grey]; + "382E" [shape=box, style=filled, color=grey]; + "422E" [shape=box, style=filled, color=grey]; + "444E" [shape=box, style=filled, color=grey]; + "582E" [shape=box, style=filled, color=grey]; + "620E" [shape=box, style=filled, color=grey]; + "630E" [shape=box, style=filled, color=grey]; + "684E" [shape=box, style=filled, color=grey]; + "696E" [shape=box, style=filled, color=grey]; + "801E" [shape=box, style=filled, color=grey]; + 312 [label="97c9d726e27304311901a52ce", shape=hexagon, style=filled, color="#ff0000"]; + "42E" [label="1112164c2f7a", shape=box, style=filled, color=grey]; + "192E" [label="5c609b12c", shape=box, style=filled, color=grey]; + "194E" [label=00265, shape=box, style=filled, color=grey]; + "196E" [label=04767, shape=box, style=filled, color=grey]; + "198E" [label=f0d99f16, shape=box, style=filled, color=grey]; + "200E" [shape=box, style=filled, color=grey]; + "202E" [label="6e186b", shape=box, style=filled, color=grey]; + "204E" [label=d382, shape=box, style=filled, color=grey]; + "312E" [label=c6b5321a, shape=box, style=filled, color=grey]; + "336E" [shape=box, style=filled, color=grey]; + "376E" [shape=box, style=filled, color=grey]; + "384E" [label=aeb8, shape=box, style=filled, color=grey]; + "386E" [label="2e53009d4a375", shape=box, style=filled, color=grey]; + "428E" [shape=box, style=filled, color=grey]; + "474E" [shape=box, style=filled, color=grey]; + "484E" [shape=box, style=filled, color=grey]; + "546E" [label=dea1d1, shape=box, style=filled, color=grey]; + "548E" [label="5a0b4b906a", shape=box, style=filled, color=grey]; + 314 [label="1727041c622518c9dd24f7c211", shape=hexagon]; + "113E" [label="49704867bee95", shape=box, style=filled, color=grey]; + 315 [label="31f2f9aef958979f9f3532b9b", shape=hexagon, style=filled, color="#ff0000"]; + "43E" [label="47cd70f", shape=box, style=filled, color=grey]; + "240E" [label="248df40dae", shape=box, style=filled, color=grey]; + "298E" [shape=box, style=filled, color=grey]; + "334E" [label="9dd5bf47f", shape=box, style=filled, color=grey]; + "360E" [shape=box, style=filled, color=grey]; + "390E" [label="28533c", shape=box, style=filled, color=grey]; + "418E" [shape=box, style=filled, color=grey]; + "492E" [label=a4c7d0, shape=box, style=filled, color=grey]; + "502E" [label="4f6f7f", shape=box, style=filled, color=grey]; + "584E" [label="7ab64a969", shape=box, style=filled, color=grey]; + "588E" [shape=box, style=filled, color=grey]; + "602E" [label=69, shape=box, style=filled, color=grey]; + "606E" [label="67513d", shape=box, style=filled, color=grey]; + "662E" [label=cf, shape=box, style=filled, color=grey]; + 316 [label=a54092a3033f7d5e41e0a76c1, shape=hexagon]; + "51E" [label="1467f017b74e", shape=box, style=filled, color=grey]; + 317 [label="2043b477ac0393676a4309514d0", shape=hexagon]; + "116E" [label=bdec8c86db51b9, shape=box, style=filled, color=grey]; + 318 [label=ab48d1f65812bc0f8ab6941c3b5, shape=hexagon]; + "74E" [label=81, shape=box, style=filled, color=grey]; + 319 [label=ca3d67754cf62fdafbf0a1e0, shape=hexagon]; + "57E" [label="75b14f1719d", shape=box, style=filled, color=grey]; + "94E" [label="62f36ea98a", shape=box, style=filled, color=grey]; + "350E" [label=e3a76d31ca59a, shape=box, style=filled, color=grey]; + "440E" [label=b3cadc253f7, shape=box, style=filled, color=grey]; + "466E" [label=fb58e11, shape=box, style=filled, color=grey]; + "676E" [label="8606837526d81cdec", shape=box, style=filled, color=grey]; + 320 [label=a7a7f3681dad1250b01cf80bc17, shape=hexagon]; + "60E" [label="2c514b0cd8f7d3", shape=box, style=filled, color=grey]; + "366E" [label="7e494b", shape=box, style=filled, color=grey]; + "434E" [label="15d44ab97", shape=box, style=filled, color=grey]; + "458E" [label="78b2d75d00166", shape=box, style=filled, color=grey]; + "618E" [label="761e0f72f95", shape=box, style=filled, color=grey]; + 321 [label="275afb2b215b966d9fac51b96b9", shape=hexagon]; + "72E" [label=ac284d73563, shape=box, style=filled, color=grey]; + "362E" [label="7e74e1587f3a4d208", shape=box, style=filled, color=grey]; + "372E" [label=ffd1b1af3b6864078f3, shape=box, style=filled, color=grey]; + "572E" [label=b38049e00, shape=box, style=filled, color=grey]; + 322 [label=c3c93c700edc0cb4f95f03c04, shape=hexagon]; + "54E" [label="99237fce1358", shape=box, style=filled, color=grey]; + "222E" [label="3dcf8f454", shape=box, style=filled, color=grey]; + "302E" [label=c5acd20cad2, shape=box, style=filled, color=grey]; + "556E" [label="6c998bf2a5edd", shape=box, style=filled, color=grey]; + "558E" [label="4b683", shape=box, style=filled, color=grey]; + 323 [label="63a3d4fb9d38a0182be6e39e76", shape=hexagon]; + "37E" [label=bba6e6e194ccf, shape=box, style=filled, color=grey]; + "208E" [label=01938827, shape=box, style=filled, color=grey]; + "210E" [label=9, shape=box, style=filled, color=grey]; + "352E" [label="64ef1d545", shape=box, style=filled, color=grey]; + "450E" [label=b473716, shape=box, style=filled, color=grey]; + "568E" [label="7c13bf753da", shape=box, style=filled, color=grey]; + "576E" [label="4e4a79111d", shape=box, style=filled, color=grey]; + "686E" [label=af4abb0d6a99, shape=box, style=filled, color=grey]; + 324 [label="4399cf78123dedd0dfe9776104", shape=hexagon]; + "228E" [label=af9c489df53, shape=box, style=filled, color=grey]; + "248E" [label="3703059dbc5a8", shape=box, style=filled, color=grey]; + "304E" [label="8a46e6", shape=box, style=filled, color=grey]; + "468E" [label=f9d09, shape=box, style=filled, color=grey]; + "578E" [label=cd1e9af3dec2, shape=box, style=filled, color=grey]; + "660E" [label="9e650e89bb", shape=box, style=filled, color=grey]; + "688E" [label=f62b136b2171, shape=box, style=filled, color=grey]; + "694E" [label="4727c415d06bcbef", shape=box, style=filled, color=grey]; + "714E" [label="38b3b0d9", shape=box, style=filled, color=grey]; + "766E" [label=a153512d982, shape=box, style=filled, color=grey]; + 325 [label="40f253cd228f7ac2d0aee", shape=hexagon]; + "97E" [label=a3ff993, shape=box, style=filled, color=grey]; + "506E" [label="7528dd86b", shape=box, style=filled, color=grey]; + 326 [label="89a2505da6179a80202d4a6c3", shape=hexagon]; + "61E" [label="75eea05672a5", shape=box, style=filled, color=grey]; + "175E" [label="3b0c08dd2ca", shape=box, style=filled, color=grey]; + "482E" [label=a3781072b, shape=box, style=filled, color=grey]; + 328 [label="2601085bde1b2450d64509f36", shape=hexagon]; + "75E" [label="0efbd", shape=box, style=filled, color=grey]; + "580E" [label=bb92d1da1f38d52f8ff, shape=box, style=filled, color=grey]; + 329 [label="5c81103c751345d0ee0f4bd", shape=hexagon]; + "96E" [label=b23526044, shape=box, style=filled, color=grey]; + 330 [label=fcbd9ad14139718bc6fcc8b4, shape=hexagon]; + "100E" [label="73ca543bf1", shape=box, style=filled, color=grey]; + "170E" [label=c2f32e2cf9, shape=box, style=filled, color=grey]; + 333 [label="44cbb41a9cfc15497eacd294", shape=doubleoctagon, style=filled, color=yellow]; + "63E" [label="6a91", shape=box, style=filled, color=grey]; + "67E" [label=b074e, shape=box, style=filled, color=grey]; + "68E" [label=06209, shape=box, style=filled, color=grey]; + "69E" [label="58e3dcc618", shape=box, style=filled, color=grey]; + "70E" [label=eee44624da, shape=box, style=filled, color=grey]; + "71E" [label="6a91", shape=box, style=filled, color=grey]; + "802E" [label=e1e8c, shape=box, style=filled, color=grey]; + "793E" [shape=box, style=filled, color=grey]; + 334 [label=b46b0756dba915943839e90a55, shape=doubleoctagon, style=filled, color=yellow]; + "64E" [label="5fdf", shape=box, style=filled, color=grey]; + "81E" [label="3eca1f94dc181", shape=box, style=filled, color=grey]; + "82E" [label="6b1bb9b0e", shape=box, style=filled, color=grey]; + "83E" [label=a54d477232, shape=box, style=filled, color=grey]; + "84E" [label=a164d9f60fbbdd, shape=box, style=filled, color=grey]; + "85E" [label="78c8463ea", shape=box, style=filled, color=grey]; + "86E" [label=c110ba7, shape=box, style=filled, color=grey]; + "87E" [label="3b63cdc0f", shape=box, style=filled, color=grey]; + "88E" [label="6f578c5128", shape=box, style=filled, color=grey]; + "89E" [label="3e048573fd", shape=box, style=filled, color=grey]; + 336 [label="825c7994d5da13afe519861818", shape=tripleoctagon, style=filled, color="#ff0000", URL="tes hi", area=test]; + "1E" [label=f4bef37b6a94bfd00, shape=box, style=filled, color=grey]; + "2E" [label=d2647f8b6d8661d08, shape=box, style=filled, color=grey]; + "3E" [label="964cb56d8f69ff058", shape=box, style=filled, color=grey]; + "4E" [label="4f35e206816c3bd22", shape=box, style=filled, color=grey]; + "5E" [label=affb2d716803a2d3e, shape=box, style=filled, color=grey]; + "6E" [label=e4ae306d9bd669c70, shape=box, style=filled, color=grey]; + "7E" [label="4dbf4395236fb03ed", shape=box, style=filled, color=grey]; + "8E" [label="15b3ad672cd2f713a", shape=box, style=filled, color=grey]; + "9E" [label="8d6e6e0cd9b842a47", shape=box, style=filled, color=grey]; + "10E" [label="00d0dd018fe879f96", shape=box, style=filled, color=grey]; + "11E" [label=f28b78d4803c, shape=box, style=filled, color=grey]; + "12E" [label="2d886da042b5384b4", shape=box, style=filled, color=grey]; + "13E" [label="548c0081a62132b44", shape=box, style=filled, color=grey]; + "14E" [label="52126553e52385d16", shape=box, style=filled, color=grey]; + "15E" [label="9fe716e738eaea34e", shape=box, style=filled, color=grey]; + "16E" [label="5782807b5f575e0a8", shape=box, style=filled, color=grey]; + "17E" [label="792fd6f9df1fa1e33", shape=box, style=filled, color=grey]; + "18E" [label=c471b6fdbfb852661, shape=box, style=filled, color=grey]; + "19E" [label=a84844dfd0052b3b5, shape=box, style=filled, color=grey]; + "20E" [label="724dabdce9744d061", shape=box, style=filled, color=grey]; + "21E" [label="57f7fd2eecec93c8b", shape=box, style=filled, color=grey]; + "22E" [label=baba65f670ee34a88, shape=box, style=filled, color=grey]; + "23E" [label=ac34ec0f0488b17ec, shape=box, style=filled, color=grey]; + "24E" [label="51e74bec5513083bb", shape=box, style=filled, color=grey]; + "25E" [label="8e2d970b2f820ee35", shape=box, style=filled, color=grey]; + "26E" [label="19398d3cd6b9c674f", shape=box, style=filled, color=grey]; + "27E" [label="6505e29f4a11d9530", shape=box, style=filled, color=grey]; + "28E" [label=bc4824f07a9d2bba6, shape=box, style=filled, color=grey]; + "29E" [label="3acbf8a1537e4e1a1", shape=box, style=filled, color=grey]; + "30E" [label="536264e787cf70469", shape=box, style=filled, color=grey]; + "31E" [label=d, shape=box, style=filled, color=grey]; + "65E" [label=d4b2, shape=box, style=filled, color=grey]; + "119E" [label="2a9caef7", shape=box, style=filled, color=grey]; + "150E" [label="73d12", shape=box, style=filled, color=grey]; + "176E" [label="8896166adc0", shape=box, style=filled, color=grey]; + "743E" [label="9f", shape=box, style=filled, color=grey]; + "744E" [label="2e1313c", shape=box, style=filled, color=grey]; + "764E" [label=cd6, shape=box, style=filled, color=grey]; + 337 [label="8304a439f91fc90b3fe8dd35be8", shape=doubleoctagon, style=filled, color=yellow]; + "120E" [label="345d26b3f821fe", shape=box, style=filled, color=grey]; + "121E" [label="357679fea1e2f", shape=box, style=filled, color=grey]; + "122E" [label=c71043819b6a79, shape=box, style=filled, color=grey]; + "123E" [label=f9df653b86fb8df, shape=box, style=filled, color=grey]; + "124E" [label="020df871874cd", shape=box, style=filled, color=grey]; + "125E" [label="4c52fdd8e396692", shape=box, style=filled, color=grey]; + "126E" [label="8b98c3ddbe0b336", shape=box, style=filled, color=grey]; + "127E" [label=d9f4abac731a9e, shape=box, style=filled, color=grey]; + "128E" [label="50f4d9b97aefe", shape=box, style=filled, color=grey]; + "129E" [label=ea920d9f5b295119, shape=box, style=filled, color=grey]; + "130E" [label=ff5c9b242337c, shape=box, style=filled, color=grey]; + "131E" [label="4e12f7ff0918", shape=box, style=filled, color=grey]; + "132E" [label=ee3b6be71d59b, shape=box, style=filled, color=grey]; + "133E" [label="615cd6b5e3d21c", shape=box, style=filled, color=grey]; + "134E" [label="6d52dd1b198bb", shape=box, style=filled, color=grey]; + "135E" [label="8c932e1e502dca", shape=box, style=filled, color=grey]; + "136E" [label=e84330eef281284a, shape=box, style=filled, color=grey]; + "137E" [label="85fc23f1c88b4", shape=box, style=filled, color=grey]; + "138E" [label="5997cb0c083422", shape=box, style=filled, color=grey]; + 339 [label=b1ffbabb24d71f67d1e0ce23c51, shape=doubleoctagon, style=filled, color=yellow]; + "151E" [shape=box, style=filled, color=grey]; + "153E" [label="41a8b095c7fd3", shape=box, style=filled, color=grey]; + "154E" [label="151bcc2a8de7ea634", shape=box, style=filled, color=grey]; + "155E" [label="6c541cad8de1b15", shape=box, style=filled, color=grey]; + "156E" [label=c935c7f4d1090ac, shape=box, style=filled, color=grey]; + "157E" [label="5ce1fcfb042b", shape=box, style=filled, color=grey]; + "158E" [label=531806429433, shape=box, style=filled, color=grey]; + "159E" [label=d285240b89cb, shape=box, style=filled, color=grey]; + "160E" [label=f22c27c0f0a54e, shape=box, style=filled, color=grey]; + "161E" [label="8d0d8314d211d80", shape=box, style=filled, color=grey]; + "162E" [shape=box, style=filled, color=grey]; + 347 [label="9652ab8b55fdb2a36d1f3fe020", shape=hexagon]; + "139E" [label=ef8b68bb5772f3, shape=box, style=filled, color=grey]; + "795E" [label="16c3ae29c0bc713", shape=box, style=filled, color=grey]; + 348 [label="676bbe7d1c1fb71742df534ce8", shape=hexagon]; + "799E" [label=a78eb40ae56aaa9, shape=box, style=filled, color=grey]; + "800E" [label="6aae8d25951", shape=box, style=filled, color=grey]; + 349 [label="66c0220688a999aaf7f1702d1", shape=hexagon]; + "141E" [label="67b6a4dca3a6d", shape=box, style=filled, color=grey]; + 350 [label="1322fb0818783e6f9a4f173d47c52", shape=hexagon]; + "142E" [label="9696c0950295d8cb5", shape=box, style=filled, color=grey]; + "678E" [label=b5c747cc9, shape=box, style=filled, color=grey]; + 351 [label=ff07977fca5513098d220d1eb3a, shape=hexagon]; + "143E" [label="89a36b13f8c344b", shape=box, style=filled, color=grey]; + "232E" [label="56292d076643", shape=box, style=filled, color=grey]; + "680E" [label=b5c747cc9, shape=box, style=filled, color=grey]; + "704E" [label="431430c49", shape=box, style=filled, color=grey]; + 352 [label=a97ef281eafc34b1630d450a1df, shape=hexagon]; + "144E" [label="4ff4e275c710c3b", shape=box, style=filled, color=grey]; + "432E" [label=d13da6273c9b4da, shape=box, style=filled, color=grey]; + 353 [label="72cbb37db85ed3c6eda5dcf8", shape=hexagon]; + "145E" [label="33ff9e43d5ab", shape=box, style=filled, color=grey]; + 354 [label="0f6784e49852c0be0da23b16", shape=hexagon]; + "146E" [label=d4f958b03a98, shape=box, style=filled, color=grey]; + "396E" [label="8e24e9b4e", shape=box, style=filled, color=grey]; + 355 [label="383f5c65cc6c25aa0a0e6dbb", shape=hexagon]; + "147E" [label="1ff8ff951ee9", shape=box, style=filled, color=grey]; + 356 [label=f52a45620969f0df4e6ae1dcd7, shape=hexagon]; + "148E" [label="5256925081c812", shape=box, style=filled, color=grey]; + 357 [label="1f5df34ad75a55a76ef4afa0a47", shape=hexagon]; + "149E" [label="26a185dde9a93dd", shape=box, style=filled, color=grey]; + 358 [label="45ba4d4c61c9601a26d59e47e0260", shape=hexagon]; + "167E" [label="99bd3e7feeb710", shape=box, style=filled, color=grey]; + 359 [label=f95344b0ae31693f3a2746597d4, shape=hexagon]; + "169E" [label="4e8259973f1f", shape=box, style=filled, color=grey]; + 360 [label=b79798b186d6b82288e8be4017d, shape=hexagon]; + "171E" [label="63b079bd5847", shape=box, style=filled, color=grey]; + 361 [label="47e0067f4d853afd2012f04daa8", shape=hexagon]; + "172E" [label="92fb5d4a0805", shape=box, style=filled, color=grey]; + 362 [label=f2b6201774de40a29b504b1f716, shape=hexagon]; + "173E" [label=d7203571944b, shape=box, style=filled, color=grey]; + 363 [label="800422ab81d804eef3e7b91dfba91", shape=hexagon]; + "174E" [label="952316a1a5a785", shape=box, style=filled, color=grey]; + 364 [label="35b941379e1af658078cffb83a2", shape=hexagon]; + "101E" [label="331675c046693f", shape=box, style=filled, color=grey]; + 365 [label=d4f7b7fba7afcf7a72397353ec, shape=hexagon]; + "102E" [label="32c4684b55361", shape=box, style=filled, color=grey]; + 367 [label=e4b45b7a2f884d3734bfd5985656, shape=hexagon]; + "104E" [label="1333074979f2d0b", shape=box, style=filled, color=grey]; + 368 [label="02c2ba83680ab57f236a33d702", shape=hexagon]; + "105E" [label="084d4bfa5853e", shape=box, style=filled, color=grey]; + 369 [label="9ccd974150a18260b207b6584caa", shape=hexagon]; + "106E" [label="28f7bfc40c88e6a", shape=box, style=filled, color=grey]; + 374 [label="653ae44d45dcadeb481b53027d", shape=hexagon]; + "111E" [label="8f95518f48528", shape=box, style=filled, color=grey]; + 375 [label=d66f542ef1ce4d02c59bec65e, shape=hexagon]; + "112E" [label="2ef209509e2a", shape=box, style=filled, color=grey]; + 377 [label=a2984b7a11e49440420058c1d80, shape=hexagon]; + "114E" [label=ef42184297591d, shape=box, style=filled, color=grey]; + 378 [label="31055116421c96b37f72a262bb", shape=hexagon]; + "115E" [label=be9c5958196ed, shape=box, style=filled, color=grey]; + 380 [label="8462bb2eec1a62d19a15865e57c92", shape=hexagon]; + "117E" [label="16a795a1d63f30df", shape=box, style=filled, color=grey]; + "392E" [label="85a34bc9616ff", shape=box, style=filled, color=grey]; + 381 [label=c21eb96fe100a1efaa128181b7, shape=hexagon]; + "118E" [label=f1b0d754353a6, shape=box, style=filled, color=grey]; + 382 [label=e3e284d0cc803d98d674f9c3f6d, shape=doubleoctagon, style=filled, color=yellow]; + "177E" [label="30417faf916", shape=box, style=filled, color=grey]; + "178E" [label=e618df70814a, shape=box, style=filled, color=grey]; + "179E" [label=fa90ddf10bd574, shape=box, style=filled, color=grey]; + "180E" [label="815cc0b83d733", shape=box, style=filled, color=grey]; + "181E" [label=f787d827958c, shape=box, style=filled, color=grey]; + "182E" [label=f20f7f513e, shape=box, style=filled, color=grey]; + "183E" [label="290907417e13", shape=box, style=filled, color=grey]; + "184E" [label=e8386a8e1c8a, shape=box, style=filled, color=grey]; + "185E" [label="319bc900218b", shape=box, style=filled, color=grey]; + "186E" [label="3ba7afb0e48ae1", shape=box, style=filled, color=grey]; + "187E" [label="6ba0776fc8e", shape=box, style=filled, color=grey]; + "188E" [label="09847696ae", shape=box, style=filled, color=grey]; + 383 [label="908f9ad506eae9ab6ada185e3", shape=doubleoctagon, style=filled, color=yellow]; + "730E" [label="65694ca6d575", shape=box, style=filled, color=grey]; + "732E" [label="37f57e81ebed95", shape=box, style=filled, color=grey]; + "741E" [label="9b6c", shape=box, style=filled, color=grey]; + "765E" [label="88ebe2e8782c", shape=box, style=filled, color=grey]; + "796E" [label="901b2105a902ee7791", shape=box, style=filled, color=grey]; + 384 [label="593caebf2037317648bb451aa79", shape=doubleoctagon, style=filled, color=yellow]; + "726E" [label="351dd0aefe480c", shape=box, style=filled, color=grey]; + "728E" [label="56e1a896", shape=box, style=filled, color=grey]; + "742E" [label="5ba4693031", shape=box, style=filled, color=grey]; + 1 -> "189E" [label=" ", color=blue, arrowhead=dot]; + 1 -> "790E" [label=" ", color=blue, arrowhead=dot]; + 2 -> "191E" [label=" ", color=blue, arrowhead=dot]; + 3 -> "193E" [label=" ", color=blue, arrowhead=dot]; + 4 -> "195E" [label=" ", color=blue, arrowhead=dot]; + 5 -> "197E" [label=" ", color=blue, arrowhead=dot]; + 6 -> "199E" [label=" ", color=blue, arrowhead=dot]; + 7 -> "201E" [label=" ", color=blue, arrowhead=dot]; + 8 -> "203E" [label=" ", color=blue, arrowhead=dot]; + 9 -> "725E" [label=" ", color=blue, arrowhead=dot]; + 9 -> "785E" [label=" ", color=blue, arrowhead=dot]; + 10 -> "205E" [label=" ", color=blue, arrowhead=dot]; + 11 -> "207E" [label=" ", color=blue, arrowhead=dot]; + 12 -> "209E" [label=" ", color=blue, arrowhead=dot]; + 13 -> "211E" [label=" ", color=blue, arrowhead=dot]; + 14 -> "213E" [label=" ", color=blue, arrowhead=dot]; + 15 -> "215E" [label=" ", color=blue, arrowhead=dot]; + 16 -> "727E" [label=" ", color=blue, arrowhead=dot]; + 16 -> "784E" [label=" ", color=blue, arrowhead=dot]; + 17 -> "217E" [label=" ", color=blue, arrowhead=dot]; + 17 -> "787E" [label=" ", color=blue, arrowhead=dot]; + 18 -> "219E" [label=" ", color=blue, arrowhead=dot]; + 19 -> "221E" [label=" ", color=blue, arrowhead=dot]; + 20 -> "223E" [label=" ", color=blue, arrowhead=dot]; + 21 -> "225E" [label=" ", color=blue, arrowhead=dot]; + 22 -> "227E" [label=" ", color=blue, arrowhead=dot]; + 22 -> "792E" [label=" ", color=blue, arrowhead=dot]; + 23 -> "231E" [label=" ", color=blue, arrowhead=dot]; + 24 -> "233E" [label=" ", color=blue, arrowhead=dot]; + 25 -> "235E" [label=" ", color=blue, arrowhead=dot]; + 26 -> "237E" [label=" ", color=blue, arrowhead=dot]; + 27 -> "239E" [label=" ", color=blue, arrowhead=dot]; + 27 -> "783E" [label=" ", color=blue, arrowhead=dot]; + 28 -> "241E" [label=" ", color=blue, arrowhead=dot]; + 28 -> "791E" [label=" ", color=blue, arrowhead=dot]; + 29 -> "243E" [label=" ", color=blue, arrowhead=dot]; + 30 -> "245E" [label=" ", color=blue, arrowhead=dot]; + 31 -> "247E" [label=" ", color=blue, arrowhead=dot]; + 32 -> "249E" [label=" ", color=blue, arrowhead=dot]; + 33 -> "251E" [label=" ", color=blue, arrowhead=dot]; + 34 -> "253E" [label=" ", color=blue, arrowhead=dot]; + 35 -> "255E" [label=" ", color=blue, arrowhead=dot]; + 36 -> "257E" [label=" ", color=blue, arrowhead=dot]; + 37 -> "259E" [label=" ", color=blue, arrowhead=dot]; + 38 -> "261E" [label=" ", color=blue, arrowhead=dot]; + 39 -> "263E" [label=" ", color=blue, arrowhead=dot]; + 40 -> "265E" [label=" ", color=blue, arrowhead=dot]; + 41 -> "267E" [label=" ", color=blue, arrowhead=dot]; + 42 -> "269E" [label=" ", color=blue, arrowhead=dot]; + 43 -> "271E" [label=" ", color=blue, arrowhead=dot]; + 44 -> "273E" [label=" ", color=blue, arrowhead=dot]; + 45 -> "275E" [label=" ", color=blue, arrowhead=dot]; + 46 -> "277E" [label=" ", color=blue, arrowhead=dot]; + 47 -> "279E" [label=" ", color=blue, arrowhead=dot]; + 48 -> "281E" [label=" ", color=blue, arrowhead=dot]; + 49 -> "283E" [label=" ", color=blue, arrowhead=dot]; + 50 -> "285E" [label=" ", color=blue, arrowhead=dot]; + 51 -> "287E" [label=" ", color=blue, arrowhead=dot]; + 52 -> "289E" [label=" ", color=blue, arrowhead=dot]; + 53 -> "291E" [label=" ", color=blue, arrowhead=dot]; + 54 -> "293E" [label=" ", color=blue, arrowhead=dot]; + 56 -> "295E" [label=" ", color=blue, arrowhead=dot]; + 57 -> "297E" [label=" ", color=blue, arrowhead=dot]; + 58 -> "299E" [label=" ", color=blue, arrowhead=dot]; + 59 -> "301E" [label=" ", color=blue, arrowhead=dot]; + 59 -> "789E" [label=" ", color=blue, arrowhead=dot]; + 60 -> "303E" [label=" ", color=blue, arrowhead=dot]; + 61 -> "305E" [label=" ", color=blue, arrowhead=dot]; + 62 -> "307E" [label=" ", color=blue, arrowhead=dot]; + 63 -> "309E" [label=" ", color=blue, arrowhead=dot]; + 64 -> "311E" [label=" ", color=blue, arrowhead=dot]; + 65 -> "313E" [label=" ", color=blue, arrowhead=dot]; + 66 -> "315E" [label=" ", color=blue, arrowhead=dot]; + 67 -> "317E" [label=" ", color=blue, arrowhead=dot]; + 68 -> "319E" [label=" ", color=blue, arrowhead=dot]; + 70 -> "321E" [label=" ", color=blue, arrowhead=dot]; + 71 -> "327E" [label=" ", color=blue, arrowhead=dot]; + 72 -> "329E" [label=" ", color=blue, arrowhead=dot]; + 73 -> "331E" [label=" ", color=blue, arrowhead=dot]; + 74 -> "333E" [label=" ", color=blue, arrowhead=dot]; + 75 -> "335E" [label=" ", color=blue, arrowhead=dot]; + 76 -> "337E" [label=" ", color=blue, arrowhead=dot]; + 77 -> "339E" [label=" ", color=blue, arrowhead=dot]; + 78 -> "341E" [label=" ", color=blue, arrowhead=dot]; + 79 -> "343E" [label=" ", color=blue, arrowhead=dot]; + 80 -> "345E" [label=" ", color=blue, arrowhead=dot]; + 81 -> "347E" [label=" ", color=blue, arrowhead=dot]; + 82 -> "349E" [label=" ", color=blue, arrowhead=dot]; + 83 -> "351E" [label=" ", color=blue, arrowhead=dot]; + 84 -> "353E" [label=" ", color=blue, arrowhead=dot]; + 85 -> "355E" [label=" ", color=blue, arrowhead=dot]; + 85 -> "788E" [label=" ", color=blue, arrowhead=dot]; + 86 -> "357E" [label=" ", color=blue, arrowhead=dot]; + 87 -> "359E" [label=" ", color=blue, arrowhead=dot]; + 88 -> "361E" [label=" ", color=blue, arrowhead=dot]; + 89 -> "363E" [label=" ", color=blue, arrowhead=dot]; + 90 -> "365E" [label=" ", color=blue, arrowhead=dot]; + 91 -> "367E" [label=" ", color=blue, arrowhead=dot]; + 92 -> "369E" [label=" ", color=blue, arrowhead=dot]; + 93 -> "729E" [label=" ", color=blue, arrowhead=dot]; + 94 -> "371E" [label=" ", color=blue, arrowhead=dot]; + 95 -> "373E" [label=" ", color=blue, arrowhead=dot]; + 96 -> "375E" [label=" ", color=blue, arrowhead=dot]; + 98 -> "377E" [label=" ", color=blue, arrowhead=dot]; + 99 -> "379E" [label=" ", color=blue, arrowhead=dot]; + 100 -> "381E" [label=" ", color=blue, arrowhead=dot]; + 101 -> "383E" [label=" ", color=blue, arrowhead=dot]; + 102 -> "385E" [label=" ", color=blue, arrowhead=dot]; + 103 -> "387E" [label=" ", color=blue, arrowhead=dot]; + 104 -> "389E" [label=" ", color=blue, arrowhead=dot]; + 105 -> "391E" [label=" ", color=blue, arrowhead=dot]; + 106 -> "393E" [label=" ", color=blue, arrowhead=dot]; + 107 -> "395E" [label=" ", color=blue, arrowhead=dot]; + 108 -> "397E" [label=" ", color=blue, arrowhead=dot]; + 109 -> "399E" [label=" ", color=blue, arrowhead=dot]; + 110 -> "401E" [label=" ", color=blue, arrowhead=dot]; + 111 -> "403E" [label=" ", color=blue, arrowhead=dot]; + 112 -> "405E" [label=" ", color=blue, arrowhead=dot]; + 113 -> "407E" [label=" ", color=blue, arrowhead=dot]; + 114 -> "409E" [label=" ", color=blue, arrowhead=dot]; + 115 -> "411E" [label=" ", color=blue, arrowhead=dot]; + 116 -> "413E" [label=" ", color=blue, arrowhead=dot]; + 117 -> "415E" [label=" ", color=blue, arrowhead=dot]; + 118 -> "417E" [label=" ", color=blue, arrowhead=dot]; + 119 -> "419E" [label=" ", color=blue, arrowhead=dot]; + 120 -> "421E" [label=" ", color=blue, arrowhead=dot]; + 121 -> "423E" [label=" ", color=blue, arrowhead=dot]; + 123 -> "425E" [label=" ", color=blue, arrowhead=dot]; + 124 -> "427E" [label=" ", color=blue, arrowhead=dot]; + 124 -> "786E" [label=" ", color=blue, arrowhead=dot]; + 125 -> "431E" [label=" ", color=blue, arrowhead=dot]; + 126 -> "433E" [label=" ", color=blue, arrowhead=dot]; + 127 -> "435E" [label=" ", color=blue, arrowhead=dot]; + 128 -> "437E" [label=" ", color=blue, arrowhead=dot]; + 129 -> "439E" [label=" ", color=blue, arrowhead=dot]; + 130 -> "441E" [label=" ", color=blue, arrowhead=dot]; + 131 -> "443E" [label=" ", color=blue, arrowhead=dot]; + 132 -> "445E" [label=" ", color=blue, arrowhead=dot]; + 134 -> "447E" [label=" ", color=blue, arrowhead=dot]; + 135 -> "449E" [label=" ", color=blue, arrowhead=dot]; + 135 -> "769E" [label=" ", color=blue, arrowhead=dot]; + 135 -> "770E" [label=" ", color=blue, arrowhead=dot]; + 136 -> "451E" [label=" ", color=blue, arrowhead=dot]; + 137 -> "453E" [label=" ", color=blue, arrowhead=dot]; + 138 -> "455E" [label=" ", color=blue, arrowhead=dot]; + 139 -> "457E" [label=" ", color=blue, arrowhead=dot]; + 140 -> "459E" [label=" ", color=blue, arrowhead=dot]; + 141 -> "461E" [label=" ", color=blue, arrowhead=dot]; + 142 -> "463E" [label=" ", color=blue, arrowhead=dot]; + 143 -> "465E" [label=" ", color=blue, arrowhead=dot]; + 144 -> "467E" [label=" ", color=blue, arrowhead=dot]; + 145 -> "469E" [label=" ", color=blue, arrowhead=dot]; + 146 -> "471E" [label=" ", color=blue, arrowhead=dot]; + 147 -> "473E" [label=" ", color=blue, arrowhead=dot]; + 148 -> "475E" [label=" ", color=blue, arrowhead=dot]; + 149 -> "477E" [label=" ", color=blue, arrowhead=dot]; + 150 -> "479E" [label=" ", color=blue, arrowhead=dot]; + 151 -> "481E" [label=" ", color=blue, arrowhead=dot]; + 152 -> "483E" [label=" ", color=blue, arrowhead=dot]; + 153 -> "731E" [label=" ", color=blue, arrowhead=dot]; + 155 -> "485E" [label=" ", color=blue, arrowhead=dot]; + 156 -> "487E" [label=" ", color=blue, arrowhead=dot]; + 157 -> "489E" [label=" ", color=blue, arrowhead=dot]; + 158 -> "491E" [label=" ", color=blue, arrowhead=dot]; + 159 -> "495E" [label=" ", color=blue, arrowhead=dot]; + 160 -> "499E" [label=" ", color=blue, arrowhead=dot]; + 161 -> "501E" [label=" ", color=blue, arrowhead=dot]; + 162 -> "503E" [label=" ", color=blue, arrowhead=dot]; + 163 -> "505E" [label=" ", color=blue, arrowhead=dot]; + 164 -> "507E" [label=" ", color=blue, arrowhead=dot]; + 165 -> "509E" [label=" ", color=blue, arrowhead=dot]; + 166 -> "511E" [label=" ", color=blue, arrowhead=dot]; + 167 -> "513E" [label=" ", color=blue, arrowhead=dot]; + 168 -> "515E" [label=" ", color=blue, arrowhead=dot]; + 169 -> "517E" [label=" ", color=blue, arrowhead=dot]; + 170 -> "519E" [label=" ", color=blue, arrowhead=dot]; + 171 -> "521E" [label=" ", color=blue, arrowhead=dot]; + 172 -> "523E" [label=" ", color=blue, arrowhead=dot]; + 173 -> "525E" [label=" ", color=blue, arrowhead=dot]; + 174 -> "527E" [label=" ", color=blue, arrowhead=dot]; + 175 -> "529E" [label=" ", color=blue, arrowhead=dot]; + 176 -> "531E" [label=" ", color=blue, arrowhead=dot]; + 177 -> "533E" [label=" ", color=blue, arrowhead=dot]; + 178 -> "535E" [label=" ", color=blue, arrowhead=dot]; + 179 -> "537E" [label=" ", color=blue, arrowhead=dot]; + 180 -> "539E" [label=" ", color=blue, arrowhead=dot]; + 181 -> "541E" [label=" ", color=blue, arrowhead=dot]; + 182 -> "543E" [label=" ", color=blue, arrowhead=dot]; + 183 -> "545E" [label=" ", color=blue, arrowhead=dot]; + 184 -> "547E" [label=" ", color=blue, arrowhead=dot]; + 185 -> "549E" [label=" ", color=blue, arrowhead=dot]; + 186 -> "551E" [label=" ", color=blue, arrowhead=dot]; + 187 -> "553E" [label=" ", color=blue, arrowhead=dot]; + 188 -> "555E" [label=" ", color=blue, arrowhead=dot]; + 189 -> "557E" [label=" ", color=blue, arrowhead=dot]; + 190 -> "559E" [label=" ", color=blue, arrowhead=dot]; + 191 -> "561E" [label=" ", color=blue, arrowhead=dot]; + 192 -> "563E" [label=" ", color=blue, arrowhead=dot]; + 193 -> "565E" [label=" ", color=blue, arrowhead=dot]; + 194 -> "567E" [label=" ", color=blue, arrowhead=dot]; + 195 -> "569E" [label=" ", color=blue, arrowhead=dot]; + 196 -> "571E" [label=" ", color=blue, arrowhead=dot]; + 197 -> "573E" [label=" ", color=blue, arrowhead=dot]; + 198 -> "575E" [label=" ", color=blue, arrowhead=dot]; + 199 -> "577E" [label=" ", color=blue, arrowhead=dot]; + 200 -> "579E" [label=" ", color=blue, arrowhead=dot]; + 201 -> "581E" [label=" ", color=blue, arrowhead=dot]; + 202 -> "583E" [label=" ", color=blue, arrowhead=dot]; + 203 -> "585E" [label=" ", color=blue, arrowhead=dot]; + 204 -> "587E" [label=" ", color=blue, arrowhead=dot]; + 206 -> "589E" [label=" ", color=blue, arrowhead=dot]; + 208 -> "597E" [label=" ", color=blue, arrowhead=dot]; + 209 -> "599E" [label=" ", color=blue, arrowhead=dot]; + 210 -> "601E" [label=" ", color=blue, arrowhead=dot]; + 211 -> "603E" [label=" ", color=blue, arrowhead=dot]; + 212 -> "605E" [label=" ", color=blue, arrowhead=dot]; + 213 -> "607E" [label=" ", color=blue, arrowhead=dot]; + 214 -> "609E" [label=" ", color=blue, arrowhead=dot]; + 215 -> "611E" [label=" ", color=blue, arrowhead=dot]; + 216 -> "613E" [label=" ", color=blue, arrowhead=dot]; + 217 -> "615E" [label=" ", color=blue, arrowhead=dot]; + 218 -> "617E" [label=" ", color=blue, arrowhead=dot]; + 219 -> "619E" [label=" ", color=blue, arrowhead=dot]; + 221 -> "623E" [label=" ", color=blue, arrowhead=dot]; + 223 -> "625E" [label=" ", color=blue, arrowhead=dot]; + 224 -> "627E" [label=" ", color=blue, arrowhead=dot]; + 225 -> "629E" [label=" ", color=blue, arrowhead=dot]; + 226 -> "631E" [label=" ", color=blue, arrowhead=dot]; + 227 -> "633E" [label=" ", color=blue, arrowhead=dot]; + 228 -> "635E" [label=" ", color=blue, arrowhead=dot]; + 229 -> "637E" [label=" ", color=blue, arrowhead=dot]; + 230 -> "639E" [label=" ", color=blue, arrowhead=dot]; + 231 -> "641E" [label=" ", color=blue, arrowhead=dot]; + 232 -> "643E" [label=" ", color=blue, arrowhead=dot]; + 233 -> "645E" [label=" ", color=blue, arrowhead=dot]; + 234 -> "647E" [label=" ", color=blue, arrowhead=dot]; + 235 -> "649E" [label=" ", color=blue, arrowhead=dot]; + 236 -> "651E" [label=" ", color=blue, arrowhead=dot]; + 237 -> "653E" [label=" ", color=blue, arrowhead=dot]; + 238 -> "655E" [label=" ", color=blue, arrowhead=dot]; + 239 -> "657E" [label=" ", color=blue, arrowhead=dot]; + 240 -> "659E" [label=" ", color=blue, arrowhead=dot]; + 241 -> "661E" [label=" ", color=blue, arrowhead=dot]; + 242 -> "663E" [label=" ", color=blue, arrowhead=dot]; + 243 -> "665E" [label=" ", color=blue, arrowhead=dot]; + 244 -> "667E" [label=" ", color=blue, arrowhead=dot]; + 245 -> "669E" [label=" ", color=blue, arrowhead=dot]; + 246 -> "671E" [label=" ", color=blue, arrowhead=dot]; + 247 -> "673E" [label=" ", color=blue, arrowhead=dot]; + 248 -> "675E" [label=" ", color=blue, arrowhead=dot]; + 249 -> "679E" [label=" ", color=blue, arrowhead=dot]; + 251 -> "681E" [label=" ", color=blue, arrowhead=dot]; + 252 -> "683E" [label=" ", color=blue, arrowhead=dot]; + 253 -> "685E" [label=" ", color=blue, arrowhead=dot]; + 254 -> "687E" [label=" ", color=blue, arrowhead=dot]; + 255 -> "689E" [label=" ", color=blue, arrowhead=dot]; + 256 -> "691E" [label=" ", color=blue, arrowhead=dot]; + 257 -> "693E" [label=" ", color=blue, arrowhead=dot]; + 258 -> "695E" [label=" ", color=blue, arrowhead=dot]; + 259 -> "697E" [label=" ", color=blue, arrowhead=dot]; + 260 -> "699E" [label=" ", color=blue, arrowhead=dot]; + 261 -> "703E" [label=" ", color=blue, arrowhead=dot]; + 262 -> "705E" [label=" ", color=blue, arrowhead=dot]; + 264 -> "709E" [label=" ", color=blue, arrowhead=dot]; + 265 -> "711E" [label=" ", color=blue, arrowhead=dot]; + 266 -> "713E" [label=" ", color=blue, arrowhead=dot]; + 267 -> "715E" [label=" ", color=blue, arrowhead=dot]; + 268 -> "717E" [label=" ", color=blue, arrowhead=dot]; + 269 -> "719E" [label=" ", color=blue, arrowhead=dot]; + 270 -> "721E" [label=" ", color=blue, arrowhead=dot]; + 272 -> "34E" [label=" ", color=blue, arrowhead=dot]; + 272 -> "252E" [label=" ", color=blue, arrowhead=dot]; + 272 -> "436E" [label=" ", color=blue, arrowhead=dot]; + 274 -> "59E" [label=" ", color=blue, arrowhead=dot]; + 274 -> "500E" [label=" ", color=blue, arrowhead=dot]; + 274 -> "720E" [label=" ", color=blue, arrowhead=dot]; + 275 -> "98E" [label=" ", color=blue, arrowhead=dot]; + 278 -> "35E" [label=" ", color=blue, arrowhead=dot]; + 278 -> "488E" [label=" ", color=blue, arrowhead=dot]; + 278 -> "598E" [label=" ", color=blue, arrowhead=dot]; + 278 -> "604E" [label=" ", color=blue, arrowhead=dot]; + 278 -> "628E" [label=" ", color=blue, arrowhead=dot]; + 279 -> "99E" [label=" ", color=blue, arrowhead=dot]; + 280 -> "242E" [label=" ", color=blue, arrowhead=dot]; + 280 -> "270E" [label=" ", color=blue, arrowhead=dot]; + 280 -> "272E" [label=" ", color=blue, arrowhead=dot]; + 280 -> "284E" [label=" ", color=blue, arrowhead=dot]; + 280 -> "286E" [label=" ", color=blue, arrowhead=dot]; + 280 -> "288E" [label=" ", color=blue, arrowhead=dot]; + 280 -> "586E" [label=" ", color=blue, arrowhead=dot]; + 280 -> "763E" [label=" ", color=blue, arrowhead=dot]; + 281 -> "45E" [label=" ", color=blue, arrowhead=dot]; + 281 -> "470E" [label=" ", color=blue, arrowhead=dot]; + 281 -> "670E" [label=" ", color=blue, arrowhead=dot]; + 281 -> "722E" [label=" ", color=blue, arrowhead=dot]; + 282 -> "103E" [label=" ", color=blue, arrowhead=dot]; + 283 -> "165E" [label=" ", color=blue, arrowhead=dot]; + 284 -> "39E" [label=" ", color=blue, arrowhead=dot]; + 284 -> "224E" [label=" ", color=blue, arrowhead=dot]; + 284 -> "268E" [label=" ", color=blue, arrowhead=dot]; + 284 -> "632E" [label=" ", color=blue, arrowhead=dot]; + 284 -> "710E" [label=" ", color=blue, arrowhead=dot]; + 285 -> "53E" [label=" ", color=blue, arrowhead=dot]; + 286 -> "38E" [label=" ", color=blue, arrowhead=dot]; + 286 -> "166E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "40E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "218E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "244E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "246E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "258E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "290E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "292E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "308E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "318E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "388E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "472E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "478E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "566E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "570E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "574E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "608E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "614E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "658E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "664E" [label=" ", color=blue, arrowhead=dot]; + 288 -> "682E" [label=" ", color=blue, arrowhead=dot]; + 289 -> "41E" [label=" ", color=blue, arrowhead=dot]; + 289 -> "636E" [label=" ", color=blue, arrowhead=dot]; + 289 -> "642E" [label=" ", color=blue, arrowhead=dot]; + 289 -> "690E" [label=" ", color=blue, arrowhead=dot]; + 289 -> "700E" [label=" ", color=blue, arrowhead=dot]; + 290 -> "56E" [label=" ", color=blue, arrowhead=dot]; + 290 -> "264E" [label=" ", color=blue, arrowhead=dot]; + 290 -> "510E" [label=" ", color=blue, arrowhead=dot]; + 290 -> "718E" [label=" ", color=blue, arrowhead=dot]; + 291 -> "66E" [label=" ", color=blue, arrowhead=dot]; + 291 -> "76E" [label=" ", color=blue, arrowhead=dot]; + 291 -> "610E" [label=" ", color=blue, arrowhead=dot]; + 292 -> "73E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "49E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "214E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "216E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "236E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "278E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "358E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "398E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "400E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "402E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "404E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "406E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "408E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "412E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "438E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "448E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "476E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "504E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "552E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "634E" [label=" ", color=blue, arrowhead=dot]; + 293 -> "768E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "44E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "92E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "250E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "316E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "380E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "424E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "442E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "446E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "454E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "460E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "462E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "648E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "656E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "666E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "692E" [label=" ", color=blue, arrowhead=dot]; + 295 -> "712E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "47E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "330E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "514E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "516E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "518E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "520E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "522E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "526E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "528E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "530E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "532E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "534E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "536E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "538E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "540E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "542E" [label=" ", color=blue, arrowhead=dot]; + 296 -> "544E" [label=" ", color=blue, arrowhead=dot]; + 297 -> "46E" [label=" ", color=blue, arrowhead=dot]; + 297 -> "93E" [label=" ", color=blue, arrowhead=dot]; + 297 -> "206E" [label=" ", color=blue, arrowhead=dot]; + 297 -> "426E" [label=" ", color=blue, arrowhead=dot]; + 297 -> "550E" [label=" ", color=blue, arrowhead=dot]; + 297 -> "706E" [label=" ", color=blue, arrowhead=dot]; + 298 -> "36E" [label=" ", color=blue, arrowhead=dot]; + 298 -> "95E" [label=" ", color=blue, arrowhead=dot]; + 298 -> "364E" [label=" ", color=blue, arrowhead=dot]; + 298 -> "394E" [label=" ", color=blue, arrowhead=dot]; + 298 -> "420E" [label=" ", color=blue, arrowhead=dot]; + 298 -> "456E" [label=" ", color=blue, arrowhead=dot]; + 298 -> "624E" [label=" ", color=blue, arrowhead=dot]; + 299 -> "48E" [label=" ", color=blue, arrowhead=dot]; + 299 -> "168E" [label=" ", color=blue, arrowhead=dot]; + 299 -> "260E" [label=" ", color=blue, arrowhead=dot]; + 299 -> "282E" [label=" ", color=blue, arrowhead=dot]; + 299 -> "554E" [label=" ", color=blue, arrowhead=dot]; + 299 -> "590E" [label=" ", color=blue, arrowhead=dot]; + 299 -> "767E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "62E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "190E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "226E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "238E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "254E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "256E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "262E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "266E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "274E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "276E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "294E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "296E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "310E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "320E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "322E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "332E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "340E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "344E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "346E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "348E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "374E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "378E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "452E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "508E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "524E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "612E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "626E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "638E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "644E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "654E" [label=" ", color=blue, arrowhead=dot]; + 300 -> "672E" [label=" ", color=blue, arrowhead=dot]; + 302 -> "797E" [label=" ", color=blue, arrowhead=dot]; + 302 -> "798E" [label=" ", color=blue, arrowhead=dot]; + 303 -> "52E" [label=" ", color=blue, arrowhead=dot]; + 303 -> "650E" [label=" ", color=blue, arrowhead=dot]; + 304 -> "50E" [label=" ", color=blue, arrowhead=dot]; + 304 -> "640E" [label=" ", color=blue, arrowhead=dot]; + 304 -> "646E" [label=" ", color=blue, arrowhead=dot]; + 304 -> "652E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "55E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "220E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "338E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "368E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "486E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "490E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "562E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "564E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "600E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "668E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "674E" [label=" ", color=blue, arrowhead=dot]; + 306 -> "698E" [label=" ", color=blue, arrowhead=dot]; + 307 -> "107E" [label=" ", color=blue, arrowhead=dot]; + 308 -> "108E" [label=" ", color=blue, arrowhead=dot]; + 309 -> "109E" [label=" ", color=blue, arrowhead=dot]; + 310 -> "110E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "58E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "234E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "300E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "306E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "314E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "342E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "354E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "370E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "382E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "422E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "444E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "582E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "620E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "630E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "684E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "696E" [label=" ", color=blue, arrowhead=dot]; + 311 -> "801E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "42E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "192E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "194E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "196E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "198E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "200E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "202E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "204E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "312E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "336E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "376E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "384E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "386E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "428E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "474E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "484E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "546E" [label=" ", color=blue, arrowhead=dot]; + 312 -> "548E" [label=" ", color=blue, arrowhead=dot]; + 314 -> "113E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "43E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "240E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "298E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "334E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "360E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "390E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "418E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "492E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "502E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "584E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "588E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "602E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "606E" [label=" ", color=blue, arrowhead=dot]; + 315 -> "662E" [label=" ", color=blue, arrowhead=dot]; + 316 -> "51E" [label=" ", color=blue, arrowhead=dot]; + 317 -> "116E" [label=" ", color=blue, arrowhead=dot]; + 318 -> "74E" [label=" ", color=blue, arrowhead=dot]; + 319 -> "57E" [label=" ", color=blue, arrowhead=dot]; + 319 -> "94E" [label=" ", color=blue, arrowhead=dot]; + 319 -> "350E" [label=" ", color=blue, arrowhead=dot]; + 319 -> "440E" [label=" ", color=blue, arrowhead=dot]; + 319 -> "466E" [label=" ", color=blue, arrowhead=dot]; + 319 -> "676E" [label=" ", color=blue, arrowhead=dot]; + 320 -> "60E" [label=" ", color=blue, arrowhead=dot]; + 320 -> "366E" [label=" ", color=blue, arrowhead=dot]; + 320 -> "434E" [label=" ", color=blue, arrowhead=dot]; + 320 -> "458E" [label=" ", color=blue, arrowhead=dot]; + 320 -> "618E" [label=" ", color=blue, arrowhead=dot]; + 321 -> "72E" [label=" ", color=blue, arrowhead=dot]; + 321 -> "362E" [label=" ", color=blue, arrowhead=dot]; + 321 -> "372E" [label=" ", color=blue, arrowhead=dot]; + 321 -> "572E" [label=" ", color=blue, arrowhead=dot]; + 322 -> "54E" [label=" ", color=blue, arrowhead=dot]; + 322 -> "222E" [label=" ", color=blue, arrowhead=dot]; + 322 -> "302E" [label=" ", color=blue, arrowhead=dot]; + 322 -> "556E" [label=" ", color=blue, arrowhead=dot]; + 322 -> "558E" [label=" ", color=blue, arrowhead=dot]; + 323 -> "37E" [label=" ", color=blue, arrowhead=dot]; + 323 -> "208E" [label=" ", color=blue, arrowhead=dot]; + 323 -> "210E" [label=" ", color=blue, arrowhead=dot]; + 323 -> "352E" [label=" ", color=blue, arrowhead=dot]; + 323 -> "450E" [label=" ", color=blue, arrowhead=dot]; + 323 -> "568E" [label=" ", color=blue, arrowhead=dot]; + 323 -> "576E" [label=" ", color=blue, arrowhead=dot]; + 323 -> "686E" [label=" ", color=blue, arrowhead=dot]; + 324 -> "228E" [label=" ", color=blue, arrowhead=dot]; + 324 -> "248E" [label=" ", color=blue, arrowhead=dot]; + 324 -> "304E" [label=" ", color=blue, arrowhead=dot]; + 324 -> "468E" [label=" ", color=blue, arrowhead=dot]; + 324 -> "578E" [label=" ", color=blue, arrowhead=dot]; + 324 -> "660E" [label=" ", color=blue, arrowhead=dot]; + 324 -> "688E" [label=" ", color=blue, arrowhead=dot]; + 324 -> "694E" [label=" ", color=blue, arrowhead=dot]; + 324 -> "714E" [label=" ", color=blue, arrowhead=dot]; + 324 -> "766E" [label=" ", color=blue, arrowhead=dot]; + 325 -> "97E" [label=" ", color=blue, arrowhead=dot]; + 325 -> "506E" [label=" ", color=blue, arrowhead=dot]; + 326 -> "61E" [label=" ", color=blue, arrowhead=dot]; + 326 -> "175E" [label=" ", color=blue, arrowhead=dot]; + 326 -> "482E" [label=" ", color=blue, arrowhead=dot]; + 328 -> "75E" [label=" ", color=blue, arrowhead=dot]; + 328 -> "580E" [label=" ", color=blue, arrowhead=dot]; + 329 -> "96E" [label=" ", color=blue, arrowhead=dot]; + 330 -> "100E" [label=" ", color=blue, arrowhead=dot]; + 330 -> "170E" [label=" ", color=blue, arrowhead=dot]; + 333 -> "63E" [label=" ", color=blue, arrowhead=dot]; + 333 -> "67E" [label=" ", color=blue, arrowhead=dot]; + 333 -> "68E" [label=" ", color=blue, arrowhead=dot]; + 333 -> "69E" [label=" ", color=blue, arrowhead=dot]; + 333 -> "70E" [label=" ", color=blue, arrowhead=dot]; + 333 -> "71E" [label=" ", color=blue, arrowhead=dot]; + 333 -> "802E" [label=" ", color=blue, arrowhead=dot]; + 333 -> "793E" [label=" ", color=blue, arrowhead=dot]; + 334 -> "64E" [label=" ", color=blue, arrowhead=dot]; + 334 -> "81E" [label=" ", color=blue, arrowhead=dot]; + 334 -> "82E" [label=" ", color=blue, arrowhead=dot]; + 334 -> "83E" [label=" ", color=blue, arrowhead=dot]; + 334 -> "84E" [label=" ", color=blue, arrowhead=dot]; + 334 -> "85E" [label=" ", color=blue, arrowhead=dot]; + 334 -> "86E" [label=" ", color=blue, arrowhead=dot]; + 334 -> "87E" [label=" ", color=blue, arrowhead=dot]; + 334 -> "88E" [label=" ", color=blue, arrowhead=dot]; + 334 -> "89E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "1E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "2E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "3E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "4E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "5E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "6E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "7E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "8E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "9E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "10E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "11E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "12E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "13E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "14E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "15E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "16E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "17E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "18E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "19E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "20E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "21E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "22E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "23E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "24E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "25E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "26E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "27E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "28E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "29E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "30E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "31E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "65E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "119E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "150E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "176E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "743E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "744E" [label=" ", color=blue, arrowhead=dot]; + 336 -> "764E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "120E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "121E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "122E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "123E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "124E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "125E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "126E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "127E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "128E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "129E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "130E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "131E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "132E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "133E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "134E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "135E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "136E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "137E" [label=" ", color=blue, arrowhead=dot]; + 337 -> "138E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "151E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "153E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "154E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "155E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "156E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "157E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "158E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "159E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "160E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "161E" [label=" ", color=blue, arrowhead=dot]; + 339 -> "162E" [label=" ", color=blue, arrowhead=dot]; + 347 -> "139E" [label=" ", color=blue, arrowhead=dot]; + 347 -> "795E" [label=" ", color=blue, arrowhead=dot]; + 348 -> "799E" [label=" ", color=blue, arrowhead=dot]; + 348 -> "800E" [label=" ", color=blue, arrowhead=dot]; + 349 -> "141E" [label=" ", color=blue, arrowhead=dot]; + 350 -> "142E" [label=" ", color=blue, arrowhead=dot]; + 350 -> "678E" [label=" ", color=blue, arrowhead=dot]; + 351 -> "143E" [label=" ", color=blue, arrowhead=dot]; + 351 -> "232E" [label=" ", color=blue, arrowhead=dot]; + 351 -> "680E" [label=" ", color=blue, arrowhead=dot]; + 351 -> "704E" [label=" ", color=blue, arrowhead=dot]; + 352 -> "144E" [label=" ", color=blue, arrowhead=dot]; + 352 -> "432E" [label=" ", color=blue, arrowhead=dot]; + 353 -> "145E" [label=" ", color=blue, arrowhead=dot]; + 354 -> "146E" [label=" ", color=blue, arrowhead=dot]; + 354 -> "396E" [label=" ", color=blue, arrowhead=dot]; + 355 -> "147E" [label=" ", color=blue, arrowhead=dot]; + 356 -> "148E" [label=" ", color=blue, arrowhead=dot]; + 357 -> "149E" [label=" ", color=blue, arrowhead=dot]; + 358 -> "167E" [label=" ", color=blue, arrowhead=dot]; + 359 -> "169E" [label=" ", color=blue, arrowhead=dot]; + 360 -> "171E" [label=" ", color=blue, arrowhead=dot]; + 361 -> "172E" [label=" ", color=blue, arrowhead=dot]; + 362 -> "173E" [label=" ", color=blue, arrowhead=dot]; + 363 -> "174E" [label=" ", color=blue, arrowhead=dot]; + 364 -> "101E" [label=" ", color=blue, arrowhead=dot]; + 365 -> "102E" [label=" ", color=blue, arrowhead=dot]; + 367 -> "104E" [label=" ", color=blue, arrowhead=dot]; + 368 -> "105E" [label=" ", color=blue, arrowhead=dot]; + 369 -> "106E" [label=" ", color=blue, arrowhead=dot]; + 374 -> "111E" [label=" ", color=blue, arrowhead=dot]; + 375 -> "112E" [label=" ", color=blue, arrowhead=dot]; + 377 -> "114E" [label=" ", color=blue, arrowhead=dot]; + 378 -> "115E" [label=" ", color=blue, arrowhead=dot]; + 380 -> "117E" [label=" ", color=blue, arrowhead=dot]; + 380 -> "392E" [label=" ", color=blue, arrowhead=dot]; + 381 -> "118E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "177E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "178E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "179E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "180E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "181E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "182E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "183E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "184E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "185E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "186E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "187E" [label=" ", color=blue, arrowhead=dot]; + 382 -> "188E" [label=" ", color=blue, arrowhead=dot]; + 383 -> "730E" [label=" ", color=blue, arrowhead=dot]; + 383 -> "732E" [label=" ", color=blue, arrowhead=dot]; + 383 -> "741E" [label=" ", color=blue, arrowhead=dot]; + 383 -> "765E" [label=" ", color=blue, arrowhead=dot]; + 383 -> "796E" [label=" ", color=blue, arrowhead=dot]; + 384 -> "726E" [label=" ", color=blue, arrowhead=dot]; + 384 -> "728E" [label=" ", color=blue, arrowhead=dot]; + 384 -> "742E" [label=" ", color=blue, arrowhead=dot]; + "1E" -> "34E" [color=purple, arrowhead=none]; + "2E" -> "35E" [color=purple, arrowhead=none]; + "3E" -> "36E" [color=purple, arrowhead=none]; + "4E" -> "37E" [color=purple, arrowhead=none]; + "5E" -> "38E" [color=purple, arrowhead=none]; + "6E" -> "39E" [color=purple, arrowhead=none]; + "7E" -> "40E" [color=purple, arrowhead=none]; + "9E" -> "41E" [color=purple, arrowhead=none]; + "10E" -> "42E" [color=purple, arrowhead=none]; + "11E" -> "43E" [color=purple, arrowhead=none]; + "12E" -> "44E" [color=purple, arrowhead=none]; + "13E" -> "45E" [color=purple, arrowhead=none]; + "14E" -> "46E" [color=purple, arrowhead=none]; + "15E" -> "47E" [color=purple, arrowhead=none]; + "16E" -> "48E" [color=purple, arrowhead=none]; + "49E" -> "17E" [color=purple, arrowhead=none]; + "18E" -> "50E" [color=purple, arrowhead=none]; + "19E" -> "51E" [color=purple, arrowhead=none]; + "20E" -> "52E" [color=purple, arrowhead=none]; + "21E" -> "53E" [color=purple, arrowhead=none]; + "22E" -> "54E" [color=purple, arrowhead=none]; + "23E" -> "55E" [color=purple, arrowhead=none]; + "24E" -> "56E" [color=purple, arrowhead=none]; + "25E" -> "57E" [color=purple, arrowhead=none]; + "26E" -> "58E" [color=purple, arrowhead=none]; + "27E" -> "59E" [color=purple, arrowhead=none]; + "28E" -> "60E" [color=purple, arrowhead=none]; + "29E" -> "61E" [color=purple, arrowhead=none]; + "30E" -> "62E" [color=purple, arrowhead=none]; + "31E" -> "63E" [color=purple, arrowhead=none]; + "64E" -> "65E" [color=purple, arrowhead=none]; + "66E" -> "8E" [color=purple, arrowhead=none]; + "71E" -> "76E" [color=purple, arrowhead=none]; + "67E" -> "72E" [color=purple, arrowhead=none]; + "68E" -> "73E" [color=purple, arrowhead=none]; + "69E" -> "74E" [color=purple, arrowhead=none]; + "70E" -> "75E" [color=purple, arrowhead=none]; + "81E" -> "92E" [color=purple, arrowhead=none]; + "82E" -> "93E" [color=purple, arrowhead=none]; + "83E" -> "94E" [color=purple, arrowhead=none]; + "84E" -> "95E" [color=purple, arrowhead=none]; + "85E" -> "96E" [color=purple, arrowhead=none]; + "86E" -> "97E" [color=purple, arrowhead=none]; + "87E" -> "98E" [color=purple, arrowhead=none]; + "88E" -> "99E" [color=purple, arrowhead=none]; + "89E" -> "100E" [color=purple, arrowhead=none]; + "101E" -> "120E" [color=purple, arrowhead=none]; + "102E" -> "121E" [color=purple, arrowhead=none]; + "103E" -> "122E" [color=purple, arrowhead=none]; + "104E" -> "123E" [color=purple, arrowhead=none]; + "105E" -> "124E" [color=purple, arrowhead=none]; + "106E" -> "125E" [color=purple, arrowhead=none]; + "107E" -> "126E" [color=purple, arrowhead=none]; + "108E" -> "127E" [color=purple, arrowhead=none]; + "109E" -> "128E" [color=purple, arrowhead=none]; + "110E" -> "129E" [color=purple, arrowhead=none]; + "111E" -> "130E" [color=purple, arrowhead=none]; + "112E" -> "131E" [color=purple, arrowhead=none]; + "113E" -> "132E" [color=purple, arrowhead=none]; + "114E" -> "133E" [color=purple, arrowhead=none]; + "115E" -> "134E" [color=purple, arrowhead=none]; + "116E" -> "135E" [color=purple, arrowhead=none]; + "117E" -> "136E" [color=purple, arrowhead=none]; + "118E" -> "137E" [color=purple, arrowhead=none]; + "119E" -> "138E" [color=purple, arrowhead=none]; + "139E" -> "151E" [color=purple, arrowhead=none]; + "141E" -> "153E" [color=purple, arrowhead=none]; + "142E" -> "154E" [color=purple, arrowhead=none]; + "143E" -> "155E" [color=purple, arrowhead=none]; + "144E" -> "156E" [color=purple, arrowhead=none]; + "145E" -> "157E" [color=purple, arrowhead=none]; + "146E" -> "158E" [color=purple, arrowhead=none]; + "147E" -> "159E" [color=purple, arrowhead=none]; + "148E" -> "160E" [color=purple, arrowhead=none]; + "149E" -> "161E" [color=purple, arrowhead=none]; + "150E" -> "162E" [color=purple, arrowhead=none]; + "165E" -> "177E" [color=purple, arrowhead=none]; + "166E" -> "178E" [color=purple, arrowhead=none]; + "167E" -> "179E" [color=purple, arrowhead=none]; + "168E" -> "180E" [color=purple, arrowhead=none]; + "169E" -> "181E" [color=purple, arrowhead=none]; + "170E" -> "182E" [color=purple, arrowhead=none]; + "171E" -> "183E" [color=purple, arrowhead=none]; + "172E" -> "184E" [color=purple, arrowhead=none]; + "173E" -> "185E" [color=purple, arrowhead=none]; + "174E" -> "186E" [color=purple, arrowhead=none]; + "175E" -> "187E" [color=purple, arrowhead=none]; + "176E" -> "188E" [color=purple, arrowhead=none]; + "189E" -> "190E" [color=purple, arrowhead=none]; + "191E" -> "192E" [color=purple, arrowhead=none]; + "193E" -> "194E" [color=purple, arrowhead=none]; + "195E" -> "196E" [color=purple, arrowhead=none]; + "197E" -> "198E" [color=purple, arrowhead=none]; + "199E" -> "200E" [color=purple, arrowhead=none]; + "201E" -> "202E" [color=purple, arrowhead=none]; + "203E" -> "204E" [color=purple, arrowhead=none]; + "205E" -> "206E" [color=purple, arrowhead=none]; + "207E" -> "208E" [color=purple, arrowhead=none]; + "209E" -> "210E" [color=purple, arrowhead=none]; + "412E" -> "211E" [color=purple, arrowhead=none]; + "214E" -> "213E" [color=purple, arrowhead=none]; + "216E" -> "215E" [color=purple, arrowhead=none]; + "217E" -> "218E" [color=purple, arrowhead=none]; + "219E" -> "220E" [color=purple, arrowhead=none]; + "221E" -> "222E" [color=purple, arrowhead=none]; + "223E" -> "224E" [color=purple, arrowhead=none]; + "225E" -> "226E" [color=purple, arrowhead=none]; + "227E" -> "228E" [color=purple, arrowhead=none]; + "231E" -> "232E" [color=purple, arrowhead=none]; + "233E" -> "234E" [color=purple, arrowhead=none]; + "236E" -> "235E" [color=purple, arrowhead=none]; + "237E" -> "238E" [color=purple, arrowhead=none]; + "239E" -> "240E" [color=purple, arrowhead=none]; + "241E" -> "242E" [color=purple, arrowhead=none]; + "243E" -> "244E" [color=purple, arrowhead=none]; + "245E" -> "246E" [color=purple, arrowhead=none]; + "247E" -> "248E" [color=purple, arrowhead=none]; + "249E" -> "250E" [color=purple, arrowhead=none]; + "251E" -> "252E" [color=purple, arrowhead=none]; + "253E" -> "254E" [color=purple, arrowhead=none]; + "255E" -> "256E" [color=purple, arrowhead=none]; + "257E" -> "258E" [color=purple, arrowhead=none]; + "259E" -> "260E" [color=purple, arrowhead=none]; + "261E" -> "262E" [color=purple, arrowhead=none]; + "263E" -> "264E" [color=purple, arrowhead=none]; + "265E" -> "266E" [color=purple, arrowhead=none]; + "267E" -> "268E" [color=purple, arrowhead=none]; + "269E" -> "270E" [color=purple, arrowhead=none]; + "271E" -> "272E" [color=purple, arrowhead=none]; + "273E" -> "274E" [color=purple, arrowhead=none]; + "275E" -> "276E" [color=purple, arrowhead=none]; + "278E" -> "277E" [color=purple, arrowhead=none]; + "279E" -> "767E" [color=purple, arrowhead=none]; + "281E" -> "282E" [color=purple, arrowhead=none]; + "283E" -> "284E" [color=purple, arrowhead=none]; + "285E" -> "286E" [color=purple, arrowhead=none]; + "768E" -> "287E" [color=purple, arrowhead=none]; + "289E" -> "290E" [color=purple, arrowhead=none]; + "291E" -> "292E" [color=purple, arrowhead=none]; + "293E" -> "294E" [color=purple, arrowhead=none]; + "295E" -> "296E" [color=purple, arrowhead=none]; + "297E" -> "298E" [color=purple, arrowhead=none]; + "299E" -> "300E" [color=purple, arrowhead=none]; + "301E" -> "302E" [color=purple, arrowhead=none]; + "303E" -> "304E" [color=purple, arrowhead=none]; + "305E" -> "306E" [color=purple, arrowhead=none]; + "307E" -> "308E" [color=purple, arrowhead=none]; + "309E" -> "310E" [color=purple, arrowhead=none]; + "311E" -> "312E" [color=purple, arrowhead=none]; + "313E" -> "314E" [color=purple, arrowhead=none]; + "315E" -> "316E" [color=purple, arrowhead=none]; + "317E" -> "318E" [color=purple, arrowhead=none]; + "319E" -> "320E" [color=purple, arrowhead=none]; + "321E" -> "322E" [color=purple, arrowhead=none]; + "327E" -> "800E" [color=purple, arrowhead=none]; + "329E" -> "330E" [color=purple, arrowhead=none]; + "331E" -> "332E" [color=purple, arrowhead=none]; + "333E" -> "334E" [color=purple, arrowhead=none]; + "335E" -> "336E" [color=purple, arrowhead=none]; + "337E" -> "338E" [color=purple, arrowhead=none]; + "339E" -> "340E" [color=purple, arrowhead=none]; + "341E" -> "342E" [color=purple, arrowhead=none]; + "343E" -> "344E" [color=purple, arrowhead=none]; + "345E" -> "346E" [color=purple, arrowhead=none]; + "347E" -> "348E" [color=purple, arrowhead=none]; + "349E" -> "350E" [color=purple, arrowhead=none]; + "351E" -> "352E" [color=purple, arrowhead=none]; + "353E" -> "354E" [color=purple, arrowhead=none]; + "412E" -> "355E" [color=purple, arrowhead=none]; + "357E" -> "358E" [color=purple, arrowhead=none]; + "359E" -> "360E" [color=purple, arrowhead=none]; + "361E" -> "362E" [color=purple, arrowhead=none]; + "363E" -> "364E" [color=purple, arrowhead=none]; + "365E" -> "366E" [color=purple, arrowhead=none]; + "367E" -> "368E" [color=purple, arrowhead=none]; + "369E" -> "370E" [color=purple, arrowhead=none]; + "371E" -> "372E" [color=purple, arrowhead=none]; + "373E" -> "374E" [color=purple, arrowhead=none]; + "375E" -> "376E" [color=purple, arrowhead=none]; + "377E" -> "378E" [color=purple, arrowhead=none]; + "379E" -> "380E" [color=purple, arrowhead=none]; + "381E" -> "382E" [color=purple, arrowhead=none]; + "383E" -> "384E" [color=purple, arrowhead=none]; + "385E" -> "386E" [color=purple, arrowhead=none]; + "387E" -> "388E" [color=purple, arrowhead=none]; + "389E" -> "390E" [color=purple, arrowhead=none]; + "391E" -> "392E" [color=purple, arrowhead=none]; + "393E" -> "394E" [color=purple, arrowhead=none]; + "395E" -> "396E" [color=purple, arrowhead=none]; + "397E" -> "398E" [color=purple, arrowhead=none]; + "399E" -> "400E" [color=purple, arrowhead=none]; + "402E" -> "401E" [color=purple, arrowhead=none]; + "404E" -> "403E" [color=purple, arrowhead=none]; + "406E" -> "405E" [color=purple, arrowhead=none]; + "408E" -> "407E" [color=purple, arrowhead=none]; + "236E" -> "409E" [color=purple, arrowhead=none]; + "412E" -> "411E" [color=purple, arrowhead=none]; + "412E" -> "413E" [color=purple, arrowhead=none]; + "278E" -> "415E" [color=purple, arrowhead=none]; + "417E" -> "418E" [color=purple, arrowhead=none]; + "419E" -> "420E" [color=purple, arrowhead=none]; + "421E" -> "422E" [color=purple, arrowhead=none]; + "423E" -> "424E" [color=purple, arrowhead=none]; + "425E" -> "426E" [color=purple, arrowhead=none]; + "427E" -> "428E" [color=purple, arrowhead=none]; + "431E" -> "432E" [color=purple, arrowhead=none]; + "433E" -> "434E" [color=purple, arrowhead=none]; + "435E" -> "436E" [color=purple, arrowhead=none]; + "438E" -> "437E" [color=purple, arrowhead=none]; + "439E" -> "440E" [color=purple, arrowhead=none]; + "441E" -> "442E" [color=purple, arrowhead=none]; + "443E" -> "444E" [color=purple, arrowhead=none]; + "445E" -> "446E" [color=purple, arrowhead=none]; + "448E" -> "447E" [color=purple, arrowhead=none]; + "449E" -> "450E" [color=purple, arrowhead=none]; + "451E" -> "452E" [color=purple, arrowhead=none]; + "453E" -> "454E" [color=purple, arrowhead=none]; + "455E" -> "456E" [color=purple, arrowhead=none]; + "457E" -> "458E" [color=purple, arrowhead=none]; + "459E" -> "460E" [color=purple, arrowhead=none]; + "461E" -> "462E" [color=purple, arrowhead=none]; + "236E" -> "463E" [color=purple, arrowhead=none]; + "465E" -> "466E" [color=purple, arrowhead=none]; + "467E" -> "468E" [color=purple, arrowhead=none]; + "469E" -> "470E" [color=purple, arrowhead=none]; + "471E" -> "472E" [color=purple, arrowhead=none]; + "473E" -> "474E" [color=purple, arrowhead=none]; + "476E" -> "475E" [color=purple, arrowhead=none]; + "477E" -> "478E" [color=purple, arrowhead=none]; + "479E" -> "358E" [color=purple, arrowhead=none]; + "481E" -> "482E" [color=purple, arrowhead=none]; + "483E" -> "484E" [color=purple, arrowhead=none]; + "485E" -> "486E" [color=purple, arrowhead=none]; + "487E" -> "488E" [color=purple, arrowhead=none]; + "489E" -> "490E" [color=purple, arrowhead=none]; + "491E" -> "492E" [color=purple, arrowhead=none]; + "495E" -> "795E" [color=purple, arrowhead=none]; + "499E" -> "500E" [color=purple, arrowhead=none]; + "501E" -> "502E" [color=purple, arrowhead=none]; + "504E" -> "503E" [color=purple, arrowhead=none]; + "505E" -> "506E" [color=purple, arrowhead=none]; + "507E" -> "508E" [color=purple, arrowhead=none]; + "509E" -> "510E" [color=purple, arrowhead=none]; + "412E" -> "511E" [color=purple, arrowhead=none]; + "513E" -> "514E" [color=purple, arrowhead=none]; + "515E" -> "516E" [color=purple, arrowhead=none]; + "517E" -> "518E" [color=purple, arrowhead=none]; + "519E" -> "520E" [color=purple, arrowhead=none]; + "521E" -> "522E" [color=purple, arrowhead=none]; + "523E" -> "524E" [color=purple, arrowhead=none]; + "525E" -> "526E" [color=purple, arrowhead=none]; + "527E" -> "528E" [color=purple, arrowhead=none]; + "529E" -> "530E" [color=purple, arrowhead=none]; + "531E" -> "532E" [color=purple, arrowhead=none]; + "533E" -> "534E" [color=purple, arrowhead=none]; + "535E" -> "536E" [color=purple, arrowhead=none]; + "537E" -> "538E" [color=purple, arrowhead=none]; + "539E" -> "540E" [color=purple, arrowhead=none]; + "541E" -> "542E" [color=purple, arrowhead=none]; + "543E" -> "544E" [color=purple, arrowhead=none]; + "545E" -> "546E" [color=purple, arrowhead=none]; + "547E" -> "548E" [color=purple, arrowhead=none]; + "549E" -> "550E" [color=purple, arrowhead=none]; + "551E" -> "552E" [color=purple, arrowhead=none]; + "553E" -> "554E" [color=purple, arrowhead=none]; + "555E" -> "556E" [color=purple, arrowhead=none]; + "557E" -> "558E" [color=purple, arrowhead=none]; + "278E" -> "559E" [color=purple, arrowhead=none]; + "561E" -> "562E" [color=purple, arrowhead=none]; + "563E" -> "564E" [color=purple, arrowhead=none]; + "565E" -> "566E" [color=purple, arrowhead=none]; + "567E" -> "568E" [color=purple, arrowhead=none]; + "569E" -> "570E" [color=purple, arrowhead=none]; + "571E" -> "572E" [color=purple, arrowhead=none]; + "573E" -> "574E" [color=purple, arrowhead=none]; + "575E" -> "576E" [color=purple, arrowhead=none]; + "577E" -> "578E" [color=purple, arrowhead=none]; + "579E" -> "580E" [color=purple, arrowhead=none]; + "581E" -> "582E" [color=purple, arrowhead=none]; + "583E" -> "584E" [color=purple, arrowhead=none]; + "585E" -> "586E" [color=purple, arrowhead=none]; + "587E" -> "588E" [color=purple, arrowhead=none]; + "589E" -> "590E" [color=purple, arrowhead=none]; + "597E" -> "598E" [color=purple, arrowhead=none]; + "599E" -> "600E" [color=purple, arrowhead=none]; + "601E" -> "602E" [color=purple, arrowhead=none]; + "603E" -> "604E" [color=purple, arrowhead=none]; + "605E" -> "606E" [color=purple, arrowhead=none]; + "607E" -> "608E" [color=purple, arrowhead=none]; + "609E" -> "610E" [color=purple, arrowhead=none]; + "611E" -> "612E" [color=purple, arrowhead=none]; + "613E" -> "614E" [color=purple, arrowhead=none]; + "615E" -> "358E" [color=purple, arrowhead=none]; + "617E" -> "618E" [color=purple, arrowhead=none]; + "619E" -> "620E" [color=purple, arrowhead=none]; + "623E" -> "624E" [color=purple, arrowhead=none]; + "625E" -> "626E" [color=purple, arrowhead=none]; + "627E" -> "628E" [color=purple, arrowhead=none]; + "629E" -> "630E" [color=purple, arrowhead=none]; + "631E" -> "632E" [color=purple, arrowhead=none]; + "634E" -> "633E" [color=purple, arrowhead=none]; + "635E" -> "636E" [color=purple, arrowhead=none]; + "637E" -> "638E" [color=purple, arrowhead=none]; + "639E" -> "640E" [color=purple, arrowhead=none]; + "641E" -> "642E" [color=purple, arrowhead=none]; + "643E" -> "644E" [color=purple, arrowhead=none]; + "645E" -> "646E" [color=purple, arrowhead=none]; + "647E" -> "648E" [color=purple, arrowhead=none]; + "649E" -> "650E" [color=purple, arrowhead=none]; + "651E" -> "652E" [color=purple, arrowhead=none]; + "653E" -> "654E" [color=purple, arrowhead=none]; + "655E" -> "656E" [color=purple, arrowhead=none]; + "657E" -> "658E" [color=purple, arrowhead=none]; + "659E" -> "660E" [color=purple, arrowhead=none]; + "661E" -> "662E" [color=purple, arrowhead=none]; + "663E" -> "664E" [color=purple, arrowhead=none]; + "665E" -> "666E" [color=purple, arrowhead=none]; + "667E" -> "668E" [color=purple, arrowhead=none]; + "669E" -> "670E" [color=purple, arrowhead=none]; + "671E" -> "672E" [color=purple, arrowhead=none]; + "673E" -> "674E" [color=purple, arrowhead=none]; + "675E" -> "676E" [color=purple, arrowhead=none]; + "679E" -> "680E" [color=purple, arrowhead=none]; + "681E" -> "682E" [color=purple, arrowhead=none]; + "683E" -> "684E" [color=purple, arrowhead=none]; + "685E" -> "686E" [color=purple, arrowhead=none]; + "687E" -> "688E" [color=purple, arrowhead=none]; + "689E" -> "690E" [color=purple, arrowhead=none]; + "691E" -> "692E" [color=purple, arrowhead=none]; + "693E" -> "694E" [color=purple, arrowhead=none]; + "695E" -> "696E" [color=purple, arrowhead=none]; + "697E" -> "698E" [color=purple, arrowhead=none]; + "699E" -> "700E" [color=purple, arrowhead=none]; + "703E" -> "704E" [color=purple, arrowhead=none]; + "705E" -> "706E" [color=purple, arrowhead=none]; + "709E" -> "710E" [color=purple, arrowhead=none]; + "711E" -> "712E" [color=purple, arrowhead=none]; + "713E" -> "714E" [color=purple, arrowhead=none]; + "715E" -> "398E" [color=purple, arrowhead=none]; + "717E" -> "718E" [color=purple, arrowhead=none]; + "719E" -> "720E" [color=purple, arrowhead=none]; + "721E" -> "722E" [color=purple, arrowhead=none]; + "725E" -> "726E" [color=purple, arrowhead=none]; + "727E" -> "728E" [color=purple, arrowhead=none]; + "729E" -> "730E" [color=purple, arrowhead=none]; + "731E" -> "732E" [color=purple, arrowhead=none]; + "741E" -> "743E" [color=purple, arrowhead=none]; + "742E" -> "744E" [color=purple, arrowhead=none]; + "763E" -> "764E" [color=purple, arrowhead=none]; + "765E" -> "766E" [color=purple, arrowhead=none]; + "770E" -> "783E" [color=purple, arrowhead=none]; + "770E" -> "784E" [color=purple, arrowhead=none]; + "769E" -> "785E" [color=purple, arrowhead=none]; + "769E" -> "786E" [color=purple, arrowhead=none]; + "769E" -> "787E" [color=purple, arrowhead=none]; + "770E" -> "788E" [color=purple, arrowhead=none]; + "770E" -> "789E" [color=purple, arrowhead=none]; + "769E" -> "790E" [color=purple, arrowhead=none]; + "770E" -> "791E" [color=purple, arrowhead=none]; + "769E" -> "792E" [color=purple, arrowhead=none]; + "793E" -> "769E" [color=purple, arrowhead=none]; + "769E" -> "784E" [color=purple, arrowhead=none]; + "770E" -> "785E" [color=purple, arrowhead=none]; + "788E" -> "787E" [color=purple, arrowhead=none]; + "770E" -> "792E" [color=purple, arrowhead=none]; + "798E" -> "799E" [color=purple, arrowhead=none]; + "796E" -> "797E" [color=purple, arrowhead=none]; + "793E" -> "789E" [color=purple, arrowhead=none]; + "783E" -> "787E" [color=purple, arrowhead=none]; + "784E" -> "792E" [color=purple, arrowhead=none]; + "787E" -> "789E" [color=purple, arrowhead=none]; + "769E" -> "791E" [color=purple, arrowhead=none]; + "802E" -> "801E" [color=purple, arrowhead=none]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/sdh.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/sdh.gv.txt new file mode 100644 index 000000000..be2199c16 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/sdh.gv.txt @@ -0,0 +1,32 @@ +##"I made a program to generate dot files representing the LR(0) state graph along with computed LALR(1) lookahead for an arbitrary context-free grammar, to make the diagrams I used in this article: http://blog.lab49.com/archives/2471. The program also highlights errant nodes in red if the grammar would produce a shift/reduce or reduce/reduce conflict -- you may be able to go to http://kthielen.dnsalias.com:8082/ to produce a graph more to your liking". Contributed by Kalani Thielen. + +##Command to get the layout: "dot -Gsize=10,15 -Tpng thisfile > thisfile.png" + +digraph g { + graph [fontsize=30 labelloc="t" label="" splines=true overlap=false rankdir = "LR"]; + ratio = auto; + "state0" [ style = "filled, bold" penwidth = 5 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #0
(0) s -> •e $
(1) e -> •l '=' r
(2) e -> •r
(3) l -> •'*' r
(4) l -> •'n'
(5) r -> •l
> ]; + "state1" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #1
(3) l -> •'*' r
(3) l -> '*' •r
(4) l -> •'n'
(5) r -> •l
> ]; + "state2" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #2
(4) l -> 'n' •=$
> ]; + "state3" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #3
(5) r -> l •=$
> ]; + "state4" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #4
(3) l -> '*' r •=$
> ]; + "state5" [ style = "filled" penwidth = 1 fillcolor = "black" fontname = "Courier New" shape = "Mrecord" label =<
State #5
(0) s -> e •$
> ]; + "state6" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #6
(1) e -> l •'=' r
(5) r -> l •$
> ]; + "state7" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #7
(1) e -> l '=' •r
(3) l -> •'*' r
(4) l -> •'n'
(5) r -> •l
> ]; + "state8" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #8
(1) e -> l '=' r •$
> ]; + "state9" [ style = "filled" penwidth = 1 fillcolor = "white" fontname = "Courier New" shape = "Mrecord" label =<
State #9
(2) e -> r •$
> ]; + state0 -> state5 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "e" ]; + state0 -> state6 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "l" ]; + state0 -> state9 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "r" ]; + state0 -> state1 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'*'" ]; + state0 -> state2 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'n'" ]; + state1 -> state1 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'*'" ]; + state1 -> state4 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "r" ]; + state1 -> state2 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'n'" ]; + state1 -> state3 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "l" ]; + state6 -> state7 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'='" ]; + state7 -> state8 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "r" ]; + state7 -> state1 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'*'" ]; + state7 -> state2 [ penwidth = 1 fontsize = 14 fontcolor = "grey28" label = "'n'" ]; + state7 -> state3 [ penwidth = 5 fontsize = 28 fontcolor = "black" label = "l" ]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/siblings.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/siblings.gv.txt new file mode 100644 index 000000000..811412179 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/siblings.gv.txt @@ -0,0 +1,512 @@ +/* +This is a graphviz-produced layout of the "family tree" of a fraternity and sorority. + +Each member in the graph was assigned a "big brother" from one organization and a "big sister" from the other. Blue icons represent Brothers from the fraternity, Pink represents Sisters from the sorority (Purple members are in both organizations - like honoraries.) + +Charter members (who can have no parent nodes) are outlined. + +... + +dot -Tgif -Goverlap=false -o siblings.gif siblings.dot + + +We're experimenting with different ways of coloring and graphing, but found this the easiest for now. When we have more people in, we might look at different shades depending on generation number -- earlier people would get lighter colors, more recent members darker. Thumbnail images would be an interesting alteration as well. + +from Japheth Cleaver +*/ + + +digraph sdsu { + size="36,36"; + node [color=grey, style=filled]; + node [fontname="Verdana", size="30,30"]; + graph [ fontname = "Arial", + fontsize = 36, + style = "bold", + label = "\nKappa Kappa Psi/Tau Beta Sigma\nSan Diego State University\nEta Mu and Zeta Xi Family Tree\n\nto date: November 30th, 2008\n", + ssize = "30,60" ]; +"Lori Brede" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=10"]; +"Michael Griffith" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=24"]; +"Amie Holston" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=30"]; +"Michael Griffith" -> "Lori Brede" +"Amie Holston" -> "Lori Brede" +"Casey Carter" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=11"]; +"Laura De'Armond" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=14"]; +"Laura De'Armond" -> "Casey Carter" +"Japheth Cleaver" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=12"]; +"Chuk Gawlik" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=22"]; +"Stacy Snyder" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=309"]; +"Chuk Gawlik" -> "Japheth Cleaver" +"Stacy Snyder" -> "Japheth Cleaver" +"Jillian Clifton" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=13"]; +"David Guthrie" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=25"]; +"David Guthrie" -> "Jillian Clifton" +"Japheth Cleaver" -> "Jillian Clifton" +"Tony Sacco" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=55"]; +"Heather Smith" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=59"]; +"Tony Sacco" -> "Laura De'Armond" +"Heather Smith" -> "Laura De'Armond" +"Kevin Decker" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=15"]; +"Alex Hansen" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=26"]; +"Wanda Livelsberger" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=53"]; +"Alex Hansen" -> "Kevin Decker" +"Wanda Livelsberger" -> "Kevin Decker" +"Patrick Doerr" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=16"]; +"Deanna Jagow" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=23"]; +"Alex Hansen" -> "Patrick Doerr" +"Deanna Jagow" -> "Patrick Doerr" +"Lori Asaro" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=178"]; +"Mark Pearson" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=169"]; +"Lori Ball" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=167"]; +"Mark Pearson" -> "Lori Asaro" +"Lori Ball" -> "Lori Asaro" +"Ryan Farris" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=18"]; +"Rob Reiner" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=51"]; +"Cindy Teel" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=62"]; +"Rob Reiner" -> "Ryan Farris" +"Cindy Teel" -> "Ryan Farris" +"Ginger Palmer" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=180"]; +"Mark Newton-John" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=46"]; +"Mark Newton-John" -> "Ginger Palmer" +"Matthew FitzGerald" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=19"]; +"Mervin Maniago" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=41"]; +"Mervin Maniago" -> "Matthew FitzGerald" +"Amie Holston" -> "Matthew FitzGerald" +"Tani Miller" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=195"]; +"Mark Pearson" -> "Tani Miller" +"Vienna McMurtry" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=196"]; +"Robert Walwick" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=153"]; +"Robert Walwick" -> "Vienna McMurtry" +"Ginger Palmer" -> "Vienna McMurtry" +"Chuck Foster" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=20"]; +"Karen Saye" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=56"]; +"Kevin Decker" -> "Chuck Foster" +"Karen Saye" -> "Chuck Foster" +"Gary Frampton" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=201"]; +"Ginger Palmer" -> "Gary Frampton" +"Pat Norris" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=207"]; +"Sean Tipps" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=204"]; +"Teresa Long" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=194"]; +"Sean Tipps" -> "Pat Norris" +"Teresa Long" -> "Pat Norris" +"Marc Martin-ez" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=208"]; +"Mark Pearson" -> "Marc Martin-ez" +"Tani Miller" -> "Marc Martin-ez" +"Kristen Villone" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=209"]; +"Kelly Erickson" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=199"]; +"Anna Pedroza" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=197"]; +"Kelly Erickson" -> "Kristen Villone" +"Anna Pedroza" -> "Kristen Villone" +"Geoff Frank" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=21"]; +"Chris Livelsberger" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=40"]; +"Amy Price" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=57"]; +"Chris Livelsberger" -> "Geoff Frank" +"Amy Price" -> "Geoff Frank" +"Tracy Murray" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=210"]; +"John FitzGibbon" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=92"]; +"Judy Dulcich" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=177"]; +"John FitzGibbon" -> "Tracy Murray" +"Judy Dulcich" -> "Tracy Murray" +"Ian McIntosh" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=215"]; +"Barbara Tollison" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=172"]; +"Robert Walwick" -> "Ian McIntosh" +"Barbara Tollison" -> "Ian McIntosh" +"Jayson Smith" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=58"]; +"Jayson Smith" -> "Chuk Gawlik" +"Heather Smith" -> "Chuk Gawlik" +"Kelly McKinney" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=222"]; +"Mark Nadeau" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=183"]; +"Mark Nadeau" -> "Kelly McKinney" +"Judy Dulcich" -> "Kelly McKinney" +"Chris Livelsberger" -> "Deanna Jagow" +"Amy Price" -> "Deanna Jagow" +"Renee Thompson" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=231"]; +"J. Angeles" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=3"]; +"Kelley Smith" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=223"]; +"J. Angeles" -> "Renee Thompson" +"Kelley Smith" -> "Renee Thompson" +"Steven Smith" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=233"]; +"John FitzGibbon" -> "Steven Smith" +"Charlene Andrews" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=234"]; +"Diane Reoch" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=227"]; +"Diane Reoch" -> "Charlene Andrews" +"Tonya Alexander" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=238"]; +"Gail Vasquez" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=225"]; +"Gail Vasquez" -> "Tonya Alexander" +"Spencer Caldwell" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=239"]; +"Becky Bernal" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=218"]; +"Becky Bernal" -> "Spencer Caldwell" +"Chuk Gawlik" -> "Michael Griffith" +"Wanda Livelsberger" -> "Michael Griffith" +"Russell Grant" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=242"]; +"Steven Smith" -> "Russell Grant" +"Tiffany Worthington" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=66"]; +"Chuck Foster" -> "David Guthrie" +"Tiffany Worthington" -> "David Guthrie" +"Jerry Maya" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=250"]; +"John FitzGibbon" -> "Jerry Maya" +"Melissa Schwartz" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=252"]; +"Russell Grant" -> "Melissa Schwartz" +"Delphy Shaulis" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=255"]; +"Renee Thompson" -> "Delphy Shaulis" +"Martin Naiman" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=45"]; +"Janean Angeles" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=86"]; +"Martin Naiman" -> "Alex Hansen" +"Janean Angeles" -> "Alex Hansen" +"Leslie Harlow" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=265"]; +"Dennis McColl" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=251"]; +"Denise Luna" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=236"]; +"Dennis McColl" -> "Leslie Harlow" +"Denise Luna" -> "Leslie Harlow" +"Jonathan Yudman" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=267"]; +"April Ortiz-cloninger" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=258"]; +"April Ortiz-cloninger" -> "Jonathan Yudman" +"Michael Elgo" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=268"]; +"Carol Kropp" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=254"]; +"Spencer Caldwell" -> "Michael Elgo" +"Carol Kropp" -> "Michael Elgo" +"Denmark Vea" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=269"]; +"Marc Martin-ez" -> "Denmark Vea" +"Kelley Smith" -> "Denmark Vea" +"Kathleen Hansen" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=27"]; +"Martin Naiman" -> "Kathleen Hansen" +"Heather Smith" -> "Kathleen Hansen" +"Laura Stegner" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=274"]; +"April Ortiz-cloninger" -> "Laura Stegner" +"Kathy Jones" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=28"]; +"J. Angeles" -> "Kathy Jones" +"Eric Gates" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=282"]; +"Erick Sugimura" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=280"]; +"Erick Sugimura" -> "Eric Gates" +"Laura Stegner" -> "Eric Gates" +"Jennifer Stoewe" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=288"]; +"Eric Gates" -> "Jennifer Stoewe" +"Karen Helbling" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=29"]; +"Regan Ashker" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=5"]; +"Kevin Decker" -> "Karen Helbling" +"Regan Ashker" -> "Karen Helbling" +"Scott Wood" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=295"]; +"Eric Gates" -> "Scott Wood" +"Greg Flood" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=200"]; +"Greg Flood" -> "J. Angeles" +"Ginger Palmer" -> "J. Angeles" +"Lynn Reeves" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=48"]; +"Chuk Gawlik" -> "Amie Holston" +"Lynn Reeves" -> "Amie Holston" +"Susan Colwell" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=302"]; +"Michael Elgo" -> "Susan Colwell" +"Christopher Jouan" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=306"]; +"Kevin Owens" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=245"]; +"Kevin Owens" -> "Christopher Jouan" +"Kristianna Reynante" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=308"]; +"Michael Elgo" -> "Kristianna Reynante" +"Janean Angeles" -> "Kristianna Reynante" +"Amy Berner" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=300"]; +"Amy Berner" -> "Stacy Snyder" +"Deanna Johnson" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=31"]; +"Alex Hansen" -> "Deanna Johnson" +"Laura De'Armond" -> "Deanna Johnson" +"Johnny Richardson" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=310"]; +"Russell Grant" -> "Johnny Richardson" +"Nathan Fellhauer" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=313"]; +"James Rowland" [color=thistle, URL="http://sdsu.kkytbs.net/members/profile.html?who=52"]; +"James Rowland" -> "Nathan Fellhauer" +"Kristianna Reynante" -> "Nathan Fellhauer" +"Brian Raneses" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=314"]; +"Sean McHenry" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=42"]; +"Sean McHenry" -> "Brian Raneses" +"Penny Lewis" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=315"]; +"Martin Naiman" -> "Penny Lewis" +"Becky Graham" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=316"]; +"Kristen Elgo" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=7"]; +"Kristen Elgo" -> "Becky Graham" +"Steven Gross" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=318"]; +"Rob Reiner" -> "Steven Gross" +"Stacy Snyder" -> "Steven Gross" +"Sedona Reynolds" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=32"]; +"Mark Newton-John" -> "Sedona Reynolds" +"Cindy Teel" -> "Sedona Reynolds" +"Klair Mayerchak" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=320"]; +"Nathan Fellhauer" -> "Klair Mayerchak" +"Becky Graham" -> "Klair Mayerchak" +"Shari VerBerkmoes" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=321"]; +"Sean McHenry" -> "Shari VerBerkmoes" +"Janean Angeles" -> "Shari VerBerkmoes" +"Anson Summers" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=326"]; +"James Rowland" -> "Anson Summers" +"Dusty Jolliff" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=33"]; +"Rob Reiner" -> "Dusty Jolliff" +"Stacy Snyder" -> "Dusty Jolliff" +"Jennifer Garman" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=331"]; +"James Rowland" -> "Jennifer Garman" +"Kelly Greenhill" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=333"]; +"Rob Reiner" -> "Kelly Greenhill" +"Kristen Elgo" -> "Kelly Greenhill" +"Lucinda Farless" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=334"]; +"J. Angeles" -> "Lucinda Farless" +"Susan Colwell" -> "Lucinda Farless" +"Alfredo Cardenas" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=335"]; +"Chuk Gawlik" -> "Alfredo Cardenas" +"Kathleen Hansen" -> "Alfredo Cardenas" +"Jennifer Jouan" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=34"]; +"Andrea Owens" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=276"]; +"Andrea Owens" -> "Jennifer Jouan" +"Tamara Scrivner" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=345"]; +"Joseph Butler" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=69"]; +"Sarah Maltese" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=83"]; +"Joseph Butler" -> "Tamara Scrivner" +"Sarah Maltese" -> "Tamara Scrivner" +"Bradley Stouse" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=346"]; +"Ryan Underwood" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=74"]; +"Ryan Underwood" -> "Bradley Stouse" +"Cindy Teel" -> "Bradley Stouse" +"Casondra Brimmage" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=347"]; +"Kristopher Lininger" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=85"]; +"Ilana Melcher" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=73"]; +"Kristopher Lininger" -> "Casondra Brimmage" +"Ilana Melcher" -> "Casondra Brimmage" +"Cassiopeia Guthrie" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=348"]; +"Jeremy Frazier" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=79"]; +"Christine Mount" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=76"]; +"Jeremy Frazier" -> "Cassiopeia Guthrie" +"Christine Mount" -> "Cassiopeia Guthrie" +"Kathleen Moran" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=349"]; +"Matthew FitzGerald" -> "Kathleen Moran" +"Lori Brede" -> "Kathleen Moran" +"Tiffany Kalland" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=35"]; +"Tony Sacco" -> "Tiffany Kalland" +"Karen Helbling" -> "Tiffany Kalland" +"Kristen Anderson" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=350"]; +"Jennie Bogart" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=78"]; +"David Guthrie" -> "Kristen Anderson" +"Jennie Bogart" -> "Kristen Anderson" +"Laura Simonette" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=351"]; +"Jon Weisel" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=89"]; +"Jon Weisel" -> "Laura Simonette" +"Japheth Cleaver" -> "Laura Simonette" +"Nathan Williams" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=352"]; +"David Guthrie" -> "Nathan Williams" +"Karen Helbling" -> "Nathan Williams" +"Rebecca Hippert" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=353"]; +"Ryan Underwood" -> "Rebecca Hippert" +"Tiffany Kalland" -> "Rebecca Hippert" +"Samuel Wallace" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=354"]; +"Joseph Butler" -> "Samuel Wallace" +"Deanna Jagow" -> "Samuel Wallace" +"Scott Gardner" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=355"]; +"Jeremy Frazier" -> "Scott Gardner" +"Christine Mount" -> "Scott Gardner" +"Alberto Ayon" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=356"]; +"Bradley Stouse" -> "Alberto Ayon" +"Jennie Bogart" -> "Alberto Ayon" +"Susannah Clayton" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=357"]; +"Nathan Williams" -> "Susannah Clayton" +"Karen Helbling" -> "Susannah Clayton" +"Lisa Gochnauer" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=358"]; +"Scott Gardner" -> "Lisa Gochnauer" +"Casondra Brimmage" -> "Lisa Gochnauer" +"Jamie Jackson" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=359"]; +"Samuel Wallace" -> "Jamie Jackson" +"Tamara Scrivner" -> "Jamie Jackson" +"Christina Kelly" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=36"]; +"Matthew FitzGerald" -> "Christina Kelly" +"Lori Brede" -> "Christina Kelly" +"Gara Thornton" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=360"]; +"Mark Newton-John" -> "Gara Thornton" +"Laura Simonette" -> "Gara Thornton" +"Robert Winebarger" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=361"]; +"Robin Ellison" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=90"]; +"Scott Gardner" -> "Robert Winebarger" +"Robin Ellison" -> "Robert Winebarger" +"Jeremy Kirchner" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=37"]; +"Rob Reiner" -> "Jeremy Kirchner" +"Sandy Konar" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=38"]; +"Jennifer Brandon" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=9"]; +"Jennifer Brandon" -> "Sandy Konar" +"Dan Kuhlman" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=39"]; +"Rob Reiner" -> "Dan Kuhlman" +"Dusty Jolliff" -> "Dan Kuhlman" +"Lindsay Arehart" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=4"]; +"Martin Naiman" -> "Lindsay Arehart" +"Jennifer Brandon" -> "Lindsay Arehart" +"J. Angeles" -> "Mervin Maniago" +"Kathy Jones" -> "Mervin Maniago" +"Jarrod Monroe" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=43"]; +"Jamie Fratacci" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=44"]; +"Mark Newton-John" -> "Jarrod Monroe" +"Jamie Fratacci" -> "Jarrod Monroe" +"Chuk Gawlik" -> "Jamie Fratacci" +"Tiffany Worthington" -> "Jamie Fratacci" +"Russell Grant" -> "Martin Naiman" +"Tonya Alexander" -> "Martin Naiman" +"Edward Givens" [color=lightblue, outline=bold, style=bold, URL="http://sdsu.kkytbs.net/members/profile.html?who=106"]; +"Edward Givens" -> "Mark Newton-John" +"Veronica Nickel" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=47"]; +"Regan Ashker" -> "Veronica Nickel" +"Wanda Livelsberger" -> "Lynn Reeves" +"Bryan Ransom" [color=thistle, URL="http://sdsu.kkytbs.net/members/profile.html?who=49"]; +"Jayson Smith" -> "Bryan Ransom" +"Tony Sacco" -> "Regan Ashker" +"Dusty Jolliff" -> "Regan Ashker" +"Jennifer Stout" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=50"]; +"Matthew FitzGerald" -> "Jennifer Stout" +"Deanna Jagow" -> "Jennifer Stout" +"Sean McHenry" -> "James Rowland" +"James Rowland" -> "Wanda Livelsberger" +"Janean Angeles" -> "Wanda Livelsberger" +"Melissa Roy" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=54"]; +"Mervin Maniago" -> "Melissa Roy" +"Christina Kelly" -> "Melissa Roy" +"Dennis McColl" -> "Tony Sacco" +"April Ortiz-cloninger" -> "Tony Sacco" +"Tony Sacco" -> "Karen Saye" +"Tony Sacco" -> "Amy Price" +"Kathleen Hansen" -> "Amy Price" +"James Rowland" -> "Jayson Smith" +"Brian Raneses" -> "Heather Smith" +"Kristen Elgo" -> "Heather Smith" +"Josh Atwood" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=6"]; +"David Guthrie" -> "Josh Atwood" +"Lori Brede" -> "Josh Atwood" +"Katie Browne" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=60"]; +"Patrick Doerr" -> "Katie Browne" +"Jamie Fratacci" -> "Katie Browne" +"Kristin Tang" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=61"]; +"James Rowland" -> "Kristin Tang" +"Heather Smith" -> "Kristin Tang" +"Mervin Maniago" -> "Cindy Teel" +"Veronica Nickel" -> "Cindy Teel" +"Mike Tulumello" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=63"]; +"Matthew FitzGerald" -> "Mike Tulumello" +"Katie Browne" -> "Mike Tulumello" +"Veronica Villanueva" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=64"]; +"Ryan Farris" -> "Veronica Villanueva" +"Sedona Reynolds" -> "Veronica Villanueva" +"Mervin Maniago" -> "Tiffany Worthington" +"Jennifer Jouan" -> "Tiffany Worthington" +"Scott Wright" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=67"]; +"James Rowland" -> "Scott Wright" +"Kristen Elgo" -> "Scott Wright" +"Jeremy Browne" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=68"]; +"Matthew FitzGerald" -> "Jeremy Browne" +"Japheth Cleaver" -> "Jeremy Browne" +"James Fogelman" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=688"]; +"Alberto Ayon" -> "James Fogelman" +"Susannah Clayton" -> "James Fogelman" +"Sandra Chase" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=689"]; +"David Guthrie" -> "Sandra Chase" +"Japheth Cleaver" -> "Sandra Chase" +"Patrick Doerr" -> "Joseph Butler" +"Deanna Jagow" -> "Joseph Butler" +"Laura Fisher" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=690"]; +"Nathan Williams" -> "Laura Fisher" +"Casondra Brimmage" -> "Laura Fisher" +"Katie Kozma" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=691"]; +"Scott Wright" -> "Katie Kozma" +"Robin Ellison" -> "Katie Kozma" +"Rachel Perkins" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=692"]; +"Joseph Butler" -> "Rachel Perkins" +"Cassiopeia Guthrie" -> "Rachel Perkins" +"Sarah Titilah" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=693"]; +"Robert Winebarger" -> "Sarah Titilah" +"Karen Helbling" -> "Sarah Titilah" +"Ashley Rehart" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=694"]; +"Laura Fisher" -> "Ashley Rehart" +"Cara Yancey" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=695"]; +"Katie Kozma" -> "Cara Yancey" +"Ashley Presley" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=698"]; +"Cara Yancey" -> "Ashley Presley" +"Leila Wilhelm" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=699"]; +"Robin Ellison" -> "Leila Wilhelm" +"Sean McHenry" -> "Kristen Elgo" +"Stacy Snyder" -> "Kristen Elgo" +"Greg Moody" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=70"]; +"Ryan Farris" -> "Greg Moody" +"Jennifer Stout" -> "Greg Moody" +"Lisa Fleck" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=700"]; +"Rachel Perkins" -> "Lisa Fleck" +"Christine Coyne" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=701"]; +"Rachel Perkins" -> "Christine Coyne" +"Jennifer Cooley" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=702"]; +"Laura Fisher" -> "Jennifer Cooley" +"Elizabeth Larios" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=703"]; +"Ashley Rehart" -> "Elizabeth Larios" +"Cate Threlkeld" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=707"]; +"Katie Kozma" -> "Cate Threlkeld" +"Erika Tapia" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=71"]; +"Patrick Doerr" -> "Erika Tapia" +"Melissa Roy" -> "Erika Tapia" +"Robbyn Rozelle" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=72"]; +"Jarrod Monroe" -> "Robbyn Rozelle" +"Tiffany Kalland" -> "Robbyn Rozelle" +"Ryan Farris" -> "Ilana Melcher" +"Veronica Villanueva" -> "Ilana Melcher" +"Greg Moody" -> "Ryan Underwood" +"Katie Browne" -> "Ryan Underwood" +"Cameron Brown" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=75"]; +"Joseph Butler" -> "Cameron Brown" +"Tiffany Kalland" -> "Cameron Brown" +"Ryan Underwood" -> "Christine Mount" +"Lori Brede" -> "Christine Mount" +"Janay Rabe" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=77"]; +"Greg Moody" -> "Janay Rabe" +"Cindy Teel" -> "Janay Rabe" +"Jeremy Browne" -> "Jennie Bogart" +"Tiffany Kalland" -> "Jennie Bogart" +"Ryan Farris" -> "Jeremy Frazier" +"Ilana Melcher" -> "Jeremy Frazier" +"Crystal Bozak" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=8"]; +"Patrick Doerr" -> "Crystal Bozak" +"Katie Browne" -> "Crystal Bozak" +"Kameka Smith" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=80"]; +"Matthew FitzGerald" -> "Kameka Smith" +"Ilana Melcher" -> "Kameka Smith" +"Kyra Sacco" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=81"]; +"Joseph Butler" -> "Kyra Sacco" +"Robbyn Rozelle" -> "Kyra Sacco" +"Samuel Behar" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=82"]; +"Ryan Underwood" -> "Samuel Behar" +"Lori Brede" -> "Samuel Behar" +"Patrick Doerr" -> "Sarah Maltese" +"Deanna Jagow" -> "Sarah Maltese" +"David Bronson" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=84"]; +"Kristin Alongi-Hutchins" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=87"]; +"Tony Sacco" -> "David Bronson" +"Kristin Alongi-Hutchins" -> "David Bronson" +"Cameron Brown" -> "Kristopher Lininger" +"Kameka Smith" -> "Kristopher Lininger" +"Rakan Abu-Rahma" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=852"]; +"Christine Coyne" -> "Rakan Abu-Rahma" +"Jennifer Berry" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=270"]; +"Jennifer Berry" -> "Janean Angeles" +"Penny Lewis" -> "Kristin Alongi-Hutchins" +"Melissa Bebak" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=88"]; +"Greg Moody" -> "Melissa Bebak" +"Sarah Maltese" -> "Melissa Bebak" +"Scott Wright" -> "Jennifer Brandon" +"Japheth Cleaver" -> "Jennifer Brandon" +"Samuel Behar" -> "Robin Ellison" +"Kyra Sacco" -> "Robin Ellison" +"Teresa Simms" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=91"]; +"Joseph Butler" -> "Teresa Simms" +"Janay Rabe" -> "Teresa Simms" +"Robert Schmidtke" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=188"]; +"Jean Newman" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=166"]; +"Robert Schmidtke" -> "John FitzGibbon" +"Jean Newman" -> "John FitzGibbon" +"Brittany DePew" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=928"]; +"Elizabeth Larios" -> "Brittany DePew" +"Kathleen Halberg" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=929"]; +"Ashley Rehart" -> "Kathleen Halberg" +"Terrance Hirsch" [color=lightblue, URL="http://sdsu.kkytbs.net/members/profile.html?who=96"]; +"J. Angeles" -> "Terrance Hirsch" +"Susan Colwell" -> "Terrance Hirsch" +"Monique Arellano" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=972"]; +"Ashley Presley" -> "Monique Arellano" +"Anthony Henderson" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=973"]; +"Jennifer Cooley" -> "Anthony Henderson" +"Amethyst Tagle" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=974"]; +"Cate Threlkeld" -> "Amethyst Tagle" +"Mallory Williams" [color=lightpink, URL="http://sdsu.kkytbs.net/members/profile.html?who=975"]; +"Lisa Fleck" -> "Mallory Williams" +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/softmaint.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/softmaint.gv.txt new file mode 100644 index 000000000..04110890b --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/softmaint.gv.txt @@ -0,0 +1,377 @@ +digraph G { + size="7,10" + page="8.5,11" + center="" + node[width=.25,height=.375,fontsize=9] + fcfpr1_1_2t_17 -> 341411; + fcfpr1_1t_1 -> 341411; + rdlfpr2_0_rdlt_4 -> 341411; + fpfpr1_0_1t_1 -> 341411; + fpfpr1_1_2t_11 -> 341411; + rtafpr1_1_2t_28 -> 341411; + rtafpr1_1_3t_6 -> 341411; + rdlfpr1_1t_1 -> 358866; + rtafpr1_1_3t_6 -> 358866; + tmfpr1_1_3t_5 -> 358930; + fcfpr1_1_3t_9 -> 358930; + pcfpr1_1_3t_7 -> 358930; + fpfpr1_1_3g_1 -> 358930; + fpfpr1_1_3t_1 -> 358930; + aufpr1_1_3t_1 -> 358930; + rtafpr1_0_3g_1 -> 358930; + rtafpr1_1_3t_6 -> 358930; + msgfpr1_1_1g_12 -> 371943; + rtafpr1_1_1g_8 -> 371943; + rtafpr1_1_1t_35 -> 371943; + rtafpr1_1_1t_45 -> 371943; + rtafpr1_1_3t_6 -> 371943; + tlfpr2_0_rdlg_2 -> 374300; + fcfpr1_1_3t_8 -> 374300; + fcfpr1_1_3t_9 -> 374300; + rtafpr1_1_3t_6 -> 374300; + fcfpr1_0_5g_1 -> 371942; + fcfpr1_1_1t_19 -> 371942; + fcfpr1_1_3t_9 -> 371942; + fcfpr1_1_3t_9 -> 374700; + tymsgfpr1_1_3t_3 -> 374700; + fpfpr1_1_3t_1 -> 374700; + rtafpr1_1_3t_7 -> 374700; + fcfpr1_1_3g_2 -> 374741; + fcfpr1_1_3t_9 -> 374741; + fpfpr1_1_3t_1 -> 374741; + rtafpr1_1_3t_7 -> 374741; + fcfpr1_1_1t_18 -> 374886; + fcfpr1_1_3t_9 -> 374886; + fpfpr1_1_3t_1 -> 374886; + rtafpr1_1_3t_7 -> 374886; + fcfpr1_1_3t_9 -> 375039; + fpfpr1_1_3t_1 -> 375039; + fcfpr1_1_3t_42 -> 375507; + fcfpr1_1_3t_9 -> 375507; + rdlfpr2_0_rdlt_158 -> 375507; + rtafpr1_1_3t_7 -> 375507; + rtafpr1_1_3t_71 -> 375507; + dbfpr1_1_3t_2 -> 375507; + fcfpr1_1_3t_9 -> 375508; + rdlfpr1_1g_13 -> 375508; + rtafpr1_1_3t_7 -> 375508; + rtafpr2_1_rdlg_1 -> 375508; + dbfpr1_1_3t_2 -> 375508; + fcfpr1_1_3t_9 -> 375519; + fpfpr1_1_3g_1 -> 375519; + fpfpr1_1_3t_1 -> 375519; + fcfpr1_1_3t_9 -> 377380; + rdlfpr1_1g_16 -> 377380; + rdlfpr1_1t_100 -> 377380; + fcfpr1_0_2g_1 -> 377719; + fcfpr1_1_3t_10 -> 377719; + fcfpr1_1_3t_7 -> 377719; + fcfpr1_1_3t_9 -> 377719; + rdlfpr2_0_rdlg_12 -> 377719; + rdlfpr2_0_rdlt_108 -> 377719; + rdlfpr2_0_rdlt_27 -> 377719; + rdlfpr2_0_rdlt_30 -> 377719; + fcfpr1_1_3t_9 -> 377763; + fcfpr1_1_3t_9 -> 379848; + fpfpr1_1_3t_1 -> 379848; + fcfpr1_1_3t_9 -> 380571; + fcfpr1_1_3t_9 -> 380604; + fpfpr1_1_3t_1 -> 380604; + fcfpr1_1_3t_9 -> 381211; + fpfpr1_1_3t_1 -> 381211; + fcfpr1_1_3t_9 -> 381835; + fcfpr1_1_3t_9 -> 381897; + fcfpr1_1_3t_9 -> 381901; + fpfpr1_1_3t_1 -> 381901; + fcfpr1_1_3t_9 -> 382103; + rtafpr1_1_3t_7 -> 382103; + fcfpr1_1_3t_9 -> 382161; + fcfpr1_1_3t_9 -> 383174; + fpfpr1_1_3t_1 -> 383174; + rtafpr1_1_3t_7 -> 383174; + fpfpr1_1_3g_1 -> 352010; + fpfpr1_1_3t_1 -> 352010; + fpfpr1_1_3t_1 -> 382409; + fpfpr1_1_3t_1 -> 382827; + fpfpr1_1_3t_1 -> 382928; + rtafpr1_1_3t_7 -> 382928; + tlfpr1_1_1t_5 -> 358224; + tymsgfpr1_1_1t_23 -> 358224; + tymsgfpr1_1_3t_3 -> 358224; + rcfpr0_0_1t_9 -> 358224; + rcfpr1_1_1t_5 -> 358224; + odfpr0_0_1t_8 -> 358224; + odfpr1_1_1t_6 -> 358224; + ecdsgfpr1_1_1t_4 -> 358224; + tymsgfpr1_1_1t_18 -> 358900; + tymsgfpr1_1_3t_3 -> 358900; + rcfpr1_1_1t_100 -> 358900; + rcfpr1_1_1t_22 -> 358900; + rcfpr1_1_1t_37 -> 358900; + odfpr1_1_1t_21 -> 358900; + tymsgfpr1_1_3t_3 -> 372568; + rcfpr1_1_1t_30 -> 372568; + odfpr1_1_1t_31 -> 372568; + tlfpr1_1_1t_20 -> 375557; + tymsgfpr1_1_1t_24 -> 375557; + tymsgfpr1_1_3t_3 -> 375557; + rcfpr1_1_1t_11 -> 375557; + odfpr1_1_1t_9 -> 375557; + ecdsgfpr1_1_1t_19 -> 375557; + rtafpr1_1_1g_14 -> 376956; + rtafpr1_1_1t_64 -> 376956; + rtafpr1_1_2t_18 -> 376956; + rtafpr1_1_3t_30 -> 376956; + rtafpr1_1_3t_7 -> 376956; + rtafpr1_1_3t_7 -> 379339; + rtafpr1_1_1t_14 -> 379422; + rtafpr1_1_1t_20 -> 379422; + rtafpr1_1_3t_7 -> 379422; + rtafpr1_1_3t_7 -> 383039; + fcfpr1_1_1t_18 -> 359471; + fcfpr2_0_1t_1 -> 359471; + fcfpr2_0_1t_2 -> 359471; + ccsfpr2_0_1t_99 -> 359471; + fcfpr1_1_3t_42 -> 384096; + rtafpr1_1_3t_71 -> 384096; + tlfpr1_0_4g_4 -> 354290; + rcfpr0_0_1t_9 -> 354290; + odfpr0_0_1t_8 -> 354290; + pagfpr1_1_1t_23 -> 354290; + rcfpr1_1_1t_5 -> 379864; + rcfpr1_1_1t_100 -> 382574; + rcfpr1_1_1t_22 -> 382574; + rcfpr1_1_1t_37 -> 382574; + rcfpr1_1_1t_30 -> 370706; + rcfpr1_1_1t_30 -> 377908; + rcfpr1_1_1t_30 -> 377924; + rcfpr1_1_1t_30 -> 377971; + rcfpr1_1_1t_30 -> 377980; + odfpr1_1_1t_31 -> 377980; + rcfpr1_1_1t_30 -> 378362; + rcfpr1_1_1t_30 -> 378656; + rcfpr1_1_1t_30 -> 378666; + rcfpr1_1_1t_30 -> 379169; + odfpr1_1_1t_31 -> 379169; + rcfpr1_1_1t_110 -> 379341; + rcfpr1_1_1t_30 -> 379341; + rcfpr1_1_1t_62 -> 379341; + odfpr1_1_1t_31 -> 379341; + rcfpr1_1_1t_30 -> 379972; + rcfpr1_1_1t_30 -> 380298; + rcfpr1_1_1t_30 -> 380448; + rcfpr1_1_1t_30 -> 380475; + odfpr1_1_1t_31 -> 380475; + rcfpr1_1_1t_30 -> 380526; + odfpr1_1_1t_31 -> 357430; + rcfpr1_1_1t_11 -> 379968; + odfpr1_1_1t_9 -> 379968; + ccsfpr2_0_1t_99 -> 359100; + ccsfpr2_0_1t_99 -> 376529; + ccsfpr2_0_1t_99 -> 377801; + ccsfpr2_0_1t_99 -> 379126; + ccsfpr2_0_1t_99 -> 379212; + ccsfpr2_0_1t_99 -> 380285; + ccsfpr2_0_1t_99 -> 380963; + ccsfpr2_0_1t_99 -> 384909; + tlfpr1_0_4g_4 -> 358471; + odfpr0_0_1t_7 -> 358471; + odfpr1_0_1t_36 -> 358471; + odfpr1_0_3t_18 -> 358471; + odfpr1_0_3t_21 -> 358471; + tlfpr1_0_4g_4 -> 375024; + tlfpr1_0_4g_4 -> 375027; + rcfpr1_1_1t_110 -> 381710; + rcfpr1_1_1t_62 -> 381710; + rcfpr1_1_1t_110 -> 381775; + rcfpr1_1_1t_62 -> 381775; + rcfpr1_1_1t_110 -> 382436; + fcfpr1_1_3t_34 -> 382528; + rcfpr1_1_1t_110 -> 382528; + rtafpr1_1_3t_48 -> 382528; + rcfpr1_1_1t_110 -> 382566; + rcfpr1_1_1t_110 -> 382572; + odfpr0_0_1t_7 -> 353506; + rcfpr1_0_1t_35 -> 370509; + odfpr0_0_1t_7 -> 370509; + odfpr0_0_1t_7 -> 370510; + odfpr1_0_1t_38 -> 370510; + tlfpr1_0_4g_5 -> 354546; + rcfpr1_1_1t_61 -> 354546; + odfpr1_0_3t_18 -> 354546; + odfpr1_0_3t_20 -> 354546; + odfpr1_0_3t_18 -> 354757; + odfpr1_0_3t_20 -> 354757; + odfpr1_0_3t_18 -> 354766; + odfpr1_0_3t_20 -> 354766; + odfpr1_0_3t_18 -> 354771; + odfpr1_0_3t_20 -> 354771; + odfpr1_0_3t_18 -> 354785; + odfpr1_0_3t_23 -> 354785; + odfpr1_0_3t_24 -> 354785; + odfpr1_0_3t_18 -> 354878; + odfpr1_0_3t_23 -> 354878; + odfpr1_0_3t_24 -> 354878; + odfpr1_0_3t_18 -> 355080; + odfpr1_0_3t_23 -> 355080; + odfpr1_0_3t_24 -> 355080; + odfpr1_0_3t_18 -> 355288; + odfpr1_0_3t_23 -> 355288; + odfpr1_0_3t_24 -> 355288; + odfpr2_0_03t_13 -> 355288; + odfpr1_0_3t_18 -> 355800; + odfpr1_0_3t_21 -> 355800; + odfpr1_0_3t_18 -> 356116; + odfpr1_0_3t_21 -> 356116; + odfpr1_0_3t_18 -> 356741; + odfpr1_0_3t_21 -> 356741; + odfpr1_0_3t_18 -> 357340; + odfpr1_0_3t_21 -> 357340; + odfpr1_0_3t_18 -> 357538; + odfpr1_0_3t_21 -> 357538; + odfpr1_0_3t_18 -> 357769; + odfpr1_0_3t_21 -> 357769; + odfpr1_0_3t_18 -> 357793; + odfpr1_0_3t_21 -> 357793; + odfpr1_0_3t_18 -> 358155; + odfpr1_0_3t_21 -> 358155; + odfpr1_0_3t_18 -> 358157; + odfpr1_0_3t_21 -> 358157; + odfpr1_0_3t_18 -> 358159; + odfpr1_0_3t_21 -> 358159; + odfpr1_0_3t_18 -> 358584; + odfpr1_0_3t_21 -> 358584; + odfpr1_0_3t_18 -> 360104; + odfpr1_0_3t_21 -> 360104; + odfpr1_0_3t_18 -> 360144; + odfpr1_0_3t_21 -> 360144; + odfpr1_0_3t_18 -> 360672; + odfpr1_0_3t_21 -> 360672; + odfpr1_0_3t_5 -> 360672; + odfpr1_0_3t_18 -> 360839; + odfpr1_0_3t_21 -> 360839; + odfpr1_0_3t_18 -> 371187; + tlfpr1_0_3g_5 -> 373300; + odfpr1_0_3t_12 -> 373300; + odfpr1_0_3t_18 -> 373300; + odfpr1_0_3t_18 -> 375134; + odfpr1_0_5t_18 -> 375134; + rcfpr0_0_1t_10 -> 375319; + odfpr1_0_3t_18 -> 375319; + odfpr1_0_3t_36 -> 375319; + odfpr1_0_5t_17 -> 375319; + odfpr1_0_5t_19 -> 375319; + odfpr1_0_3t_18 -> 375499; + odfpr1_0_3t_18 -> 377220; + odfpr1_0_5t_21 -> 377220; + tlfpr1_0_3g_7 -> 377562; + tlfpr1_1_1t_3 -> 377562; + odfpr1_0_3t_18 -> 377562; + odfpr1_0_3t_36 -> 377562; + odfpr1_0_5t_20 -> 377562; + odfpr1_0_3t_18 -> 378108; + odfpr1_0_3t_6 -> 378108; + odfpr1_0_5t_20 -> 354221; + + odfpr0_0_1t_7 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tlfpr1_0_3g_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr0_0_1t_8 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr1_1_1t_61 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_3t_18 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tlfpr1_0_3g_7 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr1_1_1t_62 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + ccsfpr2_0_1t_99 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tymsgfpr1_1_3t_3 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr0_0_1t_9 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_1t_14 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_3t_30 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr1_1_1t_110 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + dbfpr1_1_3t_2 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_1g_8 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr1_1_1t_30 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tlfpr1_1_1t_20 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_1t_64 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tlfpr2_0_rdlg_2 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_2t_28 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tlfpr1_1_1t_3 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_1_1t_6 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fpfpr1_1_3t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + aufpr1_1_3t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1_3t_34 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr1_1_1t_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1_1t_18 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_3t_36 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tlfpr1_1_1t_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1_1t_19 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_1_1t_9 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1_3t_7 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr1_1_1t_37 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1_3t_8 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_1_1t_21 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1_3t_9 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rdlfpr2_0_rdlt_27 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1_3g_2 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_1t_35 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_5t_20 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fpfpr1_1_3g_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_5t_21 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fpfpr1_1_2t_11 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + ecdsgfpr1_1_1t_19 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_1t_36 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_1g_14 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tymsgfpr1_1_1t_23 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tymsgfpr1_1_1t_24 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_1t_38 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_0_2g_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rdlfpr1_1t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr0_0_1t_10 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr1_1_1t_100 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rdlfpr2_0_rdlt_108 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + pcfpr1_1_3t_7 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_3t_20 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + ecdsgfpr1_1_1t_4 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tmfpr1_1_3t_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_3t_21 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fpfpr1_0_1t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_3t_23 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr1_1_1t_22 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + pagfpr1_1_1t_23 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_3t_71 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_2t_18 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rdlfpr2_0_rdlt_158 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_3t_6 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_3t_24 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_3t_7 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_0_3g_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_1t_20 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rdlfpr1_1g_13 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr1_0_1t_35 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1_2t_17 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr2_1_rdlg_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rdlfpr2_0_rdlt_4 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rdlfpr1_1g_16 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr2_0_1t_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr2_0_1t_2 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rdlfpr1_1t_100 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + msgfpr1_1_1g_12 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rdlfpr2_0_rdlt_30 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_3t_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tlfpr1_0_4g_4 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1_3t_42 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_3t_6 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tlfpr1_0_4g_5 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_3t_48 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_5t_17 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_5t_18 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + tymsgfpr1_1_1t_18 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_5t_19 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_1_3t_10 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + fcfpr1_0_5g_1 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_0_3t_12 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr2_0_03t_13 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rcfpr1_1_1t_11 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + odfpr1_1_1t_31 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rdlfpr2_0_rdlg_12 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; + rtafpr1_1_1t_45 [label="",shape=circle,height=0.12,width=0.12,fontsize=1]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/switch.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/switch.gv.txt new file mode 100644 index 000000000..431ba48c5 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/switch.gv.txt @@ -0,0 +1,60 @@ +digraph G { + graph [center rankdir=LR bgcolor="#808080"] + edge [dir=none] + node [width=0.3 height=0.3 label=""] + { node [shape=circle style=invis] + 1 2 3 4 5 6 7 8 10 20 30 40 50 60 70 80 + } + { node [shape=circle] + a b c d e f g h i j k l m n o p q r s t u v w x + } + { node [shape=diamond] + A B C D E F G H I J K L M N O P Q R S T U V W X + } + 1 -> a -> {A B} [color="#0000ff"] + 2 -> b -> {B A} [color="#ff0000"] + 3 -> c -> {C D} [color="#ffff00"] + 4 -> d -> {D C} [color="#00ff00"] + 5 -> e -> {E F} [color="#000000"] + 6 -> f -> {F E} [color="#00ffff"] + 7 -> g -> {G H} [color="#ffffff"] + 8 -> h -> {H G} [color="#ff00ff"] + { edge [color="#ff0000:#0000ff"] + A -> i -> {I K} + B -> j -> {J L} + } + { edge [color="#00ff00:#ffff00"] + C -> k -> {K I} + D -> l -> {L J} + } + { edge [color="#00ffff:#000000"] + E -> m -> {M O} + F -> n -> {N P} + } + { edge [color="#ff00ff:#ffffff"] + G -> o -> {O M} + H -> p -> {P N} + } + { edge [color="#00ff00:#ffff00:#ff0000:#0000ff"] + I -> q -> {Q U} + J -> r -> {R V} + K -> s -> {S W} + L -> t -> {T X} + } + { edge [color="#ff00ff:#ffffff:#00ffff:#000000"] + M -> u -> {U Q} + N -> v -> {V R} + O -> w -> {W S} + P -> x -> {X T} + } + { edge [color="#ff00ff:#ffffff:#00ffff:#000000:#00ff00:#ffff00:#ff0000:#0000ff"] + Q -> 10 + R -> 20 + S -> 30 + T -> 40 + U -> 50 + V -> 60 + W -> 70 + X -> 80 + } +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/traffic_lights.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/traffic_lights.gv.txt new file mode 100644 index 000000000..6b44bc8b3 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/traffic_lights.gv.txt @@ -0,0 +1,28 @@ +##"I played some days with making an interface between our ConceptBase system (essentially a database system to store models) and graphviz. One example graph is attached. It is a so-called petri net for Dutch traffic lights. The example is actually taken from a book by Wil van der Aalst." Contributed by Manfred Jeusfeld. + +##Command to produce the output: "neato -Tpng thisfile > thisfile.png" + +digraph TrafficLights { +node [shape=box]; gy2; yr2; rg2; gy1; yr1; rg1; +node [shape=circle,fixedsize=true,width=0.9]; green2; yellow2; red2; safe2; safe1; green1; yellow1; red1; +gy2->yellow2; +rg2->green2; +yr2->safe1; +yr2->red2; +safe2->rg2; +green2->gy2; +yellow2->yr2; +red2->rg2; +gy1->yellow1; +rg1->green1; +yr1->safe2; +yr1->red1; +safe1->rg1; +green1->gy1; +yellow1->yr1; +red1->rg1; + +overlap=false +label="PetriNet Model TrafficLights\nExtracted from ConceptBase and layed out by Graphviz" +fontsize=12; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/transparency.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/transparency.gv.txt new file mode 100644 index 000000000..d296f8d25 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/transparency.gv.txt @@ -0,0 +1,105 @@ +graph G { +// graph [splines=true overlap=false] + graph [truecolor bgcolor="#ff00005f"] + node [style=filled fillcolor="#00ff005f"] + 1 -- 30 [f=1]; + 1 -- 40 [f=14]; + 8 -- 46 [f=1]; + 8 -- 16 [f=18]; + 10 -- 25 [f=1]; + 10 -- 19 [f=5]; + 10 -- 33 [f=1]; + 12 -- 8 [f=1]; + 12 -- 36 [f=5]; + 12 -- 17 [f=16]; + 13 -- 38 [f=1]; + 13 -- 24 [f=19]; + 24 -- 49 [f=1]; + 24 -- 13 [f=1]; + 24 -- 47 [f=12]; + 24 -- 12 [f=19]; + 25 -- 27 [f=1]; + 25 -- 12 [f=1]; + 27 -- 12 [f=1]; + 27 -- 14 [f=8]; + 29 -- 10 [f=1]; + 29 -- 8 [f=17]; + 30 -- 24 [f=1]; + 30 -- 44 [f=15]; + 38 -- 29 [f=1]; + 38 -- 35 [f=15]; + 2 -- 42 [f=2]; + 2 -- 35 [f=3]; + 2 -- 11 [f=19]; + 14 -- 18 [f=2]; + 14 -- 24 [f=15]; + 14 -- 38 [f=18]; + 18 -- 49 [f=2]; + 18 -- 47 [f=20]; + 26 -- 41 [f=2]; + 26 -- 42 [f=15]; + 31 -- 39 [f=2]; + 31 -- 47 [f=17]; + 31 -- 25 [f=14]; + 37 -- 26 [f=2]; + 37 -- 16 [f=14]; + 39 -- 50 [f=2]; + 39 -- 14 [f=2]; + 39 -- 18 [f=17]; + 39 -- 47 [f=10]; + 41 -- 31 [f=2]; + 41 -- 8 [f=16]; + 42 -- 44 [f=2]; + 42 -- 29 [f=12]; + 44 -- 37 [f=2]; + 44 -- 32 [f=15]; + 3 -- 20 [f=2]; + 3 -- 28 [f=19]; + 6 -- 45 [f=2]; + 6 -- 28 [f=10]; + 9 -- 6 [f=2]; + 9 -- 16 [f=1]; + 15 -- 16 [f=2]; + 15 -- 48 [f=2]; + 16 -- 50 [f=2]; + 16 -- 32 [f=14]; + 16 -- 39 [f=8]; + 20 -- 33 [f=2]; + 33 -- 9 [f=2]; + 33 -- 46 [f=3]; + 33 -- 48 [f=17]; + 45 -- 15 [f=2]; + 4 -- 17 [f=4]; + 4 -- 15 [f=6]; + 4 -- 12 [f=16]; + 17 -- 21 [f=4]; + 19 -- 35 [f=4]; + 19 -- 15 [f=9]; + 19 -- 43 [f=4]; + 21 -- 19 [f=4]; + 21 -- 50 [f=4]; + 23 -- 36 [f=4]; + 34 -- 23 [f=4]; + 34 -- 24 [f=11]; + 35 -- 34 [f=4]; + 35 -- 16 [f=6]; + 35 -- 18 [f=16]; + 36 -- 46 [f=4]; + 5 -- 7 [f=1]; + 5 -- 36 [f=6]; + 7 -- 32 [f=1]; + 7 -- 11 [f=2]; + 7 -- 14 [f=17]; + 11 -- 40 [f=1]; + 11 -- 50 [f=1]; + 22 -- 46 [f=1]; + 28 -- 43 [f=1]; + 28 -- 8 [f=18]; + 32 -- 28 [f=1]; + 32 -- 39 [f=13]; + 32 -- 42 [f=15]; + 40 -- 22 [f=1]; + 40 -- 47 [f=1]; + 43 -- 11 [f=1]; + 43 -- 17 [f=19]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/twopi.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/twopi.gv.txt new file mode 100644 index 000000000..72b28fa7a --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/twopi.gv.txt @@ -0,0 +1,2212 @@ +digraph G { + ranksep=3; + ratio=auto; +"1" [ label="02f5daf56e299b8a8ecea892",shape="hexagon",style="filled",color="green" ]; +"189E" [ label="ca5af2",shape="box",style="filled",color="grey" ]; +"790E" [ label="b4dfef6",shape="box",style="filled",color="grey" ]; +"2" [ label="171192dc1f8e6ea551548a910c00",shape="hexagon",style="filled",color="green" ]; +"191E" [ label="629e42",shape="box",style="filled",color="grey" ]; +"3" [ label="6bce02baf91781a831e1b95",shape="hexagon",style="filled",color="green" ]; +"193E" [ label="1c08373",shape="box",style="filled",color="grey" ]; +"4" [ label="6236a67933a619a6a3d48",shape="hexagon",style="filled",color="green" ]; +"195E" [ label="be8f4199f",shape="box",style="filled",color="grey" ]; +"5" [ label="50962c93b4cb293f5beb59eb",shape="hexagon",style="filled",color="green" ]; +"197E" [ label="be8f4199f",shape="box",style="filled",color="grey" ]; +"6" [ label="05d4b1ed6a6135eec3abd3f2",shape="hexagon",style="filled",color="green" ]; +"199E" [ label="",shape="box",style="filled",color="grey" ]; +"7" [ label="08769f73d31c1a99be2d9363f",shape="hexagon",style="filled",color="green" ]; +"201E" [ label="629e42",shape="box",style="filled",color="grey" ]; +"8" [ label="a6a196a504c3a7657d1fa41",shape="hexagon",style="filled",color="green" ]; +"203E" [ label="cd856f",shape="box",style="filled",color="grey" ]; +"9" [ label="837ebf4bde22e1f1535cb662",shape="hexagon",style="filled",color="green" ]; +"725E" [ label="d0eb84",shape="box",style="filled",color="grey" ]; +"785E" [ label="dd2ba36",shape="box",style="filled",color="grey" ]; +"10" [ label="5f865c374cb3fe976dd376b8",shape="hexagon",style="filled",color="green" ]; +"205E" [ label="23ad1",shape="box",style="filled",color="grey" ]; +"11" [ label="8be752bc95d436a90493bec9",shape="hexagon",style="filled",color="green" ]; +"207E" [ label="ee91c97828",shape="box",style="filled",color="grey" ]; +"12" [ label="969a58db14386cb9d2f51ec",shape="hexagon",style="filled",color="green" ]; +"209E" [ label="7c7c",shape="box",style="filled",color="grey" ]; +"13" [ label="da24f74aad2ff519009d1f38c",shape="hexagon",style="filled",color="green" ]; +"211E" [ label="460aed10cc9",shape="box",style="filled",color="grey" ]; +"14" [ label="3124d3a6ed3381a6341c6",shape="hexagon",style="filled",color="green" ]; +"213E" [ label="bbe0a8f93dc1",shape="box",style="filled",color="grey" ]; +"15" [ label="71512ec7d43f958f2b6da",shape="hexagon",style="filled",color="green" ]; +"215E" [ label="3f0a2b4eb62f",shape="box",style="filled",color="grey" ]; +"16" [ label="3828a2c682419423cf",shape="hexagon",style="filled",color="green" ]; +"727E" [ label="2",shape="box",style="filled",color="grey" ]; +"784E" [ label="",shape="box",style="filled",color="grey" ]; +"17" [ label="aa868f65c34cdb64f1fad19a",shape="hexagon",style="filled",color="green" ]; +"217E" [ label="3089106e3b",shape="box",style="filled",color="grey" ]; +"787E" [ label="1aaaab063",shape="box",style="filled",color="grey" ]; +"18" [ label="dca32af03698c988b22",shape="hexagon",style="filled",color="green" ]; +"219E" [ label="eb8",shape="box",style="filled",color="grey" ]; +"19" [ label="d8f4a9e463a1e89217f",shape="hexagon",style="filled",color="green" ]; +"221E" [ label="4c6c8c",shape="box",style="filled",color="grey" ]; +"20" [ label="c96782ef56711c5d6a3f69",shape="hexagon",style="filled",color="green" ]; +"223E" [ label="6a8f5bafb1",shape="box",style="filled",color="grey" ]; +"21" [ label="4f04c39708f",shape="hexagon",style="filled",color="green" ]; +"225E" [ label="a49284e9",shape="box",style="filled",color="grey" ]; +"22" [ label="97284d4c3a5d499853f0e",shape="hexagon",style="filled",color="green" ]; +"227E" [ label="53069e384a2",shape="box",style="filled",color="grey" ]; +"792E" [ label="79b69c612",shape="box",style="filled",color="grey" ]; +"23" [ label="c4d32527b670afb370d643",shape="hexagon",style="filled",color="green" ]; +"231E" [ label="e851f5ddd920",shape="box",style="filled",color="grey" ]; +"24" [ label="5e9156098c064",shape="hexagon",style="filled",color="green" ]; +"233E" [ label="",shape="box",style="filled",color="grey" ]; +"25" [ label="3d475ea3aeca51b60212dd",shape="hexagon",style="filled",color="green" ]; +"235E" [ label="4280833ef80172",shape="box",style="filled",color="grey" ]; +"26" [ label="966d271c22e75c7538",shape="hexagon",style="filled",color="green" ]; +"237E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ]; +"27" [ label="b630e1af6ae1997f0e8ba750",shape="hexagon",style="filled",color="green" ]; +"239E" [ label="bb828f1a326",shape="box",style="filled",color="grey" ]; +"783E" [ label="499f6985db294c",shape="box",style="filled",color="grey" ]; +"28" [ label="ebd8ffc2ac3a90efb8af9",shape="hexagon",style="filled",color="green" ]; +"241E" [ label="1ebeec",shape="box",style="filled",color="grey" ]; +"791E" [ label="c0b727",shape="box",style="filled",color="grey" ]; +"29" [ label="69fdd1a1f4768c5efe7",shape="hexagon",style="filled",color="green" ]; +"243E" [ label="35b8742610",shape="box",style="filled",color="grey" ]; +"30" [ label="d93a80739fc1edb41a11b7294",shape="hexagon",style="filled",color="green" ]; +"245E" [ label="e03b8bc0435a",shape="box",style="filled",color="grey" ]; +"31" [ label="bf65cfddeb00ff847feae0c",shape="hexagon",style="filled",color="green" ]; +"247E" [ label="8df",shape="box",style="filled",color="grey" ]; +"32" [ label="916c686a1e82dba72524a",shape="hexagon",style="filled",color="green" ]; +"249E" [ label="a849f9d352e",shape="box",style="filled",color="grey" ]; +"33" [ label="f496bcf0889b301d77819c",shape="hexagon",style="filled",color="green" ]; +"251E" [ label="f29dfb9",shape="box",style="filled",color="grey" ]; +"34" [ label="76889f7d35e",shape="hexagon",style="filled",color="green" ]; +"253E" [ label="e7ef998",shape="box",style="filled",color="grey" ]; +"35" [ label="668d636002",shape="hexagon",style="filled",color="green" ]; +"255E" [ label="4379b5ed",shape="box",style="filled",color="grey" ]; +"36" [ label="e1e4c23db39d8bd633c3a",shape="hexagon",style="filled",color="green" ]; +"257E" [ label="1ed5d7f63b8c6",shape="box",style="filled",color="grey" ]; +"37" [ label="842bc5775657c1e0d67",shape="hexagon",style="filled",color="green" ]; +"259E" [ label="a387210a27b",shape="box",style="filled",color="grey" ]; +"38" [ label="e4e2f4e6d",shape="hexagon",style="filled",color="green" ]; +"261E" [ label="1f4f0fdf",shape="box",style="filled",color="grey" ]; +"39" [ label="04390dec6f1779353c07f5",shape="hexagon",style="filled",color="green" ]; +"263E" [ label="bac77c3f414a",shape="box",style="filled",color="grey" ]; +"40" [ label="69f2611acc42c36ed7cc",shape="hexagon",style="filled",color="green" ]; +"265E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ]; +"41" [ label="1562abef0d8241",shape="hexagon",style="filled",color="green" ]; +"267E" [ label="6a8f5bafb1",shape="box",style="filled",color="grey" ]; +"42" [ label="e49aaa5cc4e44355d6a0",shape="hexagon",style="filled",color="green" ]; +"269E" [ label="cc3f63d",shape="box",style="filled",color="grey" ]; +"43" [ label="e8ebe1bf5f421c1223",shape="hexagon",style="filled",color="green" ]; +"271E" [ label="96325ea",shape="box",style="filled",color="grey" ]; +"44" [ label="2759e82e30d6d",shape="hexagon",style="filled",color="green" ]; +"273E" [ label="ca5af2",shape="box",style="filled",color="grey" ]; +"45" [ label="23c1ec53358d237c1",shape="hexagon",style="filled",color="green" ]; +"275E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ]; +"46" [ label="5838586c293d455",shape="hexagon",style="filled",color="green" ]; +"277E" [ label="83c397b8bf7f",shape="box",style="filled",color="grey" ]; +"47" [ label="f841118350a27b7ea29a9c9d",shape="hexagon",style="filled",color="green" ]; +"279E" [ label="69f4ecb77d",shape="box",style="filled",color="grey" ]; +"48" [ label="658d208447d8ec5d6de8",shape="hexagon",style="filled",color="green" ]; +"281E" [ label="f7b22b9640",shape="box",style="filled",color="grey" ]; +"49" [ label="11180ae7706510211bc4",shape="hexagon",style="filled",color="green" ]; +"283E" [ label="052bb6e3",shape="box",style="filled",color="grey" ]; +"50" [ label="5807acd8d58e006f43",shape="hexagon",style="filled",color="green" ]; +"285E" [ label="",shape="box",style="filled",color="grey" ]; +"51" [ label="fe4e848cb5291ee59a2",shape="hexagon",style="filled",color="green" ]; +"287E" [ label="e3aefac763",shape="box",style="filled",color="grey" ]; +"52" [ label="c4f31ea3844e12da27ad47c6",shape="hexagon",style="filled",color="green" ]; +"289E" [ label="fb16636aae",shape="box",style="filled",color="grey" ]; +"53" [ label="00cbeb87c182ca0785f",shape="hexagon",style="filled",color="green" ]; +"291E" [ label="3089106e3b",shape="box",style="filled",color="grey" ]; +"54" [ label="11f088bfd8",shape="hexagon",style="filled",color="green" ]; +"293E" [ label="6a80cbe",shape="box",style="filled",color="grey" ]; +"55" [ label="64a9ec24428099ad8ed82ba6",shape="hexagon",style="filled",color="green" ]; +"745E" [ label="68d8993e61d8c82cd29e8d0182b0",shape="box",style="filled",color="grey" ]; +"56" [ label="3c2a62e0e5e9f7",shape="hexagon",style="filled",color="green" ]; +"295E" [ label="ae32701",shape="box",style="filled",color="grey" ]; +"57" [ label="dd84fe6a65cfac7bca03ebd",shape="hexagon",style="filled",color="green" ]; +"297E" [ label="",shape="box",style="filled",color="grey" ]; +"58" [ label="b06bbfa920aa95dd",shape="hexagon",style="filled",color="green" ]; +"299E" [ label="07",shape="box",style="filled",color="grey" ]; +"59" [ label="6b5aaa4bdf44b2c898854",shape="hexagon",style="filled",color="green" ]; +"301E" [ label="4c6c8c",shape="box",style="filled",color="grey" ]; +"789E" [ label="3a0ff0",shape="box",style="filled",color="grey" ]; +"60" [ label="855d26296eda4eb7",shape="hexagon",style="filled",color="green" ]; +"303E" [ label="53069e384a2",shape="box",style="filled",color="grey" ]; +"61" [ label="e82f47b8d4949ba4af69b38cbc19",shape="hexagon",style="filled",color="green" ]; +"305E" [ label="b62cd1d0a0",shape="box",style="filled",color="grey" ]; +"62" [ label="86569bffb49adf6b3d0ebac",shape="hexagon",style="filled",color="green" ]; +"307E" [ label="660ffeb76fc59",shape="box",style="filled",color="grey" ]; +"63" [ label="a96e47ff37983425a3e452095",shape="hexagon",style="filled",color="green" ]; +"309E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ]; +"64" [ label="71a48d11b2e7e56b1df128bd",shape="hexagon",style="filled",color="green" ]; +"311E" [ label="be8f4199f",shape="box",style="filled",color="grey" ]; +"65" [ label="a0befe6dd1ca7b165786835",shape="hexagon",style="filled",color="green" ]; +"313E" [ label="3cfae",shape="box",style="filled",color="grey" ]; +"66" [ label="f33ec11db496f7bfcb024f",shape="hexagon",style="filled",color="green" ]; +"315E" [ label="71e6b",shape="box",style="filled",color="grey" ]; +"67" [ label="fe6be3206549f5b5564acde84783",shape="hexagon",style="filled",color="green" ]; +"317E" [ label="",shape="box",style="filled",color="grey" ]; +"68" [ label="e4dba079d5fcb1f165920a3bf",shape="hexagon",style="filled",color="green" ]; +"319E" [ label="",shape="box",style="filled",color="grey" ]; +"69" [ label="35dfbee3123dc389cba0b15",shape="hexagon",style="filled",color="green" ]; +"746E" [ label="4c865eec228e41e7f4e5fc68a9a6",shape="box",style="filled",color="grey" ]; +"70" [ label="16c508ab98483d430bbe",shape="hexagon",style="filled",color="green" ]; +"321E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ]; +"71" [ label="9c9e2e0f2da8758e436c",shape="hexagon",style="filled",color="green" ]; +"327E" [ label="cd0d985a366cad7e",shape="box",style="filled",color="grey" ]; +"72" [ label="fb039d7a2a9fe73b5f468eba9",shape="hexagon",style="filled",color="green" ]; +"329E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ]; +"73" [ label="2ef949c4a39b",shape="hexagon",style="filled",color="green" ]; +"331E" [ label="617809d979f",shape="box",style="filled",color="grey" ]; +"74" [ label="a9497e0757b0969bde707ed5",shape="hexagon",style="filled",color="green" ]; +"333E" [ label="541ab86a2e",shape="box",style="filled",color="grey" ]; +"75" [ label="230cc6bbc66b24eae94fa03d",shape="hexagon",style="filled",color="green" ]; +"335E" [ label="",shape="box",style="filled",color="grey" ]; +"76" [ label="1d163eac141def176461c",shape="hexagon",style="filled",color="green" ]; +"337E" [ label="0acc5bb8ca4",shape="box",style="filled",color="grey" ]; +"77" [ label="32979f8cf86",shape="hexagon",style="filled",color="green" ]; +"339E" [ label="a7e89580",shape="box",style="filled",color="grey" ]; +"78" [ label="37d80ae421dba4a70730338860",shape="hexagon",style="filled",color="green" ]; +"341E" [ label="",shape="box",style="filled",color="grey" ]; +"79" [ label="fbba7215e7c13173a60206",shape="hexagon",style="filled",color="green" ]; +"343E" [ label="617809d979f",shape="box",style="filled",color="grey" ]; +"80" [ label="2dd8cc4d693415f93c0f8fc",shape="hexagon",style="filled",color="green" ]; +"345E" [ label="94da691e20e3",shape="box",style="filled",color="grey" ]; +"81" [ label="00880e6f50c765ebc1f85d3e9",shape="hexagon",style="filled",color="green" ]; +"347E" [ label="e7ef998",shape="box",style="filled",color="grey" ]; +"82" [ label="ef13d45b1277ac9a0444adb",shape="hexagon",style="filled",color="green" ]; +"349E" [ label="a7fe7",shape="box",style="filled",color="grey" ]; +"83" [ label="2573e1bf51f1b307f4640",shape="hexagon",style="filled",color="green" ]; +"351E" [ label="84e4ede82074",shape="box",style="filled",color="grey" ]; +"84" [ label="162d8039483d8",shape="hexagon",style="filled",color="green" ]; +"353E" [ label="a8e9",shape="box",style="filled",color="grey" ]; +"85" [ label="f490de272a7f6e4af346d40",shape="hexagon",style="filled",color="green" ]; +"355E" [ label="460aed10cc9",shape="box",style="filled",color="grey" ]; +"788E" [ label="391256c872",shape="box",style="filled",color="grey" ]; +"86" [ label="678bf739c344b9ad41da1",shape="hexagon",style="filled",color="green" ]; +"357E" [ label="396b16a892fe",shape="box",style="filled",color="grey" ]; +"87" [ label="876d120b38b0e88817",shape="hexagon",style="filled",color="green" ]; +"359E" [ label="e5",shape="box",style="filled",color="grey" ]; +"88" [ label="503737b64d432c60d6ac557e0e6",shape="hexagon",style="filled",color="green" ]; +"361E" [ label="9937ccba1469",shape="box",style="filled",color="grey" ]; +"89" [ label="b36e0be6f67fc25286127456",shape="hexagon",style="filled",color="green" ]; +"363E" [ label="87a7e69a72412",shape="box",style="filled",color="grey" ]; +"90" [ label="4cc20a0b7651e486",shape="hexagon",style="filled",color="green" ]; +"365E" [ label="e079d2c",shape="box",style="filled",color="grey" ]; +"91" [ label="08dade990b2282",shape="hexagon",style="filled",color="green" ]; +"367E" [ label="45827dbdd8",shape="box",style="filled",color="grey" ]; +"92" [ label="f8128d574c356631b8a9",shape="hexagon",style="filled",color="green" ]; +"369E" [ label="",shape="box",style="filled",color="grey" ]; +"93" [ label="88a4f0337c2189c3fc7b31",shape="hexagon",style="filled",color="green" ]; +"729E" [ label="da0d7bbcf30",shape="box",style="filled",color="grey" ]; +"94" [ label="1b13908a9f0763c0ae54af9062080",shape="hexagon",style="filled",color="green" ]; +"371E" [ label="8b06a67a",shape="box",style="filled",color="grey" ]; +"95" [ label="e2a5d11499b7e",shape="hexagon",style="filled",color="green" ]; +"373E" [ label="66abc181ac4",shape="box",style="filled",color="grey" ]; +"96" [ label="90cc275011c2013c61eb11",shape="hexagon",style="filled",color="green" ]; +"375E" [ label="",shape="box",style="filled",color="grey" ]; +"97" [ label="1e003bfe8fc840df0163f4c",shape="hexagon",style="filled",color="green" ]; +"747E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ]; +"98" [ label="1927c743a0d440a5a0",shape="hexagon",style="filled",color="green" ]; +"377E" [ label="b12441ecff15fa12c",shape="box",style="filled",color="grey" ]; +"99" [ label="155d892827c33ed3cae3",shape="hexagon",style="filled",color="green" ]; +"379E" [ label="71e6b",shape="box",style="filled",color="grey" ]; +"100" [ label="9f24ba80192c339a64c0",shape="hexagon",style="filled",color="green" ]; +"381E" [ label="",shape="box",style="filled",color="grey" ]; +"101" [ label="3e814305b42beb41b8c706",shape="hexagon",style="filled",color="green" ]; +"383E" [ label="1c08373",shape="box",style="filled",color="grey" ]; +"102" [ label="eccfe5ff0af70fe9fbec8b2360f90",shape="hexagon",style="filled",color="green" ]; +"385E" [ label="be8f4199f",shape="box",style="filled",color="grey" ]; +"103" [ label="8fa622d9f842c5572a545ed72982",shape="hexagon",style="filled",color="green" ]; +"387E" [ label="4dccb",shape="box",style="filled",color="grey" ]; +"104" [ label="ad9142a65f5eab78b4ca5e",shape="hexagon",style="filled",color="green" ]; +"389E" [ label="f36cce089",shape="box",style="filled",color="grey" ]; +"105" [ label="20f234fdcd0e1fc50261ce8",shape="hexagon",style="filled",color="green" ]; +"391E" [ label="67219ef689f0146b544",shape="box",style="filled",color="grey" ]; +"106" [ label="e06cc38155ff6781cf944d745",shape="hexagon",style="filled",color="green" ]; +"393E" [ label="87a7e69a72412",shape="box",style="filled",color="grey" ]; +"107" [ label="cfdf1932665dcb4cd3c",shape="hexagon",style="filled",color="green" ]; +"395E" [ label="964b86fc1bba0e",shape="box",style="filled",color="grey" ]; +"108" [ label="6d4a4a5a5af91b895272c30",shape="hexagon",style="filled",color="green" ]; +"397E" [ label="b5e86c73d1198f",shape="box",style="filled",color="grey" ]; +"109" [ label="e0ad365c2fb444358201",shape="hexagon",style="filled",color="green" ]; +"399E" [ label="bb5e89c8963",shape="box",style="filled",color="grey" ]; +"110" [ label="b07bbdc8cca5985d4c4",shape="hexagon",style="filled",color="green" ]; +"401E" [ label="50023f6f88",shape="box",style="filled",color="grey" ]; +"111" [ label="df5dba74c75b228de48c",shape="hexagon",style="filled",color="green" ]; +"403E" [ label="7e493ee44b28",shape="box",style="filled",color="grey" ]; +"112" [ label="0b8694c9ef9b27b9c3d8",shape="hexagon",style="filled",color="green" ]; +"405E" [ label="2342b759c03",shape="box",style="filled",color="grey" ]; +"113" [ label="81e20155999fa64e0ae6fd",shape="hexagon",style="filled",color="green" ]; +"407E" [ label="4280833ef80172",shape="box",style="filled",color="grey" ]; +"114" [ label="3ef07ae75d29a707",shape="hexagon",style="filled",color="green" ]; +"409E" [ label="4280833ef80172",shape="box",style="filled",color="grey" ]; +"115" [ label="4a36db80f1ab1e97",shape="hexagon",style="filled",color="green" ]; +"411E" [ label="460aed10cc9",shape="box",style="filled",color="grey" ]; +"116" [ label="16da5f1301b36df4df0f",shape="hexagon",style="filled",color="green" ]; +"413E" [ label="460aed10cc9",shape="box",style="filled",color="grey" ]; +"117" [ label="6b3f3fa236bb90592d23a",shape="hexagon",style="filled",color="green" ]; +"415E" [ label="83c397b8bf7f",shape="box",style="filled",color="grey" ]; +"118" [ label="f2a57e4d4f0cec516891e3",shape="hexagon",style="filled",color="green" ]; +"417E" [ label="bd2484",shape="box",style="filled",color="grey" ]; +"119" [ label="deb3089920548bf1ecb23f0d",shape="hexagon",style="filled",color="green" ]; +"419E" [ label="87a7e69a72412",shape="box",style="filled",color="grey" ]; +"120" [ label="bf01c8a262",shape="hexagon",style="filled",color="green" ]; +"421E" [ label="01",shape="box",style="filled",color="grey" ]; +"121" [ label="23dc3a52fed9c119610b5e8",shape="hexagon",style="filled",color="green" ]; +"423E" [ label="71e6b",shape="box",style="filled",color="grey" ]; +"122" [ label="aff7fc220edc93572bb2",shape="hexagon",style="filled",color="green" ]; +"748E" [ label="68d8993e61d8c82cd29e8d0182b0",shape="box",style="filled",color="grey" ]; +"123" [ label="78cc16f965adc5f712ea2372c6",shape="hexagon",style="filled",color="green" ]; +"425E" [ label="23ad1",shape="box",style="filled",color="grey" ]; +"124" [ label="5be631dff7b97697be7dc0a2f07f2",shape="hexagon",style="filled",color="green" ]; +"427E" [ label="",shape="box",style="filled",color="grey" ]; +"786E" [ label="421",shape="box",style="filled",color="grey" ]; +"125" [ label="48398d080dfcccced48da1980",shape="hexagon",style="filled",color="green" ]; +"431E" [ label="866808df",shape="box",style="filled",color="grey" ]; +"126" [ label="03716a2c341e5edaa31",shape="hexagon",style="filled",color="green" ]; +"433E" [ label="21407f8a6d7",shape="box",style="filled",color="grey" ]; +"127" [ label="ddfeabe456a9de5f5784",shape="hexagon",style="filled",color="green" ]; +"435E" [ label="aac615ae78",shape="box",style="filled",color="grey" ]; +"128" [ label="d550a7f392c787661aadd48",shape="hexagon",style="filled",color="green" ]; +"437E" [ label="e3aefac763",shape="box",style="filled",color="grey" ]; +"129" [ label="4c82921f4ad3f07066540",shape="hexagon",style="filled",color="green" ]; +"439E" [ label="a7fe7",shape="box",style="filled",color="grey" ]; +"130" [ label="0bc7f8f513e0e74b270",shape="hexagon",style="filled",color="green" ]; +"441E" [ label="a849f9d352e",shape="box",style="filled",color="grey" ]; +"131" [ label="3b1563a23eb9",shape="hexagon",style="filled",color="green" ]; +"443E" [ label="a8e9",shape="box",style="filled",color="grey" ]; +"132" [ label="be233fafa38d931d894",shape="hexagon",style="filled",color="green" ]; +"445E" [ label="a849f9d352e",shape="box",style="filled",color="grey" ]; +"133" [ label="f906dc5244ee6a371f8",shape="hexagon",style="filled",color="green" ]; +"749E" [ label="4c865eec228e41e7f4e5fc68a9a6",shape="box",style="filled",color="grey" ]; +"134" [ label="e7a887d88c2318beba51",shape="hexagon",style="filled",color="green" ]; +"447E" [ label="9d8988c0945d6",shape="box",style="filled",color="grey" ]; +"135" [ label="be6b73bd46a7a5183e8c91a",shape="hexagon",style="filled",color="green" ]; +"449E" [ label="ee91c97828",shape="box",style="filled",color="grey" ]; +"769E" [ label="444189d179b5db71fe",shape="box",style="filled",color="grey" ]; +"770E" [ label="1e1fbbe14ac24e0518",shape="box",style="filled",color="grey" ]; +"136" [ label="644f112bb0aa452ee7040a",shape="hexagon",style="filled",color="green" ]; +"451E" [ label="52f247fc3b",shape="box",style="filled",color="grey" ]; +"137" [ label="010957669f3770aac",shape="hexagon",style="filled",color="green" ]; +"453E" [ label="78",shape="box",style="filled",color="grey" ]; +"138" [ label="0a185946ee443342b07d8e1",shape="hexagon",style="filled",color="green" ]; +"455E" [ label="87a7e69a72412",shape="box",style="filled",color="grey" ]; +"139" [ label="f66fe4df3d189e69ce10c9c",shape="hexagon",style="filled",color="green" ]; +"457E" [ label="21407f8a6d7",shape="box",style="filled",color="grey" ]; +"140" [ label="247e407f45b353f8",shape="hexagon",style="filled",color="green" ]; +"459E" [ label="",shape="box",style="filled",color="grey" ]; +"141" [ label="84907547f36d0ff7",shape="hexagon",style="filled",color="green" ]; +"461E" [ label="e920b915087",shape="box",style="filled",color="grey" ]; +"142" [ label="805004328dad9d315d",shape="hexagon",style="filled",color="green" ]; +"463E" [ label="4280833ef80172",shape="box",style="filled",color="grey" ]; +"143" [ label="4f0cbd3fbf0cb1e8c",shape="hexagon",style="filled",color="green" ]; +"465E" [ label="403126",shape="box",style="filled",color="grey" ]; +"144" [ label="4869e993f2bb10f",shape="hexagon",style="filled",color="green" ]; +"467E" [ label="ff",shape="box",style="filled",color="grey" ]; +"145" [ label="665b76844ff78fc2cf66ca2",shape="hexagon",style="filled",color="green" ]; +"469E" [ label="af0268dddd",shape="box",style="filled",color="grey" ]; +"146" [ label="3f16509139c7dad5163b91799",shape="hexagon",style="filled",color="green" ]; +"471E" [ label="3089106e3b",shape="box",style="filled",color="grey" ]; +"147" [ label="01db23a60422ba93a68611cc0",shape="hexagon",style="filled",color="green" ]; +"473E" [ label="",shape="box",style="filled",color="grey" ]; +"148" [ label="46125fcc583c0f494a3a1d3",shape="hexagon",style="filled",color="green" ]; +"475E" [ label="db6c4213a717bc",shape="box",style="filled",color="grey" ]; +"149" [ label="731857fe189fb398e80a0594",shape="hexagon",style="filled",color="green" ]; +"477E" [ label="3089106e3b",shape="box",style="filled",color="grey" ]; +"150" [ label="6fb7a84e370ef70feac5cb",shape="hexagon",style="filled",color="green" ]; +"479E" [ label="396b16a892fe",shape="box",style="filled",color="grey" ]; +"151" [ label="e343cea291b79a2ed4e",shape="hexagon",style="filled",color="green" ]; +"481E" [ label="88d8b220746882d",shape="box",style="filled",color="grey" ]; +"152" [ label="5f2592b20f13356b7fc8b42",shape="hexagon",style="filled",color="green" ]; +"483E" [ label="",shape="box",style="filled",color="grey" ]; +"153" [ label="275a0407e33e9b8aa9cdd051",shape="hexagon",style="filled",color="green" ]; +"731E" [ label="",shape="box",style="filled",color="grey" ]; +"154" [ label="011d119375cf494ca2fa8d59",shape="hexagon",style="filled",color="green" ]; +"750E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ]; +"155" [ label="173fd00917644f0f1f3e3",shape="hexagon",style="filled",color="green" ]; +"485E" [ label="0acc5bb8ca4",shape="box",style="filled",color="grey" ]; +"156" [ label="c72df69b40156a3254",shape="hexagon",style="filled",color="green" ]; +"487E" [ label="fff03efcd",shape="box",style="filled",color="grey" ]; +"157" [ label="6c632ad9c42228bb337",shape="hexagon",style="filled",color="green" ]; +"489E" [ label="eb8",shape="box",style="filled",color="grey" ]; +"158" [ label="bbb13dc62adf2de2a42b6",shape="hexagon",style="filled",color="green" ]; +"491E" [ label="69ce90c9b2",shape="box",style="filled",color="grey" ]; +"159" [ label="6282bc21f6",shape="hexagon",style="filled",color="green" ]; +"495E" [ label="de34214b4c258c9333ec3",shape="box",style="filled",color="grey" ]; +"160" [ label="71cf45dd4e91bcca945137b40e",shape="hexagon",style="filled",color="green" ]; +"499E" [ label="65fd8495",shape="box",style="filled",color="grey" ]; +"161" [ label="a3b6df27179b175c88fa4c9cf9f",shape="hexagon",style="filled",color="green" ]; +"501E" [ label="6577",shape="box",style="filled",color="grey" ]; +"162" [ label="284f14a259991806654e74",shape="hexagon",style="filled",color="green" ]; +"503E" [ label="4280833ef80172",shape="box",style="filled",color="grey" ]; +"163" [ label="a7c99ccf6ddf6f5ebbe",shape="hexagon",style="filled",color="green" ]; +"505E" [ label="c4fd8",shape="box",style="filled",color="grey" ]; +"164" [ label="c32d2697e8",shape="hexagon",style="filled",color="green" ]; +"507E" [ label="52f247fc3b",shape="box",style="filled",color="grey" ]; +"165" [ label="d12bd75c24b110ef90cdd35d3",shape="hexagon",style="filled",color="green" ]; +"509E" [ label="0668",shape="box",style="filled",color="grey" ]; +"166" [ label="1c07453d584f3d14b1876fdb",shape="hexagon",style="filled",color="green" ]; +"511E" [ label="460aed10cc9",shape="box",style="filled",color="grey" ]; +"167" [ label="f713a8b311ffa05ce3683ad10",shape="hexagon",style="filled",color="green" ]; +"513E" [ label="30d6138b63eb",shape="box",style="filled",color="grey" ]; +"168" [ label="3cdc90c57243373efaba65a",shape="hexagon",style="filled",color="green" ]; +"515E" [ label="fa2afbd869",shape="box",style="filled",color="grey" ]; +"169" [ label="e3bdbca0e2256fffa8a59018",shape="hexagon",style="filled",color="green" ]; +"517E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ]; +"170" [ label="75ba8d840070942eb4e737849",shape="hexagon",style="filled",color="green" ]; +"519E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ]; +"171" [ label="fbdc3ca37406f66635c8b226e",shape="hexagon",style="filled",color="green" ]; +"521E" [ label="8cbcf5cb5",shape="box",style="filled",color="grey" ]; +"172" [ label="40b49a5a9bb256c7a3286e56",shape="hexagon",style="filled",color="green" ]; +"523E" [ label="f72564578be",shape="box",style="filled",color="grey" ]; +"173" [ label="3b2f08d52e4bca3f9ca7bbbd6",shape="hexagon",style="filled",color="green" ]; +"525E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ]; +"174" [ label="4a38abc630c82b0c48dfbf5271",shape="hexagon",style="filled",color="green" ]; +"527E" [ label="f0bd1521",shape="box",style="filled",color="grey" ]; +"175" [ label="2d7b7fb6c9ad6821752651f7",shape="hexagon",style="filled",color="green" ]; +"529E" [ label="47b2da3d",shape="box",style="filled",color="grey" ]; +"176" [ label="910b00285f11bb90d0a15641",shape="hexagon",style="filled",color="green" ]; +"531E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ]; +"177" [ label="24431c3eb075102f07cc2c1be",shape="hexagon",style="filled",color="green" ]; +"533E" [ label="",shape="box",style="filled",color="grey" ]; +"178" [ label="07f8a9e55a16beddb3c9153b0",shape="hexagon",style="filled",color="green" ]; +"535E" [ label="81dabfaba8",shape="box",style="filled",color="grey" ]; +"179" [ label="c1c30f30d40c4f1f84924622f",shape="hexagon",style="filled",color="green" ]; +"537E" [ label="c5d5be3942",shape="box",style="filled",color="grey" ]; +"180" [ label="86276bb1e23f2c7ffcbe82a0",shape="hexagon",style="filled",color="green" ]; +"539E" [ label="0f940646",shape="box",style="filled",color="grey" ]; +"181" [ label="f78e145a127014eb43345a0c",shape="hexagon",style="filled",color="green" ]; +"541E" [ label="d370c12dbc",shape="box",style="filled",color="grey" ]; +"182" [ label="a27037332d9fa5c43bcfe94c0",shape="hexagon",style="filled",color="green" ]; +"543E" [ label="80874aa8",shape="box",style="filled",color="grey" ]; +"183" [ label="c29ce10bb8d19b498355aa04",shape="hexagon",style="filled",color="green" ]; +"545E" [ label="1c08373",shape="box",style="filled",color="grey" ]; +"184" [ label="4f8c642b53c349c687534bda35db",shape="hexagon",style="filled",color="green" ]; +"547E" [ label="46969c4",shape="box",style="filled",color="grey" ]; +"185" [ label="30cc206b1878485",shape="hexagon",style="filled",color="green" ]; +"549E" [ label="23ad1",shape="box",style="filled",color="grey" ]; +"186" [ label="5d69639a5e3bdd3d",shape="hexagon",style="filled",color="green" ]; +"551E" [ label="6139fa6adc88d",shape="box",style="filled",color="grey" ]; +"187" [ label="b656f0ed2202b8e46eb",shape="hexagon",style="filled",color="green" ]; +"553E" [ label="f6e6236b48bc3",shape="box",style="filled",color="grey" ]; +"188" [ label="3b566eaa70ed401479d43a9",shape="hexagon",style="filled",color="green" ]; +"555E" [ label="4c6c8c",shape="box",style="filled",color="grey" ]; +"189" [ label="d6125ef42bd9958",shape="hexagon",style="filled",color="green" ]; +"557E" [ label="4c6c8c",shape="box",style="filled",color="grey" ]; +"190" [ label="dd12f26f8d9bb55",shape="hexagon",style="filled",color="green" ]; +"559E" [ label="83c397b8bf7f",shape="box",style="filled",color="grey" ]; +"191" [ label="ea890ccca2f7c2107351",shape="hexagon",style="filled",color="green" ]; +"561E" [ label="eb8",shape="box",style="filled",color="grey" ]; +"192" [ label="84e4f1c582427a98d7b",shape="hexagon",style="filled",color="green" ]; +"563E" [ label="eb8",shape="box",style="filled",color="grey" ]; +"193" [ label="d378760b814eaecb6efe636e0efc4",shape="hexagon",style="filled",color="green" ]; +"565E" [ label="81bcc35f82891",shape="box",style="filled",color="grey" ]; +"194" [ label="f722890f70a32dce3baff371a",shape="hexagon",style="filled",color="green" ]; +"567E" [ label="84e4ede82074",shape="box",style="filled",color="grey" ]; +"195" [ label="666f11bb45c3a8dcf26e1ed79",shape="hexagon",style="filled",color="green" ]; +"569E" [ label="c90f755c8b6612d",shape="box",style="filled",color="grey" ]; +"196" [ label="91ecbe29a71f00ed5a3",shape="hexagon",style="filled",color="green" ]; +"571E" [ label="0a963fef9",shape="box",style="filled",color="grey" ]; +"197" [ label="30c3f3bf8463d3843dc57d8e98",shape="hexagon",style="filled",color="green" ]; +"573E" [ label="3089106e3b",shape="box",style="filled",color="grey" ]; +"198" [ label="8ea965ab6ee8dedb6c3333e9",shape="hexagon",style="filled",color="green" ]; +"575E" [ label="84e4ede82074",shape="box",style="filled",color="grey" ]; +"199" [ label="3eecb304bab2136a76deda",shape="hexagon",style="filled",color="green" ]; +"577E" [ label="8df",shape="box",style="filled",color="grey" ]; +"200" [ label="d886e4b76537a99bc71b8a9331c94",shape="hexagon",style="filled",color="green" ]; +"579E" [ label="1172dca23",shape="box",style="filled",color="grey" ]; +"201" [ label="dcc5d5e9d6c4e",shape="hexagon",style="filled",color="green" ]; +"581E" [ label="a8e9",shape="box",style="filled",color="grey" ]; +"202" [ label="8292af691429f8d9ed481ff71ffd",shape="hexagon",style="filled",color="green" ]; +"583E" [ label="212af4",shape="box",style="filled",color="grey" ]; +"203" [ label="12fcb26b3de00ef98719c2ca",shape="hexagon",style="filled",color="green" ]; +"585E" [ label="",shape="box",style="filled",color="grey" ]; +"204" [ label="a141a557a60912051f3c135",shape="hexagon",style="filled",color="green" ]; +"587E" [ label="",shape="box",style="filled",color="grey" ]; +"205" [ label="64eeeddfc34489ff396",shape="hexagon",style="filled",color="green" ]; +"751E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ]; +"206" [ label="f5d636e14a6cd716362158d",shape="hexagon",style="filled",color="green" ]; +"589E" [ label="32c958c9997",shape="box",style="filled",color="grey" ]; +"207" [ label="84e4978afc069d5a1aecbf2b",shape="hexagon",style="filled",color="green" ]; +"593E" [ label="56caa96d171a9ac2da7c",shape="box",style="filled",color="grey" ]; +"208" [ label="52a6c2063bccd83110c32",shape="hexagon",style="filled",color="green" ]; +"597E" [ label="",shape="box",style="filled",color="grey" ]; +"209" [ label="46f754ea06f070dbc023e571a876",shape="hexagon",style="filled",color="green" ]; +"599E" [ label="ffccaa9e3",shape="box",style="filled",color="grey" ]; +"210" [ label="c10cb9baf4dcb43e24",shape="hexagon",style="filled",color="green" ]; +"601E" [ label="ac6e99186",shape="box",style="filled",color="grey" ]; +"211" [ label="3dafe1619016463f521f",shape="hexagon",style="filled",color="green" ]; +"603E" [ label="b9",shape="box",style="filled",color="grey" ]; +"212" [ label="0f5db6ce12751ddcc64e",shape="hexagon",style="filled",color="green" ]; +"605E" [ label="bb828f1a326",shape="box",style="filled",color="grey" ]; +"213" [ label="34c8c8dc0f6e41c7e7b2",shape="hexagon",style="filled",color="green" ]; +"607E" [ label="2832ed5cea6",shape="box",style="filled",color="grey" ]; +"214" [ label="0a49c95f107c0aa57c9b5748",shape="hexagon",style="filled",color="green" ]; +"609E" [ label="",shape="box",style="filled",color="grey" ]; +"215" [ label="3b4fdad8e0429d112",shape="hexagon",style="filled",color="green" ]; +"611E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ]; +"216" [ label="17dafa5ebaafd48440e3",shape="hexagon",style="filled",color="green" ]; +"613E" [ label="b5f038f79a3",shape="box",style="filled",color="grey" ]; +"217" [ label="f4c69e5e212f89348122e8",shape="hexagon",style="filled",color="green" ]; +"615E" [ label="396b16a892fe",shape="box",style="filled",color="grey" ]; +"218" [ label="4f2e020854dfacce46a12",shape="hexagon",style="filled",color="green" ]; +"617E" [ label="e079d2c",shape="box",style="filled",color="grey" ]; +"219" [ label="6448451ac2ceade90715378b",shape="hexagon",style="filled",color="green" ]; +"619E" [ label="",shape="box",style="filled",color="grey" ]; +"220" [ label="7d7b14baa649330",shape="hexagon",style="filled",color="green" ]; +"621E" [ label="77d145b32328880440c7a",shape="box",style="filled",color="grey" ]; +"221" [ label="d7c27cc6f7b02a31eb64d",shape="hexagon",style="filled",color="green" ]; +"623E" [ label="87a7e69a72412",shape="box",style="filled",color="grey" ]; +"222" [ label="8f5a69ece1",shape="hexagon",style="filled",color="green" ]; +"752E" [ label="eb9cf6456613d4cd06f7c0894bd6",shape="box",style="filled",color="grey" ]; +"223" [ label="eccf7c722ddf",shape="hexagon",style="filled",color="green" ]; +"625E" [ label="df61d5f5fc",shape="box",style="filled",color="grey" ]; +"224" [ label="86633c26be93ada8b",shape="hexagon",style="filled",color="green" ]; +"627E" [ label="08500a6044",shape="box",style="filled",color="grey" ]; +"225" [ label="3f9ddf1ffbc0d38b",shape="hexagon",style="filled",color="green" ]; +"629E" [ label="07",shape="box",style="filled",color="grey" ]; +"226" [ label="e33792703",shape="hexagon",style="filled",color="green" ]; +"631E" [ label="6a8f5bafb1",shape="box",style="filled",color="grey" ]; +"227" [ label="293a225dc56dd1e0564e6bb",shape="hexagon",style="filled",color="green" ]; +"633E" [ label="e3aefac763",shape="box",style="filled",color="grey" ]; +"228" [ label="57c77c341f94afddef07e6",shape="hexagon",style="filled",color="green" ]; +"635E" [ label="5e80f85274",shape="box",style="filled",color="grey" ]; +"229" [ label="3bbfc7bfdbbb1ba1bfad7517",shape="hexagon",style="filled",color="green" ]; +"637E" [ label="",shape="box",style="filled",color="grey" ]; +"230" [ label="a7167d5eb5408b3839903",shape="hexagon",style="filled",color="green" ]; +"639E" [ label="8c8b5bde6",shape="box",style="filled",color="grey" ]; +"231" [ label="34d7bb6af4fcd8d630de72500c8",shape="hexagon",style="filled",color="green" ]; +"641E" [ label="32fe7eee5283",shape="box",style="filled",color="grey" ]; +"232" [ label="8e69341faa4489",shape="hexagon",style="filled",color="green" ]; +"643E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ]; +"233" [ label="459236f07c73814faf5",shape="hexagon",style="filled",color="green" ]; +"645E" [ label="18083a711d",shape="box",style="filled",color="grey" ]; +"234" [ label="c71aa521578164debd0c5",shape="hexagon",style="filled",color="green" ]; +"647E" [ label="78",shape="box",style="filled",color="grey" ]; +"235" [ label="a5520019b8a73bc141b5fd416a",shape="hexagon",style="filled",color="green" ]; +"649E" [ label="3219b6b71443",shape="box",style="filled",color="grey" ]; +"236" [ label="6c89dc59ee7aaebbbd6bb64",shape="hexagon",style="filled",color="green" ]; +"651E" [ label="8c8b5bde6",shape="box",style="filled",color="grey" ]; +"237" [ label="a9a36ef02f",shape="hexagon",style="filled",color="green" ]; +"653E" [ label="6a80cbe",shape="box",style="filled",color="grey" ]; +"238" [ label="3db761b596844f133c",shape="hexagon",style="filled",color="green" ]; +"655E" [ label="e920b915087",shape="box",style="filled",color="grey" ]; +"239" [ label="383db224d7508ef072bea21d0",shape="hexagon",style="filled",color="green" ]; +"657E" [ label="975fedfb64df",shape="box",style="filled",color="grey" ]; +"240" [ label="8e307415fb435445ced7",shape="hexagon",style="filled",color="green" ]; +"659E" [ label="21dff35936370ae5f",shape="box",style="filled",color="grey" ]; +"241" [ label="aff6d7896e0e142bbc3e78",shape="hexagon",style="filled",color="green" ]; +"661E" [ label="d2498",shape="box",style="filled",color="grey" ]; +"242" [ label="e153c6e676c7369b285b4e9033a",shape="hexagon",style="filled",color="green" ]; +"663E" [ label="",shape="box",style="filled",color="grey" ]; +"243" [ label="f3c4311de0e931f08c232b",shape="hexagon",style="filled",color="green" ]; +"665E" [ label="a849f9d352e",shape="box",style="filled",color="grey" ]; +"244" [ label="0c72a426929600000f5",shape="hexagon",style="filled",color="green" ]; +"667E" [ label="45827dbdd8",shape="box",style="filled",color="grey" ]; +"245" [ label="38fa61352f5086d2cb51",shape="hexagon",style="filled",color="green" ]; +"669E" [ label="af0268dddd",shape="box",style="filled",color="grey" ]; +"246" [ label="ad1dd724f1c3e",shape="hexagon",style="filled",color="green" ]; +"671E" [ label="cab04b7c14a",shape="box",style="filled",color="grey" ]; +"247" [ label="11bb8ed3ae227d3acefc",shape="hexagon",style="filled",color="green" ]; +"673E" [ label="eb8",shape="box",style="filled",color="grey" ]; +"248" [ label="f2c7b3bb4d44f977d0ab8a42351",shape="hexagon",style="filled",color="green" ]; +"675E" [ label="",shape="box",style="filled",color="grey" ]; +"249" [ label="51e045ca826077ae765",shape="hexagon",style="filled",color="green" ]; +"679E" [ label="e842",shape="box",style="filled",color="grey" ]; +"250" [ label="aa0adc8978020629574",shape="hexagon",style="filled",color="green" ]; +"753E" [ label="68d8993e61d8c82cd29e8d0182b0",shape="box",style="filled",color="grey" ]; +"251" [ label="3b6b2c549de670d7bf5fc0ee",shape="hexagon",style="filled",color="green" ]; +"681E" [ label="",shape="box",style="filled",color="grey" ]; +"252" [ label="5eea496cc301b2a9721",shape="hexagon",style="filled",color="green" ]; +"683E" [ label="",shape="box",style="filled",color="grey" ]; +"253" [ label="bfc6564cbdeeffac00a141",shape="hexagon",style="filled",color="green" ]; +"685E" [ label="3b0a8a1c2e5050bd",shape="box",style="filled",color="grey" ]; +"254" [ label="c360aaeb167487c9578a8f",shape="hexagon",style="filled",color="green" ]; +"687E" [ label="d",shape="box",style="filled",color="grey" ]; +"255" [ label="39d025b265f9790490781cb201",shape="hexagon",style="filled",color="green" ]; +"689E" [ label="5e80f85274",shape="box",style="filled",color="grey" ]; +"256" [ label="b4ce21e0a3df1d097277d6",shape="hexagon",style="filled",color="green" ]; +"691E" [ label="a849f9d352e",shape="box",style="filled",color="grey" ]; +"257" [ label="8bdb6a91c6dee925b557c705b3",shape="hexagon",style="filled",color="green" ]; +"693E" [ label="53069e384a2",shape="box",style="filled",color="grey" ]; +"258" [ label="ac487676a04e4",shape="hexagon",style="filled",color="green" ]; +"695E" [ label="a8e9",shape="box",style="filled",color="grey" ]; +"259" [ label="18115fa32ff1cb99",shape="hexagon",style="filled",color="green" ]; +"697E" [ label="45827dbdd8",shape="box",style="filled",color="grey" ]; +"260" [ label="b7b899dc8bc6a32b28cb098fa16",shape="hexagon",style="filled",color="green" ]; +"699E" [ label="32fe7eee5283",shape="box",style="filled",color="grey" ]; +"261" [ label="b69e426d974e1907e88",shape="hexagon",style="filled",color="green" ]; +"703E" [ label="e842",shape="box",style="filled",color="grey" ]; +"262" [ label="60d0128bdb61ae40e98638bd1391",shape="hexagon",style="filled",color="green" ]; +"705E" [ label="23ad1",shape="box",style="filled",color="grey" ]; +"264" [ label="8fb60d769e4c387",shape="hexagon",style="filled",color="green" ]; +"709E" [ label="6a8f5bafb1",shape="box",style="filled",color="grey" ]; +"265" [ label="e1fa7f549e5a0893bb42da5",shape="hexagon",style="filled",color="green" ]; +"711E" [ label="6a3c6921b0aeceda3",shape="box",style="filled",color="grey" ]; +"266" [ label="a77622f2ff77ffeeb2",shape="hexagon",style="filled",color="green" ]; +"713E" [ label="21dff35936370ae5f",shape="box",style="filled",color="grey" ]; +"267" [ label="30d9d350943c0e3ff7594b50",shape="hexagon",style="filled",color="green" ]; +"715E" [ label="b5e86c73d1198f",shape="box",style="filled",color="grey" ]; +"268" [ label="89ced1a7906d58d687d5a04",shape="hexagon",style="filled",color="green" ]; +"717E" [ label="c0174bbe7ae8",shape="box",style="filled",color="grey" ]; +"269" [ label="1de26f6b12b0d292f94184",shape="hexagon",style="filled",color="green" ]; +"719E" [ label="65fd8495",shape="box",style="filled",color="grey" ]; +"270" [ label="26fa7360ab81be9d4434a",shape="hexagon",style="filled",color="green" ]; +"721E" [ label="af0268dddd",shape="box",style="filled",color="grey" ]; +"272" [ label="4a9d79c960b8d33e39251e5f66",shape="hexagon" ]; +"34E" [ label="330342f283ef2",shape="box",style="filled",color="grey" ]; +"252E" [ label="3dafb9a29c00",shape="box",style="filled",color="grey" ]; +"436E" [ label="8d5137b16a",shape="box",style="filled",color="grey" ]; +"274" [ label="10a7d61c201c67a5e78542807cd",shape="hexagon" ]; +"59E" [ label="ef6361295eba07",shape="box",style="filled",color="grey" ]; +"500E" [ label="a8f0fe2eb7bc1471",shape="box",style="filled",color="grey" ]; +"720E" [ label="cfff3acd8e9d",shape="box",style="filled",color="grey" ]; +"275" [ label="f8ff39eab120851f143bf19",shape="hexagon" ]; +"98E" [ label="4e3cfd27a",shape="box",style="filled",color="grey" ]; +"278" [ label="4995c71223c9f6067324d387a2",shape="hexagon" ]; +"35E" [ label="57948adb5dead",shape="box",style="filled",color="grey" ]; +"488E" [ label="a738ba39",shape="box",style="filled",color="grey" ]; +"598E" [ label="be7d637c50c",shape="box",style="filled",color="grey" ]; +"604E" [ label="8d52f183ec",shape="box",style="filled",color="grey" ]; +"628E" [ label="cef12b6",shape="box",style="filled",color="grey" ]; +"279" [ label="b9ae94e6935503603341ecf4",shape="hexagon" ]; +"99E" [ label="14a3c17f3d",shape="box",style="filled",color="grey" ]; +"280" [ label="fd28c194a46fde909b019c52f",shape="hexagon" ]; +"242E" [ label="9fe65061641",shape="box",style="filled",color="grey" ]; +"270E" [ label="34d06d1ed6",shape="box",style="filled",color="grey" ]; +"272E" [ label="713db1c1",shape="box",style="filled",color="grey" ]; +"284E" [ label="90dccb18c0",shape="box",style="filled",color="grey" ]; +"286E" [ label="e17fea65",shape="box",style="filled",color="grey" ]; +"288E" [ label="aebb7b91b",shape="box",style="filled",color="grey" ]; +"586E" [ label="4348f3abcb7716",shape="box",style="filled",color="grey" ]; +"763E" [ label="b082f7a5ff",shape="box",style="filled",color="grey" ]; +"281" [ label="7c0ab977f5a3c4ab6d625f5033",shape="hexagon" ]; +"45E" [ label="20949455f573f",shape="box",style="filled",color="grey" ]; +"470E" [ label="c338481d79773",shape="box",style="filled",color="grey" ]; +"670E" [ label="e1d01ef89f",shape="box",style="filled",color="grey" ]; +"722E" [ label="c4507c22d19",shape="box",style="filled",color="grey" ]; +"282" [ label="7e0b91491c8c8566892cd9a0889",shape="hexagon" ]; +"103E" [ label="de9efa12873949",shape="box",style="filled",color="grey" ]; +"283" [ label="d58478d9c273ad4f4b2e091324",shape="hexagon" ]; +"165E" [ label="1a220eb692c",shape="box",style="filled",color="grey" ]; +"284" [ label="8be0efdd94a6383e87fbfded4f",shape="hexagon" ]; +"39E" [ label="c8a6c26d4fd9f",shape="box",style="filled",color="grey" ]; +"224E" [ label="8cbae42a3900",shape="box",style="filled",color="grey" ]; +"268E" [ label="fc73",shape="box",style="filled",color="grey" ]; +"632E" [ label="",shape="box",style="filled",color="grey" ]; +"710E" [ label="102f1",shape="box",style="filled",color="grey" ]; +"285" [ label="3aeb78ea51020a44f2d2615436dae",shape="hexagon" ]; +"53E" [ label="96deede0c6b44119",shape="box",style="filled",color="grey" ]; +"286" [ label="6bbd5b422edb8e358dcc20eecf9",shape="hexagon" ]; +"38E" [ label="4f2de229621272",shape="box",style="filled",color="grey" ]; +"166E" [ label="d495de0b35f6",shape="box",style="filled",color="grey" ]; +"288" [ label="4856000a6802ddfc121ef40432297",shape="hexagon",style="filled",color="#ff0000" ]; +"40E" [ label="04904a458422a5b9",shape="box",style="filled",color="grey" ]; +"218E" [ label="8cd4d",shape="box",style="filled",color="grey" ]; +"244E" [ label="",shape="box",style="filled",color="grey" ]; +"246E" [ label="9be88247",shape="box",style="filled",color="grey" ]; +"258E" [ label="4f05b",shape="box",style="filled",color="grey" ]; +"290E" [ label="8b092",shape="box",style="filled",color="grey" ]; +"292E" [ label="c3bbf4",shape="box",style="filled",color="grey" ]; +"308E" [ label="6331b3f",shape="box",style="filled",color="grey" ]; +"318E" [ label="",shape="box",style="filled",color="grey" ]; +"388E" [ label="3711",shape="box",style="filled",color="grey" ]; +"472E" [ label="c5255d",shape="box",style="filled",color="grey" ]; +"478E" [ label="5c6a2",shape="box",style="filled",color="grey" ]; +"566E" [ label="51ec95518d1b3",shape="box",style="filled",color="grey" ]; +"570E" [ label="82a65ed4b69",shape="box",style="filled",color="grey" ]; +"574E" [ label="05fed5e",shape="box",style="filled",color="grey" ]; +"608E" [ label="bf",shape="box",style="filled",color="grey" ]; +"614E" [ label="ce",shape="box",style="filled",color="grey" ]; +"658E" [ label="1a830d9f",shape="box",style="filled",color="grey" ]; +"664E" [ label="",shape="box",style="filled",color="grey" ]; +"682E" [ label="",shape="box",style="filled",color="grey" ]; +"289" [ label="2e31175cbd52fcd08360fe86d20",shape="hexagon" ]; +"41E" [ label="4ad5d68f07981a",shape="box",style="filled",color="grey" ]; +"636E" [ label="51192117f9b4",shape="box",style="filled",color="grey" ]; +"642E" [ label="6bf214d9e7fa5f2df",shape="box",style="filled",color="grey" ]; +"690E" [ label="558d8534f92fddfe",shape="box",style="filled",color="grey" ]; +"700E" [ label="6819fd5a6cdd280dd",shape="box",style="filled",color="grey" ]; +"290" [ label="3aa0ce5efcf79bc3ecced1886e89",shape="hexagon" ]; +"56E" [ label="ff9d64ddf49a20f",shape="box",style="filled",color="grey" ]; +"264E" [ label="6c93f24516f01d",shape="box",style="filled",color="grey" ]; +"510E" [ label="32b98f11f3d01d6",shape="box",style="filled",color="grey" ]; +"718E" [ label="8f7c875500073",shape="box",style="filled",color="grey" ]; +"291" [ label="7c1767485953d9c2",shape="hexagon" ]; +"66E" [ label="086",shape="box",style="filled",color="grey" ]; +"76E" [ label="",shape="box",style="filled",color="grey" ]; +"610E" [ label="450d3a2d49cbfd",shape="box",style="filled",color="grey" ]; +"292" [ label="9c1305d59c37e9be9f13d7d049c",shape="hexagon" ]; +"73E" [ label="817",shape="box",style="filled",color="grey" ]; +"293" [ label="efe092824916a5637ee35d439589",shape="hexagon" ]; +"49E" [ label="",shape="box",style="filled",color="grey" ]; +"214E" [ label="",shape="box",style="filled",color="grey" ]; +"216E" [ label="",shape="box",style="filled",color="grey" ]; +"236E" [ label="",shape="box",style="filled",color="grey" ]; +"278E" [ label="",shape="box",style="filled",color="grey" ]; +"358E" [ label="",shape="box",style="filled",color="grey" ]; +"398E" [ label="",shape="box",style="filled",color="grey" ]; +"400E" [ label="",shape="box",style="filled",color="grey" ]; +"402E" [ label="",shape="box",style="filled",color="grey" ]; +"404E" [ label="",shape="box",style="filled",color="grey" ]; +"406E" [ label="",shape="box",style="filled",color="grey" ]; +"408E" [ label="",shape="box",style="filled",color="grey" ]; +"412E" [ label="",shape="box",style="filled",color="grey" ]; +"438E" [ label="",shape="box",style="filled",color="grey" ]; +"448E" [ label="",shape="box",style="filled",color="grey" ]; +"476E" [ label="",shape="box",style="filled",color="grey" ]; +"504E" [ label="",shape="box",style="filled",color="grey" ]; +"552E" [ label="",shape="box",style="filled",color="grey" ]; +"634E" [ label="",shape="box",style="filled",color="grey" ]; +"768E" [ label="",shape="box",style="filled",color="grey" ]; +"295" [ label="70815f0352b43dc1562133ab6eb",shape="hexagon",style="filled",color="#A52A2A" ]; +"44E" [ label="ef2d4636934472",shape="box",style="filled",color="grey" ]; +"92E" [ label="22bd92e302816",shape="box",style="filled",color="grey" ]; +"250E" [ label="74e86",shape="box",style="filled",color="grey" ]; +"316E" [ label="",shape="box",style="filled",color="grey" ]; +"380E" [ label="",shape="box",style="filled",color="grey" ]; +"424E" [ label="c",shape="box",style="filled",color="grey" ]; +"442E" [ label="a5a",shape="box",style="filled",color="grey" ]; +"446E" [ label="bce",shape="box",style="filled",color="grey" ]; +"454E" [ label="",shape="box",style="filled",color="grey" ]; +"460E" [ label="",shape="box",style="filled",color="grey" ]; +"462E" [ label="",shape="box",style="filled",color="grey" ]; +"648E" [ label="",shape="box",style="filled",color="grey" ]; +"656E" [ label="e9",shape="box",style="filled",color="grey" ]; +"666E" [ label="b701e7",shape="box",style="filled",color="grey" ]; +"692E" [ label="f2e7cc",shape="box",style="filled",color="grey" ]; +"712E" [ label="8a9eb2806b0aa",shape="box",style="filled",color="grey" ]; +"296" [ label="e287d497450664a4c0f4efc338",shape="hexagon",style="filled",color="#ff0000" ]; +"47E" [ label="06eff1db45cdf",shape="box",style="filled",color="grey" ]; +"330E" [ label="c0f34a600",shape="box",style="filled",color="grey" ]; +"514E" [ label="bd7aca295ca",shape="box",style="filled",color="grey" ]; +"516E" [ label="0da9135",shape="box",style="filled",color="grey" ]; +"518E" [ label="fe821bce",shape="box",style="filled",color="grey" ]; +"520E" [ label="e64f22a31",shape="box",style="filled",color="grey" ]; +"522E" [ label="46e412a3",shape="box",style="filled",color="grey" ]; +"526E" [ label="99da1f8a5",shape="box",style="filled",color="grey" ]; +"528E" [ label="0f167280",shape="box",style="filled",color="grey" ]; +"530E" [ label="82d201",shape="box",style="filled",color="grey" ]; +"532E" [ label="1d529eb4",shape="box",style="filled",color="grey" ]; +"534E" [ label="",shape="box",style="filled",color="grey" ]; +"536E" [ label="bf141dbce",shape="box",style="filled",color="grey" ]; +"538E" [ label="e3fd0c7b3",shape="box",style="filled",color="grey" ]; +"540E" [ label="c96cb3",shape="box",style="filled",color="grey" ]; +"542E" [ label="0fabab47",shape="box",style="filled",color="grey" ]; +"544E" [ label="1b82200",shape="box",style="filled",color="grey" ]; +"297" [ label="2ced414a91575a48f2dd29a",shape="hexagon" ]; +"46E" [ label="85221d5e9e",shape="box",style="filled",color="grey" ]; +"93E" [ label="97a7eea3f",shape="box",style="filled",color="grey" ]; +"206E" [ label="4d22e1",shape="box",style="filled",color="grey" ]; +"426E" [ label="e65185ca",shape="box",style="filled",color="grey" ]; +"550E" [ label="",shape="box",style="filled",color="grey" ]; +"706E" [ label="a9012b7bb5",shape="box",style="filled",color="grey" ]; +"298" [ label="38f162cf917ce7298663a1f1c607",shape="hexagon" ]; +"36E" [ label="a031c9192ae8e75",shape="box",style="filled",color="grey" ]; +"95E" [ label="062fc905b9eb35",shape="box",style="filled",color="grey" ]; +"364E" [ label="c8fc17180bea86",shape="box",style="filled",color="grey" ]; +"394E" [ label="09e64744536c5e1",shape="box",style="filled",color="grey" ]; +"420E" [ label="af4a1fac3e2076",shape="box",style="filled",color="grey" ]; +"456E" [ label="238805e2194c3",shape="box",style="filled",color="grey" ]; +"624E" [ label="73e6ed83012",shape="box",style="filled",color="grey" ]; +"299" [ label="549fa15d68f0b3bee6192f888cd8",shape="hexagon" ]; +"48E" [ label="d17f8f4eeb8e63d",shape="box",style="filled",color="grey" ]; +"168E" [ label="cca7040e47789",shape="box",style="filled",color="grey" ]; +"260E" [ label="47ebc3f17",shape="box",style="filled",color="grey" ]; +"282E" [ label="cf5a6049ad",shape="box",style="filled",color="grey" ]; +"554E" [ label="2a47a6a27",shape="box",style="filled",color="grey" ]; +"590E" [ label="eff3468631dd4",shape="box",style="filled",color="grey" ]; +"767E" [ label="efb52b499303115c33fd",shape="box",style="filled",color="grey" ]; +"300" [ label="8593dcf973b110d00cecdc1e756",shape="hexagon",style="filled",color="#ff7f00" ]; +"62E" [ label="472a156cf2b55f",shape="box",style="filled",color="grey" ]; +"190E" [ label="647",shape="box",style="filled",color="grey" ]; +"226E" [ label="",shape="box",style="filled",color="grey" ]; +"238E" [ label="8a",shape="box",style="filled",color="grey" ]; +"254E" [ label="",shape="box",style="filled",color="grey" ]; +"256E" [ label="",shape="box",style="filled",color="grey" ]; +"262E" [ label="",shape="box",style="filled",color="grey" ]; +"266E" [ label="e8b",shape="box",style="filled",color="grey" ]; +"274E" [ label="",shape="box",style="filled",color="grey" ]; +"276E" [ label="f",shape="box",style="filled",color="grey" ]; +"294E" [ label="",shape="box",style="filled",color="grey" ]; +"296E" [ label="",shape="box",style="filled",color="grey" ]; +"310E" [ label="1b34fb150",shape="box",style="filled",color="grey" ]; +"320E" [ label="",shape="box",style="filled",color="grey" ]; +"322E" [ label="a7d2",shape="box",style="filled",color="grey" ]; +"332E" [ label="",shape="box",style="filled",color="grey" ]; +"340E" [ label="",shape="box",style="filled",color="grey" ]; +"344E" [ label="f55670",shape="box",style="filled",color="grey" ]; +"346E" [ label="1ed67841",shape="box",style="filled",color="grey" ]; +"348E" [ label="07283",shape="box",style="filled",color="grey" ]; +"374E" [ label="73ba1714ee",shape="box",style="filled",color="grey" ]; +"378E" [ label="27709106",shape="box",style="filled",color="grey" ]; +"452E" [ label="93ea0",shape="box",style="filled",color="grey" ]; +"508E" [ label="",shape="box",style="filled",color="grey" ]; +"524E" [ label="1d792d81",shape="box",style="filled",color="grey" ]; +"612E" [ label="a",shape="box",style="filled",color="grey" ]; +"626E" [ label="",shape="box",style="filled",color="grey" ]; +"638E" [ label="",shape="box",style="filled",color="grey" ]; +"644E" [ label="",shape="box",style="filled",color="grey" ]; +"654E" [ label="",shape="box",style="filled",color="grey" ]; +"672E" [ label="",shape="box",style="filled",color="grey" ]; +"302" [ label="23f94655294d3ff537f2915fa",shape="hexagon" ]; +"797E" [ label="",shape="box",style="filled",color="grey" ]; +"798E" [ label="a2eab7c9fa641e5f",shape="box",style="filled",color="grey" ]; +"303" [ label="a9058241db5b6b6c25569acdf5",shape="hexagon" ]; +"52E" [ label="b2babf3244213",shape="box",style="filled",color="grey" ]; +"650E" [ label="b354cd9e9dbb0bfa",shape="box",style="filled",color="grey" ]; +"304" [ label="bdbdb31bd777fb65dd6dd2d0e7",shape="hexagon" ]; +"50E" [ label="3bec1c012b498",shape="box",style="filled",color="grey" ]; +"640E" [ label="c54f0fc1e05",shape="box",style="filled",color="grey" ]; +"646E" [ label="9ab6c66dc",shape="box",style="filled",color="grey" ]; +"652E" [ label="699e3db878047",shape="box",style="filled",color="grey" ]; +"306" [ label="1d4ea80c7194689d69f9592186",shape="hexagon" ]; +"55E" [ label="8066f87a88f4e",shape="box",style="filled",color="grey" ]; +"220E" [ label="3a8173d6c",shape="box",style="filled",color="grey" ]; +"338E" [ label="24dfe1a997a",shape="box",style="filled",color="grey" ]; +"368E" [ label="65a1",shape="box",style="filled",color="grey" ]; +"486E" [ label="59a8b435ccd",shape="box",style="filled",color="grey" ]; +"490E" [ label="86e9b0428",shape="box",style="filled",color="grey" ]; +"562E" [ label="5a7a610a8a",shape="box",style="filled",color="grey" ]; +"564E" [ label="8f143077e",shape="box",style="filled",color="grey" ]; +"600E" [ label="6472c2861e0e0dd681",shape="box",style="filled",color="grey" ]; +"668E" [ label="f0f45e707",shape="box",style="filled",color="grey" ]; +"674E" [ label="95e93c4a13",shape="box",style="filled",color="grey" ]; +"698E" [ label="33e1de",shape="box",style="filled",color="grey" ]; +"307" [ label="7204950f6233bf9c9e1f00d4a870",shape="hexagon" ]; +"107E" [ label="ccceeef40edda78",shape="box",style="filled",color="grey" ]; +"308" [ label="a2c4b1d72e2da483a86ae0c62e5",shape="hexagon" ]; +"108E" [ label="eedc819a68add6",shape="box",style="filled",color="grey" ]; +"309" [ label="f603819d560c5603259aa05dca",shape="hexagon" ]; +"109E" [ label="acacfc83af504",shape="box",style="filled",color="grey" ]; +"310" [ label="2f43cba12702078b4e0d3bfdae2bc",shape="hexagon" ]; +"110E" [ label="3c1edc8de4795936",shape="box",style="filled",color="grey" ]; +"311" [ label="8f9cdc26798117dd3e9ee4a8770",shape="hexagon" ]; +"58E" [ label="881d373",shape="box",style="filled",color="grey" ]; +"234E" [ label="",shape="box",style="filled",color="grey" ]; +"300E" [ label="",shape="box",style="filled",color="grey" ]; +"306E" [ label="8c7cd9b93b1cbe48e1",shape="box",style="filled",color="grey" ]; +"314E" [ label="616d8a7b",shape="box",style="filled",color="grey" ]; +"342E" [ label="",shape="box",style="filled",color="grey" ]; +"354E" [ label="",shape="box",style="filled",color="grey" ]; +"370E" [ label="",shape="box",style="filled",color="grey" ]; +"382E" [ label="",shape="box",style="filled",color="grey" ]; +"422E" [ label="",shape="box",style="filled",color="grey" ]; +"444E" [ label="",shape="box",style="filled",color="grey" ]; +"582E" [ label="",shape="box",style="filled",color="grey" ]; +"620E" [ label="",shape="box",style="filled",color="grey" ]; +"630E" [ label="",shape="box",style="filled",color="grey" ]; +"684E" [ label="",shape="box",style="filled",color="grey" ]; +"696E" [ label="",shape="box",style="filled",color="grey" ]; +"801E" [ label="",shape="box",style="filled",color="grey" ]; +"312" [ label="97c9d726e27304311901a52ce",shape="hexagon",style="filled",color="#ff0000" ]; +"42E" [ label="1112164c2f7a",shape="box",style="filled",color="grey" ]; +"192E" [ label="5c609b12c",shape="box",style="filled",color="grey" ]; +"194E" [ label="00265",shape="box",style="filled",color="grey" ]; +"196E" [ label="04767",shape="box",style="filled",color="grey" ]; +"198E" [ label="f0d99f16",shape="box",style="filled",color="grey" ]; +"200E" [ label="",shape="box",style="filled",color="grey" ]; +"202E" [ label="6e186b",shape="box",style="filled",color="grey" ]; +"204E" [ label="d382",shape="box",style="filled",color="grey" ]; +"312E" [ label="c6b5321a",shape="box",style="filled",color="grey" ]; +"336E" [ label="",shape="box",style="filled",color="grey" ]; +"376E" [ label="",shape="box",style="filled",color="grey" ]; +"384E" [ label="aeb8",shape="box",style="filled",color="grey" ]; +"386E" [ label="2e53009d4a375",shape="box",style="filled",color="grey" ]; +"428E" [ label="",shape="box",style="filled",color="grey" ]; +"474E" [ label="",shape="box",style="filled",color="grey" ]; +"484E" [ label="",shape="box",style="filled",color="grey" ]; +"546E" [ label="dea1d1",shape="box",style="filled",color="grey" ]; +"548E" [ label="5a0b4b906a",shape="box",style="filled",color="grey" ]; +"314" [ label="1727041c622518c9dd24f7c211",shape="hexagon" ]; +"113E" [ label="49704867bee95",shape="box",style="filled",color="grey" ]; +"315" [ label="31f2f9aef958979f9f3532b9b",shape="hexagon",style="filled",color="#ff0000" ]; +"43E" [ label="47cd70f",shape="box",style="filled",color="grey" ]; +"240E" [ label="248df40dae",shape="box",style="filled",color="grey" ]; +"298E" [ label="",shape="box",style="filled",color="grey" ]; +"334E" [ label="9dd5bf47f",shape="box",style="filled",color="grey" ]; +"360E" [ label="",shape="box",style="filled",color="grey" ]; +"390E" [ label="28533c",shape="box",style="filled",color="grey" ]; +"418E" [ label="",shape="box",style="filled",color="grey" ]; +"492E" [ label="a4c7d0",shape="box",style="filled",color="grey" ]; +"502E" [ label="4f6f7f",shape="box",style="filled",color="grey" ]; +"584E" [ label="7ab64a969",shape="box",style="filled",color="grey" ]; +"588E" [ label="",shape="box",style="filled",color="grey" ]; +"602E" [ label="69",shape="box",style="filled",color="grey" ]; +"606E" [ label="67513d",shape="box",style="filled",color="grey" ]; +"662E" [ label="cf",shape="box",style="filled",color="grey" ]; +"316" [ label="a54092a3033f7d5e41e0a76c1",shape="hexagon" ]; +"51E" [ label="1467f017b74e",shape="box",style="filled",color="grey" ]; +"317" [ label="2043b477ac0393676a4309514d0",shape="hexagon" ]; +"116E" [ label="bdec8c86db51b9",shape="box",style="filled",color="grey" ]; +"318" [ label="ab48d1f65812bc0f8ab6941c3b5",shape="hexagon" ]; +"74E" [ label="81",shape="box",style="filled",color="grey" ]; +"319" [ label="ca3d67754cf62fdafbf0a1e0",shape="hexagon" ]; +"57E" [ label="75b14f1719d",shape="box",style="filled",color="grey" ]; +"94E" [ label="62f36ea98a",shape="box",style="filled",color="grey" ]; +"350E" [ label="e3a76d31ca59a",shape="box",style="filled",color="grey" ]; +"440E" [ label="b3cadc253f7",shape="box",style="filled",color="grey" ]; +"466E" [ label="fb58e11",shape="box",style="filled",color="grey" ]; +"676E" [ label="8606837526d81cdec",shape="box",style="filled",color="grey" ]; +"320" [ label="a7a7f3681dad1250b01cf80bc17",shape="hexagon" ]; +"60E" [ label="2c514b0cd8f7d3",shape="box",style="filled",color="grey" ]; +"366E" [ label="7e494b",shape="box",style="filled",color="grey" ]; +"434E" [ label="15d44ab97",shape="box",style="filled",color="grey" ]; +"458E" [ label="78b2d75d00166",shape="box",style="filled",color="grey" ]; +"618E" [ label="761e0f72f95",shape="box",style="filled",color="grey" ]; +"321" [ label="275afb2b215b966d9fac51b96b9",shape="hexagon" ]; +"72E" [ label="ac284d73563",shape="box",style="filled",color="grey" ]; +"362E" [ label="7e74e1587f3a4d208",shape="box",style="filled",color="grey" ]; +"372E" [ label="ffd1b1af3b6864078f3",shape="box",style="filled",color="grey" ]; +"572E" [ label="b38049e00",shape="box",style="filled",color="grey" ]; +"322" [ label="c3c93c700edc0cb4f95f03c04",shape="hexagon" ]; +"54E" [ label="99237fce1358",shape="box",style="filled",color="grey" ]; +"222E" [ label="3dcf8f454",shape="box",style="filled",color="grey" ]; +"302E" [ label="c5acd20cad2",shape="box",style="filled",color="grey" ]; +"556E" [ label="6c998bf2a5edd",shape="box",style="filled",color="grey" ]; +"558E" [ label="4b683",shape="box",style="filled",color="grey" ]; +"323" [ label="63a3d4fb9d38a0182be6e39e76",shape="hexagon" ]; +"37E" [ label="bba6e6e194ccf",shape="box",style="filled",color="grey" ]; +"208E" [ label="01938827",shape="box",style="filled",color="grey" ]; +"210E" [ label="9",shape="box",style="filled",color="grey" ]; +"352E" [ label="64ef1d545",shape="box",style="filled",color="grey" ]; +"450E" [ label="b473716",shape="box",style="filled",color="grey" ]; +"568E" [ label="7c13bf753da",shape="box",style="filled",color="grey" ]; +"576E" [ label="4e4a79111d",shape="box",style="filled",color="grey" ]; +"686E" [ label="af4abb0d6a99",shape="box",style="filled",color="grey" ]; +"324" [ label="4399cf78123dedd0dfe9776104",shape="hexagon" ]; +"228E" [ label="af9c489df53",shape="box",style="filled",color="grey" ]; +"248E" [ label="3703059dbc5a8",shape="box",style="filled",color="grey" ]; +"304E" [ label="8a46e6",shape="box",style="filled",color="grey" ]; +"468E" [ label="f9d09",shape="box",style="filled",color="grey" ]; +"578E" [ label="cd1e9af3dec2",shape="box",style="filled",color="grey" ]; +"660E" [ label="9e650e89bb",shape="box",style="filled",color="grey" ]; +"688E" [ label="f62b136b2171",shape="box",style="filled",color="grey" ]; +"694E" [ label="4727c415d06bcbef",shape="box",style="filled",color="grey" ]; +"714E" [ label="38b3b0d9",shape="box",style="filled",color="grey" ]; +"766E" [ label="a153512d982",shape="box",style="filled",color="grey" ]; +"325" [ label="40f253cd228f7ac2d0aee",shape="hexagon" ]; +"97E" [ label="a3ff993",shape="box",style="filled",color="grey" ]; +"506E" [ label="7528dd86b",shape="box",style="filled",color="grey" ]; +"326" [ label="89a2505da6179a80202d4a6c3",shape="hexagon" ]; +"61E" [ label="75eea05672a5",shape="box",style="filled",color="grey" ]; +"175E" [ label="3b0c08dd2ca",shape="box",style="filled",color="grey" ]; +"482E" [ label="a3781072b",shape="box",style="filled",color="grey" ]; +"328" [ label="2601085bde1b2450d64509f36",shape="hexagon" ]; +"75E" [ label="0efbd",shape="box",style="filled",color="grey" ]; +"580E" [ label="bb92d1da1f38d52f8ff",shape="box",style="filled",color="grey" ]; +"329" [ label="5c81103c751345d0ee0f4bd",shape="hexagon" ]; +"96E" [ label="b23526044",shape="box",style="filled",color="grey" ]; +"330" [ label="fcbd9ad14139718bc6fcc8b4",shape="hexagon" ]; +"100E" [ label="73ca543bf1",shape="box",style="filled",color="grey" ]; +"170E" [ label="c2f32e2cf9",shape="box",style="filled",color="grey" ]; +"333" [ label="44cbb41a9cfc15497eacd294",color="yellow",style="filled",shape="doubleoctagon" ]; +"63E" [ label="6a91",shape="box",style="filled",color="grey" ]; +"67E" [ label="b074e",shape="box",style="filled",color="grey" ]; +"68E" [ label="06209",shape="box",style="filled",color="grey" ]; +"69E" [ label="58e3dcc618",shape="box",style="filled",color="grey" ]; +"70E" [ label="eee44624da",shape="box",style="filled",color="grey" ]; +"71E" [ label="6a91",shape="box",style="filled",color="grey" ]; +"802E" [ label="e1e8c",shape="box",style="filled",color="grey" ]; +"793E" [ label="",shape="box",style="filled",color="grey" ]; +"334" [ label="b46b0756dba915943839e90a55",color="yellow",style="filled",shape="doubleoctagon" ]; +"64E" [ label="5fdf",shape="box",style="filled",color="grey" ]; +"81E" [ label="3eca1f94dc181",shape="box",style="filled",color="grey" ]; +"82E" [ label="6b1bb9b0e",shape="box",style="filled",color="grey" ]; +"83E" [ label="a54d477232",shape="box",style="filled",color="grey" ]; +"84E" [ label="a164d9f60fbbdd",shape="box",style="filled",color="grey" ]; +"85E" [ label="78c8463ea",shape="box",style="filled",color="grey" ]; +"86E" [ label="c110ba7",shape="box",style="filled",color="grey" ]; +"87E" [ label="3b63cdc0f",shape="box",style="filled",color="grey" ]; +"88E" [ label="6f578c5128",shape="box",style="filled",color="grey" ]; +"89E" [ label="3e048573fd",shape="box",style="filled",color="grey" ]; +"336" [ URL="tes hi",area="test",label="825c7994d5da13afe519861818",color="#ff0000",style="filled",shape="tripleoctagon" ]; +"1E" [ label="f4bef37b6a94bfd00",shape="box",style="filled",color="grey" ]; +"2E" [ label="d2647f8b6d8661d08",shape="box",style="filled",color="grey" ]; +"3E" [ label="964cb56d8f69ff058",shape="box",style="filled",color="grey" ]; +"4E" [ label="4f35e206816c3bd22",shape="box",style="filled",color="grey" ]; +"5E" [ label="affb2d716803a2d3e",shape="box",style="filled",color="grey" ]; +"6E" [ label="e4ae306d9bd669c70",shape="box",style="filled",color="grey" ]; +"7E" [ label="4dbf4395236fb03ed",shape="box",style="filled",color="grey" ]; +"8E" [ label="15b3ad672cd2f713a",shape="box",style="filled",color="grey" ]; +"9E" [ label="8d6e6e0cd9b842a47",shape="box",style="filled",color="grey" ]; +"10E" [ label="00d0dd018fe879f96",shape="box",style="filled",color="grey" ]; +"11E" [ label="f28b78d4803c",shape="box",style="filled",color="grey" ]; +"12E" [ label="2d886da042b5384b4",shape="box",style="filled",color="grey" ]; +"13E" [ label="548c0081a62132b44",shape="box",style="filled",color="grey" ]; +"14E" [ label="52126553e52385d16",shape="box",style="filled",color="grey" ]; +"15E" [ label="9fe716e738eaea34e",shape="box",style="filled",color="grey" ]; +"16E" [ label="5782807b5f575e0a8",shape="box",style="filled",color="grey" ]; +"17E" [ label="792fd6f9df1fa1e33",shape="box",style="filled",color="grey" ]; +"18E" [ label="c471b6fdbfb852661",shape="box",style="filled",color="grey" ]; +"19E" [ label="a84844dfd0052b3b5",shape="box",style="filled",color="grey" ]; +"20E" [ label="724dabdce9744d061",shape="box",style="filled",color="grey" ]; +"21E" [ label="57f7fd2eecec93c8b",shape="box",style="filled",color="grey" ]; +"22E" [ label="baba65f670ee34a88",shape="box",style="filled",color="grey" ]; +"23E" [ label="ac34ec0f0488b17ec",shape="box",style="filled",color="grey" ]; +"24E" [ label="51e74bec5513083bb",shape="box",style="filled",color="grey" ]; +"25E" [ label="8e2d970b2f820ee35",shape="box",style="filled",color="grey" ]; +"26E" [ label="19398d3cd6b9c674f",shape="box",style="filled",color="grey" ]; +"27E" [ label="6505e29f4a11d9530",shape="box",style="filled",color="grey" ]; +"28E" [ label="bc4824f07a9d2bba6",shape="box",style="filled",color="grey" ]; +"29E" [ label="3acbf8a1537e4e1a1",shape="box",style="filled",color="grey" ]; +"30E" [ label="536264e787cf70469",shape="box",style="filled",color="grey" ]; +"31E" [ label="d",shape="box",style="filled",color="grey" ]; +"65E" [ label="d4b2",shape="box",style="filled",color="grey" ]; +"119E" [ label="2a9caef7",shape="box",style="filled",color="grey" ]; +"150E" [ label="73d12",shape="box",style="filled",color="grey" ]; +"176E" [ label="8896166adc0",shape="box",style="filled",color="grey" ]; +"743E" [ label="9f",shape="box",style="filled",color="grey" ]; +"744E" [ label="2e1313c",shape="box",style="filled",color="grey" ]; +"764E" [ label="cd6",shape="box",style="filled",color="grey" ]; +"337" [ label="8304a439f91fc90b3fe8dd35be8",color="yellow",style="filled",shape="doubleoctagon" ]; +"120E" [ label="345d26b3f821fe",shape="box",style="filled",color="grey" ]; +"121E" [ label="357679fea1e2f",shape="box",style="filled",color="grey" ]; +"122E" [ label="c71043819b6a79",shape="box",style="filled",color="grey" ]; +"123E" [ label="f9df653b86fb8df",shape="box",style="filled",color="grey" ]; +"124E" [ label="020df871874cd",shape="box",style="filled",color="grey" ]; +"125E" [ label="4c52fdd8e396692",shape="box",style="filled",color="grey" ]; +"126E" [ label="8b98c3ddbe0b336",shape="box",style="filled",color="grey" ]; +"127E" [ label="d9f4abac731a9e",shape="box",style="filled",color="grey" ]; +"128E" [ label="50f4d9b97aefe",shape="box",style="filled",color="grey" ]; +"129E" [ label="ea920d9f5b295119",shape="box",style="filled",color="grey" ]; +"130E" [ label="ff5c9b242337c",shape="box",style="filled",color="grey" ]; +"131E" [ label="4e12f7ff0918",shape="box",style="filled",color="grey" ]; +"132E" [ label="ee3b6be71d59b",shape="box",style="filled",color="grey" ]; +"133E" [ label="615cd6b5e3d21c",shape="box",style="filled",color="grey" ]; +"134E" [ label="6d52dd1b198bb",shape="box",style="filled",color="grey" ]; +"135E" [ label="8c932e1e502dca",shape="box",style="filled",color="grey" ]; +"136E" [ label="e84330eef281284a",shape="box",style="filled",color="grey" ]; +"137E" [ label="85fc23f1c88b4",shape="box",style="filled",color="grey" ]; +"138E" [ label="5997cb0c083422",shape="box",style="filled",color="grey" ]; +"339" [ label="b1ffbabb24d71f67d1e0ce23c51",color="yellow",style="filled",shape="doubleoctagon" ]; +"151E" [ label="",shape="box",style="filled",color="grey" ]; +"153E" [ label="41a8b095c7fd3",shape="box",style="filled",color="grey" ]; +"154E" [ label="151bcc2a8de7ea634",shape="box",style="filled",color="grey" ]; +"155E" [ label="6c541cad8de1b15",shape="box",style="filled",color="grey" ]; +"156E" [ label="c935c7f4d1090ac",shape="box",style="filled",color="grey" ]; +"157E" [ label="5ce1fcfb042b",shape="box",style="filled",color="grey" ]; +"158E" [ label="531806429433",shape="box",style="filled",color="grey" ]; +"159E" [ label="d285240b89cb",shape="box",style="filled",color="grey" ]; +"160E" [ label="f22c27c0f0a54e",shape="box",style="filled",color="grey" ]; +"161E" [ label="8d0d8314d211d80",shape="box",style="filled",color="grey" ]; +"162E" [ label="",shape="box",style="filled",color="grey" ]; +"347" [ label="9652ab8b55fdb2a36d1f3fe020",shape="hexagon" ]; +"139E" [ label="ef8b68bb5772f3",shape="box",style="filled",color="grey" ]; +"795E" [ label="16c3ae29c0bc713",shape="box",style="filled",color="grey" ]; +"348" [ label="676bbe7d1c1fb71742df534ce8",shape="hexagon" ]; +"799E" [ label="a78eb40ae56aaa9",shape="box",style="filled",color="grey" ]; +"800E" [ label="6aae8d25951",shape="box",style="filled",color="grey" ]; +"349" [ label="66c0220688a999aaf7f1702d1",shape="hexagon" ]; +"141E" [ label="67b6a4dca3a6d",shape="box",style="filled",color="grey" ]; +"350" [ label="1322fb0818783e6f9a4f173d47c52",shape="hexagon" ]; +"142E" [ label="9696c0950295d8cb5",shape="box",style="filled",color="grey" ]; +"678E" [ label="b5c747cc9",shape="box",style="filled",color="grey" ]; +"351" [ label="ff07977fca5513098d220d1eb3a",shape="hexagon" ]; +"143E" [ label="89a36b13f8c344b",shape="box",style="filled",color="grey" ]; +"232E" [ label="56292d076643",shape="box",style="filled",color="grey" ]; +"680E" [ label="b5c747cc9",shape="box",style="filled",color="grey" ]; +"704E" [ label="431430c49",shape="box",style="filled",color="grey" ]; +"352" [ label="a97ef281eafc34b1630d450a1df",shape="hexagon" ]; +"144E" [ label="4ff4e275c710c3b",shape="box",style="filled",color="grey" ]; +"432E" [ label="d13da6273c9b4da",shape="box",style="filled",color="grey" ]; +"353" [ label="72cbb37db85ed3c6eda5dcf8",shape="hexagon" ]; +"145E" [ label="33ff9e43d5ab",shape="box",style="filled",color="grey" ]; +"354" [ label="0f6784e49852c0be0da23b16",shape="hexagon" ]; +"146E" [ label="d4f958b03a98",shape="box",style="filled",color="grey" ]; +"396E" [ label="8e24e9b4e",shape="box",style="filled",color="grey" ]; +"355" [ label="383f5c65cc6c25aa0a0e6dbb",shape="hexagon" ]; +"147E" [ label="1ff8ff951ee9",shape="box",style="filled",color="grey" ]; +"356" [ label="f52a45620969f0df4e6ae1dcd7",shape="hexagon" ]; +"148E" [ label="5256925081c812",shape="box",style="filled",color="grey" ]; +"357" [ label="1f5df34ad75a55a76ef4afa0a47",shape="hexagon" ]; +"149E" [ label="26a185dde9a93dd",shape="box",style="filled",color="grey" ]; +"358" [ label="45ba4d4c61c9601a26d59e47e0260",shape="hexagon" ]; +"167E" [ label="99bd3e7feeb710",shape="box",style="filled",color="grey" ]; +"359" [ label="f95344b0ae31693f3a2746597d4",shape="hexagon" ]; +"169E" [ label="4e8259973f1f",shape="box",style="filled",color="grey" ]; +"360" [ label="b79798b186d6b82288e8be4017d",shape="hexagon" ]; +"171E" [ label="63b079bd5847",shape="box",style="filled",color="grey" ]; +"361" [ label="47e0067f4d853afd2012f04daa8",shape="hexagon" ]; +"172E" [ label="92fb5d4a0805",shape="box",style="filled",color="grey" ]; +"362" [ label="f2b6201774de40a29b504b1f716",shape="hexagon" ]; +"173E" [ label="d7203571944b",shape="box",style="filled",color="grey" ]; +"363" [ label="800422ab81d804eef3e7b91dfba91",shape="hexagon" ]; +"174E" [ label="952316a1a5a785",shape="box",style="filled",color="grey" ]; +"364" [ label="35b941379e1af658078cffb83a2",shape="hexagon" ]; +"101E" [ label="331675c046693f",shape="box",style="filled",color="grey" ]; +"365" [ label="d4f7b7fba7afcf7a72397353ec",shape="hexagon" ]; +"102E" [ label="32c4684b55361",shape="box",style="filled",color="grey" ]; +"367" [ label="e4b45b7a2f884d3734bfd5985656",shape="hexagon" ]; +"104E" [ label="1333074979f2d0b",shape="box",style="filled",color="grey" ]; +"368" [ label="02c2ba83680ab57f236a33d702",shape="hexagon" ]; +"105E" [ label="084d4bfa5853e",shape="box",style="filled",color="grey" ]; +"369" [ label="9ccd974150a18260b207b6584caa",shape="hexagon" ]; +"106E" [ label="28f7bfc40c88e6a",shape="box",style="filled",color="grey" ]; +"374" [ label="653ae44d45dcadeb481b53027d",shape="hexagon" ]; +"111E" [ label="8f95518f48528",shape="box",style="filled",color="grey" ]; +"375" [ label="d66f542ef1ce4d02c59bec65e",shape="hexagon" ]; +"112E" [ label="2ef209509e2a",shape="box",style="filled",color="grey" ]; +"377" [ label="a2984b7a11e49440420058c1d80",shape="hexagon" ]; +"114E" [ label="ef42184297591d",shape="box",style="filled",color="grey" ]; +"378" [ label="31055116421c96b37f72a262bb",shape="hexagon" ]; +"115E" [ label="be9c5958196ed",shape="box",style="filled",color="grey" ]; +"380" [ label="8462bb2eec1a62d19a15865e57c92",shape="hexagon" ]; +"117E" [ label="16a795a1d63f30df",shape="box",style="filled",color="grey" ]; +"392E" [ label="85a34bc9616ff",shape="box",style="filled",color="grey" ]; +"381" [ label="c21eb96fe100a1efaa128181b7",shape="hexagon" ]; +"118E" [ label="f1b0d754353a6",shape="box",style="filled",color="grey" ]; +"382" [ label="e3e284d0cc803d98d674f9c3f6d",color="yellow",style="filled",shape="doubleoctagon" ]; +"177E" [ label="30417faf916",shape="box",style="filled",color="grey" ]; +"178E" [ label="e618df70814a",shape="box",style="filled",color="grey" ]; +"179E" [ label="fa90ddf10bd574",shape="box",style="filled",color="grey" ]; +"180E" [ label="815cc0b83d733",shape="box",style="filled",color="grey" ]; +"181E" [ label="f787d827958c",shape="box",style="filled",color="grey" ]; +"182E" [ label="f20f7f513e",shape="box",style="filled",color="grey" ]; +"183E" [ label="290907417e13",shape="box",style="filled",color="grey" ]; +"184E" [ label="e8386a8e1c8a",shape="box",style="filled",color="grey" ]; +"185E" [ label="319bc900218b",shape="box",style="filled",color="grey" ]; +"186E" [ label="3ba7afb0e48ae1",shape="box",style="filled",color="grey" ]; +"187E" [ label="6ba0776fc8e",shape="box",style="filled",color="grey" ]; +"188E" [ label="09847696ae",shape="box",style="filled",color="grey" ]; +"383" [ label="908f9ad506eae9ab6ada185e3",color="yellow",style="filled",shape="doubleoctagon" ]; +"730E" [ label="65694ca6d575",shape="box",style="filled",color="grey" ]; +"732E" [ label="37f57e81ebed95",shape="box",style="filled",color="grey" ]; +"741E" [ label="9b6c",shape="box",style="filled",color="grey" ]; +"765E" [ label="88ebe2e8782c",shape="box",style="filled",color="grey" ]; +"796E" [ label="901b2105a902ee7791",shape="box",style="filled",color="grey" ]; +"384" [ label="593caebf2037317648bb451aa79",color="yellow",style="filled",shape="doubleoctagon" ]; +"726E" [ label="351dd0aefe480c",shape="box",style="filled",color="grey" ]; +"728E" [ label="56e1a896",shape="box",style="filled",color="grey" ]; +"742E" [ label="5ba4693031",shape="box",style="filled",color="grey" ]; +"385" [ label="717c254aeffbb527dabfc",shape="hexagon" ]; +"328E" [ label="123cc6d1ac",shape="box",style="filled",color="grey" ]; +"496E" [ label="",shape="box",style="filled",color="grey" ]; +"594E" [ label="7f8c557bcf3889",shape="box",style="filled",color="grey" ]; +"622E" [ label="da3d5",shape="box",style="filled",color="grey" ]; +"754E" [ label="68d8993e61d8c82cd29e8d0182b0",shape="box",style="filled",color="grey" ]; +"755E" [ label="4c865eec228e41e7f4e5fc68a9a6",shape="box",style="filled",color="grey" ]; +"756E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ]; +"757E" [ label="68d8993e61d8c82cd29e8d0182b0",shape="box",style="filled",color="grey" ]; +"758E" [ label="4c865eec228e41e7f4e5fc68a9a6",shape="box",style="filled",color="grey" ]; +"759E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ]; +"760E" [ label="8983ffbc30deb364dd92c3ad85c9",shape="box",style="filled",color="grey" ]; +"761E" [ label="eb9cf6456613d4cd06f7c0894bd6",shape="box",style="filled",color="grey" ]; +"762E" [ label="1e2298c4bb",shape="box",style="filled",color="grey" ]; +"1" -> "189E" [ label=" ",color="blue",arrowhead="dot" ]; +"1" -> "790E" [ label=" ",color="blue",arrowhead="dot" ]; +"2" -> "191E" [ label=" ",color="blue",arrowhead="dot" ]; +"3" -> "193E" [ label=" ",color="blue",arrowhead="dot" ]; +"4" -> "195E" [ label=" ",color="blue",arrowhead="dot" ]; +"5" -> "197E" [ label=" ",color="blue",arrowhead="dot" ]; +"6" -> "199E" [ label=" ",color="blue",arrowhead="dot" ]; +"7" -> "201E" [ label=" ",color="blue",arrowhead="dot" ]; +"8" -> "203E" [ label=" ",color="blue",arrowhead="dot" ]; +"9" -> "725E" [ label=" ",color="blue",arrowhead="dot" ]; +"9" -> "785E" [ label=" ",color="blue",arrowhead="dot" ]; +"10" -> "205E" [ label=" ",color="blue",arrowhead="dot" ]; +"11" -> "207E" [ label=" ",color="blue",arrowhead="dot" ]; +"12" -> "209E" [ label=" ",color="blue",arrowhead="dot" ]; +"13" -> "211E" [ label=" ",color="blue",arrowhead="dot" ]; +"14" -> "213E" [ label=" ",color="blue",arrowhead="dot" ]; +"15" -> "215E" [ label=" ",color="blue",arrowhead="dot" ]; +"16" -> "727E" [ label=" ",color="blue",arrowhead="dot" ]; +"16" -> "784E" [ label=" ",color="blue",arrowhead="dot" ]; +"17" -> "217E" [ label=" ",color="blue",arrowhead="dot" ]; +"17" -> "787E" [ label=" ",color="blue",arrowhead="dot" ]; +"18" -> "219E" [ label=" ",color="blue",arrowhead="dot" ]; +"19" -> "221E" [ label=" ",color="blue",arrowhead="dot" ]; +"20" -> "223E" [ label=" ",color="blue",arrowhead="dot" ]; +"21" -> "225E" [ label=" ",color="blue",arrowhead="dot" ]; +"22" -> "227E" [ label=" ",color="blue",arrowhead="dot" ]; +"22" -> "792E" [ label=" ",color="blue",arrowhead="dot" ]; +"23" -> "231E" [ label=" ",color="blue",arrowhead="dot" ]; +"24" -> "233E" [ label=" ",color="blue",arrowhead="dot" ]; +"25" -> "235E" [ label=" ",color="blue",arrowhead="dot" ]; +"26" -> "237E" [ label=" ",color="blue",arrowhead="dot" ]; +"27" -> "239E" [ label=" ",color="blue",arrowhead="dot" ]; +"27" -> "783E" [ label=" ",color="blue",arrowhead="dot" ]; +"28" -> "241E" [ label=" ",color="blue",arrowhead="dot" ]; +"28" -> "791E" [ label=" ",color="blue",arrowhead="dot" ]; +"29" -> "243E" [ label=" ",color="blue",arrowhead="dot" ]; +"30" -> "245E" [ label=" ",color="blue",arrowhead="dot" ]; +"31" -> "247E" [ label=" ",color="blue",arrowhead="dot" ]; +"32" -> "249E" [ label=" ",color="blue",arrowhead="dot" ]; +"33" -> "251E" [ label=" ",color="blue",arrowhead="dot" ]; +"34" -> "253E" [ label=" ",color="blue",arrowhead="dot" ]; +"35" -> "255E" [ label=" ",color="blue",arrowhead="dot" ]; +"36" -> "257E" [ label=" ",color="blue",arrowhead="dot" ]; +"37" -> "259E" [ label=" ",color="blue",arrowhead="dot" ]; +"38" -> "261E" [ label=" ",color="blue",arrowhead="dot" ]; +"39" -> "263E" [ label=" ",color="blue",arrowhead="dot" ]; +"40" -> "265E" [ label=" ",color="blue",arrowhead="dot" ]; +"41" -> "267E" [ label=" ",color="blue",arrowhead="dot" ]; +"42" -> "269E" [ label=" ",color="blue",arrowhead="dot" ]; +"43" -> "271E" [ label=" ",color="blue",arrowhead="dot" ]; +"44" -> "273E" [ label=" ",color="blue",arrowhead="dot" ]; +"45" -> "275E" [ label=" ",color="blue",arrowhead="dot" ]; +"46" -> "277E" [ label=" ",color="blue",arrowhead="dot" ]; +"47" -> "279E" [ label=" ",color="blue",arrowhead="dot" ]; +"48" -> "281E" [ label=" ",color="blue",arrowhead="dot" ]; +"49" -> "283E" [ label=" ",color="blue",arrowhead="dot" ]; +"50" -> "285E" [ label=" ",color="blue",arrowhead="dot" ]; +"51" -> "287E" [ label=" ",color="blue",arrowhead="dot" ]; +"52" -> "289E" [ label=" ",color="blue",arrowhead="dot" ]; +"53" -> "291E" [ label=" ",color="blue",arrowhead="dot" ]; +"54" -> "293E" [ label=" ",color="blue",arrowhead="dot" ]; +"55" -> "745E" [ label=" ",color="blue",arrowhead="dot" ]; +"56" -> "295E" [ label=" ",color="blue",arrowhead="dot" ]; +"57" -> "297E" [ label=" ",color="blue",arrowhead="dot" ]; +"58" -> "299E" [ label=" ",color="blue",arrowhead="dot" ]; +"59" -> "301E" [ label=" ",color="blue",arrowhead="dot" ]; +"59" -> "789E" [ label=" ",color="blue",arrowhead="dot" ]; +"60" -> "303E" [ label=" ",color="blue",arrowhead="dot" ]; +"61" -> "305E" [ label=" ",color="blue",arrowhead="dot" ]; +"62" -> "307E" [ label=" ",color="blue",arrowhead="dot" ]; +"63" -> "309E" [ label=" ",color="blue",arrowhead="dot" ]; +"64" -> "311E" [ label=" ",color="blue",arrowhead="dot" ]; +"65" -> "313E" [ label=" ",color="blue",arrowhead="dot" ]; +"66" -> "315E" [ label=" ",color="blue",arrowhead="dot" ]; +"67" -> "317E" [ label=" ",color="blue",arrowhead="dot" ]; +"68" -> "319E" [ label=" ",color="blue",arrowhead="dot" ]; +"69" -> "746E" [ label=" ",color="blue",arrowhead="dot" ]; +"70" -> "321E" [ label=" ",color="blue",arrowhead="dot" ]; +"71" -> "327E" [ label=" ",color="blue",arrowhead="dot" ]; +"72" -> "329E" [ label=" ",color="blue",arrowhead="dot" ]; +"73" -> "331E" [ label=" ",color="blue",arrowhead="dot" ]; +"74" -> "333E" [ label=" ",color="blue",arrowhead="dot" ]; +"75" -> "335E" [ label=" ",color="blue",arrowhead="dot" ]; +"76" -> "337E" [ label=" ",color="blue",arrowhead="dot" ]; +"77" -> "339E" [ label=" ",color="blue",arrowhead="dot" ]; +"78" -> "341E" [ label=" ",color="blue",arrowhead="dot" ]; +"79" -> "343E" [ label=" ",color="blue",arrowhead="dot" ]; +"80" -> "345E" [ label=" ",color="blue",arrowhead="dot" ]; +"81" -> "347E" [ label=" ",color="blue",arrowhead="dot" ]; +"82" -> "349E" [ label=" ",color="blue",arrowhead="dot" ]; +"83" -> "351E" [ label=" ",color="blue",arrowhead="dot" ]; +"84" -> "353E" [ label=" ",color="blue",arrowhead="dot" ]; +"85" -> "355E" [ label=" ",color="blue",arrowhead="dot" ]; +"85" -> "788E" [ label=" ",color="blue",arrowhead="dot" ]; +"86" -> "357E" [ label=" ",color="blue",arrowhead="dot" ]; +"87" -> "359E" [ label=" ",color="blue",arrowhead="dot" ]; +"88" -> "361E" [ label=" ",color="blue",arrowhead="dot" ]; +"89" -> "363E" [ label=" ",color="blue",arrowhead="dot" ]; +"90" -> "365E" [ label=" ",color="blue",arrowhead="dot" ]; +"91" -> "367E" [ label=" ",color="blue",arrowhead="dot" ]; +"92" -> "369E" [ label=" ",color="blue",arrowhead="dot" ]; +"93" -> "729E" [ label=" ",color="blue",arrowhead="dot" ]; +"94" -> "371E" [ label=" ",color="blue",arrowhead="dot" ]; +"95" -> "373E" [ label=" ",color="blue",arrowhead="dot" ]; +"96" -> "375E" [ label=" ",color="blue",arrowhead="dot" ]; +"97" -> "747E" [ label=" ",color="blue",arrowhead="dot" ]; +"98" -> "377E" [ label=" ",color="blue",arrowhead="dot" ]; +"99" -> "379E" [ label=" ",color="blue",arrowhead="dot" ]; +"100" -> "381E" [ label=" ",color="blue",arrowhead="dot" ]; +"101" -> "383E" [ label=" ",color="blue",arrowhead="dot" ]; +"102" -> "385E" [ label=" ",color="blue",arrowhead="dot" ]; +"103" -> "387E" [ label=" ",color="blue",arrowhead="dot" ]; +"104" -> "389E" [ label=" ",color="blue",arrowhead="dot" ]; +"105" -> "391E" [ label=" ",color="blue",arrowhead="dot" ]; +"106" -> "393E" [ label=" ",color="blue",arrowhead="dot" ]; +"107" -> "395E" [ label=" ",color="blue",arrowhead="dot" ]; +"108" -> "397E" [ label=" ",color="blue",arrowhead="dot" ]; +"109" -> "399E" [ label=" ",color="blue",arrowhead="dot" ]; +"110" -> "401E" [ label=" ",color="blue",arrowhead="dot" ]; +"111" -> "403E" [ label=" ",color="blue",arrowhead="dot" ]; +"112" -> "405E" [ label=" ",color="blue",arrowhead="dot" ]; +"113" -> "407E" [ label=" ",color="blue",arrowhead="dot" ]; +"114" -> "409E" [ label=" ",color="blue",arrowhead="dot" ]; +"115" -> "411E" [ label=" ",color="blue",arrowhead="dot" ]; +"116" -> "413E" [ label=" ",color="blue",arrowhead="dot" ]; +"117" -> "415E" [ label=" ",color="blue",arrowhead="dot" ]; +"118" -> "417E" [ label=" ",color="blue",arrowhead="dot" ]; +"119" -> "419E" [ label=" ",color="blue",arrowhead="dot" ]; +"120" -> "421E" [ label=" ",color="blue",arrowhead="dot" ]; +"121" -> "423E" [ label=" ",color="blue",arrowhead="dot" ]; +"122" -> "748E" [ label=" ",color="blue",arrowhead="dot" ]; +"123" -> "425E" [ label=" ",color="blue",arrowhead="dot" ]; +"124" -> "427E" [ label=" ",color="blue",arrowhead="dot" ]; +"124" -> "786E" [ label=" ",color="blue",arrowhead="dot" ]; +"125" -> "431E" [ label=" ",color="blue",arrowhead="dot" ]; +"126" -> "433E" [ label=" ",color="blue",arrowhead="dot" ]; +"127" -> "435E" [ label=" ",color="blue",arrowhead="dot" ]; +"128" -> "437E" [ label=" ",color="blue",arrowhead="dot" ]; +"129" -> "439E" [ label=" ",color="blue",arrowhead="dot" ]; +"130" -> "441E" [ label=" ",color="blue",arrowhead="dot" ]; +"131" -> "443E" [ label=" ",color="blue",arrowhead="dot" ]; +"132" -> "445E" [ label=" ",color="blue",arrowhead="dot" ]; +"133" -> "749E" [ label=" ",color="blue",arrowhead="dot" ]; +"134" -> "447E" [ label=" ",color="blue",arrowhead="dot" ]; +"135" -> "449E" [ label=" ",color="blue",arrowhead="dot" ]; +"135" -> "769E" [ label=" ",color="blue",arrowhead="dot" ]; +"135" -> "770E" [ label=" ",color="blue",arrowhead="dot" ]; +"136" -> "451E" [ label=" ",color="blue",arrowhead="dot" ]; +"137" -> "453E" [ label=" ",color="blue",arrowhead="dot" ]; +"138" -> "455E" [ label=" ",color="blue",arrowhead="dot" ]; +"139" -> "457E" [ label=" ",color="blue",arrowhead="dot" ]; +"140" -> "459E" [ label=" ",color="blue",arrowhead="dot" ]; +"141" -> "461E" [ label=" ",color="blue",arrowhead="dot" ]; +"142" -> "463E" [ label=" ",color="blue",arrowhead="dot" ]; +"143" -> "465E" [ label=" ",color="blue",arrowhead="dot" ]; +"144" -> "467E" [ label=" ",color="blue",arrowhead="dot" ]; +"145" -> "469E" [ label=" ",color="blue",arrowhead="dot" ]; +"146" -> "471E" [ label=" ",color="blue",arrowhead="dot" ]; +"147" -> "473E" [ label=" ",color="blue",arrowhead="dot" ]; +"148" -> "475E" [ label=" ",color="blue",arrowhead="dot" ]; +"149" -> "477E" [ label=" ",color="blue",arrowhead="dot" ]; +"150" -> "479E" [ label=" ",color="blue",arrowhead="dot" ]; +"151" -> "481E" [ label=" ",color="blue",arrowhead="dot" ]; +"152" -> "483E" [ label=" ",color="blue",arrowhead="dot" ]; +"153" -> "731E" [ label=" ",color="blue",arrowhead="dot" ]; +"154" -> "750E" [ label=" ",color="blue",arrowhead="dot" ]; +"155" -> "485E" [ label=" ",color="blue",arrowhead="dot" ]; +"156" -> "487E" [ label=" ",color="blue",arrowhead="dot" ]; +"157" -> "489E" [ label=" ",color="blue",arrowhead="dot" ]; +"158" -> "491E" [ label=" ",color="blue",arrowhead="dot" ]; +"159" -> "495E" [ label=" ",color="blue",arrowhead="dot" ]; +"160" -> "499E" [ label=" ",color="blue",arrowhead="dot" ]; +"161" -> "501E" [ label=" ",color="blue",arrowhead="dot" ]; +"162" -> "503E" [ label=" ",color="blue",arrowhead="dot" ]; +"163" -> "505E" [ label=" ",color="blue",arrowhead="dot" ]; +"164" -> "507E" [ label=" ",color="blue",arrowhead="dot" ]; +"165" -> "509E" [ label=" ",color="blue",arrowhead="dot" ]; +"166" -> "511E" [ label=" ",color="blue",arrowhead="dot" ]; +"167" -> "513E" [ label=" ",color="blue",arrowhead="dot" ]; +"168" -> "515E" [ label=" ",color="blue",arrowhead="dot" ]; +"169" -> "517E" [ label=" ",color="blue",arrowhead="dot" ]; +"170" -> "519E" [ label=" ",color="blue",arrowhead="dot" ]; +"171" -> "521E" [ label=" ",color="blue",arrowhead="dot" ]; +"172" -> "523E" [ label=" ",color="blue",arrowhead="dot" ]; +"173" -> "525E" [ label=" ",color="blue",arrowhead="dot" ]; +"174" -> "527E" [ label=" ",color="blue",arrowhead="dot" ]; +"175" -> "529E" [ label=" ",color="blue",arrowhead="dot" ]; +"176" -> "531E" [ label=" ",color="blue",arrowhead="dot" ]; +"177" -> "533E" [ label=" ",color="blue",arrowhead="dot" ]; +"178" -> "535E" [ label=" ",color="blue",arrowhead="dot" ]; +"179" -> "537E" [ label=" ",color="blue",arrowhead="dot" ]; +"180" -> "539E" [ label=" ",color="blue",arrowhead="dot" ]; +"181" -> "541E" [ label=" ",color="blue",arrowhead="dot" ]; +"182" -> "543E" [ label=" ",color="blue",arrowhead="dot" ]; +"183" -> "545E" [ label=" ",color="blue",arrowhead="dot" ]; +"184" -> "547E" [ label=" ",color="blue",arrowhead="dot" ]; +"185" -> "549E" [ label=" ",color="blue",arrowhead="dot" ]; +"186" -> "551E" [ label=" ",color="blue",arrowhead="dot" ]; +"187" -> "553E" [ label=" ",color="blue",arrowhead="dot" ]; +"188" -> "555E" [ label=" ",color="blue",arrowhead="dot" ]; +"189" -> "557E" [ label=" ",color="blue",arrowhead="dot" ]; +"190" -> "559E" [ label=" ",color="blue",arrowhead="dot" ]; +"191" -> "561E" [ label=" ",color="blue",arrowhead="dot" ]; +"192" -> "563E" [ label=" ",color="blue",arrowhead="dot" ]; +"193" -> "565E" [ label=" ",color="blue",arrowhead="dot" ]; +"194" -> "567E" [ label=" ",color="blue",arrowhead="dot" ]; +"195" -> "569E" [ label=" ",color="blue",arrowhead="dot" ]; +"196" -> "571E" [ label=" ",color="blue",arrowhead="dot" ]; +"197" -> "573E" [ label=" ",color="blue",arrowhead="dot" ]; +"198" -> "575E" [ label=" ",color="blue",arrowhead="dot" ]; +"199" -> "577E" [ label=" ",color="blue",arrowhead="dot" ]; +"200" -> "579E" [ label=" ",color="blue",arrowhead="dot" ]; +"201" -> "581E" [ label=" ",color="blue",arrowhead="dot" ]; +"202" -> "583E" [ label=" ",color="blue",arrowhead="dot" ]; +"203" -> "585E" [ label=" ",color="blue",arrowhead="dot" ]; +"204" -> "587E" [ label=" ",color="blue",arrowhead="dot" ]; +"205" -> "751E" [ label=" ",color="blue",arrowhead="dot" ]; +"206" -> "589E" [ label=" ",color="blue",arrowhead="dot" ]; +"207" -> "593E" [ label=" ",color="blue",arrowhead="dot" ]; +"208" -> "597E" [ label=" ",color="blue",arrowhead="dot" ]; +"209" -> "599E" [ label=" ",color="blue",arrowhead="dot" ]; +"210" -> "601E" [ label=" ",color="blue",arrowhead="dot" ]; +"211" -> "603E" [ label=" ",color="blue",arrowhead="dot" ]; +"212" -> "605E" [ label=" ",color="blue",arrowhead="dot" ]; +"213" -> "607E" [ label=" ",color="blue",arrowhead="dot" ]; +"214" -> "609E" [ label=" ",color="blue",arrowhead="dot" ]; +"215" -> "611E" [ label=" ",color="blue",arrowhead="dot" ]; +"216" -> "613E" [ label=" ",color="blue",arrowhead="dot" ]; +"217" -> "615E" [ label=" ",color="blue",arrowhead="dot" ]; +"218" -> "617E" [ label=" ",color="blue",arrowhead="dot" ]; +"219" -> "619E" [ label=" ",color="blue",arrowhead="dot" ]; +"220" -> "621E" [ label=" ",color="blue",arrowhead="dot" ]; +"221" -> "623E" [ label=" ",color="blue",arrowhead="dot" ]; +"222" -> "752E" [ label=" ",color="blue",arrowhead="dot" ]; +"223" -> "625E" [ label=" ",color="blue",arrowhead="dot" ]; +"224" -> "627E" [ label=" ",color="blue",arrowhead="dot" ]; +"225" -> "629E" [ label=" ",color="blue",arrowhead="dot" ]; +"226" -> "631E" [ label=" ",color="blue",arrowhead="dot" ]; +"227" -> "633E" [ label=" ",color="blue",arrowhead="dot" ]; +"228" -> "635E" [ label=" ",color="blue",arrowhead="dot" ]; +"229" -> "637E" [ label=" ",color="blue",arrowhead="dot" ]; +"230" -> "639E" [ label=" ",color="blue",arrowhead="dot" ]; +"231" -> "641E" [ label=" ",color="blue",arrowhead="dot" ]; +"232" -> "643E" [ label=" ",color="blue",arrowhead="dot" ]; +"233" -> "645E" [ label=" ",color="blue",arrowhead="dot" ]; +"234" -> "647E" [ label=" ",color="blue",arrowhead="dot" ]; +"235" -> "649E" [ label=" ",color="blue",arrowhead="dot" ]; +"236" -> "651E" [ label=" ",color="blue",arrowhead="dot" ]; +"237" -> "653E" [ label=" ",color="blue",arrowhead="dot" ]; +"238" -> "655E" [ label=" ",color="blue",arrowhead="dot" ]; +"239" -> "657E" [ label=" ",color="blue",arrowhead="dot" ]; +"240" -> "659E" [ label=" ",color="blue",arrowhead="dot" ]; +"241" -> "661E" [ label=" ",color="blue",arrowhead="dot" ]; +"242" -> "663E" [ label=" ",color="blue",arrowhead="dot" ]; +"243" -> "665E" [ label=" ",color="blue",arrowhead="dot" ]; +"244" -> "667E" [ label=" ",color="blue",arrowhead="dot" ]; +"245" -> "669E" [ label=" ",color="blue",arrowhead="dot" ]; +"246" -> "671E" [ label=" ",color="blue",arrowhead="dot" ]; +"247" -> "673E" [ label=" ",color="blue",arrowhead="dot" ]; +"248" -> "675E" [ label=" ",color="blue",arrowhead="dot" ]; +"249" -> "679E" [ label=" ",color="blue",arrowhead="dot" ]; +"250" -> "753E" [ label=" ",color="blue",arrowhead="dot" ]; +"251" -> "681E" [ label=" ",color="blue",arrowhead="dot" ]; +"252" -> "683E" [ label=" ",color="blue",arrowhead="dot" ]; +"253" -> "685E" [ label=" ",color="blue",arrowhead="dot" ]; +"254" -> "687E" [ label=" ",color="blue",arrowhead="dot" ]; +"255" -> "689E" [ label=" ",color="blue",arrowhead="dot" ]; +"256" -> "691E" [ label=" ",color="blue",arrowhead="dot" ]; +"257" -> "693E" [ label=" ",color="blue",arrowhead="dot" ]; +"258" -> "695E" [ label=" ",color="blue",arrowhead="dot" ]; +"259" -> "697E" [ label=" ",color="blue",arrowhead="dot" ]; +"260" -> "699E" [ label=" ",color="blue",arrowhead="dot" ]; +"261" -> "703E" [ label=" ",color="blue",arrowhead="dot" ]; +"262" -> "705E" [ label=" ",color="blue",arrowhead="dot" ]; +"264" -> "709E" [ label=" ",color="blue",arrowhead="dot" ]; +"265" -> "711E" [ label=" ",color="blue",arrowhead="dot" ]; +"266" -> "713E" [ label=" ",color="blue",arrowhead="dot" ]; +"267" -> "715E" [ label=" ",color="blue",arrowhead="dot" ]; +"268" -> "717E" [ label=" ",color="blue",arrowhead="dot" ]; +"269" -> "719E" [ label=" ",color="blue",arrowhead="dot" ]; +"270" -> "721E" [ label=" ",color="blue",arrowhead="dot" ]; +"272" -> "34E" [ label=" ",color="blue",arrowhead="dot" ]; +"272" -> "252E" [ label=" ",color="blue",arrowhead="dot" ]; +"272" -> "436E" [ label=" ",color="blue",arrowhead="dot" ]; +"274" -> "59E" [ label=" ",color="blue",arrowhead="dot" ]; +"274" -> "500E" [ label=" ",color="blue",arrowhead="dot" ]; +"274" -> "720E" [ label=" ",color="blue",arrowhead="dot" ]; +"275" -> "98E" [ label=" ",color="blue",arrowhead="dot" ]; +"278" -> "35E" [ label=" ",color="blue",arrowhead="dot" ]; +"278" -> "488E" [ label=" ",color="blue",arrowhead="dot" ]; +"278" -> "598E" [ label=" ",color="blue",arrowhead="dot" ]; +"278" -> "604E" [ label=" ",color="blue",arrowhead="dot" ]; +"278" -> "628E" [ label=" ",color="blue",arrowhead="dot" ]; +"279" -> "99E" [ label=" ",color="blue",arrowhead="dot" ]; +"280" -> "242E" [ label=" ",color="blue",arrowhead="dot" ]; +"280" -> "270E" [ label=" ",color="blue",arrowhead="dot" ]; +"280" -> "272E" [ label=" ",color="blue",arrowhead="dot" ]; +"280" -> "284E" [ label=" ",color="blue",arrowhead="dot" ]; +"280" -> "286E" [ label=" ",color="blue",arrowhead="dot" ]; +"280" -> "288E" [ label=" ",color="blue",arrowhead="dot" ]; +"280" -> "586E" [ label=" ",color="blue",arrowhead="dot" ]; +"280" -> "763E" [ label=" ",color="blue",arrowhead="dot" ]; +"281" -> "45E" [ label=" ",color="blue",arrowhead="dot" ]; +"281" -> "470E" [ label=" ",color="blue",arrowhead="dot" ]; +"281" -> "670E" [ label=" ",color="blue",arrowhead="dot" ]; +"281" -> "722E" [ label=" ",color="blue",arrowhead="dot" ]; +"282" -> "103E" [ label=" ",color="blue",arrowhead="dot" ]; +"283" -> "165E" [ label=" ",color="blue",arrowhead="dot" ]; +"284" -> "39E" [ label=" ",color="blue",arrowhead="dot" ]; +"284" -> "224E" [ label=" ",color="blue",arrowhead="dot" ]; +"284" -> "268E" [ label=" ",color="blue",arrowhead="dot" ]; +"284" -> "632E" [ label=" ",color="blue",arrowhead="dot" ]; +"284" -> "710E" [ label=" ",color="blue",arrowhead="dot" ]; +"285" -> "53E" [ label=" ",color="blue",arrowhead="dot" ]; +"286" -> "38E" [ label=" ",color="blue",arrowhead="dot" ]; +"286" -> "166E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "40E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "218E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "244E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "246E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "258E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "290E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "292E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "308E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "318E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "388E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "472E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "478E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "566E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "570E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "574E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "608E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "614E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "658E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "664E" [ label=" ",color="blue",arrowhead="dot" ]; +"288" -> "682E" [ label=" ",color="blue",arrowhead="dot" ]; +"289" -> "41E" [ label=" ",color="blue",arrowhead="dot" ]; +"289" -> "636E" [ label=" ",color="blue",arrowhead="dot" ]; +"289" -> "642E" [ label=" ",color="blue",arrowhead="dot" ]; +"289" -> "690E" [ label=" ",color="blue",arrowhead="dot" ]; +"289" -> "700E" [ label=" ",color="blue",arrowhead="dot" ]; +"290" -> "56E" [ label=" ",color="blue",arrowhead="dot" ]; +"290" -> "264E" [ label=" ",color="blue",arrowhead="dot" ]; +"290" -> "510E" [ label=" ",color="blue",arrowhead="dot" ]; +"290" -> "718E" [ label=" ",color="blue",arrowhead="dot" ]; +"291" -> "66E" [ label=" ",color="blue",arrowhead="dot" ]; +"291" -> "76E" [ label=" ",color="blue",arrowhead="dot" ]; +"291" -> "610E" [ label=" ",color="blue",arrowhead="dot" ]; +"292" -> "73E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "49E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "214E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "216E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "236E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "278E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "358E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "398E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "400E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "402E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "404E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "406E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "408E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "412E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "438E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "448E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "476E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "504E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "552E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "634E" [ label=" ",color="blue",arrowhead="dot" ]; +"293" -> "768E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "44E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "92E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "250E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "316E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "380E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "424E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "442E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "446E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "454E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "460E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "462E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "648E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "656E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "666E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "692E" [ label=" ",color="blue",arrowhead="dot" ]; +"295" -> "712E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "47E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "330E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "514E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "516E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "518E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "520E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "522E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "526E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "528E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "530E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "532E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "534E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "536E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "538E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "540E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "542E" [ label=" ",color="blue",arrowhead="dot" ]; +"296" -> "544E" [ label=" ",color="blue",arrowhead="dot" ]; +"297" -> "46E" [ label=" ",color="blue",arrowhead="dot" ]; +"297" -> "93E" [ label=" ",color="blue",arrowhead="dot" ]; +"297" -> "206E" [ label=" ",color="blue",arrowhead="dot" ]; +"297" -> "426E" [ label=" ",color="blue",arrowhead="dot" ]; +"297" -> "550E" [ label=" ",color="blue",arrowhead="dot" ]; +"297" -> "706E" [ label=" ",color="blue",arrowhead="dot" ]; +"298" -> "36E" [ label=" ",color="blue",arrowhead="dot" ]; +"298" -> "95E" [ label=" ",color="blue",arrowhead="dot" ]; +"298" -> "364E" [ label=" ",color="blue",arrowhead="dot" ]; +"298" -> "394E" [ label=" ",color="blue",arrowhead="dot" ]; +"298" -> "420E" [ label=" ",color="blue",arrowhead="dot" ]; +"298" -> "456E" [ label=" ",color="blue",arrowhead="dot" ]; +"298" -> "624E" [ label=" ",color="blue",arrowhead="dot" ]; +"299" -> "48E" [ label=" ",color="blue",arrowhead="dot" ]; +"299" -> "168E" [ label=" ",color="blue",arrowhead="dot" ]; +"299" -> "260E" [ label=" ",color="blue",arrowhead="dot" ]; +"299" -> "282E" [ label=" ",color="blue",arrowhead="dot" ]; +"299" -> "554E" [ label=" ",color="blue",arrowhead="dot" ]; +"299" -> "590E" [ label=" ",color="blue",arrowhead="dot" ]; +"299" -> "767E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "62E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "190E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "226E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "238E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "254E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "256E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "262E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "266E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "274E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "276E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "294E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "296E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "310E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "320E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "322E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "332E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "340E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "344E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "346E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "348E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "374E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "378E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "452E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "508E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "524E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "612E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "626E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "638E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "644E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "654E" [ label=" ",color="blue",arrowhead="dot" ]; +"300" -> "672E" [ label=" ",color="blue",arrowhead="dot" ]; +"302" -> "797E" [ label=" ",color="blue",arrowhead="dot" ]; +"302" -> "798E" [ label=" ",color="blue",arrowhead="dot" ]; +"303" -> "52E" [ label=" ",color="blue",arrowhead="dot" ]; +"303" -> "650E" [ label=" ",color="blue",arrowhead="dot" ]; +"304" -> "50E" [ label=" ",color="blue",arrowhead="dot" ]; +"304" -> "640E" [ label=" ",color="blue",arrowhead="dot" ]; +"304" -> "646E" [ label=" ",color="blue",arrowhead="dot" ]; +"304" -> "652E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "55E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "220E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "338E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "368E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "486E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "490E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "562E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "564E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "600E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "668E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "674E" [ label=" ",color="blue",arrowhead="dot" ]; +"306" -> "698E" [ label=" ",color="blue",arrowhead="dot" ]; +"307" -> "107E" [ label=" ",color="blue",arrowhead="dot" ]; +"308" -> "108E" [ label=" ",color="blue",arrowhead="dot" ]; +"309" -> "109E" [ label=" ",color="blue",arrowhead="dot" ]; +"310" -> "110E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "58E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "234E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "300E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "306E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "314E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "342E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "354E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "370E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "382E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "422E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "444E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "582E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "620E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "630E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "684E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "696E" [ label=" ",color="blue",arrowhead="dot" ]; +"311" -> "801E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "42E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "192E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "194E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "196E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "198E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "200E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "202E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "204E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "312E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "336E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "376E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "384E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "386E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "428E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "474E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "484E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "546E" [ label=" ",color="blue",arrowhead="dot" ]; +"312" -> "548E" [ label=" ",color="blue",arrowhead="dot" ]; +"314" -> "113E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "43E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "240E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "298E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "334E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "360E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "390E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "418E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "492E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "502E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "584E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "588E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "602E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "606E" [ label=" ",color="blue",arrowhead="dot" ]; +"315" -> "662E" [ label=" ",color="blue",arrowhead="dot" ]; +"316" -> "51E" [ label=" ",color="blue",arrowhead="dot" ]; +"317" -> "116E" [ label=" ",color="blue",arrowhead="dot" ]; +"318" -> "74E" [ label=" ",color="blue",arrowhead="dot" ]; +"319" -> "57E" [ label=" ",color="blue",arrowhead="dot" ]; +"319" -> "94E" [ label=" ",color="blue",arrowhead="dot" ]; +"319" -> "350E" [ label=" ",color="blue",arrowhead="dot" ]; +"319" -> "440E" [ label=" ",color="blue",arrowhead="dot" ]; +"319" -> "466E" [ label=" ",color="blue",arrowhead="dot" ]; +"319" -> "676E" [ label=" ",color="blue",arrowhead="dot" ]; +"320" -> "60E" [ label=" ",color="blue",arrowhead="dot" ]; +"320" -> "366E" [ label=" ",color="blue",arrowhead="dot" ]; +"320" -> "434E" [ label=" ",color="blue",arrowhead="dot" ]; +"320" -> "458E" [ label=" ",color="blue",arrowhead="dot" ]; +"320" -> "618E" [ label=" ",color="blue",arrowhead="dot" ]; +"321" -> "72E" [ label=" ",color="blue",arrowhead="dot" ]; +"321" -> "362E" [ label=" ",color="blue",arrowhead="dot" ]; +"321" -> "372E" [ label=" ",color="blue",arrowhead="dot" ]; +"321" -> "572E" [ label=" ",color="blue",arrowhead="dot" ]; +"322" -> "54E" [ label=" ",color="blue",arrowhead="dot" ]; +"322" -> "222E" [ label=" ",color="blue",arrowhead="dot" ]; +"322" -> "302E" [ label=" ",color="blue",arrowhead="dot" ]; +"322" -> "556E" [ label=" ",color="blue",arrowhead="dot" ]; +"322" -> "558E" [ label=" ",color="blue",arrowhead="dot" ]; +"323" -> "37E" [ label=" ",color="blue",arrowhead="dot" ]; +"323" -> "208E" [ label=" ",color="blue",arrowhead="dot" ]; +"323" -> "210E" [ label=" ",color="blue",arrowhead="dot" ]; +"323" -> "352E" [ label=" ",color="blue",arrowhead="dot" ]; +"323" -> "450E" [ label=" ",color="blue",arrowhead="dot" ]; +"323" -> "568E" [ label=" ",color="blue",arrowhead="dot" ]; +"323" -> "576E" [ label=" ",color="blue",arrowhead="dot" ]; +"323" -> "686E" [ label=" ",color="blue",arrowhead="dot" ]; +"324" -> "228E" [ label=" ",color="blue",arrowhead="dot" ]; +"324" -> "248E" [ label=" ",color="blue",arrowhead="dot" ]; +"324" -> "304E" [ label=" ",color="blue",arrowhead="dot" ]; +"324" -> "468E" [ label=" ",color="blue",arrowhead="dot" ]; +"324" -> "578E" [ label=" ",color="blue",arrowhead="dot" ]; +"324" -> "660E" [ label=" ",color="blue",arrowhead="dot" ]; +"324" -> "688E" [ label=" ",color="blue",arrowhead="dot" ]; +"324" -> "694E" [ label=" ",color="blue",arrowhead="dot" ]; +"324" -> "714E" [ label=" ",color="blue",arrowhead="dot" ]; +"324" -> "766E" [ label=" ",color="blue",arrowhead="dot" ]; +"325" -> "97E" [ label=" ",color="blue",arrowhead="dot" ]; +"325" -> "506E" [ label=" ",color="blue",arrowhead="dot" ]; +"326" -> "61E" [ label=" ",color="blue",arrowhead="dot" ]; +"326" -> "175E" [ label=" ",color="blue",arrowhead="dot" ]; +"326" -> "482E" [ label=" ",color="blue",arrowhead="dot" ]; +"328" -> "75E" [ label=" ",color="blue",arrowhead="dot" ]; +"328" -> "580E" [ label=" ",color="blue",arrowhead="dot" ]; +"329" -> "96E" [ label=" ",color="blue",arrowhead="dot" ]; +"330" -> "100E" [ label=" ",color="blue",arrowhead="dot" ]; +"330" -> "170E" [ label=" ",color="blue",arrowhead="dot" ]; +"333" -> "63E" [ label=" ",color="blue",arrowhead="dot" ]; +"333" -> "67E" [ label=" ",color="blue",arrowhead="dot" ]; +"333" -> "68E" [ label=" ",color="blue",arrowhead="dot" ]; +"333" -> "69E" [ label=" ",color="blue",arrowhead="dot" ]; +"333" -> "70E" [ label=" ",color="blue",arrowhead="dot" ]; +"333" -> "71E" [ label=" ",color="blue",arrowhead="dot" ]; +"333" -> "802E" [ label=" ",color="blue",arrowhead="dot" ]; +"333" -> "793E" [ label=" ",color="blue",arrowhead="dot" ]; +"334" -> "64E" [ label=" ",color="blue",arrowhead="dot" ]; +"334" -> "81E" [ label=" ",color="blue",arrowhead="dot" ]; +"334" -> "82E" [ label=" ",color="blue",arrowhead="dot" ]; +"334" -> "83E" [ label=" ",color="blue",arrowhead="dot" ]; +"334" -> "84E" [ label=" ",color="blue",arrowhead="dot" ]; +"334" -> "85E" [ label=" ",color="blue",arrowhead="dot" ]; +"334" -> "86E" [ label=" ",color="blue",arrowhead="dot" ]; +"334" -> "87E" [ label=" ",color="blue",arrowhead="dot" ]; +"334" -> "88E" [ label=" ",color="blue",arrowhead="dot" ]; +"334" -> "89E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "1E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "2E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "3E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "4E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "5E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "6E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "7E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "8E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "9E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "10E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "11E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "12E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "13E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "14E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "15E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "16E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "17E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "18E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "19E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "20E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "21E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "22E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "23E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "24E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "25E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "26E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "27E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "28E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "29E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "30E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "31E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "65E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "119E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "150E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "176E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "743E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "744E" [ label=" ",color="blue",arrowhead="dot" ]; +"336" -> "764E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "120E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "121E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "122E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "123E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "124E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "125E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "126E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "127E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "128E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "129E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "130E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "131E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "132E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "133E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "134E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "135E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "136E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "137E" [ label=" ",color="blue",arrowhead="dot" ]; +"337" -> "138E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "151E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "153E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "154E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "155E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "156E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "157E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "158E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "159E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "160E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "161E" [ label=" ",color="blue",arrowhead="dot" ]; +"339" -> "162E" [ label=" ",color="blue",arrowhead="dot" ]; +"347" -> "139E" [ label=" ",color="blue",arrowhead="dot" ]; +"347" -> "795E" [ label=" ",color="blue",arrowhead="dot" ]; +"348" -> "799E" [ label=" ",color="blue",arrowhead="dot" ]; +"348" -> "800E" [ label=" ",color="blue",arrowhead="dot" ]; +"349" -> "141E" [ label=" ",color="blue",arrowhead="dot" ]; +"350" -> "142E" [ label=" ",color="blue",arrowhead="dot" ]; +"350" -> "678E" [ label=" ",color="blue",arrowhead="dot" ]; +"351" -> "143E" [ label=" ",color="blue",arrowhead="dot" ]; +"351" -> "232E" [ label=" ",color="blue",arrowhead="dot" ]; +"351" -> "680E" [ label=" ",color="blue",arrowhead="dot" ]; +"351" -> "704E" [ label=" ",color="blue",arrowhead="dot" ]; +"352" -> "144E" [ label=" ",color="blue",arrowhead="dot" ]; +"352" -> "432E" [ label=" ",color="blue",arrowhead="dot" ]; +"353" -> "145E" [ label=" ",color="blue",arrowhead="dot" ]; +"354" -> "146E" [ label=" ",color="blue",arrowhead="dot" ]; +"354" -> "396E" [ label=" ",color="blue",arrowhead="dot" ]; +"355" -> "147E" [ label=" ",color="blue",arrowhead="dot" ]; +"356" -> "148E" [ label=" ",color="blue",arrowhead="dot" ]; +"357" -> "149E" [ label=" ",color="blue",arrowhead="dot" ]; +"358" -> "167E" [ label=" ",color="blue",arrowhead="dot" ]; +"359" -> "169E" [ label=" ",color="blue",arrowhead="dot" ]; +"360" -> "171E" [ label=" ",color="blue",arrowhead="dot" ]; +"361" -> "172E" [ label=" ",color="blue",arrowhead="dot" ]; +"362" -> "173E" [ label=" ",color="blue",arrowhead="dot" ]; +"363" -> "174E" [ label=" ",color="blue",arrowhead="dot" ]; +"364" -> "101E" [ label=" ",color="blue",arrowhead="dot" ]; +"365" -> "102E" [ label=" ",color="blue",arrowhead="dot" ]; +"367" -> "104E" [ label=" ",color="blue",arrowhead="dot" ]; +"368" -> "105E" [ label=" ",color="blue",arrowhead="dot" ]; +"369" -> "106E" [ label=" ",color="blue",arrowhead="dot" ]; +"374" -> "111E" [ label=" ",color="blue",arrowhead="dot" ]; +"375" -> "112E" [ label=" ",color="blue",arrowhead="dot" ]; +"377" -> "114E" [ label=" ",color="blue",arrowhead="dot" ]; +"378" -> "115E" [ label=" ",color="blue",arrowhead="dot" ]; +"380" -> "117E" [ label=" ",color="blue",arrowhead="dot" ]; +"380" -> "392E" [ label=" ",color="blue",arrowhead="dot" ]; +"381" -> "118E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "177E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "178E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "179E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "180E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "181E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "182E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "183E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "184E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "185E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "186E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "187E" [ label=" ",color="blue",arrowhead="dot" ]; +"382" -> "188E" [ label=" ",color="blue",arrowhead="dot" ]; +"383" -> "730E" [ label=" ",color="blue",arrowhead="dot" ]; +"383" -> "732E" [ label=" ",color="blue",arrowhead="dot" ]; +"383" -> "741E" [ label=" ",color="blue",arrowhead="dot" ]; +"383" -> "765E" [ label=" ",color="blue",arrowhead="dot" ]; +"383" -> "796E" [ label=" ",color="blue",arrowhead="dot" ]; +"384" -> "726E" [ label=" ",color="blue",arrowhead="dot" ]; +"384" -> "728E" [ label=" ",color="blue",arrowhead="dot" ]; +"384" -> "742E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "328E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "496E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "594E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "622E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "754E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "755E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "756E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "757E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "758E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "759E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "760E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "761E" [ label=" ",color="blue",arrowhead="dot" ]; +"385" -> "762E" [ label=" ",color="blue",arrowhead="dot" ]; +"1E" -> "34E" [ color="purple",arrowhead="none" ]; +"2E" -> "35E" [ color="purple",arrowhead="none" ]; +"3E" -> "36E" [ color="purple",arrowhead="none" ]; +"4E" -> "37E" [ color="purple",arrowhead="none" ]; +"5E" -> "38E" [ color="purple",arrowhead="none" ]; +"6E" -> "39E" [ color="purple",arrowhead="none" ]; +"7E" -> "40E" [ color="purple",arrowhead="none" ]; +"9E" -> "41E" [ color="purple",arrowhead="none" ]; +"10E" -> "42E" [ color="purple",arrowhead="none" ]; +"11E" -> "43E" [ color="purple",arrowhead="none" ]; +"12E" -> "44E" [ color="purple",arrowhead="none" ]; +"13E" -> "45E" [ color="purple",arrowhead="none" ]; +"14E" -> "46E" [ color="purple",arrowhead="none" ]; +"15E" -> "47E" [ color="purple",arrowhead="none" ]; +"16E" -> "48E" [ color="purple",arrowhead="none" ]; +"49E" -> "17E" [ color="purple",arrowhead="none" ]; +"18E" -> "50E" [ color="purple",arrowhead="none" ]; +"19E" -> "51E" [ color="purple",arrowhead="none" ]; +"20E" -> "52E" [ color="purple",arrowhead="none" ]; +"21E" -> "53E" [ color="purple",arrowhead="none" ]; +"22E" -> "54E" [ color="purple",arrowhead="none" ]; +"23E" -> "55E" [ color="purple",arrowhead="none" ]; +"24E" -> "56E" [ color="purple",arrowhead="none" ]; +"25E" -> "57E" [ color="purple",arrowhead="none" ]; +"26E" -> "58E" [ color="purple",arrowhead="none" ]; +"27E" -> "59E" [ color="purple",arrowhead="none" ]; +"28E" -> "60E" [ color="purple",arrowhead="none" ]; +"29E" -> "61E" [ color="purple",arrowhead="none" ]; +"30E" -> "62E" [ color="purple",arrowhead="none" ]; +"31E" -> "63E" [ color="purple",arrowhead="none" ]; +"64E" -> "65E" [ color="purple",arrowhead="none" ]; +"66E" -> "8E" [ color="purple",arrowhead="none" ]; +"71E" -> "76E" [ color="purple",arrowhead="none" ]; +"67E" -> "72E" [ color="purple",arrowhead="none" ]; +"68E" -> "73E" [ color="purple",arrowhead="none" ]; +"69E" -> "74E" [ color="purple",arrowhead="none" ]; +"70E" -> "75E" [ color="purple",arrowhead="none" ]; +"81E" -> "92E" [ color="purple",arrowhead="none" ]; +"82E" -> "93E" [ color="purple",arrowhead="none" ]; +"83E" -> "94E" [ color="purple",arrowhead="none" ]; +"84E" -> "95E" [ color="purple",arrowhead="none" ]; +"85E" -> "96E" [ color="purple",arrowhead="none" ]; +"86E" -> "97E" [ color="purple",arrowhead="none" ]; +"87E" -> "98E" [ color="purple",arrowhead="none" ]; +"88E" -> "99E" [ color="purple",arrowhead="none" ]; +"89E" -> "100E" [ color="purple",arrowhead="none" ]; +"101E" -> "120E" [ color="purple",arrowhead="none" ]; +"102E" -> "121E" [ color="purple",arrowhead="none" ]; +"103E" -> "122E" [ color="purple",arrowhead="none" ]; +"104E" -> "123E" [ color="purple",arrowhead="none" ]; +"105E" -> "124E" [ color="purple",arrowhead="none" ]; +"106E" -> "125E" [ color="purple",arrowhead="none" ]; +"107E" -> "126E" [ color="purple",arrowhead="none" ]; +"108E" -> "127E" [ color="purple",arrowhead="none" ]; +"109E" -> "128E" [ color="purple",arrowhead="none" ]; +"110E" -> "129E" [ color="purple",arrowhead="none" ]; +"111E" -> "130E" [ color="purple",arrowhead="none" ]; +"112E" -> "131E" [ color="purple",arrowhead="none" ]; +"113E" -> "132E" [ color="purple",arrowhead="none" ]; +"114E" -> "133E" [ color="purple",arrowhead="none" ]; +"115E" -> "134E" [ color="purple",arrowhead="none" ]; +"116E" -> "135E" [ color="purple",arrowhead="none" ]; +"117E" -> "136E" [ color="purple",arrowhead="none" ]; +"118E" -> "137E" [ color="purple",arrowhead="none" ]; +"119E" -> "138E" [ color="purple",arrowhead="none" ]; +"139E" -> "151E" [ color="purple",arrowhead="none" ]; +"141E" -> "153E" [ color="purple",arrowhead="none" ]; +"142E" -> "154E" [ color="purple",arrowhead="none" ]; +"143E" -> "155E" [ color="purple",arrowhead="none" ]; +"144E" -> "156E" [ color="purple",arrowhead="none" ]; +"145E" -> "157E" [ color="purple",arrowhead="none" ]; +"146E" -> "158E" [ color="purple",arrowhead="none" ]; +"147E" -> "159E" [ color="purple",arrowhead="none" ]; +"148E" -> "160E" [ color="purple",arrowhead="none" ]; +"149E" -> "161E" [ color="purple",arrowhead="none" ]; +"150E" -> "162E" [ color="purple",arrowhead="none" ]; +"165E" -> "177E" [ color="purple",arrowhead="none" ]; +"166E" -> "178E" [ color="purple",arrowhead="none" ]; +"167E" -> "179E" [ color="purple",arrowhead="none" ]; +"168E" -> "180E" [ color="purple",arrowhead="none" ]; +"169E" -> "181E" [ color="purple",arrowhead="none" ]; +"170E" -> "182E" [ color="purple",arrowhead="none" ]; +"171E" -> "183E" [ color="purple",arrowhead="none" ]; +"172E" -> "184E" [ color="purple",arrowhead="none" ]; +"173E" -> "185E" [ color="purple",arrowhead="none" ]; +"174E" -> "186E" [ color="purple",arrowhead="none" ]; +"175E" -> "187E" [ color="purple",arrowhead="none" ]; +"176E" -> "188E" [ color="purple",arrowhead="none" ]; +"189E" -> "190E" [ color="purple",arrowhead="none" ]; +"191E" -> "192E" [ color="purple",arrowhead="none" ]; +"193E" -> "194E" [ color="purple",arrowhead="none" ]; +"195E" -> "196E" [ color="purple",arrowhead="none" ]; +"197E" -> "198E" [ color="purple",arrowhead="none" ]; +"199E" -> "200E" [ color="purple",arrowhead="none" ]; +"201E" -> "202E" [ color="purple",arrowhead="none" ]; +"203E" -> "204E" [ color="purple",arrowhead="none" ]; +"205E" -> "206E" [ color="purple",arrowhead="none" ]; +"207E" -> "208E" [ color="purple",arrowhead="none" ]; +"209E" -> "210E" [ color="purple",arrowhead="none" ]; +"412E" -> "211E" [ color="purple",arrowhead="none" ]; +"214E" -> "213E" [ color="purple",arrowhead="none" ]; +"216E" -> "215E" [ color="purple",arrowhead="none" ]; +"217E" -> "218E" [ color="purple",arrowhead="none" ]; +"219E" -> "220E" [ color="purple",arrowhead="none" ]; +"221E" -> "222E" [ color="purple",arrowhead="none" ]; +"223E" -> "224E" [ color="purple",arrowhead="none" ]; +"225E" -> "226E" [ color="purple",arrowhead="none" ]; +"227E" -> "228E" [ color="purple",arrowhead="none" ]; +"231E" -> "232E" [ color="purple",arrowhead="none" ]; +"233E" -> "234E" [ color="purple",arrowhead="none" ]; +"236E" -> "235E" [ color="purple",arrowhead="none" ]; +"237E" -> "238E" [ color="purple",arrowhead="none" ]; +"239E" -> "240E" [ color="purple",arrowhead="none" ]; +"241E" -> "242E" [ color="purple",arrowhead="none" ]; +"243E" -> "244E" [ color="purple",arrowhead="none" ]; +"245E" -> "246E" [ color="purple",arrowhead="none" ]; +"247E" -> "248E" [ color="purple",arrowhead="none" ]; +"249E" -> "250E" [ color="purple",arrowhead="none" ]; +"251E" -> "252E" [ color="purple",arrowhead="none" ]; +"253E" -> "254E" [ color="purple",arrowhead="none" ]; +"255E" -> "256E" [ color="purple",arrowhead="none" ]; +"257E" -> "258E" [ color="purple",arrowhead="none" ]; +"259E" -> "260E" [ color="purple",arrowhead="none" ]; +"261E" -> "262E" [ color="purple",arrowhead="none" ]; +"263E" -> "264E" [ color="purple",arrowhead="none" ]; +"265E" -> "266E" [ color="purple",arrowhead="none" ]; +"267E" -> "268E" [ color="purple",arrowhead="none" ]; +"269E" -> "270E" [ color="purple",arrowhead="none" ]; +"271E" -> "272E" [ color="purple",arrowhead="none" ]; +"273E" -> "274E" [ color="purple",arrowhead="none" ]; +"275E" -> "276E" [ color="purple",arrowhead="none" ]; +"278E" -> "277E" [ color="purple",arrowhead="none" ]; +"279E" -> "767E" [ color="purple",arrowhead="none" ]; +"281E" -> "282E" [ color="purple",arrowhead="none" ]; +"283E" -> "284E" [ color="purple",arrowhead="none" ]; +"285E" -> "286E" [ color="purple",arrowhead="none" ]; +"768E" -> "287E" [ color="purple",arrowhead="none" ]; +"289E" -> "290E" [ color="purple",arrowhead="none" ]; +"291E" -> "292E" [ color="purple",arrowhead="none" ]; +"293E" -> "294E" [ color="purple",arrowhead="none" ]; +"295E" -> "296E" [ color="purple",arrowhead="none" ]; +"297E" -> "298E" [ color="purple",arrowhead="none" ]; +"299E" -> "300E" [ color="purple",arrowhead="none" ]; +"301E" -> "302E" [ color="purple",arrowhead="none" ]; +"303E" -> "304E" [ color="purple",arrowhead="none" ]; +"305E" -> "306E" [ color="purple",arrowhead="none" ]; +"307E" -> "308E" [ color="purple",arrowhead="none" ]; +"309E" -> "310E" [ color="purple",arrowhead="none" ]; +"311E" -> "312E" [ color="purple",arrowhead="none" ]; +"313E" -> "314E" [ color="purple",arrowhead="none" ]; +"315E" -> "316E" [ color="purple",arrowhead="none" ]; +"317E" -> "318E" [ color="purple",arrowhead="none" ]; +"319E" -> "320E" [ color="purple",arrowhead="none" ]; +"321E" -> "322E" [ color="purple",arrowhead="none" ]; +"327E" -> "800E" [ color="purple",arrowhead="none" ]; +"329E" -> "330E" [ color="purple",arrowhead="none" ]; +"331E" -> "332E" [ color="purple",arrowhead="none" ]; +"333E" -> "334E" [ color="purple",arrowhead="none" ]; +"335E" -> "336E" [ color="purple",arrowhead="none" ]; +"337E" -> "338E" [ color="purple",arrowhead="none" ]; +"339E" -> "340E" [ color="purple",arrowhead="none" ]; +"341E" -> "342E" [ color="purple",arrowhead="none" ]; +"343E" -> "344E" [ color="purple",arrowhead="none" ]; +"345E" -> "346E" [ color="purple",arrowhead="none" ]; +"347E" -> "348E" [ color="purple",arrowhead="none" ]; +"349E" -> "350E" [ color="purple",arrowhead="none" ]; +"351E" -> "352E" [ color="purple",arrowhead="none" ]; +"353E" -> "354E" [ color="purple",arrowhead="none" ]; +"412E" -> "355E" [ color="purple",arrowhead="none" ]; +"357E" -> "358E" [ color="purple",arrowhead="none" ]; +"359E" -> "360E" [ color="purple",arrowhead="none" ]; +"361E" -> "362E" [ color="purple",arrowhead="none" ]; +"363E" -> "364E" [ color="purple",arrowhead="none" ]; +"365E" -> "366E" [ color="purple",arrowhead="none" ]; +"367E" -> "368E" [ color="purple",arrowhead="none" ]; +"369E" -> "370E" [ color="purple",arrowhead="none" ]; +"371E" -> "372E" [ color="purple",arrowhead="none" ]; +"373E" -> "374E" [ color="purple",arrowhead="none" ]; +"375E" -> "376E" [ color="purple",arrowhead="none" ]; +"377E" -> "378E" [ color="purple",arrowhead="none" ]; +"379E" -> "380E" [ color="purple",arrowhead="none" ]; +"381E" -> "382E" [ color="purple",arrowhead="none" ]; +"383E" -> "384E" [ color="purple",arrowhead="none" ]; +"385E" -> "386E" [ color="purple",arrowhead="none" ]; +"387E" -> "388E" [ color="purple",arrowhead="none" ]; +"389E" -> "390E" [ color="purple",arrowhead="none" ]; +"391E" -> "392E" [ color="purple",arrowhead="none" ]; +"393E" -> "394E" [ color="purple",arrowhead="none" ]; +"395E" -> "396E" [ color="purple",arrowhead="none" ]; +"397E" -> "398E" [ color="purple",arrowhead="none" ]; +"399E" -> "400E" [ color="purple",arrowhead="none" ]; +"402E" -> "401E" [ color="purple",arrowhead="none" ]; +"404E" -> "403E" [ color="purple",arrowhead="none" ]; +"406E" -> "405E" [ color="purple",arrowhead="none" ]; +"408E" -> "407E" [ color="purple",arrowhead="none" ]; +"236E" -> "409E" [ color="purple",arrowhead="none" ]; +"412E" -> "411E" [ color="purple",arrowhead="none" ]; +"412E" -> "413E" [ color="purple",arrowhead="none" ]; +"278E" -> "415E" [ color="purple",arrowhead="none" ]; +"417E" -> "418E" [ color="purple",arrowhead="none" ]; +"419E" -> "420E" [ color="purple",arrowhead="none" ]; +"421E" -> "422E" [ color="purple",arrowhead="none" ]; +"423E" -> "424E" [ color="purple",arrowhead="none" ]; +"425E" -> "426E" [ color="purple",arrowhead="none" ]; +"427E" -> "428E" [ color="purple",arrowhead="none" ]; +"431E" -> "432E" [ color="purple",arrowhead="none" ]; +"433E" -> "434E" [ color="purple",arrowhead="none" ]; +"435E" -> "436E" [ color="purple",arrowhead="none" ]; +"438E" -> "437E" [ color="purple",arrowhead="none" ]; +"439E" -> "440E" [ color="purple",arrowhead="none" ]; +"441E" -> "442E" [ color="purple",arrowhead="none" ]; +"443E" -> "444E" [ color="purple",arrowhead="none" ]; +"445E" -> "446E" [ color="purple",arrowhead="none" ]; +"448E" -> "447E" [ color="purple",arrowhead="none" ]; +"449E" -> "450E" [ color="purple",arrowhead="none" ]; +"451E" -> "452E" [ color="purple",arrowhead="none" ]; +"453E" -> "454E" [ color="purple",arrowhead="none" ]; +"455E" -> "456E" [ color="purple",arrowhead="none" ]; +"457E" -> "458E" [ color="purple",arrowhead="none" ]; +"459E" -> "460E" [ color="purple",arrowhead="none" ]; +"461E" -> "462E" [ color="purple",arrowhead="none" ]; +"236E" -> "463E" [ color="purple",arrowhead="none" ]; +"465E" -> "466E" [ color="purple",arrowhead="none" ]; +"467E" -> "468E" [ color="purple",arrowhead="none" ]; +"469E" -> "470E" [ color="purple",arrowhead="none" ]; +"471E" -> "472E" [ color="purple",arrowhead="none" ]; +"473E" -> "474E" [ color="purple",arrowhead="none" ]; +"476E" -> "475E" [ color="purple",arrowhead="none" ]; +"477E" -> "478E" [ color="purple",arrowhead="none" ]; +"479E" -> "358E" [ color="purple",arrowhead="none" ]; +"481E" -> "482E" [ color="purple",arrowhead="none" ]; +"483E" -> "484E" [ color="purple",arrowhead="none" ]; +"485E" -> "486E" [ color="purple",arrowhead="none" ]; +"487E" -> "488E" [ color="purple",arrowhead="none" ]; +"489E" -> "490E" [ color="purple",arrowhead="none" ]; +"491E" -> "492E" [ color="purple",arrowhead="none" ]; +"495E" -> "795E" [ color="purple",arrowhead="none" ]; +"499E" -> "500E" [ color="purple",arrowhead="none" ]; +"501E" -> "502E" [ color="purple",arrowhead="none" ]; +"504E" -> "503E" [ color="purple",arrowhead="none" ]; +"505E" -> "506E" [ color="purple",arrowhead="none" ]; +"507E" -> "508E" [ color="purple",arrowhead="none" ]; +"509E" -> "510E" [ color="purple",arrowhead="none" ]; +"412E" -> "511E" [ color="purple",arrowhead="none" ]; +"513E" -> "514E" [ color="purple",arrowhead="none" ]; +"515E" -> "516E" [ color="purple",arrowhead="none" ]; +"517E" -> "518E" [ color="purple",arrowhead="none" ]; +"519E" -> "520E" [ color="purple",arrowhead="none" ]; +"521E" -> "522E" [ color="purple",arrowhead="none" ]; +"523E" -> "524E" [ color="purple",arrowhead="none" ]; +"525E" -> "526E" [ color="purple",arrowhead="none" ]; +"527E" -> "528E" [ color="purple",arrowhead="none" ]; +"529E" -> "530E" [ color="purple",arrowhead="none" ]; +"531E" -> "532E" [ color="purple",arrowhead="none" ]; +"533E" -> "534E" [ color="purple",arrowhead="none" ]; +"535E" -> "536E" [ color="purple",arrowhead="none" ]; +"537E" -> "538E" [ color="purple",arrowhead="none" ]; +"539E" -> "540E" [ color="purple",arrowhead="none" ]; +"541E" -> "542E" [ color="purple",arrowhead="none" ]; +"543E" -> "544E" [ color="purple",arrowhead="none" ]; +"545E" -> "546E" [ color="purple",arrowhead="none" ]; +"547E" -> "548E" [ color="purple",arrowhead="none" ]; +"549E" -> "550E" [ color="purple",arrowhead="none" ]; +"551E" -> "552E" [ color="purple",arrowhead="none" ]; +"553E" -> "554E" [ color="purple",arrowhead="none" ]; +"555E" -> "556E" [ color="purple",arrowhead="none" ]; +"557E" -> "558E" [ color="purple",arrowhead="none" ]; +"278E" -> "559E" [ color="purple",arrowhead="none" ]; +"561E" -> "562E" [ color="purple",arrowhead="none" ]; +"563E" -> "564E" [ color="purple",arrowhead="none" ]; +"565E" -> "566E" [ color="purple",arrowhead="none" ]; +"567E" -> "568E" [ color="purple",arrowhead="none" ]; +"569E" -> "570E" [ color="purple",arrowhead="none" ]; +"571E" -> "572E" [ color="purple",arrowhead="none" ]; +"573E" -> "574E" [ color="purple",arrowhead="none" ]; +"575E" -> "576E" [ color="purple",arrowhead="none" ]; +"577E" -> "578E" [ color="purple",arrowhead="none" ]; +"579E" -> "580E" [ color="purple",arrowhead="none" ]; +"581E" -> "582E" [ color="purple",arrowhead="none" ]; +"583E" -> "584E" [ color="purple",arrowhead="none" ]; +"585E" -> "586E" [ color="purple",arrowhead="none" ]; +"587E" -> "588E" [ color="purple",arrowhead="none" ]; +"589E" -> "590E" [ color="purple",arrowhead="none" ]; +"593E" -> "594E" [ color="purple",arrowhead="none" ]; +"597E" -> "598E" [ color="purple",arrowhead="none" ]; +"599E" -> "600E" [ color="purple",arrowhead="none" ]; +"601E" -> "602E" [ color="purple",arrowhead="none" ]; +"603E" -> "604E" [ color="purple",arrowhead="none" ]; +"605E" -> "606E" [ color="purple",arrowhead="none" ]; +"607E" -> "608E" [ color="purple",arrowhead="none" ]; +"609E" -> "610E" [ color="purple",arrowhead="none" ]; +"611E" -> "612E" [ color="purple",arrowhead="none" ]; +"613E" -> "614E" [ color="purple",arrowhead="none" ]; +"615E" -> "358E" [ color="purple",arrowhead="none" ]; +"617E" -> "618E" [ color="purple",arrowhead="none" ]; +"619E" -> "620E" [ color="purple",arrowhead="none" ]; +"621E" -> "622E" [ color="purple",arrowhead="none" ]; +"623E" -> "624E" [ color="purple",arrowhead="none" ]; +"625E" -> "626E" [ color="purple",arrowhead="none" ]; +"627E" -> "628E" [ color="purple",arrowhead="none" ]; +"629E" -> "630E" [ color="purple",arrowhead="none" ]; +"631E" -> "632E" [ color="purple",arrowhead="none" ]; +"634E" -> "633E" [ color="purple",arrowhead="none" ]; +"635E" -> "636E" [ color="purple",arrowhead="none" ]; +"637E" -> "638E" [ color="purple",arrowhead="none" ]; +"639E" -> "640E" [ color="purple",arrowhead="none" ]; +"641E" -> "642E" [ color="purple",arrowhead="none" ]; +"643E" -> "644E" [ color="purple",arrowhead="none" ]; +"645E" -> "646E" [ color="purple",arrowhead="none" ]; +"647E" -> "648E" [ color="purple",arrowhead="none" ]; +"649E" -> "650E" [ color="purple",arrowhead="none" ]; +"651E" -> "652E" [ color="purple",arrowhead="none" ]; +"653E" -> "654E" [ color="purple",arrowhead="none" ]; +"655E" -> "656E" [ color="purple",arrowhead="none" ]; +"657E" -> "658E" [ color="purple",arrowhead="none" ]; +"659E" -> "660E" [ color="purple",arrowhead="none" ]; +"661E" -> "662E" [ color="purple",arrowhead="none" ]; +"663E" -> "664E" [ color="purple",arrowhead="none" ]; +"665E" -> "666E" [ color="purple",arrowhead="none" ]; +"667E" -> "668E" [ color="purple",arrowhead="none" ]; +"669E" -> "670E" [ color="purple",arrowhead="none" ]; +"671E" -> "672E" [ color="purple",arrowhead="none" ]; +"673E" -> "674E" [ color="purple",arrowhead="none" ]; +"675E" -> "676E" [ color="purple",arrowhead="none" ]; +"679E" -> "680E" [ color="purple",arrowhead="none" ]; +"681E" -> "682E" [ color="purple",arrowhead="none" ]; +"683E" -> "684E" [ color="purple",arrowhead="none" ]; +"685E" -> "686E" [ color="purple",arrowhead="none" ]; +"687E" -> "688E" [ color="purple",arrowhead="none" ]; +"689E" -> "690E" [ color="purple",arrowhead="none" ]; +"691E" -> "692E" [ color="purple",arrowhead="none" ]; +"693E" -> "694E" [ color="purple",arrowhead="none" ]; +"695E" -> "696E" [ color="purple",arrowhead="none" ]; +"697E" -> "698E" [ color="purple",arrowhead="none" ]; +"699E" -> "700E" [ color="purple",arrowhead="none" ]; +"703E" -> "704E" [ color="purple",arrowhead="none" ]; +"705E" -> "706E" [ color="purple",arrowhead="none" ]; +"709E" -> "710E" [ color="purple",arrowhead="none" ]; +"711E" -> "712E" [ color="purple",arrowhead="none" ]; +"713E" -> "714E" [ color="purple",arrowhead="none" ]; +"715E" -> "398E" [ color="purple",arrowhead="none" ]; +"717E" -> "718E" [ color="purple",arrowhead="none" ]; +"719E" -> "720E" [ color="purple",arrowhead="none" ]; +"721E" -> "722E" [ color="purple",arrowhead="none" ]; +"725E" -> "726E" [ color="purple",arrowhead="none" ]; +"727E" -> "728E" [ color="purple",arrowhead="none" ]; +"729E" -> "730E" [ color="purple",arrowhead="none" ]; +"731E" -> "732E" [ color="purple",arrowhead="none" ]; +"741E" -> "743E" [ color="purple",arrowhead="none" ]; +"742E" -> "744E" [ color="purple",arrowhead="none" ]; +"745E" -> "754E" [ color="purple",arrowhead="none" ]; +"746E" -> "755E" [ color="purple",arrowhead="none" ]; +"747E" -> "756E" [ color="purple",arrowhead="none" ]; +"748E" -> "757E" [ color="purple",arrowhead="none" ]; +"749E" -> "758E" [ color="purple",arrowhead="none" ]; +"750E" -> "759E" [ color="purple",arrowhead="none" ]; +"751E" -> "760E" [ color="purple",arrowhead="none" ]; +"752E" -> "761E" [ color="purple",arrowhead="none" ]; +"753E" -> "762E" [ color="purple",arrowhead="none" ]; +"763E" -> "764E" [ color="purple",arrowhead="none" ]; +"765E" -> "766E" [ color="purple",arrowhead="none" ]; +"770E" -> "783E" [ color="purple",arrowhead="none" ]; +"770E" -> "784E" [ color="purple",arrowhead="none" ]; +"769E" -> "785E" [ color="purple",arrowhead="none" ]; +"769E" -> "786E" [ color="purple",arrowhead="none" ]; +"769E" -> "787E" [ color="purple",arrowhead="none" ]; +"770E" -> "788E" [ color="purple",arrowhead="none" ]; +"770E" -> "789E" [ color="purple",arrowhead="none" ]; +"769E" -> "790E" [ color="purple",arrowhead="none" ]; +"770E" -> "791E" [ color="purple",arrowhead="none" ]; +"769E" -> "792E" [ color="purple",arrowhead="none" ]; +"793E" -> "769E" [ color="purple",arrowhead="none" ]; +"769E" -> "784E" [ color="purple",arrowhead="none" ]; +"770E" -> "785E" [ color="purple",arrowhead="none" ]; +"788E" -> "787E" [ color="purple",arrowhead="none" ]; +"770E" -> "792E" [ color="purple",arrowhead="none" ]; +"798E" -> "799E" [ color="purple",arrowhead="none" ]; +"796E" -> "797E" [ color="purple",arrowhead="none" ]; +"793E" -> "789E" [ color="purple",arrowhead="none" ]; +"783E" -> "787E" [ color="purple",arrowhead="none" ]; +"784E" -> "792E" [ color="purple",arrowhead="none" ]; +"787E" -> "789E" [ color="purple",arrowhead="none" ]; +"769E" -> "791E" [ color="purple",arrowhead="none" ]; +"802E" -> "801E" [ color="purple",arrowhead="none" ]; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/unix.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/unix.gv.txt new file mode 100644 index 000000000..f8ddf8db7 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/unix.gv.txt @@ -0,0 +1,54 @@ +/* courtesy Ian Darwin and Geoff Collyer, Softquad Inc. */ +digraph unix { + size="6,6"; + node [color=lightblue2, style=filled]; + "5th Edition" -> "6th Edition"; + "5th Edition" -> "PWB 1.0"; + "6th Edition" -> "LSX"; + "6th Edition" -> "1 BSD"; + "6th Edition" -> "Mini Unix"; + "6th Edition" -> "Wollongong"; + "6th Edition" -> "Interdata"; + "Interdata" -> "Unix/TS 3.0"; + "Interdata" -> "PWB 2.0"; + "Interdata" -> "7th Edition"; + "7th Edition" -> "8th Edition"; + "7th Edition" -> "32V"; + "7th Edition" -> "V7M"; + "7th Edition" -> "Ultrix-11"; + "7th Edition" -> "Xenix"; + "7th Edition" -> "UniPlus+"; + "V7M" -> "Ultrix-11"; + "8th Edition" -> "9th Edition"; + "1 BSD" -> "2 BSD"; + "2 BSD" -> "2.8 BSD"; + "2.8 BSD" -> "Ultrix-11"; + "2.8 BSD" -> "2.9 BSD"; + "32V" -> "3 BSD"; + "3 BSD" -> "4 BSD"; + "4 BSD" -> "4.1 BSD"; + "4.1 BSD" -> "4.2 BSD"; + "4.1 BSD" -> "2.8 BSD"; + "4.1 BSD" -> "8th Edition"; + "4.2 BSD" -> "4.3 BSD"; + "4.2 BSD" -> "Ultrix-32"; + "PWB 1.0" -> "PWB 1.2"; + "PWB 1.0" -> "USG 1.0"; + "PWB 1.2" -> "PWB 2.0"; + "USG 1.0" -> "CB Unix 1"; + "USG 1.0" -> "USG 2.0"; + "CB Unix 1" -> "CB Unix 2"; + "CB Unix 2" -> "CB Unix 3"; + "CB Unix 3" -> "Unix/TS++"; + "CB Unix 3" -> "PDP-11 Sys V"; + "USG 2.0" -> "USG 3.0"; + "USG 3.0" -> "Unix/TS 3.0"; + "PWB 2.0" -> "Unix/TS 3.0"; + "Unix/TS 1.0" -> "Unix/TS 3.0"; + "Unix/TS 3.0" -> "TS 4.0"; + "Unix/TS++" -> "TS 4.0"; + "CB Unix 3" -> "TS 4.0"; + "TS 4.0" -> "System V.0"; + "System V.0" -> "System V.2"; + "System V.2" -> "System V.3"; +} diff --git a/vendor/github.com/awalterschulze/gographviz/testdata/world.gv.txt b/vendor/github.com/awalterschulze/gographviz/testdata/world.gv.txt new file mode 100644 index 000000000..3e6e4e370 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/testdata/world.gv.txt @@ -0,0 +1,67 @@ +digraph world { +size="7,7"; + {rank=same; S8 S24 S1 S35 S30;} + {rank=same; T8 T24 T1 T35 T30;} + {rank=same; 43 37 36 10 2;} + {rank=same; 25 9 38 40 13 17 12 18;} + {rank=same; 26 42 11 3 33 19 39 14 16;} + {rank=same; 4 31 34 21 41 28 20;} + {rank=same; 27 5 22 32 29 15;} + {rank=same; 6 23;} + {rank=same; 7;} + + S8 -> 9; + S24 -> 25; + S24 -> 27; + S1 -> 2; + S1 -> 10; + S35 -> 43; + S35 -> 36; + S30 -> 31; + S30 -> 33; + 9 -> 42; + 9 -> T1; + 25 -> T1; + 25 -> 26; + 27 -> T24; + 2 -> {3 ; 16 ; 17 ; T1 ; 18} + 10 -> { 11 ; 14 ; T1 ; 13; 12;} + 31 -> T1; + 31 -> 32; + 33 -> T30; + 33 -> 34; + 42 -> 4; + 26 -> 4; + 3 -> 4; + 16 -> 15; + 17 -> 19; + 18 -> 29; + 11 -> 4; + 14 -> 15; + 37 -> {39 ; 41 ; 38 ; 40;} + 13 -> 19; + 12 -> 29; + 43 -> 38; + 43 -> 40; + 36 -> 19; + 32 -> 23; + 34 -> 29; + 39 -> 15; + 41 -> 29; + 38 -> 4; + 40 -> 19; + 4 -> 5; + 19 -> {21 ; 20 ; 28;} + 5 -> {6 ; T35 ; 23;} + 21 -> 22; + 20 -> 15; + 28 -> 29; + 6 -> 7; + 15 -> T1; + 22 -> T35; + 22 -> 23; + 29 -> T30; + 7 -> T8; + 23 -> T24; + 23 -> T1; +} diff --git a/vendor/github.com/awalterschulze/gographviz/token/token.go b/vendor/github.com/awalterschulze/gographviz/token/token.go new file mode 100644 index 000000000..ef4148290 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/token/token.go @@ -0,0 +1,104 @@ +// generated by gocc; DO NOT EDIT. + +package token + +import ( + "fmt" +) + +type Token struct { + Type + Lit []byte + Pos +} + +type Type int + +const ( + INVALID Type = iota + EOF +) + +type Pos struct { + Offset int + Line int + Column int +} + +func (this Pos) String() string { + return fmt.Sprintf("Pos(offset=%d, line=%d, column=%d)", this.Offset, this.Line, this.Column) +} + +type TokenMap struct { + typeMap []string + idMap map[string]Type +} + +func (this TokenMap) Id(tok Type) string { + if int(tok) < len(this.typeMap) { + return this.typeMap[tok] + } + return "unknown" +} + +func (this TokenMap) Type(tok string) Type { + if typ, exist := this.idMap[tok]; exist { + return typ + } + return INVALID +} + +func (this TokenMap) TokenString(tok *Token) string { + //TODO: refactor to print pos & token string properly + return fmt.Sprintf("%s(%d,%s)", this.Id(tok.Type), tok.Type, tok.Lit) +} + +func (this TokenMap) StringType(typ Type) string { + return fmt.Sprintf("%s(%d)", this.Id(typ), typ) +} + +var TokMap = TokenMap{ + typeMap: []string{ + "INVALID", + "$", + "graphx", + "{", + "}", + "strict", + "digraph", + ";", + "=", + "node", + "edge", + "[", + "]", + ",", + ":", + "subgraph", + "->", + "--", + "id", + }, + + idMap: map[string]Type{ + "INVALID": 0, + "$": 1, + "graphx": 2, + "{": 3, + "}": 4, + "strict": 5, + "digraph": 6, + ";": 7, + "=": 8, + "node": 9, + "edge": 10, + "[": 11, + "]": 12, + ",": 13, + ":": 14, + "subgraph": 15, + "->": 16, + "--": 17, + "id": 18, + }, +} diff --git a/vendor/github.com/awalterschulze/gographviz/util/litconv.go b/vendor/github.com/awalterschulze/gographviz/util/litconv.go new file mode 100644 index 000000000..a4822f83f --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/util/litconv.go @@ -0,0 +1,122 @@ +// generated by gocc; DO NOT EDIT. + +//Copyright 2013 Vastech SA (PTY) LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "fmt" + "strconv" + "unicode" + "unicode/utf8" +) + +/* Interface */ + +/* +Convert the literal value of a scanned token to rune +*/ +func RuneValue(lit []byte) rune { + if lit[1] == '\\' { + return escapeCharVal(lit) + } + r, size := utf8.DecodeRune(lit[1:]) + if size != len(lit)-2 { + panic(fmt.Sprintf("Error decoding rune. Lit: %s, rune: %d, size%d\n", lit, r, size)) + } + return r +} + +/* +Convert the literal value of a scanned token to int64 +*/ +func IntValue(lit []byte) (int64, error) { + return strconv.ParseInt(string(lit), 10, 64) +} + +/* +Convert the literal value of a scanned token to uint64 +*/ +func UintValue(lit []byte) (uint64, error) { + return strconv.ParseUint(string(lit), 10, 64) +} + +/* Util */ + +func escapeCharVal(lit []byte) rune { + var i, base, max uint32 + offset := 2 + switch lit[offset] { + case 'a': + return '\a' + case 'b': + return '\b' + case 'f': + return '\f' + case 'n': + return '\n' + case 'r': + return '\r' + case 't': + return '\t' + case 'v': + return '\v' + case '\\': + return '\\' + case '\'': + return '\'' + case '0', '1', '2', '3', '4', '5', '6', '7': + i, base, max = 3, 8, 255 + case 'x': + i, base, max = 2, 16, 255 + offset++ + case 'u': + i, base, max = 4, 16, unicode.MaxRune + offset++ + case 'U': + i, base, max = 8, 16, unicode.MaxRune + offset++ + default: + panic(fmt.Sprintf("Error decoding character literal: %s\n", lit)) + } + + var x uint32 + for ; i > 0 && offset < len(lit)-1; i-- { + ch, size := utf8.DecodeRune(lit[offset:]) + offset += size + d := uint32(digitVal(ch)) + if d >= base { + panic(fmt.Sprintf("charVal(%s): illegal character (%c) in escape sequence. size=%d, offset=%d", lit, ch, size, offset)) + } + x = x*base + d + } + if x > max || 0xD800 <= x && x < 0xE000 { + panic(fmt.Sprintf("Error decoding escape char value. Lit:%s, offset:%d, escape sequence is invalid Unicode code point\n", lit, offset)) + } + + return rune(x) +} + +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch) - '0' + case 'a' <= ch && ch <= 'f': + return int(ch) - 'a' + 10 + case 'A' <= ch && ch <= 'F': + return int(ch) - 'A' + 10 + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/awalterschulze/gographviz/util/rune.go b/vendor/github.com/awalterschulze/gographviz/util/rune.go new file mode 100644 index 000000000..124956016 --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/util/rune.go @@ -0,0 +1,53 @@ +// generated by gocc; DO NOT EDIT. + +//Copyright 2013 Vastech SA (PTY) LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "fmt" +) + +func RuneToString(r rune) string { + if r >= 0x20 && r < 0x7f { + return fmt.Sprintf("'%c'", r) + } + switch r { + case 0x07: + return "'\\a'" + case 0x08: + return "'\\b'" + case 0x0C: + return "'\\f'" + case 0x0A: + return "'\\n'" + case 0x0D: + return "'\\r'" + case 0x09: + return "'\\t'" + case 0x0b: + return "'\\v'" + case 0x5c: + return "'\\\\\\'" + case 0x27: + return "'\\''" + case 0x22: + return "'\\\"'" + } + if r < 0x10000 { + return fmt.Sprintf("\\u%04x", r) + } + return fmt.Sprintf("\\U%08x", r) +} diff --git a/vendor/github.com/awalterschulze/gographviz/write.go b/vendor/github.com/awalterschulze/gographviz/write.go new file mode 100644 index 000000000..a8bbf1cee --- /dev/null +++ b/vendor/github.com/awalterschulze/gographviz/write.go @@ -0,0 +1,137 @@ +//Copyright 2013 GoGraphviz Authors +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +package gographviz + +import ( + "fmt" + + "github.com/awalterschulze/gographviz/ast" +) + +type writer struct { + *Graph + writtenLocations map[string]bool +} + +func newWriter(g *Graph) *writer { + return &writer{g, make(map[string]bool)} +} + +func appendAttrs(list ast.StmtList, attrs Attrs) ast.StmtList { + for _, name := range attrs.SortedNames() { + stmt := &ast.Attr{ + Field: ast.Id(name), + Value: ast.Id(attrs[name]), + } + list = append(list, stmt) + } + return list +} + +func (this *writer) newSubGraph(name string) *ast.SubGraph { + sub := this.SubGraphs.SubGraphs[name] + this.writtenLocations[sub.Name] = true + s := &ast.SubGraph{} + s.Id = ast.Id(sub.Name) + s.StmtList = appendAttrs(s.StmtList, sub.Attrs) + children := this.Relations.SortedChildren(name) + for _, child := range children { + s.StmtList = append(s.StmtList, this.newNodeStmt(child)) + } + return s +} + +func (this *writer) newNodeId(name string, port string) *ast.NodeId { + node := this.Nodes.Lookup[name] + return ast.MakeNodeId(node.Name, port) +} + +func (this *writer) newNodeStmt(name string) *ast.NodeStmt { + node := this.Nodes.Lookup[name] + id := ast.MakeNodeId(node.Name, "") + this.writtenLocations[node.Name] = true + return &ast.NodeStmt{ + id, + ast.PutMap(node.Attrs), + } +} + +func (this *writer) newLocation(name string, port string) ast.Location { + if this.IsNode(name) { + return this.newNodeId(name, port) + } else if this.IsSubGraph(name) { + if len(port) != 0 { + panic(fmt.Sprintf("subgraph cannot have a port: %v", port)) + } + return this.newSubGraph(name) + } + panic(fmt.Sprintf("%v is not a node or a subgraph", name)) +} + +func (this *writer) newEdgeStmt(edge *Edge) *ast.EdgeStmt { + src := this.newLocation(edge.Src, edge.SrcPort) + dst := this.newLocation(edge.Dst, edge.DstPort) + stmt := &ast.EdgeStmt{ + Source: src, + EdgeRHS: ast.EdgeRHS{ + &ast.EdgeRH{ + ast.EdgeOp(edge.Dir), + dst, + }, + }, + Attrs: ast.PutMap(edge.Attrs), + } + return stmt +} + +func (this *writer) Write() *ast.Graph { + t := &ast.Graph{} + t.Strict = this.Strict + t.Type = ast.GraphType(this.Directed) + t.Id = ast.Id(this.Name) + + t.StmtList = appendAttrs(t.StmtList, this.Attrs) + + for _, edge := range this.Edges.Edges { + t.StmtList = append(t.StmtList, this.newEdgeStmt(edge)) + } + + subGraphs := this.SubGraphs.Sorted() + for _, s := range subGraphs { + if _, ok := this.writtenLocations[s.Name]; !ok { + t.StmtList = append(t.StmtList, this.newSubGraph(s.Name)) + } + } + + nodes := this.Nodes.Sorted() + for _, n := range nodes { + if _, ok := this.writtenLocations[n.Name]; !ok { + t.StmtList = append(t.StmtList, this.newNodeStmt(n.Name)) + } + } + + return t +} + +//Creates an Abstract Syntrax Tree from the Graph. +func (g *Graph) WriteAst() *ast.Graph { + w := newWriter(g) + return w.Write() +} + +//Returns a DOT string representing the Graph. +func (g *Graph) String() string { + return g.WriteAst().String() +} diff --git a/vendor/github.com/docker/docker/CHANGELOG.md b/vendor/github.com/docker/docker/CHANGELOG.md index 5ab423725..fb4213012 100644 --- a/vendor/github.com/docker/docker/CHANGELOG.md +++ b/vendor/github.com/docker/docker/CHANGELOG.md @@ -102,7 +102,7 @@ To manually remove all plugins and resolve this problem, take the following step * Remove `--name` from `docker volume create` [#23830](https://github.com/docker/docker/pull/23830) + Add `docker stack ls` [#23886](https://github.com/docker/docker/pull/23886) + Add a new `is-task` ps filter [#24411](https://github.com/docker/docker/pull/24411) -+ Add `--env-file` flag to `docker create service` [#24844](https://github.com/docker/docker/pull/24844) ++ Add `--env-file` flag to `docker service create` [#24844](https://github.com/docker/docker/pull/24844) + Add `--format` on `docker stats` [#24987](https://github.com/docker/docker/pull/24987) + Make `docker node ps` default to `self` in swarm node [#25214](https://github.com/docker/docker/pull/25214) + Add `--group` in `docker service create` [#25317](https://github.com/docker/docker/pull/25317) diff --git a/vendor/github.com/docker/docker/Dockerfile b/vendor/github.com/docker/docker/Dockerfile index 01ab89e33..44d16c783 100644 --- a/vendor/github.com/docker/docker/Dockerfile +++ b/vendor/github.com/docker/docker/Dockerfile @@ -30,8 +30,8 @@ ARG APT_MIRROR=deb.debian.org RUN sed -ri "s/(httpredir|deb).debian.org/$APT_MIRROR/g" /etc/apt/sources.list # Add zfs ppa -RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys E871F18B51E0147C77796AC81196BA81F6B0FC61 \ - || apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys E871F18B51E0147C77796AC81196BA81F6B0FC61 +COPY keys/launchpad-ppa-zfs.asc /go/src/github.com/docker/docker/keys/ +RUN apt-key add /go/src/github.com/docker/docker/keys/launchpad-ppa-zfs.asc RUN echo deb http://ppa.launchpad.net/zfs-native/stable/ubuntu trusty main > /etc/apt/sources.list.d/zfs.list # Packaged dependencies diff --git a/vendor/github.com/docker/docker/api/server/router/network/network_routes.go b/vendor/github.com/docker/docker/api/server/router/network/network_routes.go index 2390aac5d..3e45c146c 100644 --- a/vendor/github.com/docker/docker/api/server/router/network/network_routes.go +++ b/vendor/github.com/docker/docker/api/server/router/network/network_routes.go @@ -312,7 +312,12 @@ func (n *networkRouter) postNetworksPrune(ctx context.Context, w http.ResponseWr return err } - pruneReport, err := n.backend.NetworksPrune(filters.Args{}) + pruneFilters, err := filters.FromParam(r.Form.Get("filters")) + if err != nil { + return err + } + + pruneReport, err := n.backend.NetworksPrune(pruneFilters) if err != nil { return err } diff --git a/vendor/github.com/docker/docker/api/swagger.yaml b/vendor/github.com/docker/docker/api/swagger.yaml index fa188f9c6..b7500bbf8 100644 --- a/vendor/github.com/docker/docker/api/swagger.yaml +++ b/vendor/github.com/docker/docker/api/swagger.yaml @@ -1444,13 +1444,13 @@ definitions: Linux: type: "object" x-nullable: false - required: [Capabilities, DeviceCreation, Devices] + required: [Capabilities, AllowAllDevices, Devices] properties: Capabilities: type: "array" items: type: "string" - DeviceCreation: + AllowAllDevices: type: "boolean" x-nullable: false Devices: @@ -1498,74 +1498,39 @@ definitions: type: "string" example: Id: "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078" - Name: "tiborvass/no-remove" + Name: "tiborvass/sample-volume-plugin" Tag: "latest" Active: true - Config: - Mounts: - - Name: "" - Description: "" - Settable: null - Source: "/data" - Destination: "/data" - Type: "bind" - Options: - - "shared" - - "rbind" - - Name: "" - Description: "" - Settable: null - Source: null - Destination: "/foobar" - Type: "tmpfs" - Options: null + Settings: Env: - - "DEBUG=1" + - "DEBUG=0" Args: null Devices: null - Manifest: - ManifestVersion: "v0" - Description: "A test plugin for Docker" + Config: + Description: "A sample volume plugin for Docker" Documentation: "https://docs.docker.com/engine/extend/plugins/" Interface: Types: - "docker.volumedriver/1.0" Socket: "plugins.sock" Entrypoint: - - "plugin-no-remove" + - "/usr/bin/sample-volume-plugin" - "/data" WorkDir: "" User: {} Network: - Type: "host" - Capabilities: null - Mounts: - - Name: "" - Description: "" - Settable: null - Source: "/data" - Destination: "/data" - Type: "bind" - Options: - - "shared" - - "rbind" - - Name: "" - Description: "" - Settable: null - Source: null - Destination: "/foobar" - Type: "tmpfs" - Options: null - Devices: - - Name: "device" - Description: "a host device to mount" - Settable: null - Path: "/dev/cpu_dma_latency" + Type: "" + Linux: + Capabilities: null + AllowAllDevices: false + Devices: null + Mounts: null + PropagatedMount: "/data" Env: - Name: "DEBUG" Description: "If set, prints debug messages" Settable: null - Value: "1" + Value: "0" Args: Name: "args" Description: "command line arguments" @@ -4045,6 +4010,13 @@ paths: examples: application/json: message: "No such container: c2ada9df5af8" + 409: + description: "conflict" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "You cannot remove a running container: c2ada9df5af8. Stop the container before attempting removal or use -f" 500: description: "server error" schema: @@ -4219,6 +4191,7 @@ paths: Filters to process on the prune list, encoded as JSON (a `map[string][]string`). Available filters: + - `until=` Prune containers created before this timestamp. The `` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time. type: "string" responses: 200: @@ -4426,8 +4399,8 @@ paths: in: "header" type: "string" enum: - - "application/tar" - default: "application/tar" + - "application/x-tar" + default: "application/x-tar" - name: "X-Registry-Config" in: "header" description: | @@ -4894,6 +4867,7 @@ paths: - `dangling=` When set to `true` (or `1`), prune only unused *and* untagged images. When set to `false` (or `0`), all unused images are pruned. + - `until=` Prune images created before this timestamp. The `` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time. type: "string" responses: 200: @@ -6323,8 +6297,6 @@ paths: /networks/prune: post: summary: "Delete unused networks" - consumes: - - "application/json" produces: - "application/json" operationId: "NetworkPrune" @@ -6335,6 +6307,7 @@ paths: Filters to process on the prune list, encoded as JSON (a `map[string][]string`). Available filters: + - `until=` Prune networks created before this timestamp. The `` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time. type: "string" responses: 200: @@ -6367,74 +6340,39 @@ paths: $ref: "#/definitions/Plugin" example: - Id: "5724e2c8652da337ab2eedd19fc6fc0ec908e4bd907c7421bf6a8dfc70c4c078" - Name: "tiborvass/no-remove" + Name: "tiborvass/sample-volume-plugin" Tag: "latest" Active: true - Config: - Mounts: - - Name: "" - Description: "" - Settable: null - Source: "/data" - Destination: "/data" - Type: "bind" - Options: - - "shared" - - "rbind" - - Name: "" - Description: "" - Settable: null - Source: null - Destination: "/foobar" - Type: "tmpfs" - Options: null + Settings: Env: - - "DEBUG=1" + - "DEBUG=0" Args: null Devices: null - Manifest: - ManifestVersion: "v0" - Description: "A test plugin for Docker" + Config: + Description: "A sample volume plugin for Docker" Documentation: "https://docs.docker.com/engine/extend/plugins/" Interface: Types: - "docker.volumedriver/1.0" Socket: "plugins.sock" Entrypoint: - - "plugin-no-remove" + - "/usr/bin/sample-volume-plugin" - "/data" WorkDir: "" User: {} Network: - Type: "host" - Capabilities: null - Mounts: - - Name: "" - Description: "" - Settable: null - Source: "/data" - Destination: "/data" - Type: "bind" - Options: - - "shared" - - "rbind" - - Name: "" - Description: "" - Settable: null - Source: null - Destination: "/foobar" - Type: "tmpfs" - Options: null - Devices: - - Name: "device" - Description: "a host device to mount" - Settable: null - Path: "/dev/cpu_dma_latency" + Type: "" + Linux: + Capabilities: null + AllowAllDevices: false + Devices: null + Mounts: null + PropagatedMount: "/data" Env: - Name: "DEBUG" Description: "If set, prints debug messages" Settable: null - Value: "1" + Value: "0" Args: Name: "args" Description: "command line arguments" diff --git a/vendor/github.com/docker/docker/api/types/plugin.go b/vendor/github.com/docker/docker/api/types/plugin.go index 44c7f5272..46f47be26 100644 --- a/vendor/github.com/docker/docker/api/types/plugin.go +++ b/vendor/github.com/docker/docker/api/types/plugin.go @@ -120,13 +120,13 @@ type PluginConfigInterface struct { // swagger:model PluginConfigLinux type PluginConfigLinux struct { - // capabilities + // allow all devices // Required: true - Capabilities []string `json:"Capabilities"` + AllowAllDevices bool `json:"AllowAllDevices"` - // device creation + // capabilities // Required: true - DeviceCreation bool `json:"DeviceCreation"` + Capabilities []string `json:"Capabilities"` // devices // Required: true diff --git a/vendor/github.com/docker/docker/api/types/reference/image_reference_test.go b/vendor/github.com/docker/docker/api/types/reference/image_reference_test.go index 61fb676b6..2f6268f5b 100644 --- a/vendor/github.com/docker/docker/api/types/reference/image_reference_test.go +++ b/vendor/github.com/docker/docker/api/types/reference/image_reference_test.go @@ -1,6 +1,7 @@ package reference import ( + _ "crypto/sha256" "testing" ) diff --git a/vendor/github.com/docker/docker/api/types/swarm/swarm.go b/vendor/github.com/docker/docker/api/types/swarm/swarm.go index 0b4221969..549671ea4 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/swarm.go +++ b/vendor/github.com/docker/docker/api/types/swarm/swarm.go @@ -135,6 +135,7 @@ type InitRequest struct { ForceNewCluster bool Spec Spec AutoLockManagers bool + Availability NodeAvailability } // JoinRequest is the request used to join a swarm. @@ -143,6 +144,7 @@ type JoinRequest struct { AdvertiseAddr string RemoteAddrs []string JoinToken string // accept by secret + Availability NodeAvailability } // UnlockRequest is the request used to unlock a swarm. diff --git a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers.go b/vendor/github.com/docker/docker/builder/dockerfile/dispatchers.go index 81d6d04c2..a6ee9165e 100644 --- a/vendor/github.com/docker/docker/builder/dockerfile/dispatchers.go +++ b/vendor/github.com/docker/docker/builder/dockerfile/dispatchers.go @@ -298,17 +298,19 @@ func workdir(b *Builder, args []string, attributes map[string]bool, original str } b.runConfig.Image = b.image + cmd := b.runConfig.Cmd + comment := "WORKDIR " + b.runConfig.WorkingDir + // reset the command for cache detection + b.runConfig.Cmd = strslice.StrSlice(append(getShell(b.runConfig), "#(nop) "+comment)) + defer func(cmd strslice.StrSlice) { b.runConfig.Cmd = cmd }(cmd) + if hit, err := b.probeCache(); err != nil { return err } else if hit { return nil } - // Actually copy the struct - workdirConfig := *b.runConfig - workdirConfig.Cmd = strslice.StrSlice(append(getShell(b.runConfig), fmt.Sprintf("#(nop) WORKDIR %s", b.runConfig.WorkingDir))) - - container, err := b.docker.ContainerCreate(types.ContainerCreateConfig{Config: &workdirConfig}) + container, err := b.docker.ContainerCreate(types.ContainerCreateConfig{Config: b.runConfig}) if err != nil { return err } @@ -317,7 +319,7 @@ func workdir(b *Builder, args []string, attributes map[string]bool, original str return err } - return b.commit(container.ID, b.runConfig.Cmd, "WORKDIR "+b.runConfig.WorkingDir) + return b.commit(container.ID, cmd, comment) } // RUN some command yo diff --git a/vendor/github.com/docker/docker/cli/command/cli.go b/vendor/github.com/docker/docker/cli/command/cli.go index c287ebcf7..bf9d55460 100644 --- a/vendor/github.com/docker/docker/cli/command/cli.go +++ b/vendor/github.com/docker/docker/cli/command/cli.go @@ -32,7 +32,15 @@ type Streams interface { Err() io.Writer } -// DockerCli represents the docker command line client. +// Cli represents the docker command line client. +type Cli interface { + Client() client.APIClient + Out() *OutStream + Err() io.Writer + In() *InStream +} + +// DockerCli is an instance the docker command line client. // Instances of the client can be returned from NewDockerCli. type DockerCli struct { configFile *configfile.ConfigFile diff --git a/vendor/github.com/docker/docker/cli/command/container/logs.go b/vendor/github.com/docker/docker/cli/command/container/logs.go index 2e1ce5205..d8cafaf74 100644 --- a/vendor/github.com/docker/docker/cli/command/container/logs.go +++ b/vendor/github.com/docker/docker/cli/command/container/logs.go @@ -37,7 +37,7 @@ func NewLogsCommand(dockerCli *command.DockerCli) *cobra.Command { flags := cmd.Flags() flags.BoolVarP(&opts.follow, "follow", "f", false, "Follow log output") - flags.StringVar(&opts.since, "since", "", "Show logs since timestamp") + flags.StringVar(&opts.since, "since", "", "Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)") flags.BoolVarP(&opts.timestamps, "timestamps", "t", false, "Show timestamps") flags.BoolVar(&opts.details, "details", false, "Show extra details provided to logs") flags.StringVar(&opts.tail, "tail", "all", "Number of lines to show from the end of the logs") diff --git a/vendor/github.com/docker/docker/cli/command/container/opts.go b/vendor/github.com/docker/docker/cli/command/container/opts.go index 0f41dd507..c5fc15216 100644 --- a/vendor/github.com/docker/docker/cli/command/container/opts.go +++ b/vendor/github.com/docker/docker/cli/command/container/opts.go @@ -193,11 +193,11 @@ func addFlags(flags *pflag.FlagSet) *containerOptions { flags.MarkHidden("dns-opt") flags.Var(&copts.dnsSearch, "dns-search", "Set custom DNS search domains") flags.Var(&copts.expose, "expose", "Expose a port or a range of ports") - flags.StringVar(&copts.ipv4Address, "ip", "", "Container IPv4 address (e.g. 172.30.100.104)") - flags.StringVar(&copts.ipv6Address, "ip6", "", "Container IPv6 address (e.g. 2001:db8::33)") + flags.StringVar(&copts.ipv4Address, "ip", "", "IPv4 address (e.g., 172.30.100.104)") + flags.StringVar(&copts.ipv6Address, "ip6", "", "IPv6 address (e.g., 2001:db8::33)") flags.Var(&copts.links, "link", "Add link to another container") flags.Var(&copts.linkLocalIPs, "link-local-ip", "Container IPv4/IPv6 link-local addresses") - flags.StringVar(&copts.macAddress, "mac-address", "", "Container MAC address (e.g. 92:d0:c6:0a:29:33)") + flags.StringVar(&copts.macAddress, "mac-address", "", "Container MAC address (e.g., 92:d0:c6:0a:29:33)") flags.VarP(&copts.publish, "publish", "p", "Publish a container's port(s) to the host") flags.BoolVarP(&copts.publishAll, "publish-all", "P", false, "Publish all exposed ports to random ports") // We allow for both "--net" and "--network", although the latter is the recommended way. diff --git a/vendor/github.com/docker/docker/cli/command/container/prune.go b/vendor/github.com/docker/docker/cli/command/container/prune.go index 0aad66e6e..ca50e2e15 100644 --- a/vendor/github.com/docker/docker/cli/command/container/prune.go +++ b/vendor/github.com/docker/docker/cli/command/container/prune.go @@ -3,21 +3,22 @@ package container import ( "fmt" - "github.com/docker/docker/api/types/filters" "github.com/docker/docker/cli" "github.com/docker/docker/cli/command" + "github.com/docker/docker/opts" units "github.com/docker/go-units" "github.com/spf13/cobra" "golang.org/x/net/context" ) type pruneOptions struct { - force bool + force bool + filter opts.FilterOpt } // NewPruneCommand returns a new cobra prune command for containers func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pruneOptions + opts := pruneOptions{filter: opts.NewFilterOpt()} cmd := &cobra.Command{ Use: "prune [OPTIONS]", @@ -39,6 +40,7 @@ func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { flags := cmd.Flags() flags.BoolVarP(&opts.force, "force", "f", false, "Do not prompt for confirmation") + flags.Var(&opts.filter, "filter", "Provide filter values (e.g. 'until=')") return cmd } @@ -47,11 +49,13 @@ const warning = `WARNING! This will remove all stopped containers. Are you sure you want to continue?` func runPrune(dockerCli *command.DockerCli, opts pruneOptions) (spaceReclaimed uint64, output string, err error) { + pruneFilters := opts.filter.Value() + if !opts.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), warning) { return } - report, err := dockerCli.Client().ContainersPrune(context.Background(), filters.Args{}) + report, err := dockerCli.Client().ContainersPrune(context.Background(), pruneFilters) if err != nil { return } @@ -69,6 +73,6 @@ func runPrune(dockerCli *command.DockerCli, opts pruneOptions) (spaceReclaimed u // RunPrune calls the Container Prune API // This returns the amount of space reclaimed and a detailed output string -func RunPrune(dockerCli *command.DockerCli) (uint64, string, error) { - return runPrune(dockerCli, pruneOptions{force: true}) +func RunPrune(dockerCli *command.DockerCli, filter opts.FilterOpt) (uint64, string, error) { + return runPrune(dockerCli, pruneOptions{force: true, filter: filter}) } diff --git a/vendor/github.com/docker/docker/cli/command/formatter/service.go b/vendor/github.com/docker/docker/cli/command/formatter/service.go index 2690029ce..8242e1cb9 100644 --- a/vendor/github.com/docker/docker/cli/command/formatter/service.go +++ b/vendor/github.com/docker/docker/cli/command/formatter/service.go @@ -103,6 +103,7 @@ Ports: PublishedPort {{ $port.PublishedPort }} Protocol = {{ $port.Protocol }} TargetPort = {{ $port.TargetPort }} + PublishMode = {{ $port.PublishMode }} {{- end }} {{ end -}} ` diff --git a/vendor/github.com/docker/docker/cli/command/image/prune.go b/vendor/github.com/docker/docker/cli/command/image/prune.go index 82c28fcf4..f17aed741 100644 --- a/vendor/github.com/docker/docker/cli/command/image/prune.go +++ b/vendor/github.com/docker/docker/cli/command/image/prune.go @@ -5,21 +5,22 @@ import ( "golang.org/x/net/context" - "github.com/docker/docker/api/types/filters" "github.com/docker/docker/cli" "github.com/docker/docker/cli/command" + "github.com/docker/docker/opts" units "github.com/docker/go-units" "github.com/spf13/cobra" ) type pruneOptions struct { - force bool - all bool + force bool + all bool + filter opts.FilterOpt } // NewPruneCommand returns a new cobra prune command for images func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pruneOptions + opts := pruneOptions{filter: opts.NewFilterOpt()} cmd := &cobra.Command{ Use: "prune [OPTIONS]", @@ -42,6 +43,7 @@ func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { flags := cmd.Flags() flags.BoolVarP(&opts.force, "force", "f", false, "Do not prompt for confirmation") flags.BoolVarP(&opts.all, "all", "a", false, "Remove all unused images, not just dangling ones") + flags.Var(&opts.filter, "filter", "Provide filter values (e.g. 'until=')") return cmd } @@ -54,7 +56,7 @@ Are you sure you want to continue?` ) func runPrune(dockerCli *command.DockerCli, opts pruneOptions) (spaceReclaimed uint64, output string, err error) { - pruneFilters := filters.NewArgs() + pruneFilters := opts.filter.Value() pruneFilters.Add("dangling", fmt.Sprintf("%v", !opts.all)) warning := danglingWarning @@ -87,6 +89,6 @@ func runPrune(dockerCli *command.DockerCli, opts pruneOptions) (spaceReclaimed u // RunPrune calls the Image Prune API // This returns the amount of space reclaimed and a detailed output string -func RunPrune(dockerCli *command.DockerCli, all bool) (uint64, string, error) { - return runPrune(dockerCli, pruneOptions{force: true, all: all}) +func RunPrune(dockerCli *command.DockerCli, all bool, filter opts.FilterOpt) (uint64, string, error) { + return runPrune(dockerCli, pruneOptions{force: true, all: all, filter: filter}) } diff --git a/vendor/github.com/docker/docker/cli/command/image/trust.go b/vendor/github.com/docker/docker/cli/command/image/trust.go index 948e002bf..58e057439 100644 --- a/vendor/github.com/docker/docker/cli/command/image/trust.go +++ b/vendor/github.com/docker/docker/cli/command/image/trust.go @@ -10,7 +10,6 @@ import ( "sort" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types" "github.com/docker/docker/cli/command" "github.com/docker/docker/cli/trust" @@ -19,6 +18,7 @@ import ( "github.com/docker/docker/registry" "github.com/docker/notary/client" "github.com/docker/notary/tuf/data" + "github.com/opencontainers/go-digest" "golang.org/x/net/context" ) @@ -58,7 +58,7 @@ func PushTrustedReference(cli *command.DockerCli, repoInfo *registry.RepositoryI var pushResult types.PushResult err := json.Unmarshal(*aux, &pushResult) if err == nil && pushResult.Tag != "" { - if dgst, err := digest.ParseDigest(pushResult.Digest); err == nil { + if dgst, err := digest.Parse(pushResult.Digest); err == nil { h, err := hex.DecodeString(dgst.Hex()) if err != nil { target = nil diff --git a/vendor/github.com/docker/docker/cli/command/network/connect.go b/vendor/github.com/docker/docker/cli/command/network/connect.go index 113c6c03f..bc90ddaba 100644 --- a/vendor/github.com/docker/docker/cli/command/network/connect.go +++ b/vendor/github.com/docker/docker/cli/command/network/connect.go @@ -37,8 +37,8 @@ func newConnectCommand(dockerCli *command.DockerCli) *cobra.Command { } flags := cmd.Flags() - flags.StringVar(&opts.ipaddress, "ip", "", "IP Address") - flags.StringVar(&opts.ipv6address, "ip6", "", "IPv6 Address") + flags.StringVar(&opts.ipaddress, "ip", "", "IPv4 address (e.g., 172.30.100.104)") + flags.StringVar(&opts.ipv6address, "ip6", "", "IPv6 address (e.g., 2001:db8::33)") flags.Var(&opts.links, "link", "Add link to another container") flags.StringSliceVar(&opts.aliases, "alias", []string{}, "Add network-scoped alias for the container") flags.StringSliceVar(&opts.linklocalips, "link-local-ip", []string{}, "Add a link-local address for the container") diff --git a/vendor/github.com/docker/docker/cli/command/network/prune.go b/vendor/github.com/docker/docker/cli/command/network/prune.go index 9f1979e6b..c5c535992 100644 --- a/vendor/github.com/docker/docker/cli/command/network/prune.go +++ b/vendor/github.com/docker/docker/cli/command/network/prune.go @@ -5,19 +5,20 @@ import ( "golang.org/x/net/context" - "github.com/docker/docker/api/types/filters" "github.com/docker/docker/cli" "github.com/docker/docker/cli/command" + "github.com/docker/docker/opts" "github.com/spf13/cobra" ) type pruneOptions struct { - force bool + force bool + filter opts.FilterOpt } // NewPruneCommand returns a new cobra prune command for networks func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pruneOptions + opts := pruneOptions{filter: opts.NewFilterOpt()} cmd := &cobra.Command{ Use: "prune [OPTIONS]", @@ -38,6 +39,7 @@ func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { flags := cmd.Flags() flags.BoolVarP(&opts.force, "force", "f", false, "Do not prompt for confirmation") + flags.Var(&opts.filter, "filter", "Provide filter values (e.g. 'until=')") return cmd } @@ -46,11 +48,13 @@ const warning = `WARNING! This will remove all networks not used by at least one Are you sure you want to continue?` func runPrune(dockerCli *command.DockerCli, opts pruneOptions) (output string, err error) { + pruneFilters := opts.filter.Value() + if !opts.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), warning) { return } - report, err := dockerCli.Client().NetworksPrune(context.Background(), filters.Args{}) + report, err := dockerCli.Client().NetworksPrune(context.Background(), pruneFilters) if err != nil { return } @@ -67,7 +71,7 @@ func runPrune(dockerCli *command.DockerCli, opts pruneOptions) (output string, e // RunPrune calls the Network Prune API // This returns the amount of space reclaimed and a detailed output string -func RunPrune(dockerCli *command.DockerCli) (uint64, string, error) { - output, err := runPrune(dockerCli, pruneOptions{force: true}) +func RunPrune(dockerCli *command.DockerCli, filter opts.FilterOpt) (uint64, string, error) { + output, err := runPrune(dockerCli, pruneOptions{force: true, filter: filter}) return 0, output, err } diff --git a/vendor/github.com/docker/docker/cli/command/node/client_test.go b/vendor/github.com/docker/docker/cli/command/node/client_test.go new file mode 100644 index 000000000..1f5cdc7ce --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/client_test.go @@ -0,0 +1,68 @@ +package node + +import ( + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/client" + "golang.org/x/net/context" +) + +type fakeClient struct { + client.Client + infoFunc func() (types.Info, error) + nodeInspectFunc func() (swarm.Node, []byte, error) + nodeListFunc func() ([]swarm.Node, error) + nodeRemoveFunc func() error + nodeUpdateFunc func(nodeID string, version swarm.Version, node swarm.NodeSpec) error + taskInspectFunc func(taskID string) (swarm.Task, []byte, error) + taskListFunc func(options types.TaskListOptions) ([]swarm.Task, error) +} + +func (cli *fakeClient) NodeInspectWithRaw(ctx context.Context, ref string) (swarm.Node, []byte, error) { + if cli.nodeInspectFunc != nil { + return cli.nodeInspectFunc() + } + return swarm.Node{}, []byte{}, nil +} + +func (cli *fakeClient) NodeList(ctx context.Context, options types.NodeListOptions) ([]swarm.Node, error) { + if cli.nodeListFunc != nil { + return cli.nodeListFunc() + } + return []swarm.Node{}, nil +} + +func (cli *fakeClient) NodeRemove(ctx context.Context, nodeID string, options types.NodeRemoveOptions) error { + if cli.nodeRemoveFunc != nil { + return cli.nodeRemoveFunc() + } + return nil +} + +func (cli *fakeClient) NodeUpdate(ctx context.Context, nodeID string, version swarm.Version, node swarm.NodeSpec) error { + if cli.nodeUpdateFunc != nil { + return cli.nodeUpdateFunc(nodeID, version, node) + } + return nil +} + +func (cli *fakeClient) Info(ctx context.Context) (types.Info, error) { + if cli.infoFunc != nil { + return cli.infoFunc() + } + return types.Info{}, nil +} + +func (cli *fakeClient) TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) { + if cli.taskInspectFunc != nil { + return cli.taskInspectFunc(taskID) + } + return swarm.Task{}, []byte{}, nil +} + +func (cli *fakeClient) TaskList(ctx context.Context, options types.TaskListOptions) ([]swarm.Task, error) { + if cli.taskListFunc != nil { + return cli.taskListFunc(options) + } + return []swarm.Task{}, nil +} diff --git a/vendor/github.com/docker/docker/cli/command/node/demote.go b/vendor/github.com/docker/docker/cli/command/node/demote.go index 33f86c649..72ed3ea63 100644 --- a/vendor/github.com/docker/docker/cli/command/node/demote.go +++ b/vendor/github.com/docker/docker/cli/command/node/demote.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" ) -func newDemoteCommand(dockerCli *command.DockerCli) *cobra.Command { +func newDemoteCommand(dockerCli command.Cli) *cobra.Command { return &cobra.Command{ Use: "demote NODE [NODE...]", Short: "Demote one or more nodes from manager in the swarm", @@ -20,7 +20,7 @@ func newDemoteCommand(dockerCli *command.DockerCli) *cobra.Command { } } -func runDemote(dockerCli *command.DockerCli, nodes []string) error { +func runDemote(dockerCli command.Cli, nodes []string) error { demote := func(node *swarm.Node) error { if node.Spec.Role == swarm.NodeRoleWorker { fmt.Fprintf(dockerCli.Out(), "Node %s is already a worker.\n", node.ID) diff --git a/vendor/github.com/docker/docker/cli/command/node/demote_test.go b/vendor/github.com/docker/docker/cli/command/node/demote_test.go new file mode 100644 index 000000000..3ba88f41c --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/demote_test.go @@ -0,0 +1,88 @@ +package node + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + // Import builders to get the builder function as package function + . "github.com/docker/docker/cli/internal/test/builders" + "github.com/docker/docker/pkg/testutil/assert" +) + +func TestNodeDemoteErrors(t *testing.T) { + testCases := []struct { + args []string + nodeInspectFunc func() (swarm.Node, []byte, error) + nodeUpdateFunc func(nodeID string, version swarm.Version, node swarm.NodeSpec) error + expectedError string + }{ + { + expectedError: "requires at least 1 argument", + }, + { + args: []string{"nodeID"}, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node") + }, + expectedError: "error inspecting the node", + }, + { + args: []string{"nodeID"}, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + return fmt.Errorf("error updating the node") + }, + expectedError: "error updating the node", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newDemoteCommand( + test.NewFakeCli(&fakeClient{ + nodeInspectFunc: tc.nodeInspectFunc, + nodeUpdateFunc: tc.nodeUpdateFunc, + }, buf)) + cmd.SetArgs(tc.args) + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestNodeDemoteNoChange(t *testing.T) { + buf := new(bytes.Buffer) + cmd := newDemoteCommand( + test.NewFakeCli(&fakeClient{ + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(), []byte{}, nil + }, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + if node.Role != swarm.NodeRoleWorker { + return fmt.Errorf("expected role worker, got %s", node.Role) + } + return nil + }, + }, buf)) + cmd.SetArgs([]string{"nodeID"}) + assert.NilError(t, cmd.Execute()) +} + +func TestNodeDemoteMultipleNode(t *testing.T) { + buf := new(bytes.Buffer) + cmd := newDemoteCommand( + test.NewFakeCli(&fakeClient{ + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(Manager()), []byte{}, nil + }, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + if node.Role != swarm.NodeRoleWorker { + return fmt.Errorf("expected role worker, got %s", node.Role) + } + return nil + }, + }, buf)) + cmd.SetArgs([]string{"nodeID1", "nodeID2"}) + assert.NilError(t, cmd.Execute()) +} diff --git a/vendor/github.com/docker/docker/cli/command/node/inspect.go b/vendor/github.com/docker/docker/cli/command/node/inspect.go index fde70185f..97a271778 100644 --- a/vendor/github.com/docker/docker/cli/command/node/inspect.go +++ b/vendor/github.com/docker/docker/cli/command/node/inspect.go @@ -22,7 +22,7 @@ type inspectOptions struct { pretty bool } -func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { +func newInspectCommand(dockerCli command.Cli) *cobra.Command { var opts inspectOptions cmd := &cobra.Command{ @@ -41,7 +41,7 @@ func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } -func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error { +func runInspect(dockerCli command.Cli, opts inspectOptions) error { client := dockerCli.Client() ctx := context.Background() getRef := func(ref string) (interface{}, []byte, error) { diff --git a/vendor/github.com/docker/docker/cli/command/node/inspect_test.go b/vendor/github.com/docker/docker/cli/command/node/inspect_test.go new file mode 100644 index 000000000..91bd41e16 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/inspect_test.go @@ -0,0 +1,122 @@ +package node + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + // Import builders to get the builder function as package function + . "github.com/docker/docker/cli/internal/test/builders" + "github.com/docker/docker/pkg/testutil/assert" + "github.com/docker/docker/pkg/testutil/golden" +) + +func TestNodeInspectErrors(t *testing.T) { + testCases := []struct { + args []string + flags map[string]string + nodeInspectFunc func() (swarm.Node, []byte, error) + infoFunc func() (types.Info, error) + expectedError string + }{ + { + expectedError: "requires at least 1 argument", + }, + { + args: []string{"self"}, + infoFunc: func() (types.Info, error) { + return types.Info{}, fmt.Errorf("error asking for node info") + }, + expectedError: "error asking for node info", + }, + { + args: []string{"nodeID"}, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node") + }, + infoFunc: func() (types.Info, error) { + return types.Info{}, fmt.Errorf("error asking for node info") + }, + expectedError: "error inspecting the node", + }, + { + args: []string{"self"}, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node") + }, + infoFunc: func() (types.Info, error) { + return types.Info{}, nil + }, + expectedError: "error inspecting the node", + }, + { + args: []string{"self"}, + flags: map[string]string{ + "pretty": "true", + }, + infoFunc: func() (types.Info, error) { + return types.Info{}, fmt.Errorf("error asking for node info") + }, + expectedError: "error asking for node info", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newInspectCommand( + test.NewFakeCli(&fakeClient{ + nodeInspectFunc: tc.nodeInspectFunc, + infoFunc: tc.infoFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestNodeInspectPretty(t *testing.T) { + testCases := []struct { + name string + nodeInspectFunc func() (swarm.Node, []byte, error) + }{ + { + name: "simple", + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(NodeLabels(map[string]string{ + "lbl1": "value1", + })), []byte{}, nil + }, + }, + { + name: "manager", + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(Manager()), []byte{}, nil + }, + }, + { + name: "manager-leader", + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(Manager(Leader())), []byte{}, nil + }, + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newInspectCommand( + test.NewFakeCli(&fakeClient{ + nodeInspectFunc: tc.nodeInspectFunc, + }, buf)) + cmd.SetArgs([]string{"nodeID"}) + cmd.Flags().Set("pretty", "true") + assert.NilError(t, cmd.Execute()) + actual := buf.String() + expected := golden.Get(t, []byte(actual), fmt.Sprintf("node-inspect-pretty.%s.golden", tc.name)) + assert.EqualNormalizedString(t, assert.RemoveSpace, actual, string(expected)) + } +} diff --git a/vendor/github.com/docker/docker/cli/command/node/list.go b/vendor/github.com/docker/docker/cli/command/node/list.go index 9cacdcf44..d166401ab 100644 --- a/vendor/github.com/docker/docker/cli/command/node/list.go +++ b/vendor/github.com/docker/docker/cli/command/node/list.go @@ -24,7 +24,7 @@ type listOptions struct { filter opts.FilterOpt } -func newListCommand(dockerCli *command.DockerCli) *cobra.Command { +func newListCommand(dockerCli command.Cli) *cobra.Command { opts := listOptions{filter: opts.NewFilterOpt()} cmd := &cobra.Command{ @@ -43,7 +43,7 @@ func newListCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } -func runList(dockerCli *command.DockerCli, opts listOptions) error { +func runList(dockerCli command.Cli, opts listOptions) error { client := dockerCli.Client() out := dockerCli.Out() ctx := context.Background() diff --git a/vendor/github.com/docker/docker/cli/command/node/list_test.go b/vendor/github.com/docker/docker/cli/command/node/list_test.go new file mode 100644 index 000000000..237c4be9c --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/list_test.go @@ -0,0 +1,101 @@ +package node + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + // Import builders to get the builder function as package function + . "github.com/docker/docker/cli/internal/test/builders" + "github.com/docker/docker/pkg/testutil/assert" +) + +func TestNodeListErrorOnAPIFailure(t *testing.T) { + testCases := []struct { + nodeListFunc func() ([]swarm.Node, error) + infoFunc func() (types.Info, error) + expectedError string + }{ + { + nodeListFunc: func() ([]swarm.Node, error) { + return []swarm.Node{}, fmt.Errorf("error listing nodes") + }, + expectedError: "error listing nodes", + }, + { + nodeListFunc: func() ([]swarm.Node, error) { + return []swarm.Node{ + { + ID: "nodeID", + }, + }, nil + }, + infoFunc: func() (types.Info, error) { + return types.Info{}, fmt.Errorf("error asking for node info") + }, + expectedError: "error asking for node info", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newListCommand( + test.NewFakeCli(&fakeClient{ + nodeListFunc: tc.nodeListFunc, + infoFunc: tc.infoFunc, + }, buf)) + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestNodeList(t *testing.T) { + buf := new(bytes.Buffer) + cmd := newListCommand( + test.NewFakeCli(&fakeClient{ + nodeListFunc: func() ([]swarm.Node, error) { + return []swarm.Node{ + *Node(NodeID("nodeID1"), Hostname("nodeHostname1"), Manager(Leader())), + *Node(NodeID("nodeID2"), Hostname("nodeHostname2"), Manager()), + *Node(NodeID("nodeID3"), Hostname("nodeHostname3")), + }, nil + }, + infoFunc: func() (types.Info, error) { + return types.Info{ + Swarm: swarm.Info{ + NodeID: "nodeID1", + }, + }, nil + }, + }, buf)) + assert.NilError(t, cmd.Execute()) + assert.Contains(t, buf.String(), `nodeID1 * nodeHostname1 Ready Active Leader`) + assert.Contains(t, buf.String(), `nodeID2 nodeHostname2 Ready Active Reachable`) + assert.Contains(t, buf.String(), `nodeID3 nodeHostname3 Ready Active`) +} + +func TestNodeListQuietShouldOnlyPrintIDs(t *testing.T) { + buf := new(bytes.Buffer) + cmd := newListCommand( + test.NewFakeCli(&fakeClient{ + nodeListFunc: func() ([]swarm.Node, error) { + return []swarm.Node{ + *Node(), + }, nil + }, + }, buf)) + cmd.Flags().Set("quiet", "true") + assert.NilError(t, cmd.Execute()) + assert.Contains(t, buf.String(), "nodeID") +} + +// Test case for #24090 +func TestNodeListContainsHostname(t *testing.T) { + buf := new(bytes.Buffer) + cmd := newListCommand(test.NewFakeCli(&fakeClient{}, buf)) + assert.NilError(t, cmd.Execute()) + assert.Contains(t, buf.String(), "HOSTNAME") +} diff --git a/vendor/github.com/docker/docker/cli/command/node/opts.go b/vendor/github.com/docker/docker/cli/command/node/opts.go index 7e6c55d48..0ad365f0c 100644 --- a/vendor/github.com/docker/docker/cli/command/node/opts.go +++ b/vendor/github.com/docker/docker/cli/command/node/opts.go @@ -1,12 +1,7 @@ package node import ( - "fmt" - "strings" - - "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/opts" - runconfigopts "github.com/docker/docker/runconfig/opts" ) type nodeOptions struct { @@ -27,34 +22,3 @@ func newNodeOptions() *nodeOptions { }, } } - -func (opts *nodeOptions) ToNodeSpec() (swarm.NodeSpec, error) { - var spec swarm.NodeSpec - - spec.Annotations.Name = opts.annotations.name - spec.Annotations.Labels = runconfigopts.ConvertKVStringsToMap(opts.annotations.labels.GetAll()) - - switch swarm.NodeRole(strings.ToLower(opts.role)) { - case swarm.NodeRoleWorker: - spec.Role = swarm.NodeRoleWorker - case swarm.NodeRoleManager: - spec.Role = swarm.NodeRoleManager - case "": - default: - return swarm.NodeSpec{}, fmt.Errorf("invalid role %q, only worker and manager are supported", opts.role) - } - - switch swarm.NodeAvailability(strings.ToLower(opts.availability)) { - case swarm.NodeAvailabilityActive: - spec.Availability = swarm.NodeAvailabilityActive - case swarm.NodeAvailabilityPause: - spec.Availability = swarm.NodeAvailabilityPause - case swarm.NodeAvailabilityDrain: - spec.Availability = swarm.NodeAvailabilityDrain - case "": - default: - return swarm.NodeSpec{}, fmt.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability) - } - - return spec, nil -} diff --git a/vendor/github.com/docker/docker/cli/command/node/promote.go b/vendor/github.com/docker/docker/cli/command/node/promote.go index f47d783f4..94fff6400 100644 --- a/vendor/github.com/docker/docker/cli/command/node/promote.go +++ b/vendor/github.com/docker/docker/cli/command/node/promote.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" ) -func newPromoteCommand(dockerCli *command.DockerCli) *cobra.Command { +func newPromoteCommand(dockerCli command.Cli) *cobra.Command { return &cobra.Command{ Use: "promote NODE [NODE...]", Short: "Promote one or more nodes to manager in the swarm", @@ -20,7 +20,7 @@ func newPromoteCommand(dockerCli *command.DockerCli) *cobra.Command { } } -func runPromote(dockerCli *command.DockerCli, nodes []string) error { +func runPromote(dockerCli command.Cli, nodes []string) error { promote := func(node *swarm.Node) error { if node.Spec.Role == swarm.NodeRoleManager { fmt.Fprintf(dockerCli.Out(), "Node %s is already a manager.\n", node.ID) diff --git a/vendor/github.com/docker/docker/cli/command/node/promote_test.go b/vendor/github.com/docker/docker/cli/command/node/promote_test.go new file mode 100644 index 000000000..ef4666321 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/promote_test.go @@ -0,0 +1,88 @@ +package node + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + // Import builders to get the builder function as package function + . "github.com/docker/docker/cli/internal/test/builders" + "github.com/docker/docker/pkg/testutil/assert" +) + +func TestNodePromoteErrors(t *testing.T) { + testCases := []struct { + args []string + nodeInspectFunc func() (swarm.Node, []byte, error) + nodeUpdateFunc func(nodeID string, version swarm.Version, node swarm.NodeSpec) error + expectedError string + }{ + { + expectedError: "requires at least 1 argument", + }, + { + args: []string{"nodeID"}, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node") + }, + expectedError: "error inspecting the node", + }, + { + args: []string{"nodeID"}, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + return fmt.Errorf("error updating the node") + }, + expectedError: "error updating the node", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newPromoteCommand( + test.NewFakeCli(&fakeClient{ + nodeInspectFunc: tc.nodeInspectFunc, + nodeUpdateFunc: tc.nodeUpdateFunc, + }, buf)) + cmd.SetArgs(tc.args) + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestNodePromoteNoChange(t *testing.T) { + buf := new(bytes.Buffer) + cmd := newPromoteCommand( + test.NewFakeCli(&fakeClient{ + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(Manager()), []byte{}, nil + }, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + if node.Role != swarm.NodeRoleManager { + return fmt.Errorf("expected role manager, got %s", node.Role) + } + return nil + }, + }, buf)) + cmd.SetArgs([]string{"nodeID"}) + assert.NilError(t, cmd.Execute()) +} + +func TestNodePromoteMultipleNode(t *testing.T) { + buf := new(bytes.Buffer) + cmd := newPromoteCommand( + test.NewFakeCli(&fakeClient{ + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(), []byte{}, nil + }, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + if node.Role != swarm.NodeRoleManager { + return fmt.Errorf("expected role manager, got %s", node.Role) + } + return nil + }, + }, buf)) + cmd.SetArgs([]string{"nodeID1", "nodeID2"}) + assert.NilError(t, cmd.Execute()) +} diff --git a/vendor/github.com/docker/docker/cli/command/node/ps.go b/vendor/github.com/docker/docker/cli/command/node/ps.go index a034721d2..52ac36646 100644 --- a/vendor/github.com/docker/docker/cli/command/node/ps.go +++ b/vendor/github.com/docker/docker/cli/command/node/ps.go @@ -22,7 +22,7 @@ type psOptions struct { filter opts.FilterOpt } -func newPsCommand(dockerCli *command.DockerCli) *cobra.Command { +func newPsCommand(dockerCli command.Cli) *cobra.Command { opts := psOptions{filter: opts.NewFilterOpt()} cmd := &cobra.Command{ @@ -47,7 +47,7 @@ func newPsCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } -func runPs(dockerCli *command.DockerCli, opts psOptions) error { +func runPs(dockerCli command.Cli, opts psOptions) error { client := dockerCli.Client() ctx := context.Background() diff --git a/vendor/github.com/docker/docker/cli/command/node/ps_test.go b/vendor/github.com/docker/docker/cli/command/node/ps_test.go new file mode 100644 index 000000000..1a1022d21 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/ps_test.go @@ -0,0 +1,132 @@ +package node + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + "time" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + // Import builders to get the builder function as package function + . "github.com/docker/docker/cli/internal/test/builders" + "github.com/docker/docker/pkg/testutil/assert" + "github.com/docker/docker/pkg/testutil/golden" +) + +func TestNodePsErrors(t *testing.T) { + testCases := []struct { + args []string + flags map[string]string + infoFunc func() (types.Info, error) + nodeInspectFunc func() (swarm.Node, []byte, error) + taskListFunc func(options types.TaskListOptions) ([]swarm.Task, error) + taskInspectFunc func(taskID string) (swarm.Task, []byte, error) + expectedError string + }{ + { + infoFunc: func() (types.Info, error) { + return types.Info{}, fmt.Errorf("error asking for node info") + }, + expectedError: "error asking for node info", + }, + { + args: []string{"nodeID"}, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node") + }, + expectedError: "error inspecting the node", + }, + { + args: []string{"nodeID"}, + taskListFunc: func(options types.TaskListOptions) ([]swarm.Task, error) { + return []swarm.Task{}, fmt.Errorf("error returning the task list") + }, + expectedError: "error returning the task list", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newPsCommand( + test.NewFakeCli(&fakeClient{ + infoFunc: tc.infoFunc, + nodeInspectFunc: tc.nodeInspectFunc, + taskInspectFunc: tc.taskInspectFunc, + taskListFunc: tc.taskListFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestNodePs(t *testing.T) { + testCases := []struct { + name string + args []string + flags map[string]string + infoFunc func() (types.Info, error) + nodeInspectFunc func() (swarm.Node, []byte, error) + taskListFunc func(options types.TaskListOptions) ([]swarm.Task, error) + taskInspectFunc func(taskID string) (swarm.Task, []byte, error) + }{ + { + name: "simple", + args: []string{"nodeID"}, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(), []byte{}, nil + }, + taskListFunc: func(options types.TaskListOptions) ([]swarm.Task, error) { + return []swarm.Task{ + *Task(WithStatus(Timestamp(time.Now().Add(-2*time.Hour)), PortStatus([]swarm.PortConfig{ + { + TargetPort: 80, + PublishedPort: 80, + Protocol: "tcp", + }, + }))), + }, nil + }, + }, + { + name: "with-errors", + args: []string{"nodeID"}, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(), []byte{}, nil + }, + taskListFunc: func(options types.TaskListOptions) ([]swarm.Task, error) { + return []swarm.Task{ + *Task(TaskID("taskID1"), ServiceID("failure"), + WithStatus(Timestamp(time.Now().Add(-2*time.Hour)), StatusErr("a task error"))), + *Task(TaskID("taskID2"), ServiceID("failure"), + WithStatus(Timestamp(time.Now().Add(-3*time.Hour)), StatusErr("a task error"))), + *Task(TaskID("taskID3"), ServiceID("failure"), + WithStatus(Timestamp(time.Now().Add(-4*time.Hour)), StatusErr("a task error"))), + }, nil + }, + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newPsCommand( + test.NewFakeCli(&fakeClient{ + infoFunc: tc.infoFunc, + nodeInspectFunc: tc.nodeInspectFunc, + taskInspectFunc: tc.taskInspectFunc, + taskListFunc: tc.taskListFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + assert.NilError(t, cmd.Execute()) + actual := buf.String() + expected := golden.Get(t, []byte(actual), fmt.Sprintf("node-ps.%s.golden", tc.name)) + assert.EqualNormalizedString(t, assert.RemoveSpace, actual, string(expected)) + } +} diff --git a/vendor/github.com/docker/docker/cli/command/node/remove.go b/vendor/github.com/docker/docker/cli/command/node/remove.go index 19b4a9663..0e4963aca 100644 --- a/vendor/github.com/docker/docker/cli/command/node/remove.go +++ b/vendor/github.com/docker/docker/cli/command/node/remove.go @@ -16,7 +16,7 @@ type removeOptions struct { force bool } -func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { +func newRemoveCommand(dockerCli command.Cli) *cobra.Command { opts := removeOptions{} cmd := &cobra.Command{ @@ -33,7 +33,7 @@ func newRemoveCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } -func runRemove(dockerCli *command.DockerCli, args []string, opts removeOptions) error { +func runRemove(dockerCli command.Cli, args []string, opts removeOptions) error { client := dockerCli.Client() ctx := context.Background() diff --git a/vendor/github.com/docker/docker/cli/command/node/remove_test.go b/vendor/github.com/docker/docker/cli/command/node/remove_test.go new file mode 100644 index 000000000..54930a276 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/remove_test.go @@ -0,0 +1,47 @@ +package node + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + "github.com/docker/docker/cli/internal/test" + "github.com/docker/docker/pkg/testutil/assert" +) + +func TestNodeRemoveErrors(t *testing.T) { + testCases := []struct { + args []string + nodeRemoveFunc func() error + expectedError string + }{ + { + expectedError: "requires at least 1 argument", + }, + { + args: []string{"nodeID"}, + nodeRemoveFunc: func() error { + return fmt.Errorf("error removing the node") + }, + expectedError: "error removing the node", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newRemoveCommand( + test.NewFakeCli(&fakeClient{ + nodeRemoveFunc: tc.nodeRemoveFunc, + }, buf)) + cmd.SetArgs(tc.args) + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestNodeRemoveMultiple(t *testing.T) { + buf := new(bytes.Buffer) + cmd := newRemoveCommand(test.NewFakeCli(&fakeClient{}, buf)) + cmd.SetArgs([]string{"nodeID1", "nodeID2"}) + assert.NilError(t, cmd.Execute()) +} diff --git a/vendor/github.com/docker/docker/cli/command/node/testdata/node-inspect-pretty.manager-leader.golden b/vendor/github.com/docker/docker/cli/command/node/testdata/node-inspect-pretty.manager-leader.golden new file mode 100644 index 000000000..461fc46ea --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/testdata/node-inspect-pretty.manager-leader.golden @@ -0,0 +1,25 @@ +ID: nodeID +Name: defaultNodeName +Hostname: defaultNodeHostname +Joined at: 2009-11-10 23:00:00 +0000 utc +Status: + State: Ready + Availability: Active + Address: 127.0.0.1 +Manager Status: + Address: 127.0.0.1 + Raft Status: Reachable + Leader: Yes +Platform: + Operating System: linux + Architecture: x86_64 +Resources: + CPUs: 0 + Memory: 20 MiB +Plugins: + Network: bridge, overlay + Volume: local +Engine Version: 1.13.0 +Engine Labels: + - engine = label + diff --git a/vendor/github.com/docker/docker/cli/command/node/testdata/node-inspect-pretty.manager.golden b/vendor/github.com/docker/docker/cli/command/node/testdata/node-inspect-pretty.manager.golden new file mode 100644 index 000000000..2c660188d --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/testdata/node-inspect-pretty.manager.golden @@ -0,0 +1,25 @@ +ID: nodeID +Name: defaultNodeName +Hostname: defaultNodeHostname +Joined at: 2009-11-10 23:00:00 +0000 utc +Status: + State: Ready + Availability: Active + Address: 127.0.0.1 +Manager Status: + Address: 127.0.0.1 + Raft Status: Reachable + Leader: No +Platform: + Operating System: linux + Architecture: x86_64 +Resources: + CPUs: 0 + Memory: 20 MiB +Plugins: + Network: bridge, overlay + Volume: local +Engine Version: 1.13.0 +Engine Labels: + - engine = label + diff --git a/vendor/github.com/docker/docker/cli/command/node/testdata/node-inspect-pretty.simple.golden b/vendor/github.com/docker/docker/cli/command/node/testdata/node-inspect-pretty.simple.golden new file mode 100644 index 000000000..e63bc1259 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/testdata/node-inspect-pretty.simple.golden @@ -0,0 +1,23 @@ +ID: nodeID +Name: defaultNodeName +Labels: + - lbl1 = value1 +Hostname: defaultNodeHostname +Joined at: 2009-11-10 23:00:00 +0000 utc +Status: + State: Ready + Availability: Active + Address: 127.0.0.1 +Platform: + Operating System: linux + Architecture: x86_64 +Resources: + CPUs: 0 + Memory: 20 MiB +Plugins: + Network: bridge, overlay + Volume: local +Engine Version: 1.13.0 +Engine Labels: + - engine = label + diff --git a/vendor/github.com/docker/docker/cli/command/node/testdata/node-ps.simple.golden b/vendor/github.com/docker/docker/cli/command/node/testdata/node-ps.simple.golden new file mode 100644 index 000000000..f9555d879 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/testdata/node-ps.simple.golden @@ -0,0 +1,2 @@ +ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS +taskID rl02d5gwz6chzu7il5fhtb8be.1 myimage:mytag defaultNodeName Ready Ready 2 hours ago *:80->80/tcp diff --git a/vendor/github.com/docker/docker/cli/command/node/testdata/node-ps.with-errors.golden b/vendor/github.com/docker/docker/cli/command/node/testdata/node-ps.with-errors.golden new file mode 100644 index 000000000..273b30fa1 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/testdata/node-ps.with-errors.golden @@ -0,0 +1,4 @@ +ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS +taskID1 failure.1 myimage:mytag defaultNodeName Ready Ready 2 hours ago "a task error" +taskID2 \_ failure.1 myimage:mytag defaultNodeName Ready Ready 3 hours ago "a task error" +taskID3 \_ failure.1 myimage:mytag defaultNodeName Ready Ready 4 hours ago "a task error" diff --git a/vendor/github.com/docker/docker/cli/command/node/update.go b/vendor/github.com/docker/docker/cli/command/node/update.go index 65339e138..6ca2a7c1e 100644 --- a/vendor/github.com/docker/docker/cli/command/node/update.go +++ b/vendor/github.com/docker/docker/cli/command/node/update.go @@ -18,7 +18,7 @@ var ( errNoRoleChange = errors.New("role was already set to the requested value") ) -func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command { +func newUpdateCommand(dockerCli command.Cli) *cobra.Command { nodeOpts := newNodeOptions() cmd := &cobra.Command{ @@ -39,14 +39,14 @@ func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } -func runUpdate(dockerCli *command.DockerCli, flags *pflag.FlagSet, nodeID string) error { +func runUpdate(dockerCli command.Cli, flags *pflag.FlagSet, nodeID string) error { success := func(_ string) { fmt.Fprintln(dockerCli.Out(), nodeID) } return updateNodes(dockerCli, []string{nodeID}, mergeNodeUpdate(flags), success) } -func updateNodes(dockerCli *command.DockerCli, nodes []string, mergeNode func(node *swarm.Node) error, success func(nodeID string)) error { +func updateNodes(dockerCli command.Cli, nodes []string, mergeNode func(node *swarm.Node) error, success func(nodeID string)) error { client := dockerCli.Client() ctx := context.Background() diff --git a/vendor/github.com/docker/docker/cli/command/node/update_test.go b/vendor/github.com/docker/docker/cli/command/node/update_test.go new file mode 100644 index 000000000..439ba9443 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/node/update_test.go @@ -0,0 +1,172 @@ +package node + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + // Import builders to get the builder function as package function + . "github.com/docker/docker/cli/internal/test/builders" + "github.com/docker/docker/pkg/testutil/assert" +) + +func TestNodeUpdateErrors(t *testing.T) { + testCases := []struct { + args []string + flags map[string]string + nodeInspectFunc func() (swarm.Node, []byte, error) + nodeUpdateFunc func(nodeID string, version swarm.Version, node swarm.NodeSpec) error + expectedError string + }{ + { + expectedError: "requires exactly 1 argument", + }, + { + args: []string{"node1", "node2"}, + expectedError: "requires exactly 1 argument", + }, + { + args: []string{"nodeID"}, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node") + }, + expectedError: "error inspecting the node", + }, + { + args: []string{"nodeID"}, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + return fmt.Errorf("error updating the node") + }, + expectedError: "error updating the node", + }, + { + args: []string{"nodeID"}, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(NodeLabels(map[string]string{ + "key": "value", + })), []byte{}, nil + }, + flags: map[string]string{ + "label-rm": "notpresent", + }, + expectedError: "key notpresent doesn't exist in node's labels", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newUpdateCommand( + test.NewFakeCli(&fakeClient{ + nodeInspectFunc: tc.nodeInspectFunc, + nodeUpdateFunc: tc.nodeUpdateFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestNodeUpdate(t *testing.T) { + testCases := []struct { + args []string + flags map[string]string + nodeInspectFunc func() (swarm.Node, []byte, error) + nodeUpdateFunc func(nodeID string, version swarm.Version, node swarm.NodeSpec) error + }{ + { + args: []string{"nodeID"}, + flags: map[string]string{ + "role": "manager", + }, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(), []byte{}, nil + }, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + if node.Role != swarm.NodeRoleManager { + return fmt.Errorf("expected role manager, got %s", node.Role) + } + return nil + }, + }, + { + args: []string{"nodeID"}, + flags: map[string]string{ + "availability": "drain", + }, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(), []byte{}, nil + }, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + if node.Availability != swarm.NodeAvailabilityDrain { + return fmt.Errorf("expected drain availability, got %s", node.Availability) + } + return nil + }, + }, + { + args: []string{"nodeID"}, + flags: map[string]string{ + "label-add": "lbl", + }, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(), []byte{}, nil + }, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + if _, present := node.Annotations.Labels["lbl"]; !present { + return fmt.Errorf("expected 'lbl' label, got %v", node.Annotations.Labels) + } + return nil + }, + }, + { + args: []string{"nodeID"}, + flags: map[string]string{ + "label-add": "key=value", + }, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(), []byte{}, nil + }, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + if value, present := node.Annotations.Labels["key"]; !present || value != "value" { + return fmt.Errorf("expected 'key' label to be 'value', got %v", node.Annotations.Labels) + } + return nil + }, + }, + { + args: []string{"nodeID"}, + flags: map[string]string{ + "label-rm": "key", + }, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(NodeLabels(map[string]string{ + "key": "value", + })), []byte{}, nil + }, + nodeUpdateFunc: func(nodeID string, version swarm.Version, node swarm.NodeSpec) error { + if len(node.Annotations.Labels) > 0 { + return fmt.Errorf("expected no labels, got %v", node.Annotations.Labels) + } + return nil + }, + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newUpdateCommand( + test.NewFakeCli(&fakeClient{ + nodeInspectFunc: tc.nodeInspectFunc, + nodeUpdateFunc: tc.nodeUpdateFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + assert.NilError(t, cmd.Execute()) + } +} diff --git a/vendor/github.com/docker/docker/cli/command/plugin/inspect.go b/vendor/github.com/docker/docker/cli/command/plugin/inspect.go index 46ec7b229..c2c7a0d6b 100644 --- a/vendor/github.com/docker/docker/cli/command/plugin/inspect.go +++ b/vendor/github.com/docker/docker/cli/command/plugin/inspect.go @@ -17,7 +17,7 @@ func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { var opts inspectOptions cmd := &cobra.Command{ - Use: "inspect [OPTIONS] PLUGIN|ID [PLUGIN|ID...]", + Use: "inspect [OPTIONS] PLUGIN [PLUGIN...]", Short: "Display detailed information on one or more plugins", Args: cli.RequiresMinArgs(1), RunE: func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/docker/docker/cli/command/prune/prune.go b/vendor/github.com/docker/docker/cli/command/prune/prune.go index a022487fd..6314718c6 100644 --- a/vendor/github.com/docker/docker/cli/command/prune/prune.go +++ b/vendor/github.com/docker/docker/cli/command/prune/prune.go @@ -6,6 +6,7 @@ import ( "github.com/docker/docker/cli/command/image" "github.com/docker/docker/cli/command/network" "github.com/docker/docker/cli/command/volume" + "github.com/docker/docker/opts" "github.com/spf13/cobra" ) @@ -30,21 +31,21 @@ func NewNetworkPruneCommand(dockerCli *command.DockerCli) *cobra.Command { } // RunContainerPrune executes a prune command for containers -func RunContainerPrune(dockerCli *command.DockerCli) (uint64, string, error) { - return container.RunPrune(dockerCli) +func RunContainerPrune(dockerCli *command.DockerCli, filter opts.FilterOpt) (uint64, string, error) { + return container.RunPrune(dockerCli, filter) } // RunVolumePrune executes a prune command for volumes -func RunVolumePrune(dockerCli *command.DockerCli) (uint64, string, error) { +func RunVolumePrune(dockerCli *command.DockerCli, filter opts.FilterOpt) (uint64, string, error) { return volume.RunPrune(dockerCli) } // RunImagePrune executes a prune command for images -func RunImagePrune(dockerCli *command.DockerCli, all bool) (uint64, string, error) { - return image.RunPrune(dockerCli, all) +func RunImagePrune(dockerCli *command.DockerCli, all bool, filter opts.FilterOpt) (uint64, string, error) { + return image.RunPrune(dockerCli, all, filter) } // RunNetworkPrune executes a prune command for networks -func RunNetworkPrune(dockerCli *command.DockerCli) (uint64, string, error) { - return network.RunPrune(dockerCli) +func RunNetworkPrune(dockerCli *command.DockerCli, filter opts.FilterOpt) (uint64, string, error) { + return network.RunPrune(dockerCli, filter) } diff --git a/vendor/github.com/docker/docker/cli/command/secret/create.go b/vendor/github.com/docker/docker/cli/command/secret/create.go index 6967fb51e..a3248e5df 100644 --- a/vendor/github.com/docker/docker/cli/command/secret/create.go +++ b/vendor/github.com/docker/docker/cli/command/secret/create.go @@ -27,17 +27,17 @@ func newSecretCreateCommand(dockerCli *command.DockerCli) *cobra.Command { } cmd := &cobra.Command{ - Use: "create [OPTIONS] SECRET", + Use: "create [OPTIONS] SECRET file|-", Short: "Create a secret from a file or STDIN as content", - Args: cli.ExactArgs(1), + Args: cli.ExactArgs(2), RunE: func(cmd *cobra.Command, args []string) error { createOpts.name = args[0] + createOpts.file = args[1] return runSecretCreate(dockerCli, createOpts) }, } flags := cmd.Flags() flags.VarP(&createOpts.labels, "label", "l", "Secret labels") - flags.StringVarP(&createOpts.file, "file", "f", "", "Read from a file or STDIN ('-')") return cmd } @@ -46,10 +46,6 @@ func runSecretCreate(dockerCli *command.DockerCli, options createOptions) error client := dockerCli.Client() ctx := context.Background() - if options.file == "" { - return fmt.Errorf("Please specify either a file name or STDIN ('-') with --file") - } - var in io.Reader = dockerCli.In() if options.file != "-" { file, err := system.OpenSequential(options.file) diff --git a/vendor/github.com/docker/docker/cli/command/service/opts.go b/vendor/github.com/docker/docker/cli/command/service/opts.go index 78c27eae2..b794b07a3 100644 --- a/vendor/github.com/docker/docker/cli/command/service/opts.go +++ b/vendor/github.com/docker/docker/cli/command/service/opts.go @@ -1,10 +1,7 @@ package service import ( - "encoding/csv" "fmt" - "os" - "path/filepath" "strconv" "strings" "time" @@ -142,98 +139,6 @@ func (f *floatValue) Value() float32 { return float32(*f) } -// SecretRequestSpec is a type for requesting secrets -type SecretRequestSpec struct { - source string - target string - uid string - gid string - mode os.FileMode -} - -// SecretOpt is a Value type for parsing secrets -type SecretOpt struct { - values []*SecretRequestSpec -} - -// Set a new secret value -func (o *SecretOpt) Set(value string) error { - csvReader := csv.NewReader(strings.NewReader(value)) - fields, err := csvReader.Read() - if err != nil { - return err - } - - spec := &SecretRequestSpec{ - source: "", - target: "", - uid: "0", - gid: "0", - mode: 0444, - } - - for _, field := range fields { - parts := strings.SplitN(field, "=", 2) - key := strings.ToLower(parts[0]) - - if len(parts) != 2 { - return fmt.Errorf("invalid field '%s' must be a key=value pair", field) - } - - value := parts[1] - switch key { - case "source", "src": - spec.source = value - case "target": - tDir, _ := filepath.Split(value) - if tDir != "" { - return fmt.Errorf("target must not have a path") - } - spec.target = value - case "uid": - spec.uid = value - case "gid": - spec.gid = value - case "mode": - m, err := strconv.ParseUint(value, 0, 32) - if err != nil { - return fmt.Errorf("invalid mode specified: %v", err) - } - - spec.mode = os.FileMode(m) - default: - return fmt.Errorf("invalid field in secret request: %s", key) - } - } - - if spec.source == "" { - return fmt.Errorf("source is required") - } - - o.values = append(o.values, spec) - return nil -} - -// Type returns the type of this option -func (o *SecretOpt) Type() string { - return "secret" -} - -// String returns a string repr of this option -func (o *SecretOpt) String() string { - secrets := []string{} - for _, secret := range o.values { - repr := fmt.Sprintf("%s -> %s", secret.source, secret.target) - secrets = append(secrets, repr) - } - return strings.Join(secrets, ", ") -} - -// Value returns the secret requests -func (o *SecretOpt) Value() []*SecretRequestSpec { - return o.values -} - type updateOptions struct { parallelism uint64 delay time.Duration diff --git a/vendor/github.com/docker/docker/cli/command/service/parse.go b/vendor/github.com/docker/docker/cli/command/service/parse.go index ff3249e58..6af7e3bb8 100644 --- a/vendor/github.com/docker/docker/cli/command/service/parse.go +++ b/vendor/github.com/docker/docker/cli/command/service/parse.go @@ -12,7 +12,7 @@ import ( // parseSecrets retrieves the secrets from the requested names and converts // them to secret references to use with the spec -func parseSecrets(client client.APIClient, requestedSecrets []*types.SecretRequestOption) ([]*swarmtypes.SecretReference, error) { +func parseSecrets(client client.SecretAPIClient, requestedSecrets []*types.SecretRequestOption) ([]*swarmtypes.SecretReference, error) { secretRefs := make(map[string]*swarmtypes.SecretReference) ctx := context.Background() diff --git a/vendor/github.com/docker/docker/cli/command/service/ps.go b/vendor/github.com/docker/docker/cli/command/service/ps.go index cf94ad737..12b25bf4f 100644 --- a/vendor/github.com/docker/docker/cli/command/service/ps.go +++ b/vendor/github.com/docker/docker/cli/command/service/ps.go @@ -1,7 +1,13 @@ package service import ( + "fmt" + "strings" + + "golang.org/x/net/context" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" "github.com/docker/docker/cli" "github.com/docker/docker/cli/command" "github.com/docker/docker/cli/command/idresolver" @@ -9,11 +15,10 @@ import ( "github.com/docker/docker/cli/command/task" "github.com/docker/docker/opts" "github.com/spf13/cobra" - "golang.org/x/net/context" ) type psOptions struct { - serviceID string + services []string quiet bool noResolve bool noTrunc bool @@ -24,11 +29,11 @@ func newPsCommand(dockerCli *command.DockerCli) *cobra.Command { opts := psOptions{filter: opts.NewFilterOpt()} cmd := &cobra.Command{ - Use: "ps [OPTIONS] SERVICE", - Short: "List the tasks of a service", - Args: cli.ExactArgs(1), + Use: "ps [OPTIONS] SERVICE [SERVICE...]", + Short: "List the tasks of one or more services", + Args: cli.RequiresMinArgs(1), RunE: func(cmd *cobra.Command, args []string) error { - opts.serviceID = args[0] + opts.services = args return runPS(dockerCli, opts) }, } @@ -45,13 +50,46 @@ func runPS(dockerCli *command.DockerCli, opts psOptions) error { client := dockerCli.Client() ctx := context.Background() - service, _, err := client.ServiceInspectWithRaw(ctx, opts.serviceID) + filter := opts.filter.Value() + + serviceIDFilter := filters.NewArgs() + serviceNameFilter := filters.NewArgs() + for _, service := range opts.services { + serviceIDFilter.Add("id", service) + serviceNameFilter.Add("name", service) + } + serviceByIDList, err := client.ServiceList(ctx, types.ServiceListOptions{Filters: serviceIDFilter}) + if err != nil { + return err + } + serviceByNameList, err := client.ServiceList(ctx, types.ServiceListOptions{Filters: serviceNameFilter}) if err != nil { return err } - filter := opts.filter.Value() - filter.Add("service", service.ID) + for _, service := range opts.services { + serviceCount := 0 + // Lookup by ID/Prefix + for _, serviceEntry := range serviceByIDList { + if strings.HasPrefix(serviceEntry.ID, service) { + filter.Add("service", serviceEntry.ID) + serviceCount++ + } + } + + // Lookup by Name/Prefix + for _, serviceEntry := range serviceByNameList { + if strings.HasPrefix(serviceEntry.Spec.Annotations.Name, service) { + filter.Add("service", serviceEntry.ID) + serviceCount++ + } + } + // If nothing has been found, return immediately. + if serviceCount == 0 { + return fmt.Errorf("no such services: %s", service) + } + } + if filter.Include("node") { nodeFilters := filter.Get("node") for _, nodeFilter := range nodeFilters { diff --git a/vendor/github.com/docker/docker/cli/command/service/trust.go b/vendor/github.com/docker/docker/cli/command/service/trust.go index 052d49c32..15f8a708f 100644 --- a/vendor/github.com/docker/docker/cli/command/service/trust.go +++ b/vendor/github.com/docker/docker/cli/command/service/trust.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" distreference "github.com/docker/distribution/reference" "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/cli/command" @@ -13,6 +12,7 @@ import ( "github.com/docker/docker/reference" "github.com/docker/docker/registry" "github.com/docker/notary/tuf/data" + "github.com/opencontainers/go-digest" "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -30,7 +30,7 @@ func resolveServiceImageDigest(dockerCli *command.DockerCli, service *swarm.Serv // could be parsed as a digest reference. Specifying an image ID // is valid but not resolvable. There is no warning message for // an image ID because it's valid to use one. - if _, err := digest.ParseDigest(image); err == nil { + if _, err := digest.Parse(image); err == nil { return nil } diff --git a/vendor/github.com/docker/docker/cli/command/service/update.go b/vendor/github.com/docker/docker/cli/command/service/update.go index 514b1bd51..df0977d86 100644 --- a/vendor/github.com/docker/docker/cli/command/service/update.go +++ b/vendor/github.com/docker/docker/cli/command/service/update.go @@ -6,8 +6,6 @@ import ( "strings" "time" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" mounttypes "github.com/docker/docker/api/types/mount" @@ -21,6 +19,7 @@ import ( shlex "github.com/flynn-archive/go-shlex" "github.com/spf13/cobra" "github.com/spf13/pflag" + "golang.org/x/net/context" ) func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command { @@ -431,7 +430,16 @@ func updateEnvironment(flags *pflag.FlagSet, field *[]string) { *field = removeItems(*field, toRemove, envKey) } -func getUpdatedSecrets(apiClient client.APIClient, flags *pflag.FlagSet, secrets []*swarm.SecretReference) ([]*swarm.SecretReference, error) { +func getUpdatedSecrets(apiClient client.SecretAPIClient, flags *pflag.FlagSet, secrets []*swarm.SecretReference) ([]*swarm.SecretReference, error) { + newSecrets := []*swarm.SecretReference{} + + toRemove := buildToRemoveSet(flags, flagSecretRemove) + for _, secret := range secrets { + if _, exists := toRemove[secret.SecretName]; !exists { + newSecrets = append(newSecrets, secret) + } + } + if flags.Changed(flagSecretAdd) { values := flags.Lookup(flagSecretAdd).Value.(*opts.SecretOpt).Value() @@ -439,14 +447,7 @@ func getUpdatedSecrets(apiClient client.APIClient, flags *pflag.FlagSet, secrets if err != nil { return nil, err } - secrets = append(secrets, addSecrets...) - } - toRemove := buildToRemoveSet(flags, flagSecretRemove) - newSecrets := []*swarm.SecretReference{} - for _, secret := range secrets { - if _, exists := toRemove[secret.SecretName]; !exists { - newSecrets = append(newSecrets, secret) - } + newSecrets = append(newSecrets, addSecrets...) } return newSecrets, nil @@ -691,11 +692,7 @@ portLoop: ports := flags.Lookup(flagPublishAdd).Value.(*opts.PortOpt).Value() for _, port := range ports { - if v, ok := portSet[portConfigToString(&port)]; ok { - if v != port { - fmt.Println("v", v) - return fmt.Errorf("conflicting port mapping between %v:%v/%s and %v:%v/%s", port.PublishedPort, port.TargetPort, port.Protocol, v.PublishedPort, v.TargetPort, v.Protocol) - } + if _, ok := portSet[portConfigToString(&port)]; ok { continue } //portSet[portConfigToString(&port)] = port diff --git a/vendor/github.com/docker/docker/cli/command/service/update_test.go b/vendor/github.com/docker/docker/cli/command/service/update_test.go index 08fe24876..a6df6b985 100644 --- a/vendor/github.com/docker/docker/cli/command/service/update_test.go +++ b/vendor/github.com/docker/docker/cli/command/service/update_test.go @@ -6,10 +6,12 @@ import ( "testing" "time" + "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" mounttypes "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/pkg/testutil/assert" + "golang.org/x/net/context" ) func TestUpdateServiceArgs(t *testing.T) { @@ -382,3 +384,58 @@ func TestValidatePort(t *testing.T) { assert.Error(t, err, e) } } + +type secretAPIClientMock struct { + listResult []swarm.Secret +} + +func (s secretAPIClientMock) SecretList(ctx context.Context, options types.SecretListOptions) ([]swarm.Secret, error) { + return s.listResult, nil +} +func (s secretAPIClientMock) SecretCreate(ctx context.Context, secret swarm.SecretSpec) (types.SecretCreateResponse, error) { + return types.SecretCreateResponse{}, nil +} +func (s secretAPIClientMock) SecretRemove(ctx context.Context, id string) error { + return nil +} +func (s secretAPIClientMock) SecretInspectWithRaw(ctx context.Context, name string) (swarm.Secret, []byte, error) { + return swarm.Secret{}, []byte{}, nil +} + +// TestUpdateSecretUpdateInPlace tests the ability to update the "target" of an secret with "docker service update" +// by combining "--secret-rm" and "--secret-add" for the same secret. +func TestUpdateSecretUpdateInPlace(t *testing.T) { + apiClient := secretAPIClientMock{ + listResult: []swarm.Secret{ + { + ID: "tn9qiblgnuuut11eufquw5dev", + Spec: swarm.SecretSpec{Annotations: swarm.Annotations{Name: "foo"}}, + }, + }, + } + + flags := newUpdateCommand(nil).Flags() + flags.Set("secret-add", "source=foo,target=foo2") + flags.Set("secret-rm", "foo") + + secrets := []*swarm.SecretReference{ + { + File: &swarm.SecretReferenceFileTarget{ + Name: "foo", + UID: "0", + GID: "0", + Mode: 292, + }, + SecretID: "tn9qiblgnuuut11eufquw5dev", + SecretName: "foo", + }, + } + + updatedSecrets, err := getUpdatedSecrets(apiClient, flags, secrets) + + assert.Equal(t, err, nil) + assert.Equal(t, len(updatedSecrets), 1) + assert.Equal(t, updatedSecrets[0].SecretID, "tn9qiblgnuuut11eufquw5dev") + assert.Equal(t, updatedSecrets[0].SecretName, "foo") + assert.Equal(t, updatedSecrets[0].File.Name, "foo2") +} diff --git a/vendor/github.com/docker/docker/cli/command/stack/deploy.go b/vendor/github.com/docker/docker/cli/command/stack/deploy.go index f4730db55..306a583e1 100644 --- a/vendor/github.com/docker/docker/cli/command/stack/deploy.go +++ b/vendor/github.com/docker/docker/cli/command/stack/deploy.go @@ -117,7 +117,9 @@ func deployCompose(ctx context.Context, dockerCli *command.DockerCli, opts deplo namespace := convert.NewNamespace(opts.namespace) - networks, externalNetworks := convert.Networks(namespace, config.Networks) + serviceNetworks := getServicesDeclaredNetworks(config.Services) + + networks, externalNetworks := convert.Networks(namespace, config.Networks, serviceNetworks) if err := validateExternalNetworks(ctx, dockerCli, externalNetworks); err != nil { return err } @@ -131,6 +133,20 @@ func deployCompose(ctx context.Context, dockerCli *command.DockerCli, opts deplo return deployServices(ctx, dockerCli, services, namespace, opts.sendRegistryAuth) } +func getServicesDeclaredNetworks(serviceConfigs []composetypes.ServiceConfig) map[string]struct{} { + serviceNetworks := map[string]struct{}{} + for _, serviceConfig := range serviceConfigs { + if len(serviceConfig.Networks) == 0 { + serviceNetworks["default"] = struct{}{} + continue + } + for network := range serviceConfig.Networks { + serviceNetworks[network] = struct{}{} + } + } + return serviceNetworks +} + func propertyWarnings(properties map[string]string) string { var msgs []string for name, description := range properties { diff --git a/vendor/github.com/docker/docker/cli/command/swarm/client_test.go b/vendor/github.com/docker/docker/cli/command/swarm/client_test.go new file mode 100644 index 000000000..1d42b9499 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/client_test.go @@ -0,0 +1,84 @@ +package swarm + +import ( + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/client" + "golang.org/x/net/context" +) + +type fakeClient struct { + client.Client + infoFunc func() (types.Info, error) + swarmInitFunc func() (string, error) + swarmInspectFunc func() (swarm.Swarm, error) + nodeInspectFunc func() (swarm.Node, []byte, error) + swarmGetUnlockKeyFunc func() (types.SwarmUnlockKeyResponse, error) + swarmJoinFunc func() error + swarmLeaveFunc func() error + swarmUpdateFunc func(swarm swarm.Spec, flags swarm.UpdateFlags) error + swarmUnlockFunc func(req swarm.UnlockRequest) error +} + +func (cli *fakeClient) Info(ctx context.Context) (types.Info, error) { + if cli.infoFunc != nil { + return cli.infoFunc() + } + return types.Info{}, nil +} + +func (cli *fakeClient) NodeInspectWithRaw(ctx context.Context, ref string) (swarm.Node, []byte, error) { + if cli.nodeInspectFunc != nil { + return cli.nodeInspectFunc() + } + return swarm.Node{}, []byte{}, nil +} + +func (cli *fakeClient) SwarmInit(ctx context.Context, req swarm.InitRequest) (string, error) { + if cli.swarmInitFunc != nil { + return cli.swarmInitFunc() + } + return "", nil +} + +func (cli *fakeClient) SwarmInspect(ctx context.Context) (swarm.Swarm, error) { + if cli.swarmInspectFunc != nil { + return cli.swarmInspectFunc() + } + return swarm.Swarm{}, nil +} + +func (cli *fakeClient) SwarmGetUnlockKey(ctx context.Context) (types.SwarmUnlockKeyResponse, error) { + if cli.swarmGetUnlockKeyFunc != nil { + return cli.swarmGetUnlockKeyFunc() + } + return types.SwarmUnlockKeyResponse{}, nil +} + +func (cli *fakeClient) SwarmJoin(ctx context.Context, req swarm.JoinRequest) error { + if cli.swarmJoinFunc != nil { + return cli.swarmJoinFunc() + } + return nil +} + +func (cli *fakeClient) SwarmLeave(ctx context.Context, force bool) error { + if cli.swarmLeaveFunc != nil { + return cli.swarmLeaveFunc() + } + return nil +} + +func (cli *fakeClient) SwarmUpdate(ctx context.Context, version swarm.Version, swarm swarm.Spec, flags swarm.UpdateFlags) error { + if cli.swarmUpdateFunc != nil { + return cli.swarmUpdateFunc(swarm, flags) + } + return nil +} + +func (cli *fakeClient) SwarmUnlock(ctx context.Context, req swarm.UnlockRequest) error { + if cli.swarmUnlockFunc != nil { + return cli.swarmUnlockFunc(req) + } + return nil +} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/init.go b/vendor/github.com/docker/docker/cli/command/swarm/init.go index 2550feeb4..b79602267 100644 --- a/vendor/github.com/docker/docker/cli/command/swarm/init.go +++ b/vendor/github.com/docker/docker/cli/command/swarm/init.go @@ -20,9 +20,10 @@ type initOptions struct { // Not a NodeAddrOption because it has no default port. advertiseAddr string forceNewCluster bool + availability string } -func newInitCommand(dockerCli *command.DockerCli) *cobra.Command { +func newInitCommand(dockerCli command.Cli) *cobra.Command { opts := initOptions{ listenAddr: NewListenAddrOption(), } @@ -41,11 +42,12 @@ func newInitCommand(dockerCli *command.DockerCli) *cobra.Command { flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "Advertised address (format: [:port])") flags.BoolVar(&opts.forceNewCluster, "force-new-cluster", false, "Force create a new cluster from current state") flags.BoolVar(&opts.autolock, flagAutolock, false, "Enable manager autolocking (requiring an unlock key to start a stopped manager)") + flags.StringVar(&opts.availability, flagAvailability, "active", "Availability of the node (active/pause/drain)") addSwarmFlags(flags, &opts.swarmOptions) return cmd } -func runInit(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts initOptions) error { +func runInit(dockerCli command.Cli, flags *pflag.FlagSet, opts initOptions) error { client := dockerCli.Client() ctx := context.Background() @@ -56,6 +58,15 @@ func runInit(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts initOption Spec: opts.swarmOptions.ToSpec(flags), AutoLockManagers: opts.swarmOptions.autolock, } + if flags.Changed(flagAvailability) { + availability := swarm.NodeAvailability(strings.ToLower(opts.availability)) + switch availability { + case swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain: + req.Availability = availability + default: + return fmt.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability) + } + } nodeID, err := client.SwarmInit(ctx, req) if err != nil { @@ -67,7 +78,7 @@ func runInit(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts initOption fmt.Fprintf(dockerCli.Out(), "Swarm initialized: current node (%s) is now a manager.\n\n", nodeID) - if err := printJoinCommand(ctx, dockerCli, nodeID, true, false); err != nil { + if err := printJoinCommand(ctx, dockerCli, nodeID, false, true); err != nil { return err } diff --git a/vendor/github.com/docker/docker/cli/command/swarm/init_test.go b/vendor/github.com/docker/docker/cli/command/swarm/init_test.go new file mode 100644 index 000000000..13de1cd55 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/init_test.go @@ -0,0 +1,129 @@ +package swarm + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + "github.com/docker/docker/pkg/testutil/assert" + "github.com/docker/docker/pkg/testutil/golden" +) + +func TestSwarmInitErrorOnAPIFailure(t *testing.T) { + testCases := []struct { + name string + flags map[string]string + swarmInitFunc func() (string, error) + swarmInspectFunc func() (swarm.Swarm, error) + swarmGetUnlockKeyFunc func() (types.SwarmUnlockKeyResponse, error) + nodeInspectFunc func() (swarm.Node, []byte, error) + expectedError string + }{ + { + name: "init-failed", + swarmInitFunc: func() (string, error) { + return "", fmt.Errorf("error initializing the swarm") + }, + expectedError: "error initializing the swarm", + }, + { + name: "init-faild-with-ip-choice", + swarmInitFunc: func() (string, error) { + return "", fmt.Errorf("could not choose an IP address to advertise") + }, + expectedError: "could not choose an IP address to advertise - specify one with --advertise-addr", + }, + { + name: "swarm-inspect-after-init-failed", + swarmInspectFunc: func() (swarm.Swarm, error) { + return swarm.Swarm{}, fmt.Errorf("error inspecting the swarm") + }, + expectedError: "error inspecting the swarm", + }, + { + name: "node-inspect-after-init-failed", + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting the node") + }, + expectedError: "error inspecting the node", + }, + { + name: "swarm-get-unlock-key-after-init-failed", + flags: map[string]string{ + flagAutolock: "true", + }, + swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) { + return types.SwarmUnlockKeyResponse{}, fmt.Errorf("error getting swarm unlock key") + }, + expectedError: "could not fetch unlock key: error getting swarm unlock key", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newInitCommand( + test.NewFakeCli(&fakeClient{ + swarmInitFunc: tc.swarmInitFunc, + swarmInspectFunc: tc.swarmInspectFunc, + swarmGetUnlockKeyFunc: tc.swarmGetUnlockKeyFunc, + nodeInspectFunc: tc.nodeInspectFunc, + }, buf)) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestSwarmInit(t *testing.T) { + testCases := []struct { + name string + flags map[string]string + swarmInitFunc func() (string, error) + swarmInspectFunc func() (swarm.Swarm, error) + swarmGetUnlockKeyFunc func() (types.SwarmUnlockKeyResponse, error) + nodeInspectFunc func() (swarm.Node, []byte, error) + }{ + { + name: "init", + swarmInitFunc: func() (string, error) { + return "nodeID", nil + }, + }, + { + name: "init-autolock", + flags: map[string]string{ + flagAutolock: "true", + }, + swarmInitFunc: func() (string, error) { + return "nodeID", nil + }, + swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) { + return types.SwarmUnlockKeyResponse{ + UnlockKey: "unlock-key", + }, nil + }, + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newInitCommand( + test.NewFakeCli(&fakeClient{ + swarmInitFunc: tc.swarmInitFunc, + swarmInspectFunc: tc.swarmInspectFunc, + swarmGetUnlockKeyFunc: tc.swarmGetUnlockKeyFunc, + nodeInspectFunc: tc.nodeInspectFunc, + }, buf)) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + assert.NilError(t, cmd.Execute()) + actual := buf.String() + expected := golden.Get(t, []byte(actual), fmt.Sprintf("init-%s.golden", tc.name)) + assert.EqualNormalizedString(t, assert.RemoveSpace, actual, string(expected)) + } +} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/join.go b/vendor/github.com/docker/docker/cli/command/swarm/join.go index 004313b4c..40fc5c192 100644 --- a/vendor/github.com/docker/docker/cli/command/swarm/join.go +++ b/vendor/github.com/docker/docker/cli/command/swarm/join.go @@ -2,12 +2,15 @@ package swarm import ( "fmt" + "strings" + + "golang.org/x/net/context" "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/cli" "github.com/docker/docker/cli/command" "github.com/spf13/cobra" - "golang.org/x/net/context" + "github.com/spf13/pflag" ) type joinOptions struct { @@ -16,9 +19,10 @@ type joinOptions struct { // Not a NodeAddrOption because it has no default port. advertiseAddr string token string + availability string } -func newJoinCommand(dockerCli *command.DockerCli) *cobra.Command { +func newJoinCommand(dockerCli command.Cli) *cobra.Command { opts := joinOptions{ listenAddr: NewListenAddrOption(), } @@ -29,7 +33,7 @@ func newJoinCommand(dockerCli *command.DockerCli) *cobra.Command { Args: cli.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { opts.remote = args[0] - return runJoin(dockerCli, opts) + return runJoin(dockerCli, cmd.Flags(), opts) }, } @@ -37,10 +41,11 @@ func newJoinCommand(dockerCli *command.DockerCli) *cobra.Command { flags.Var(&opts.listenAddr, flagListenAddr, "Listen address (format: [:port])") flags.StringVar(&opts.advertiseAddr, flagAdvertiseAddr, "", "Advertised address (format: [:port])") flags.StringVar(&opts.token, flagToken, "", "Token for entry into the swarm") + flags.StringVar(&opts.availability, flagAvailability, "active", "Availability of the node (active/pause/drain)") return cmd } -func runJoin(dockerCli *command.DockerCli, opts joinOptions) error { +func runJoin(dockerCli command.Cli, flags *pflag.FlagSet, opts joinOptions) error { client := dockerCli.Client() ctx := context.Background() @@ -50,6 +55,16 @@ func runJoin(dockerCli *command.DockerCli, opts joinOptions) error { AdvertiseAddr: opts.advertiseAddr, RemoteAddrs: []string{opts.remote}, } + if flags.Changed(flagAvailability) { + availability := swarm.NodeAvailability(strings.ToLower(opts.availability)) + switch availability { + case swarm.NodeAvailabilityActive, swarm.NodeAvailabilityPause, swarm.NodeAvailabilityDrain: + req.Availability = availability + default: + return fmt.Errorf("invalid availability %q, only active, pause and drain are supported", opts.availability) + } + } + err := client.SwarmJoin(ctx, req) if err != nil { return err diff --git a/vendor/github.com/docker/docker/cli/command/swarm/join_test.go b/vendor/github.com/docker/docker/cli/command/swarm/join_test.go new file mode 100644 index 000000000..66dd6d66b --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/join_test.go @@ -0,0 +1,102 @@ +package swarm + +import ( + "bytes" + "fmt" + "io/ioutil" + "strings" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + "github.com/docker/docker/pkg/testutil/assert" +) + +func TestSwarmJoinErrors(t *testing.T) { + testCases := []struct { + name string + args []string + swarmJoinFunc func() error + infoFunc func() (types.Info, error) + expectedError string + }{ + { + name: "not-enough-args", + expectedError: "requires exactly 1 argument", + }, + { + name: "too-many-args", + args: []string{"remote1", "remote2"}, + expectedError: "requires exactly 1 argument", + }, + { + name: "join-failed", + args: []string{"remote"}, + swarmJoinFunc: func() error { + return fmt.Errorf("error joining the swarm") + }, + expectedError: "error joining the swarm", + }, + { + name: "join-failed-on-init", + args: []string{"remote"}, + infoFunc: func() (types.Info, error) { + return types.Info{}, fmt.Errorf("error asking for node info") + }, + expectedError: "error asking for node info", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newJoinCommand( + test.NewFakeCli(&fakeClient{ + swarmJoinFunc: tc.swarmJoinFunc, + infoFunc: tc.infoFunc, + }, buf)) + cmd.SetArgs(tc.args) + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestSwarmJoin(t *testing.T) { + testCases := []struct { + name string + infoFunc func() (types.Info, error) + expected string + }{ + { + name: "join-as-manager", + infoFunc: func() (types.Info, error) { + return types.Info{ + Swarm: swarm.Info{ + ControlAvailable: true, + }, + }, nil + }, + expected: "This node joined a swarm as a manager.", + }, + { + name: "join-as-worker", + infoFunc: func() (types.Info, error) { + return types.Info{ + Swarm: swarm.Info{ + ControlAvailable: false, + }, + }, nil + }, + expected: "This node joined a swarm as a worker.", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newJoinCommand( + test.NewFakeCli(&fakeClient{ + infoFunc: tc.infoFunc, + }, buf)) + cmd.SetArgs([]string{"remote"}) + assert.NilError(t, cmd.Execute()) + assert.Equal(t, strings.TrimSpace(buf.String()), tc.expected) + } +} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/join_token.go b/vendor/github.com/docker/docker/cli/command/swarm/join_token.go index d800b769b..5c84c7a31 100644 --- a/vendor/github.com/docker/docker/cli/command/swarm/join_token.go +++ b/vendor/github.com/docker/docker/cli/command/swarm/join_token.go @@ -18,7 +18,7 @@ type joinTokenOptions struct { quiet bool } -func newJoinTokenCommand(dockerCli *command.DockerCli) *cobra.Command { +func newJoinTokenCommand(dockerCli command.Cli) *cobra.Command { opts := joinTokenOptions{} cmd := &cobra.Command{ @@ -38,7 +38,7 @@ func newJoinTokenCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } -func runJoinToken(dockerCli *command.DockerCli, opts joinTokenOptions) error { +func runJoinToken(dockerCli command.Cli, opts joinTokenOptions) error { worker := opts.role == "worker" manager := opts.role == "manager" @@ -94,7 +94,7 @@ func runJoinToken(dockerCli *command.DockerCli, opts joinTokenOptions) error { return printJoinCommand(ctx, dockerCli, info.Swarm.NodeID, worker, manager) } -func printJoinCommand(ctx context.Context, dockerCli *command.DockerCli, nodeID string, worker bool, manager bool) error { +func printJoinCommand(ctx context.Context, dockerCli command.Cli, nodeID string, worker bool, manager bool) error { client := dockerCli.Client() node, _, err := client.NodeInspectWithRaw(ctx, nodeID) diff --git a/vendor/github.com/docker/docker/cli/command/swarm/join_token_test.go b/vendor/github.com/docker/docker/cli/command/swarm/join_token_test.go new file mode 100644 index 000000000..624401641 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/join_token_test.go @@ -0,0 +1,215 @@ +package swarm + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + // Import builders to get the builder function as package function + . "github.com/docker/docker/cli/internal/test/builders" + "github.com/docker/docker/pkg/testutil/assert" + "github.com/docker/docker/pkg/testutil/golden" +) + +func TestSwarmJoinTokenErrors(t *testing.T) { + testCases := []struct { + name string + args []string + flags map[string]string + infoFunc func() (types.Info, error) + swarmInspectFunc func() (swarm.Swarm, error) + swarmUpdateFunc func(swarm swarm.Spec, flags swarm.UpdateFlags) error + nodeInspectFunc func() (swarm.Node, []byte, error) + expectedError string + }{ + { + name: "not-enough-args", + expectedError: "requires exactly 1 argument", + }, + { + name: "too-many-args", + args: []string{"worker", "manager"}, + expectedError: "requires exactly 1 argument", + }, + { + name: "invalid-args", + args: []string{"foo"}, + expectedError: "unknown role foo", + }, + { + name: "swarm-inspect-failed", + args: []string{"worker"}, + swarmInspectFunc: func() (swarm.Swarm, error) { + return swarm.Swarm{}, fmt.Errorf("error inspecting the swarm") + }, + expectedError: "error inspecting the swarm", + }, + { + name: "swarm-inspect-rotate-failed", + args: []string{"worker"}, + flags: map[string]string{ + flagRotate: "true", + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return swarm.Swarm{}, fmt.Errorf("error inspecting the swarm") + }, + expectedError: "error inspecting the swarm", + }, + { + name: "swarm-update-failed", + args: []string{"worker"}, + flags: map[string]string{ + flagRotate: "true", + }, + swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error { + return fmt.Errorf("error updating the swarm") + }, + expectedError: "error updating the swarm", + }, + { + name: "node-inspect-failed", + args: []string{"worker"}, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return swarm.Node{}, []byte{}, fmt.Errorf("error inspecting node") + }, + expectedError: "error inspecting node", + }, + { + name: "info-failed", + args: []string{"worker"}, + infoFunc: func() (types.Info, error) { + return types.Info{}, fmt.Errorf("error asking for node info") + }, + expectedError: "error asking for node info", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newJoinTokenCommand( + test.NewFakeCli(&fakeClient{ + swarmInspectFunc: tc.swarmInspectFunc, + swarmUpdateFunc: tc.swarmUpdateFunc, + infoFunc: tc.infoFunc, + nodeInspectFunc: tc.nodeInspectFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestSwarmJoinToken(t *testing.T) { + testCases := []struct { + name string + args []string + flags map[string]string + infoFunc func() (types.Info, error) + swarmInspectFunc func() (swarm.Swarm, error) + nodeInspectFunc func() (swarm.Node, []byte, error) + }{ + { + name: "worker", + args: []string{"worker"}, + infoFunc: func() (types.Info, error) { + return types.Info{ + Swarm: swarm.Info{ + NodeID: "nodeID", + }, + }, nil + }, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(Manager()), []byte{}, nil + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(), nil + }, + }, + { + name: "manager", + args: []string{"manager"}, + infoFunc: func() (types.Info, error) { + return types.Info{ + Swarm: swarm.Info{ + NodeID: "nodeID", + }, + }, nil + }, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(Manager()), []byte{}, nil + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(), nil + }, + }, + { + name: "manager-rotate", + args: []string{"manager"}, + flags: map[string]string{ + flagRotate: "true", + }, + infoFunc: func() (types.Info, error) { + return types.Info{ + Swarm: swarm.Info{ + NodeID: "nodeID", + }, + }, nil + }, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(Manager()), []byte{}, nil + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(), nil + }, + }, + { + name: "worker-quiet", + args: []string{"worker"}, + flags: map[string]string{ + flagQuiet: "true", + }, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(Manager()), []byte{}, nil + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(), nil + }, + }, + { + name: "manager-quiet", + args: []string{"manager"}, + flags: map[string]string{ + flagQuiet: "true", + }, + nodeInspectFunc: func() (swarm.Node, []byte, error) { + return *Node(Manager()), []byte{}, nil + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(), nil + }, + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newJoinTokenCommand( + test.NewFakeCli(&fakeClient{ + swarmInspectFunc: tc.swarmInspectFunc, + infoFunc: tc.infoFunc, + nodeInspectFunc: tc.nodeInspectFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + assert.NilError(t, cmd.Execute()) + actual := buf.String() + expected := golden.Get(t, []byte(actual), fmt.Sprintf("jointoken-%s.golden", tc.name)) + assert.EqualNormalizedString(t, assert.RemoveSpace, actual, string(expected)) + } +} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/leave.go b/vendor/github.com/docker/docker/cli/command/swarm/leave.go index e2cfa0a04..128ed46d8 100644 --- a/vendor/github.com/docker/docker/cli/command/swarm/leave.go +++ b/vendor/github.com/docker/docker/cli/command/swarm/leave.go @@ -14,7 +14,7 @@ type leaveOptions struct { force bool } -func newLeaveCommand(dockerCli *command.DockerCli) *cobra.Command { +func newLeaveCommand(dockerCli command.Cli) *cobra.Command { opts := leaveOptions{} cmd := &cobra.Command{ @@ -31,7 +31,7 @@ func newLeaveCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } -func runLeave(dockerCli *command.DockerCli, opts leaveOptions) error { +func runLeave(dockerCli command.Cli, opts leaveOptions) error { client := dockerCli.Client() ctx := context.Background() diff --git a/vendor/github.com/docker/docker/cli/command/swarm/leave_test.go b/vendor/github.com/docker/docker/cli/command/swarm/leave_test.go new file mode 100644 index 000000000..09b41b251 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/leave_test.go @@ -0,0 +1,52 @@ +package swarm + +import ( + "bytes" + "fmt" + "io/ioutil" + "strings" + "testing" + + "github.com/docker/docker/cli/internal/test" + "github.com/docker/docker/pkg/testutil/assert" +) + +func TestSwarmLeaveErrors(t *testing.T) { + testCases := []struct { + name string + args []string + swarmLeaveFunc func() error + expectedError string + }{ + { + name: "too-many-args", + args: []string{"foo"}, + expectedError: "accepts no argument(s)", + }, + { + name: "leave-failed", + swarmLeaveFunc: func() error { + return fmt.Errorf("error leaving the swarm") + }, + expectedError: "error leaving the swarm", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newLeaveCommand( + test.NewFakeCli(&fakeClient{ + swarmLeaveFunc: tc.swarmLeaveFunc, + }, buf)) + cmd.SetArgs(tc.args) + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestSwarmLeave(t *testing.T) { + buf := new(bytes.Buffer) + cmd := newLeaveCommand( + test.NewFakeCli(&fakeClient{}, buf)) + assert.NilError(t, cmd.Execute()) + assert.Equal(t, strings.TrimSpace(buf.String()), "Node left the swarm.") +} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/opts.go b/vendor/github.com/docker/docker/cli/command/swarm/opts.go index 9db46dcf5..40f88a441 100644 --- a/vendor/github.com/docker/docker/cli/command/swarm/opts.go +++ b/vendor/github.com/docker/docker/cli/command/swarm/opts.go @@ -28,6 +28,7 @@ const ( flagSnapshotInterval = "snapshot-interval" flagLockKey = "lock-key" flagAutolock = "autolock" + flagAvailability = "availability" ) type swarmOptions struct { diff --git a/vendor/github.com/docker/docker/cli/command/swarm/opts_test.go b/vendor/github.com/docker/docker/cli/command/swarm/opts_test.go index 568dc8730..9a97e8bd2 100644 --- a/vendor/github.com/docker/docker/cli/command/swarm/opts_test.go +++ b/vendor/github.com/docker/docker/cli/command/swarm/opts_test.go @@ -35,3 +35,76 @@ func TestNodeAddrOptionSetInvalidFormat(t *testing.T) { opt := NewListenAddrOption() assert.Error(t, opt.Set("http://localhost:4545"), "Invalid") } + +func TestExternalCAOptionErrors(t *testing.T) { + testCases := []struct { + externalCA string + expectedError string + }{ + { + externalCA: "", + expectedError: "EOF", + }, + { + externalCA: "anything", + expectedError: "invalid field 'anything' must be a key=value pair", + }, + { + externalCA: "foo=bar", + expectedError: "the external-ca option needs a protocol= parameter", + }, + { + externalCA: "protocol=baz", + expectedError: "unrecognized external CA protocol baz", + }, + { + externalCA: "protocol=cfssl", + expectedError: "the external-ca option needs a url= parameter", + }, + } + for _, tc := range testCases { + opt := &ExternalCAOption{} + assert.Error(t, opt.Set(tc.externalCA), tc.expectedError) + } +} + +func TestExternalCAOption(t *testing.T) { + testCases := []struct { + externalCA string + expected string + }{ + { + externalCA: "protocol=cfssl,url=anything", + expected: "cfssl: anything", + }, + { + externalCA: "protocol=CFSSL,url=anything", + expected: "cfssl: anything", + }, + { + externalCA: "protocol=Cfssl,url=https://example.com", + expected: "cfssl: https://example.com", + }, + { + externalCA: "protocol=Cfssl,url=https://example.com,foo=bar", + expected: "cfssl: https://example.com", + }, + { + externalCA: "protocol=Cfssl,url=https://example.com,foo=bar,foo=baz", + expected: "cfssl: https://example.com", + }, + } + for _, tc := range testCases { + opt := &ExternalCAOption{} + assert.NilError(t, opt.Set(tc.externalCA)) + assert.Equal(t, opt.String(), tc.expected) + } +} + +func TestExternalCAOptionMultiple(t *testing.T) { + opt := &ExternalCAOption{} + assert.NilError(t, opt.Set("protocol=cfssl,url=https://example.com")) + assert.NilError(t, opt.Set("protocol=CFSSL,url=anything")) + assert.Equal(t, len(opt.Value()), 2) + assert.Equal(t, opt.String(), "cfssl: https://example.com, cfssl: anything") +} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/init-init-autolock.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/init-init-autolock.golden new file mode 100644 index 000000000..cdd3c666b --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/init-init-autolock.golden @@ -0,0 +1,11 @@ +Swarm initialized: current node (nodeID) is now a manager. + +To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. + +To unlock a swarm manager after it restarts, run the `docker swarm unlock` +command and provide the following key: + + unlock-key + +Please remember to store this key in a password manager, since without it you +will not be able to restart the manager. diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/init-init.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/init-init.golden new file mode 100644 index 000000000..6e82be010 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/init-init.golden @@ -0,0 +1,4 @@ +Swarm initialized: current node (nodeID) is now a manager. + +To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. + diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-manager-quiet.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-manager-quiet.golden new file mode 100644 index 000000000..0c7cfc608 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-manager-quiet.golden @@ -0,0 +1 @@ +manager-join-token diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-manager-rotate.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-manager-rotate.golden new file mode 100644 index 000000000..7ee455bec --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-manager-rotate.golden @@ -0,0 +1,8 @@ +Successfully rotated manager join token. + +To add a manager to this swarm, run the following command: + + docker swarm join \ + --token manager-join-token \ + 127.0.0.1 + diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-manager.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-manager.golden new file mode 100644 index 000000000..d56527aa5 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-manager.golden @@ -0,0 +1,6 @@ +To add a manager to this swarm, run the following command: + + docker swarm join \ + --token manager-join-token \ + 127.0.0.1 + diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-worker-quiet.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-worker-quiet.golden new file mode 100644 index 000000000..b445e191e --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-worker-quiet.golden @@ -0,0 +1 @@ +worker-join-token diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-worker.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-worker.golden new file mode 100644 index 000000000..5d44f3dae --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/jointoken-worker.golden @@ -0,0 +1,6 @@ +To add a worker to this swarm, run the following command: + + docker swarm join \ + --token worker-join-token \ + 127.0.0.1 + diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key-quiet.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key-quiet.golden new file mode 100644 index 000000000..ed53505e2 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key-quiet.golden @@ -0,0 +1 @@ +unlock-key diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key-rotate-quiet.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key-rotate-quiet.golden new file mode 100644 index 000000000..ed53505e2 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key-rotate-quiet.golden @@ -0,0 +1 @@ +unlock-key diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key-rotate.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key-rotate.golden new file mode 100644 index 000000000..89152b864 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key-rotate.golden @@ -0,0 +1,9 @@ +Successfully rotated manager unlock key. + +To unlock a swarm manager after it restarts, run the `docker swarm unlock` +command and provide the following key: + + unlock-key + +Please remember to store this key in a password manager, since without it you +will not be able to restart the manager. diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key.golden new file mode 100644 index 000000000..8316df478 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/unlockkeys-unlock-key.golden @@ -0,0 +1,7 @@ +To unlock a swarm manager after it restarts, run the `docker swarm unlock` +command and provide the following key: + + unlock-key + +Please remember to store this key in a password manager, since without it you +will not be able to restart the manager. diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/update-all-flags-quiet.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/update-all-flags-quiet.golden new file mode 100644 index 000000000..3d195a258 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/update-all-flags-quiet.golden @@ -0,0 +1 @@ +Swarm updated. diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/update-autolock-unlock-key.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/update-autolock-unlock-key.golden new file mode 100644 index 000000000..a077b9e16 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/update-autolock-unlock-key.golden @@ -0,0 +1,8 @@ +Swarm updated. +To unlock a swarm manager after it restarts, run the `docker swarm unlock` +command and provide the following key: + + unlock-key + +Please remember to store this key in a password manager, since without it you +will not be able to restart the manager. diff --git a/vendor/github.com/docker/docker/cli/command/swarm/testdata/update-noargs.golden b/vendor/github.com/docker/docker/cli/command/swarm/testdata/update-noargs.golden new file mode 100644 index 000000000..381c0ccf1 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/testdata/update-noargs.golden @@ -0,0 +1,13 @@ +Update the swarm + +Usage: + update [OPTIONS] [flags] + +Flags: + --autolock Change manager autolocking setting (true|false) + --cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s) + --dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s) + --external-ca external-ca Specifications of one or more certificate signing endpoints + --max-snapshots uint Number of additional Raft snapshots to retain + --snapshot-interval uint Number of log entries between Raft snapshots (default 10000) + --task-history-limit int Task history retention limit (default 5) diff --git a/vendor/github.com/docker/docker/cli/command/swarm/unlock.go b/vendor/github.com/docker/docker/cli/command/swarm/unlock.go index aa752e214..45dd6e79e 100644 --- a/vendor/github.com/docker/docker/cli/command/swarm/unlock.go +++ b/vendor/github.com/docker/docker/cli/command/swarm/unlock.go @@ -18,7 +18,7 @@ import ( type unlockOptions struct{} -func newUnlockCommand(dockerCli *command.DockerCli) *cobra.Command { +func newUnlockCommand(dockerCli command.Cli) *cobra.Command { opts := unlockOptions{} cmd := &cobra.Command{ @@ -33,7 +33,7 @@ func newUnlockCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } -func runUnlock(dockerCli *command.DockerCli, opts unlockOptions) error { +func runUnlock(dockerCli command.Cli, opts unlockOptions) error { client := dockerCli.Client() ctx := context.Background() diff --git a/vendor/github.com/docker/docker/cli/command/swarm/unlock_key.go b/vendor/github.com/docker/docker/cli/command/swarm/unlock_key.go index e571e6645..77c97d88e 100644 --- a/vendor/github.com/docker/docker/cli/command/swarm/unlock_key.go +++ b/vendor/github.com/docker/docker/cli/command/swarm/unlock_key.go @@ -3,12 +3,11 @@ package swarm import ( "fmt" - "github.com/spf13/cobra" - "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/cli" "github.com/docker/docker/cli/command" "github.com/pkg/errors" + "github.com/spf13/cobra" "golang.org/x/net/context" ) @@ -17,7 +16,7 @@ type unlockKeyOptions struct { quiet bool } -func newUnlockKeyCommand(dockerCli *command.DockerCli) *cobra.Command { +func newUnlockKeyCommand(dockerCli command.Cli) *cobra.Command { opts := unlockKeyOptions{} cmd := &cobra.Command{ @@ -36,7 +35,7 @@ func newUnlockKeyCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } -func runUnlockKey(dockerCli *command.DockerCli, opts unlockKeyOptions) error { +func runUnlockKey(dockerCli command.Cli, opts unlockKeyOptions) error { client := dockerCli.Client() ctx := context.Background() @@ -79,7 +78,7 @@ func runUnlockKey(dockerCli *command.DockerCli, opts unlockKeyOptions) error { return nil } -func printUnlockCommand(ctx context.Context, dockerCli *command.DockerCli, unlockKey string) { +func printUnlockCommand(ctx context.Context, dockerCli command.Cli, unlockKey string) { if len(unlockKey) > 0 { fmt.Fprintf(dockerCli.Out(), "To unlock a swarm manager after it restarts, run the `docker swarm unlock`\ncommand and provide the following key:\n\n %s\n\nPlease remember to store this key in a password manager, since without it you\nwill not be able to restart the manager.\n", unlockKey) } diff --git a/vendor/github.com/docker/docker/cli/command/swarm/unlock_key_test.go b/vendor/github.com/docker/docker/cli/command/swarm/unlock_key_test.go new file mode 100644 index 000000000..17a07d3fb --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/unlock_key_test.go @@ -0,0 +1,175 @@ +package swarm + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + // Import builders to get the builder function as package function + . "github.com/docker/docker/cli/internal/test/builders" + "github.com/docker/docker/pkg/testutil/assert" + "github.com/docker/docker/pkg/testutil/golden" +) + +func TestSwarmUnlockKeyErrors(t *testing.T) { + testCases := []struct { + name string + args []string + flags map[string]string + swarmInspectFunc func() (swarm.Swarm, error) + swarmUpdateFunc func(swarm swarm.Spec, flags swarm.UpdateFlags) error + swarmGetUnlockKeyFunc func() (types.SwarmUnlockKeyResponse, error) + expectedError string + }{ + { + name: "too-many-args", + args: []string{"foo"}, + expectedError: "accepts no argument(s)", + }, + { + name: "swarm-inspect-rotate-failed", + flags: map[string]string{ + flagRotate: "true", + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return swarm.Swarm{}, fmt.Errorf("error inspecting the swarm") + }, + expectedError: "error inspecting the swarm", + }, + { + name: "swarm-rotate-no-autolock-failed", + flags: map[string]string{ + flagRotate: "true", + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(), nil + }, + expectedError: "cannot rotate because autolock is not turned on", + }, + { + name: "swarm-update-failed", + flags: map[string]string{ + flagRotate: "true", + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(Autolock()), nil + }, + swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error { + return fmt.Errorf("error updating the swarm") + }, + expectedError: "error updating the swarm", + }, + { + name: "swarm-get-unlock-key-failed", + swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) { + return types.SwarmUnlockKeyResponse{}, fmt.Errorf("error getting unlock key") + }, + expectedError: "error getting unlock key", + }, + { + name: "swarm-no-unlock-key-failed", + swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) { + return types.SwarmUnlockKeyResponse{ + UnlockKey: "", + }, nil + }, + expectedError: "no unlock key is set", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newUnlockKeyCommand( + test.NewFakeCli(&fakeClient{ + swarmInspectFunc: tc.swarmInspectFunc, + swarmUpdateFunc: tc.swarmUpdateFunc, + swarmGetUnlockKeyFunc: tc.swarmGetUnlockKeyFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestSwarmUnlockKey(t *testing.T) { + testCases := []struct { + name string + args []string + flags map[string]string + swarmInspectFunc func() (swarm.Swarm, error) + swarmUpdateFunc func(swarm swarm.Spec, flags swarm.UpdateFlags) error + swarmGetUnlockKeyFunc func() (types.SwarmUnlockKeyResponse, error) + }{ + { + name: "unlock-key", + swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) { + return types.SwarmUnlockKeyResponse{ + UnlockKey: "unlock-key", + }, nil + }, + }, + { + name: "unlock-key-quiet", + flags: map[string]string{ + flagQuiet: "true", + }, + swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) { + return types.SwarmUnlockKeyResponse{ + UnlockKey: "unlock-key", + }, nil + }, + }, + { + name: "unlock-key-rotate", + flags: map[string]string{ + flagRotate: "true", + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(Autolock()), nil + }, + swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) { + return types.SwarmUnlockKeyResponse{ + UnlockKey: "unlock-key", + }, nil + }, + }, + { + name: "unlock-key-rotate-quiet", + flags: map[string]string{ + flagQuiet: "true", + flagRotate: "true", + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(Autolock()), nil + }, + swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) { + return types.SwarmUnlockKeyResponse{ + UnlockKey: "unlock-key", + }, nil + }, + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newUnlockKeyCommand( + test.NewFakeCli(&fakeClient{ + swarmInspectFunc: tc.swarmInspectFunc, + swarmUpdateFunc: tc.swarmUpdateFunc, + swarmGetUnlockKeyFunc: tc.swarmGetUnlockKeyFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + assert.NilError(t, cmd.Execute()) + actual := buf.String() + expected := golden.Get(t, []byte(actual), fmt.Sprintf("unlockkeys-%s.golden", tc.name)) + assert.EqualNormalizedString(t, assert.RemoveSpace, actual, string(expected)) + } +} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/unlock_test.go b/vendor/github.com/docker/docker/cli/command/swarm/unlock_test.go new file mode 100644 index 000000000..abf858a28 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/unlock_test.go @@ -0,0 +1,101 @@ +package swarm + +import ( + "bytes" + "fmt" + "io/ioutil" + "strings" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + "github.com/docker/docker/pkg/testutil/assert" +) + +func TestSwarmUnlockErrors(t *testing.T) { + testCases := []struct { + name string + args []string + input string + swarmUnlockFunc func(req swarm.UnlockRequest) error + infoFunc func() (types.Info, error) + expectedError string + }{ + { + name: "too-many-args", + args: []string{"foo"}, + expectedError: "accepts no argument(s)", + }, + { + name: "is-not-part-of-a-swarm", + infoFunc: func() (types.Info, error) { + return types.Info{ + Swarm: swarm.Info{ + LocalNodeState: swarm.LocalNodeStateInactive, + }, + }, nil + }, + expectedError: "This node is not part of a swarm", + }, + { + name: "is-not-locked", + infoFunc: func() (types.Info, error) { + return types.Info{ + Swarm: swarm.Info{ + LocalNodeState: swarm.LocalNodeStateActive, + }, + }, nil + }, + expectedError: "Error: swarm is not locked", + }, + { + name: "unlockrequest-failed", + infoFunc: func() (types.Info, error) { + return types.Info{ + Swarm: swarm.Info{ + LocalNodeState: swarm.LocalNodeStateLocked, + }, + }, nil + }, + swarmUnlockFunc: func(req swarm.UnlockRequest) error { + return fmt.Errorf("error unlocking the swarm") + }, + expectedError: "error unlocking the swarm", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newUnlockCommand( + test.NewFakeCli(&fakeClient{ + infoFunc: tc.infoFunc, + swarmUnlockFunc: tc.swarmUnlockFunc, + }, buf)) + cmd.SetArgs(tc.args) + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestSwarmUnlock(t *testing.T) { + input := "unlockKey" + buf := new(bytes.Buffer) + dockerCli := test.NewFakeCli(&fakeClient{ + infoFunc: func() (types.Info, error) { + return types.Info{ + Swarm: swarm.Info{ + LocalNodeState: swarm.LocalNodeStateLocked, + }, + }, nil + }, + swarmUnlockFunc: func(req swarm.UnlockRequest) error { + if req.UnlockKey != input { + return fmt.Errorf("Invalid unlock key") + } + return nil + }, + }, buf) + dockerCli.SetIn(ioutil.NopCloser(strings.NewReader(input))) + cmd := newUnlockCommand(dockerCli) + assert.NilError(t, cmd.Execute()) +} diff --git a/vendor/github.com/docker/docker/cli/command/swarm/update.go b/vendor/github.com/docker/docker/cli/command/swarm/update.go index dbbd26872..1ccd268e7 100644 --- a/vendor/github.com/docker/docker/cli/command/swarm/update.go +++ b/vendor/github.com/docker/docker/cli/command/swarm/update.go @@ -13,7 +13,7 @@ import ( "github.com/spf13/pflag" ) -func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command { +func newUpdateCommand(dockerCli command.Cli) *cobra.Command { opts := swarmOptions{} cmd := &cobra.Command{ @@ -36,24 +36,24 @@ func newUpdateCommand(dockerCli *command.DockerCli) *cobra.Command { return cmd } -func runUpdate(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts swarmOptions) error { +func runUpdate(dockerCli command.Cli, flags *pflag.FlagSet, opts swarmOptions) error { client := dockerCli.Client() ctx := context.Background() var updateFlags swarm.UpdateFlags - swarm, err := client.SwarmInspect(ctx) + swarmInspect, err := client.SwarmInspect(ctx) if err != nil { return err } - prevAutoLock := swarm.Spec.EncryptionConfig.AutoLockManagers + prevAutoLock := swarmInspect.Spec.EncryptionConfig.AutoLockManagers - opts.mergeSwarmSpec(&swarm.Spec, flags) + opts.mergeSwarmSpec(&swarmInspect.Spec, flags) - curAutoLock := swarm.Spec.EncryptionConfig.AutoLockManagers + curAutoLock := swarmInspect.Spec.EncryptionConfig.AutoLockManagers - err = client.SwarmUpdate(ctx, swarm.Version, swarm.Spec, updateFlags) + err = client.SwarmUpdate(ctx, swarmInspect.Version, swarmInspect.Spec, updateFlags) if err != nil { return err } diff --git a/vendor/github.com/docker/docker/cli/command/swarm/update_test.go b/vendor/github.com/docker/docker/cli/command/swarm/update_test.go new file mode 100644 index 000000000..c8a2860a0 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/command/swarm/update_test.go @@ -0,0 +1,182 @@ +package swarm + +import ( + "bytes" + "fmt" + "io/ioutil" + "testing" + "time" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/cli/internal/test" + // Import builders to get the builder function as package function + . "github.com/docker/docker/cli/internal/test/builders" + "github.com/docker/docker/pkg/testutil/assert" + "github.com/docker/docker/pkg/testutil/golden" +) + +func TestSwarmUpdateErrors(t *testing.T) { + testCases := []struct { + name string + args []string + flags map[string]string + swarmInspectFunc func() (swarm.Swarm, error) + swarmUpdateFunc func(swarm swarm.Spec, flags swarm.UpdateFlags) error + swarmGetUnlockKeyFunc func() (types.SwarmUnlockKeyResponse, error) + expectedError string + }{ + { + name: "too-many-args", + args: []string{"foo"}, + expectedError: "accepts no argument(s)", + }, + { + name: "swarm-inspect-error", + flags: map[string]string{ + flagTaskHistoryLimit: "10", + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return swarm.Swarm{}, fmt.Errorf("error inspecting the swarm") + }, + expectedError: "error inspecting the swarm", + }, + { + name: "swarm-update-error", + flags: map[string]string{ + flagTaskHistoryLimit: "10", + }, + swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error { + return fmt.Errorf("error updating the swarm") + }, + expectedError: "error updating the swarm", + }, + { + name: "swarm-unlockkey-error", + flags: map[string]string{ + flagAutolock: "true", + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(), nil + }, + swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) { + return types.SwarmUnlockKeyResponse{}, fmt.Errorf("error getting unlock key") + }, + expectedError: "error getting unlock key", + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newUpdateCommand( + test.NewFakeCli(&fakeClient{ + swarmInspectFunc: tc.swarmInspectFunc, + swarmUpdateFunc: tc.swarmUpdateFunc, + swarmGetUnlockKeyFunc: tc.swarmGetUnlockKeyFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + cmd.SetOutput(ioutil.Discard) + assert.Error(t, cmd.Execute(), tc.expectedError) + } +} + +func TestSwarmUpdate(t *testing.T) { + testCases := []struct { + name string + args []string + flags map[string]string + swarmInspectFunc func() (swarm.Swarm, error) + swarmUpdateFunc func(swarm swarm.Spec, flags swarm.UpdateFlags) error + swarmGetUnlockKeyFunc func() (types.SwarmUnlockKeyResponse, error) + }{ + { + name: "noargs", + }, + { + name: "all-flags-quiet", + flags: map[string]string{ + flagTaskHistoryLimit: "10", + flagDispatcherHeartbeat: "10s", + flagCertExpiry: "20s", + flagExternalCA: "protocol=cfssl,url=https://example.com.", + flagMaxSnapshots: "10", + flagSnapshotInterval: "100", + flagAutolock: "true", + flagQuiet: "true", + }, + swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error { + if *swarm.Orchestration.TaskHistoryRetentionLimit != 10 { + return fmt.Errorf("historyLimit not correctly set") + } + heartbeatDuration, err := time.ParseDuration("10s") + if err != nil { + return err + } + if swarm.Dispatcher.HeartbeatPeriod != heartbeatDuration { + return fmt.Errorf("heartbeatPeriodLimit not correctly set") + } + certExpiryDuration, err := time.ParseDuration("20s") + if err != nil { + return err + } + if swarm.CAConfig.NodeCertExpiry != certExpiryDuration { + return fmt.Errorf("certExpiry not correctly set") + } + if len(swarm.CAConfig.ExternalCAs) != 1 { + return fmt.Errorf("externalCA not correctly set") + } + if *swarm.Raft.KeepOldSnapshots != 10 { + return fmt.Errorf("keepOldSnapshots not correctly set") + } + if swarm.Raft.SnapshotInterval != 100 { + return fmt.Errorf("snapshotInterval not correctly set") + } + if !swarm.EncryptionConfig.AutoLockManagers { + return fmt.Errorf("autolock not correctly set") + } + return nil + }, + }, + { + name: "autolock-unlock-key", + flags: map[string]string{ + flagTaskHistoryLimit: "10", + flagAutolock: "true", + }, + swarmUpdateFunc: func(swarm swarm.Spec, flags swarm.UpdateFlags) error { + if *swarm.Orchestration.TaskHistoryRetentionLimit != 10 { + return fmt.Errorf("historyLimit not correctly set") + } + return nil + }, + swarmInspectFunc: func() (swarm.Swarm, error) { + return *Swarm(), nil + }, + swarmGetUnlockKeyFunc: func() (types.SwarmUnlockKeyResponse, error) { + return types.SwarmUnlockKeyResponse{ + UnlockKey: "unlock-key", + }, nil + }, + }, + } + for _, tc := range testCases { + buf := new(bytes.Buffer) + cmd := newUpdateCommand( + test.NewFakeCli(&fakeClient{ + swarmInspectFunc: tc.swarmInspectFunc, + swarmUpdateFunc: tc.swarmUpdateFunc, + swarmGetUnlockKeyFunc: tc.swarmGetUnlockKeyFunc, + }, buf)) + cmd.SetArgs(tc.args) + for key, value := range tc.flags { + cmd.Flags().Set(key, value) + } + cmd.SetOutput(buf) + assert.NilError(t, cmd.Execute()) + actual := buf.String() + expected := golden.Get(t, []byte(actual), fmt.Sprintf("update-%s.golden", tc.name)) + assert.EqualNormalizedString(t, assert.RemoveSpace, actual, string(expected)) + } +} diff --git a/vendor/github.com/docker/docker/cli/command/system/prune.go b/vendor/github.com/docker/docker/cli/command/system/prune.go index 92dddbdca..46e4316f4 100644 --- a/vendor/github.com/docker/docker/cli/command/system/prune.go +++ b/vendor/github.com/docker/docker/cli/command/system/prune.go @@ -6,18 +6,20 @@ import ( "github.com/docker/docker/cli" "github.com/docker/docker/cli/command" "github.com/docker/docker/cli/command/prune" + "github.com/docker/docker/opts" units "github.com/docker/go-units" "github.com/spf13/cobra" ) type pruneOptions struct { - force bool - all bool + force bool + all bool + filter opts.FilterOpt } // NewPruneCommand creates a new cobra.Command for `docker prune` func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { - var opts pruneOptions + opts := pruneOptions{filter: opts.NewFilterOpt()} cmd := &cobra.Command{ Use: "prune [OPTIONS]", @@ -32,6 +34,7 @@ func NewPruneCommand(dockerCli *command.DockerCli) *cobra.Command { flags := cmd.Flags() flags.BoolVarP(&opts.force, "force", "f", false, "Do not prompt for confirmation") flags.BoolVarP(&opts.all, "all", "a", false, "Remove all unused images not just dangling ones") + flags.Var(&opts.filter, "filter", "Provide filter values (e.g. 'until=')") return cmd } @@ -48,27 +51,27 @@ Are you sure you want to continue?` allImageDesc = `- all images without at least one container associated to them` ) -func runPrune(dockerCli *command.DockerCli, opts pruneOptions) error { +func runPrune(dockerCli *command.DockerCli, options pruneOptions) error { var message string - if opts.all { + if options.all { message = fmt.Sprintf(warning, allImageDesc) } else { message = fmt.Sprintf(warning, danglingImageDesc) } - if !opts.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), message) { + if !options.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), message) { return nil } var spaceReclaimed uint64 - for _, pruneFn := range []func(dockerCli *command.DockerCli) (uint64, string, error){ + for _, pruneFn := range []func(dockerCli *command.DockerCli, filter opts.FilterOpt) (uint64, string, error){ prune.RunContainerPrune, prune.RunVolumePrune, prune.RunNetworkPrune, } { - spc, output, err := pruneFn(dockerCli) + spc, output, err := pruneFn(dockerCli, options.filter) if err != nil { return err } @@ -78,7 +81,7 @@ func runPrune(dockerCli *command.DockerCli, opts pruneOptions) error { } } - spc, output, err := prune.RunImagePrune(dockerCli, opts.all) + spc, output, err := prune.RunImagePrune(dockerCli, options.all, options.filter) if err != nil { return err } diff --git a/vendor/github.com/docker/docker/cli/command/task/print.go b/vendor/github.com/docker/docker/cli/command/task/print.go index 57c4e0c8c..60a2bca85 100644 --- a/vendor/github.com/docker/docker/cli/command/task/print.go +++ b/vendor/github.com/docker/docker/cli/command/task/print.go @@ -61,7 +61,7 @@ func (t tasksBySlot) Less(i, j int) bool { // Print task information in a table format. // Besides this, command `docker node ps ` // and `docker stack ps` will call this, too. -func Print(dockerCli *command.DockerCli, ctx context.Context, tasks []swarm.Task, resolver *idresolver.IDResolver, noTrunc bool) error { +func Print(dockerCli command.Cli, ctx context.Context, tasks []swarm.Task, resolver *idresolver.IDResolver, noTrunc bool) error { sort.Stable(tasksBySlot(tasks)) writer := tabwriter.NewWriter(dockerCli.Out(), 0, 4, 2, ' ', 0) @@ -74,7 +74,7 @@ func Print(dockerCli *command.DockerCli, ctx context.Context, tasks []swarm.Task } // PrintQuiet shows task list in a quiet way. -func PrintQuiet(dockerCli *command.DockerCli, tasks []swarm.Task) error { +func PrintQuiet(dockerCli command.Cli, tasks []swarm.Task) error { sort.Stable(tasksBySlot(tasks)) out := dockerCli.Out() diff --git a/vendor/github.com/docker/docker/cli/command/volume/cmd.go b/vendor/github.com/docker/docker/cli/command/volume/cmd.go index 40862f29d..2bc768775 100644 --- a/vendor/github.com/docker/docker/cli/command/volume/cmd.go +++ b/vendor/github.com/docker/docker/cli/command/volume/cmd.go @@ -12,7 +12,6 @@ func NewVolumeCommand(dockerCli *command.DockerCli) *cobra.Command { cmd := &cobra.Command{ Use: "volume COMMAND", Short: "Manage volumes", - Long: volumeDescription, Args: cli.NoArgs, RunE: dockerCli.ShowHelp, } @@ -25,21 +24,3 @@ func NewVolumeCommand(dockerCli *command.DockerCli) *cobra.Command { ) return cmd } - -var volumeDescription = ` -The **docker volume** command has subcommands for managing data volumes. A data -volume is a specially-designated directory that by-passes storage driver -management. - -Data volumes persist data independent of a container's life cycle. When you -delete a container, the Docker daemon does not delete any data volumes. You can -share volumes across multiple containers. Moreover, you can share data volumes -with other computing resources in your system. - -To see help for a subcommand, use: - - docker volume COMMAND --help - -For full details on using docker volume visit Docker's online documentation. - -` diff --git a/vendor/github.com/docker/docker/cli/command/volume/create.go b/vendor/github.com/docker/docker/cli/command/volume/create.go index ce4e5e2e8..21cfa84b7 100644 --- a/vendor/github.com/docker/docker/cli/command/volume/create.go +++ b/vendor/github.com/docker/docker/cli/command/volume/create.go @@ -28,7 +28,6 @@ func newCreateCommand(dockerCli *command.DockerCli) *cobra.Command { cmd := &cobra.Command{ Use: "create [OPTIONS] [VOLUME]", Short: "Create a volume", - Long: createDescription, Args: cli.RequiresMaxArgs(1), RunE: func(cmd *cobra.Command, args []string) error { if len(args) == 1 { @@ -69,42 +68,3 @@ func runCreate(dockerCli *command.DockerCli, opts createOptions) error { fmt.Fprintf(dockerCli.Out(), "%s\n", vol.Name) return nil } - -var createDescription = ` -Creates a new volume that containers can consume and store data in. If a name -is not specified, Docker generates a random name. You create a volume and then -configure the container to use it, for example: - - $ docker volume create hello - hello - $ docker run -d -v hello:/world busybox ls /world - -The mount is created inside the container's **/src** directory. Docker doesn't -not support relative paths for mount points inside the container. - -Multiple containers can use the same volume in the same time period. This is -useful if two containers need access to shared data. For example, if one -container writes and the other reads the data. - -## Driver specific options - -Some volume drivers may take options to customize the volume creation. Use the -**-o** or **--opt** flags to pass driver options: - - $ docker volume create --driver fake --opt tardis=blue --opt timey=wimey - -These options are passed directly to the volume driver. Options for different -volume drivers may do different things (or nothing at all). - -The built-in **local** driver on Windows does not support any options. - -The built-in **local** driver on Linux accepts options similar to the linux -**mount** command: - - $ docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m,uid=1000 - -Another example: - - $ docker volume create --driver local --opt type=btrfs --opt device=/dev/sda2 - -` diff --git a/vendor/github.com/docker/docker/cli/command/volume/inspect.go b/vendor/github.com/docker/docker/cli/command/volume/inspect.go index 5eb8ad251..f58b927ac 100644 --- a/vendor/github.com/docker/docker/cli/command/volume/inspect.go +++ b/vendor/github.com/docker/docker/cli/command/volume/inspect.go @@ -20,7 +20,6 @@ func newInspectCommand(dockerCli *command.DockerCli) *cobra.Command { cmd := &cobra.Command{ Use: "inspect [OPTIONS] VOLUME [VOLUME...]", Short: "Display detailed information on one or more volumes", - Long: inspectDescription, Args: cli.RequiresMinArgs(1), RunE: func(cmd *cobra.Command, args []string) error { opts.names = args @@ -45,11 +44,3 @@ func runInspect(dockerCli *command.DockerCli, opts inspectOptions) error { return inspect.Inspect(dockerCli.Out(), opts.names, opts.format, getVolFunc) } - -var inspectDescription = ` -Returns information about one or more volumes. By default, this command renders -all results in a JSON array. You can specify an alternate format to execute a -given template is executed for each result. Go's https://golang.org/pkg/text/template/ -package describes all the details of the format. - -` diff --git a/vendor/github.com/docker/docker/cli/command/volume/list.go b/vendor/github.com/docker/docker/cli/command/volume/list.go index d76006a1b..0de83aea4 100644 --- a/vendor/github.com/docker/docker/cli/command/volume/list.go +++ b/vendor/github.com/docker/docker/cli/command/volume/list.go @@ -34,7 +34,6 @@ func newListCommand(dockerCli *command.DockerCli) *cobra.Command { Use: "ls [OPTIONS]", Aliases: []string{"list"}, Short: "List volumes", - Long: listDescription, Args: cli.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { return runList(dockerCli, opts) @@ -73,19 +72,3 @@ func runList(dockerCli *command.DockerCli, opts listOptions) error { } return formatter.VolumeWrite(volumeCtx, volumes.Volumes) } - -var listDescription = ` - -Lists all the volumes Docker manages. You can filter using the **-f** or -**--filter** flag. The filtering format is a **key=value** pair. To specify -more than one filter, pass multiple flags (for example, -**--filter "foo=bar" --filter "bif=baz"**) - -The currently supported filters are: - -* **dangling** (boolean - **true** or **false**, **1** or **0**) -* **driver** (a volume driver's name) -* **label** (**label=** or **label==**) -* **name** (a volume's name) - -` diff --git a/vendor/github.com/docker/docker/cli/compose/convert/compose.go b/vendor/github.com/docker/docker/cli/compose/convert/compose.go index 7c410844c..70c1762a4 100644 --- a/vendor/github.com/docker/docker/cli/compose/convert/compose.go +++ b/vendor/github.com/docker/docker/cli/compose/convert/compose.go @@ -43,20 +43,15 @@ func AddStackLabel(namespace Namespace, labels map[string]string) map[string]str type networkMap map[string]composetypes.NetworkConfig // Networks from the compose-file type to the engine API type -func Networks(namespace Namespace, networks networkMap) (map[string]types.NetworkCreate, []string) { +func Networks(namespace Namespace, networks networkMap, servicesNetworks map[string]struct{}) (map[string]types.NetworkCreate, []string) { if networks == nil { networks = make(map[string]composetypes.NetworkConfig) } - // TODO: only add default network if it's used - if _, ok := networks["default"]; !ok { - networks["default"] = composetypes.NetworkConfig{} - } - externalNetworks := []string{} result := make(map[string]types.NetworkCreate) - - for internalName, network := range networks { + for internalName := range servicesNetworks { + network := networks[internalName] if network.External.External { externalNetworks = append(externalNetworks, network.External.Name) continue diff --git a/vendor/github.com/docker/docker/cli/compose/convert/compose_test.go b/vendor/github.com/docker/docker/cli/compose/convert/compose_test.go index 27a67047d..d88ac7f7c 100644 --- a/vendor/github.com/docker/docker/cli/compose/convert/compose_test.go +++ b/vendor/github.com/docker/docker/cli/compose/convert/compose_test.go @@ -28,6 +28,11 @@ func TestAddStackLabel(t *testing.T) { func TestNetworks(t *testing.T) { namespace := Namespace{name: "foo"} + serviceNetworks := map[string]struct{}{ + "normal": {}, + "outside": {}, + "default": {}, + } source := networkMap{ "normal": composetypes.NetworkConfig{ Driver: "overlay", @@ -79,7 +84,7 @@ func TestNetworks(t *testing.T) { }, } - networks, externals := Networks(namespace, source) + networks, externals := Networks(namespace, source, serviceNetworks) assert.DeepEqual(t, networks, expected) assert.DeepEqual(t, externals, []string{"special"}) } diff --git a/vendor/github.com/docker/docker/cli/compose/convert/service.go b/vendor/github.com/docker/docker/cli/compose/convert/service.go index 2a8ed8288..37f3ece40 100644 --- a/vendor/github.com/docker/docker/cli/compose/convert/service.go +++ b/vendor/github.com/docker/docker/cli/compose/convert/service.go @@ -263,10 +263,14 @@ func convertUpdateConfig(source *composetypes.UpdateConfig) *swarm.UpdateConfig func convertResources(source composetypes.Resources) (*swarm.ResourceRequirements, error) { resources := &swarm.ResourceRequirements{} + var err error if source.Limits != nil { - cpus, err := opts.ParseCPUs(source.Limits.NanoCPUs) - if err != nil { - return nil, err + var cpus int64 + if source.Limits.NanoCPUs != "" { + cpus, err = opts.ParseCPUs(source.Limits.NanoCPUs) + if err != nil { + return nil, err + } } resources.Limits = &swarm.Resources{ NanoCPUs: cpus, @@ -274,9 +278,12 @@ func convertResources(source composetypes.Resources) (*swarm.ResourceRequirement } } if source.Reservations != nil { - cpus, err := opts.ParseCPUs(source.Reservations.NanoCPUs) - if err != nil { - return nil, err + var cpus int64 + if source.Reservations.NanoCPUs != "" { + cpus, err = opts.ParseCPUs(source.Reservations.NanoCPUs) + if err != nil { + return nil, err + } } resources.Reservations = &swarm.Resources{ NanoCPUs: cpus, diff --git a/vendor/github.com/docker/docker/cli/compose/convert/service_test.go b/vendor/github.com/docker/docker/cli/compose/convert/service_test.go index 45da76432..2e614d730 100644 --- a/vendor/github.com/docker/docker/cli/compose/convert/service_test.go +++ b/vendor/github.com/docker/docker/cli/compose/convert/service_test.go @@ -80,6 +80,29 @@ func TestConvertResourcesFull(t *testing.T) { assert.DeepEqual(t, resources, expected) } +func TestConvertResourcesOnlyMemory(t *testing.T) { + source := composetypes.Resources{ + Limits: &composetypes.Resource{ + MemoryBytes: composetypes.UnitBytes(300000000), + }, + Reservations: &composetypes.Resource{ + MemoryBytes: composetypes.UnitBytes(200000000), + }, + } + resources, err := convertResources(source) + assert.NilError(t, err) + + expected := &swarm.ResourceRequirements{ + Limits: &swarm.Resources{ + MemoryBytes: 300000000, + }, + Reservations: &swarm.Resources{ + MemoryBytes: 200000000, + }, + } + assert.DeepEqual(t, resources, expected) +} + func TestConvertHealthcheck(t *testing.T) { retries := uint64(10) source := &composetypes.HealthCheckConfig{ diff --git a/vendor/github.com/docker/docker/cli/compose/schema/bindata.go b/vendor/github.com/docker/docker/cli/compose/schema/bindata.go index 2acc7d29f..c3774130b 100644 --- a/vendor/github.com/docker/docker/cli/compose/schema/bindata.go +++ b/vendor/github.com/docker/docker/cli/compose/schema/bindata.go @@ -182,6 +182,7 @@ type bintree struct { Func func() (*asset, error) Children map[string]*bintree } + var _bintree = &bintree{nil, map[string]*bintree{ "data": &bintree{nil, map[string]*bintree{ "config_schema_v3.0.json": &bintree{dataConfig_schema_v30Json, map[string]*bintree{}}, @@ -234,4 +235,3 @@ func _filePath(dir, name string) string { cannonicalName := strings.Replace(name, "\\", "/", -1) return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) } - diff --git a/vendor/github.com/docker/docker/cli/compose/types/types.go b/vendor/github.com/docker/docker/cli/compose/types/types.go index 45923b346..5244bd116 100644 --- a/vendor/github.com/docker/docker/cli/compose/types/types.go +++ b/vendor/github.com/docker/docker/cli/compose/types/types.go @@ -38,7 +38,7 @@ var DeprecatedProperties = map[string]string{ // ForbiddenProperties that are not supported in this implementation of the // compose file. var ForbiddenProperties = map[string]string{ - "extends": "Support for `extends` is not implemented yet. Use `docker-compose config` to generate a configuration with all `extends` options resolved, and deploy from that.", + "extends": "Support for `extends` is not implemented yet.", "volume_driver": "Instead of setting the volume driver on the service, define a volume using the top-level `volumes` option and specify the driver there.", "volumes_from": "To share a volume between services, define it using the top-level `volumes` option and reference it from each service that shares it using the service-level `volumes` option.", "cpu_quota": "Set resource limits using deploy.resources", diff --git a/vendor/github.com/docker/docker/cli/flags/common.go b/vendor/github.com/docker/docker/cli/flags/common.go index 9d3245c99..af2fe0603 100644 --- a/vendor/github.com/docker/docker/cli/flags/common.go +++ b/vendor/github.com/docker/docker/cli/flags/common.go @@ -59,11 +59,15 @@ func (commonOpts *CommonOptions) InstallFlags(flags *pflag.FlagSet) { // TODO use flag flags.String("identity"}, "i", "", "Path to libtrust key file") - commonOpts.TLSOptions = &tlsconfig.Options{} + commonOpts.TLSOptions = &tlsconfig.Options{ + CAFile: filepath.Join(dockerCertPath, DefaultCaFile), + CertFile: filepath.Join(dockerCertPath, DefaultCertFile), + KeyFile: filepath.Join(dockerCertPath, DefaultKeyFile), + } tlsOptions := commonOpts.TLSOptions - flags.StringVar(&tlsOptions.CAFile, "tlscacert", filepath.Join(dockerCertPath, DefaultCaFile), "Trust certs signed only by this CA") - flags.StringVar(&tlsOptions.CertFile, "tlscert", filepath.Join(dockerCertPath, DefaultCertFile), "Path to TLS certificate file") - flags.StringVar(&tlsOptions.KeyFile, "tlskey", filepath.Join(dockerCertPath, DefaultKeyFile), "Path to TLS key file") + flags.Var(opts.NewQuotedString(&tlsOptions.CAFile), "tlscacert", "Trust certs signed only by this CA") + flags.Var(opts.NewQuotedString(&tlsOptions.CertFile), "tlscert", "Path to TLS certificate file") + flags.Var(opts.NewQuotedString(&tlsOptions.KeyFile), "tlskey", "Path to TLS key file") hostOpt := opts.NewNamedListOptsRef("hosts", &commonOpts.Hosts, opts.ValidateHost) flags.VarP(hostOpt, "host", "H", "Daemon socket(s) to connect to") diff --git a/vendor/github.com/docker/docker/cli/flags/common_test.go b/vendor/github.com/docker/docker/cli/flags/common_test.go new file mode 100644 index 000000000..616d577f0 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/flags/common_test.go @@ -0,0 +1,42 @@ +package flags + +import ( + "path/filepath" + "testing" + + cliconfig "github.com/docker/docker/cli/config" + "github.com/docker/docker/pkg/testutil/assert" + "github.com/spf13/pflag" +) + +func TestCommonOptionsInstallFlags(t *testing.T) { + flags := pflag.NewFlagSet("testing", pflag.ContinueOnError) + opts := NewCommonOptions() + opts.InstallFlags(flags) + + err := flags.Parse([]string{ + "--tlscacert=\"/foo/cafile\"", + "--tlscert=\"/foo/cert\"", + "--tlskey=\"/foo/key\"", + }) + assert.NilError(t, err) + assert.Equal(t, opts.TLSOptions.CAFile, "/foo/cafile") + assert.Equal(t, opts.TLSOptions.CertFile, "/foo/cert") + assert.Equal(t, opts.TLSOptions.KeyFile, "/foo/key") +} + +func defaultPath(filename string) string { + return filepath.Join(cliconfig.Dir(), filename) +} + +func TestCommonOptionsInstallFlagsWithDefaults(t *testing.T) { + flags := pflag.NewFlagSet("testing", pflag.ContinueOnError) + opts := NewCommonOptions() + opts.InstallFlags(flags) + + err := flags.Parse([]string{}) + assert.NilError(t, err) + assert.Equal(t, opts.TLSOptions.CAFile, defaultPath("ca.pem")) + assert.Equal(t, opts.TLSOptions.CertFile, defaultPath("cert.pem")) + assert.Equal(t, opts.TLSOptions.KeyFile, defaultPath("key.pem")) +} diff --git a/vendor/github.com/docker/docker/cli/internal/test/builders/node.go b/vendor/github.com/docker/docker/cli/internal/test/builders/node.go new file mode 100644 index 000000000..63fdebba1 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/internal/test/builders/node.go @@ -0,0 +1,117 @@ +package builders + +import ( + "time" + + "github.com/docker/docker/api/types/swarm" +) + +// Node creates a node with default values. +// Any number of node function builder can be pass to augment it. +func Node(builders ...func(*swarm.Node)) *swarm.Node { + t1 := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC) + node := &swarm.Node{ + ID: "nodeID", + Meta: swarm.Meta{ + CreatedAt: t1, + }, + Description: swarm.NodeDescription{ + Hostname: "defaultNodeHostname", + Platform: swarm.Platform{ + Architecture: "x86_64", + OS: "linux", + }, + Resources: swarm.Resources{ + NanoCPUs: 4, + MemoryBytes: 20 * 1024 * 1024, + }, + Engine: swarm.EngineDescription{ + EngineVersion: "1.13.0", + Labels: map[string]string{ + "engine": "label", + }, + Plugins: []swarm.PluginDescription{ + { + Type: "Volume", + Name: "local", + }, + { + Type: "Network", + Name: "bridge", + }, + { + Type: "Network", + Name: "overlay", + }, + }, + }, + }, + Status: swarm.NodeStatus{ + State: swarm.NodeStateReady, + Addr: "127.0.0.1", + }, + Spec: swarm.NodeSpec{ + Annotations: swarm.Annotations{ + Name: "defaultNodeName", + }, + Role: swarm.NodeRoleWorker, + Availability: swarm.NodeAvailabilityActive, + }, + } + + for _, builder := range builders { + builder(node) + } + + return node +} + +// NodeID sets the node id +func NodeID(id string) func(*swarm.Node) { + return func(node *swarm.Node) { + node.ID = id + } +} + +// NodeLabels sets the node labels +func NodeLabels(labels map[string]string) func(*swarm.Node) { + return func(node *swarm.Node) { + node.Spec.Labels = labels + } +} + +// Hostname sets the node hostname +func Hostname(hostname string) func(*swarm.Node) { + return func(node *swarm.Node) { + node.Description.Hostname = hostname + } +} + +// Leader sets the current node as a leader +func Leader() func(*swarm.ManagerStatus) { + return func(managerStatus *swarm.ManagerStatus) { + managerStatus.Leader = true + } +} + +// Manager set the current node as a manager +func Manager(managerStatusBuilders ...func(*swarm.ManagerStatus)) func(*swarm.Node) { + return func(node *swarm.Node) { + node.Spec.Role = swarm.NodeRoleManager + node.ManagerStatus = ManagerStatus(managerStatusBuilders...) + } +} + +// ManagerStatus create a ManageStatus with default values. +func ManagerStatus(managerStatusBuilders ...func(*swarm.ManagerStatus)) *swarm.ManagerStatus { + managerStatus := &swarm.ManagerStatus{ + Reachability: swarm.ReachabilityReachable, + Addr: "127.0.0.1", + } + + for _, builder := range managerStatusBuilders { + builder(managerStatus) + } + + return managerStatus +} diff --git a/vendor/github.com/docker/docker/cli/internal/test/builders/swarm.go b/vendor/github.com/docker/docker/cli/internal/test/builders/swarm.go new file mode 100644 index 000000000..ab1a93062 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/internal/test/builders/swarm.go @@ -0,0 +1,39 @@ +package builders + +import ( + "time" + + "github.com/docker/docker/api/types/swarm" +) + +// Swarm creates a swarm with default values. +// Any number of swarm function builder can be pass to augment it. +func Swarm(swarmBuilders ...func(*swarm.Swarm)) *swarm.Swarm { + t1 := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC) + swarm := &swarm.Swarm{ + ClusterInfo: swarm.ClusterInfo{ + ID: "swarm", + Meta: swarm.Meta{ + CreatedAt: t1, + }, + Spec: swarm.Spec{}, + }, + JoinTokens: swarm.JoinTokens{ + Worker: "worker-join-token", + Manager: "manager-join-token", + }, + } + + for _, builder := range swarmBuilders { + builder(swarm) + } + + return swarm +} + +// Autolock set the swarm into autolock mode +func Autolock() func(*swarm.Swarm) { + return func(swarm *swarm.Swarm) { + swarm.Spec.EncryptionConfig.AutoLockManagers = true + } +} diff --git a/vendor/github.com/docker/docker/cli/internal/test/builders/task.go b/vendor/github.com/docker/docker/cli/internal/test/builders/task.go new file mode 100644 index 000000000..688c62a3a --- /dev/null +++ b/vendor/github.com/docker/docker/cli/internal/test/builders/task.go @@ -0,0 +1,111 @@ +package builders + +import ( + "time" + + "github.com/docker/docker/api/types/swarm" +) + +var ( + defaultTime = time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC) +) + +// Task creates a task with default values . +// Any number of task function builder can be pass to augment it. +func Task(taskBuilders ...func(*swarm.Task)) *swarm.Task { + task := &swarm.Task{ + ID: "taskID", + Meta: swarm.Meta{ + CreatedAt: defaultTime, + }, + Annotations: swarm.Annotations{ + Name: "defaultTaskName", + }, + Spec: *TaskSpec(), + ServiceID: "rl02d5gwz6chzu7il5fhtb8be", + Slot: 1, + Status: *TaskStatus(), + DesiredState: swarm.TaskStateReady, + } + + for _, builder := range taskBuilders { + builder(task) + } + + return task +} + +// TaskID sets the task ID +func TaskID(id string) func(*swarm.Task) { + return func(task *swarm.Task) { + task.ID = id + } +} + +// ServiceID sets the task service's ID +func ServiceID(id string) func(*swarm.Task) { + return func(task *swarm.Task) { + task.ServiceID = id + } +} + +// WithStatus sets the task status +func WithStatus(statusBuilders ...func(*swarm.TaskStatus)) func(*swarm.Task) { + return func(task *swarm.Task) { + task.Status = *TaskStatus(statusBuilders...) + } +} + +// TaskStatus creates a task status with default values . +// Any number of taskStatus function builder can be pass to augment it. +func TaskStatus(statusBuilders ...func(*swarm.TaskStatus)) *swarm.TaskStatus { + timestamp := defaultTime.Add(1 * time.Hour) + taskStatus := &swarm.TaskStatus{ + State: swarm.TaskStateReady, + Timestamp: timestamp, + } + + for _, builder := range statusBuilders { + builder(taskStatus) + } + + return taskStatus +} + +// Timestamp sets the task status timestamp +func Timestamp(t time.Time) func(*swarm.TaskStatus) { + return func(taskStatus *swarm.TaskStatus) { + taskStatus.Timestamp = t + } +} + +// StatusErr sets the tasks status error +func StatusErr(err string) func(*swarm.TaskStatus) { + return func(taskStatus *swarm.TaskStatus) { + taskStatus.Err = err + } +} + +// PortStatus sets the tasks port config status +// FIXME(vdemeester) should be a sub builder 👼 +func PortStatus(portConfigs []swarm.PortConfig) func(*swarm.TaskStatus) { + return func(taskStatus *swarm.TaskStatus) { + taskStatus.PortStatus.Ports = portConfigs + } +} + +// TaskSpec creates a task spec with default values . +// Any number of taskSpec function builder can be pass to augment it. +func TaskSpec(specBuilders ...func(*swarm.TaskSpec)) *swarm.TaskSpec { + taskSpec := &swarm.TaskSpec{ + ContainerSpec: swarm.ContainerSpec{ + Image: "myimage:mytag", + }, + } + + for _, builder := range specBuilders { + builder(taskSpec) + } + + return taskSpec +} diff --git a/vendor/github.com/docker/docker/cli/internal/test/cli.go b/vendor/github.com/docker/docker/cli/internal/test/cli.go new file mode 100644 index 000000000..06ab053e9 --- /dev/null +++ b/vendor/github.com/docker/docker/cli/internal/test/cli.go @@ -0,0 +1,48 @@ +// Package test is a test-only package that can be used by other cli package to write unit test +package test + +import ( + "io" + "io/ioutil" + + "github.com/docker/docker/cli/command" + "github.com/docker/docker/client" + "strings" +) + +// FakeCli emulates the default DockerCli +type FakeCli struct { + command.DockerCli + client client.APIClient + out io.Writer + in io.ReadCloser +} + +// NewFakeCli returns a Cli backed by the fakeCli +func NewFakeCli(client client.APIClient, out io.Writer) *FakeCli { + return &FakeCli{ + client: client, + out: out, + in: ioutil.NopCloser(strings.NewReader("")), + } +} + +// SetIn sets the input of the cli to the specified ReadCloser +func (c *FakeCli) SetIn(in io.ReadCloser) { + c.in = in +} + +// Client returns a docker API client +func (c *FakeCli) Client() client.APIClient { + return c.client +} + +// Out returns the output stream the cli should write on +func (c *FakeCli) Out() *command.OutStream { + return command.NewOutStream(c.out) +} + +// In returns thi input stream the cli will use +func (c *FakeCli) In() *command.InStream { + return command.NewInStream(c.in) +} diff --git a/vendor/github.com/docker/docker/client/container_prune_test.go b/vendor/github.com/docker/docker/client/container_prune_test.go new file mode 100644 index 000000000..5f06ea066 --- /dev/null +++ b/vendor/github.com/docker/docker/client/container_prune_test.go @@ -0,0 +1,111 @@ +package client + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "strings" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/pkg/testutil/assert" + "golang.org/x/net/context" +) + +func TestContainersPruneError(t *testing.T) { + client := &Client{ + client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), + version: "1.25", + } + + filters := filters.NewArgs() + + _, err := client.ContainersPrune(context.Background(), filters) + assert.Error(t, err, "Error response from daemon: Server error") +} + +func TestContainersPrune(t *testing.T) { + expectedURL := "/v1.25/containers/prune" + + danglingFilters := filters.NewArgs() + danglingFilters.Add("dangling", "true") + + noDanglingFilters := filters.NewArgs() + noDanglingFilters.Add("dangling", "false") + + danglingUntilFilters := filters.NewArgs() + danglingUntilFilters.Add("dangling", "true") + danglingUntilFilters.Add("until", "2016-12-15T14:00") + + listCases := []struct { + filters filters.Args + expectedQueryParams map[string]string + }{ + { + filters: filters.Args{}, + expectedQueryParams: map[string]string{ + "until": "", + "filter": "", + "filters": "", + }, + }, + { + filters: danglingFilters, + expectedQueryParams: map[string]string{ + "until": "", + "filter": "", + "filters": `{"dangling":{"true":true}}`, + }, + }, + { + filters: danglingUntilFilters, + expectedQueryParams: map[string]string{ + "until": "", + "filter": "", + "filters": `{"dangling":{"true":true},"until":{"2016-12-15T14:00":true}}`, + }, + }, + { + filters: noDanglingFilters, + expectedQueryParams: map[string]string{ + "until": "", + "filter": "", + "filters": `{"dangling":{"false":true}}`, + }, + }, + } + for _, listCase := range listCases { + client := &Client{ + client: newMockClient(func(req *http.Request) (*http.Response, error) { + if !strings.HasPrefix(req.URL.Path, expectedURL) { + return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) + } + query := req.URL.Query() + for key, expected := range listCase.expectedQueryParams { + actual := query.Get(key) + assert.Equal(t, actual, expected) + } + content, err := json.Marshal(types.ContainersPruneReport{ + ContainersDeleted: []string{"container_id1", "container_id2"}, + SpaceReclaimed: 9999, + }) + if err != nil { + return nil, err + } + return &http.Response{ + StatusCode: http.StatusOK, + Body: ioutil.NopCloser(bytes.NewReader(content)), + }, nil + }), + version: "1.25", + } + + report, err := client.ContainersPrune(context.Background(), listCase.filters) + assert.NilError(t, err) + assert.Equal(t, len(report.ContainersDeleted), 2) + assert.Equal(t, report.SpaceReclaimed, uint64(9999)) + } +} diff --git a/vendor/github.com/docker/docker/client/image_build.go b/vendor/github.com/docker/docker/client/image_build.go index 6fde75dcf..411d5493e 100644 --- a/vendor/github.com/docker/docker/client/image_build.go +++ b/vendor/github.com/docker/docker/client/image_build.go @@ -29,7 +29,7 @@ func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, optio return types.ImageBuildResponse{}, err } headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf)) - headers.Set("Content-Type", "application/tar") + headers.Set("Content-Type", "application/x-tar") serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers) if err != nil { diff --git a/vendor/github.com/docker/docker/client/image_build_test.go b/vendor/github.com/docker/docker/client/image_build_test.go index b9d04f817..1e18b7bda 100644 --- a/vendor/github.com/docker/docker/client/image_build_test.go +++ b/vendor/github.com/docker/docker/client/image_build_test.go @@ -170,8 +170,8 @@ func TestImageBuild(t *testing.T) { return nil, fmt.Errorf("X-Registry-Config header not properly set in the request. Expected '%s', got %s", buildCase.expectedRegistryConfig, registryConfig) } contentType := r.Header.Get("Content-Type") - if contentType != "application/tar" { - return nil, fmt.Errorf("Content-type header not properly set in the request. Expected 'application/tar', got %s", contentType) + if contentType != "application/x-tar" { + return nil, fmt.Errorf("Content-type header not properly set in the request. Expected 'application/x-tar', got %s", contentType) } // Check query parameters diff --git a/vendor/github.com/docker/docker/client/image_prune_test.go b/vendor/github.com/docker/docker/client/image_prune_test.go new file mode 100644 index 000000000..61cf18ef3 --- /dev/null +++ b/vendor/github.com/docker/docker/client/image_prune_test.go @@ -0,0 +1,106 @@ +package client + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "strings" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/pkg/testutil/assert" + "golang.org/x/net/context" +) + +func TestImagesPruneError(t *testing.T) { + client := &Client{ + client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), + version: "1.25", + } + + filters := filters.NewArgs() + + _, err := client.ImagesPrune(context.Background(), filters) + assert.Error(t, err, "Error response from daemon: Server error") +} + +func TestImagesPrune(t *testing.T) { + expectedURL := "/v1.25/images/prune" + + danglingFilters := filters.NewArgs() + danglingFilters.Add("dangling", "true") + + noDanglingFilters := filters.NewArgs() + noDanglingFilters.Add("dangling", "false") + + listCases := []struct { + filters filters.Args + expectedQueryParams map[string]string + }{ + { + filters: filters.Args{}, + expectedQueryParams: map[string]string{ + "until": "", + "filter": "", + "filters": "", + }, + }, + { + filters: danglingFilters, + expectedQueryParams: map[string]string{ + "until": "", + "filter": "", + "filters": `{"dangling":{"true":true}}`, + }, + }, + { + filters: noDanglingFilters, + expectedQueryParams: map[string]string{ + "until": "", + "filter": "", + "filters": `{"dangling":{"false":true}}`, + }, + }, + } + for _, listCase := range listCases { + client := &Client{ + client: newMockClient(func(req *http.Request) (*http.Response, error) { + if !strings.HasPrefix(req.URL.Path, expectedURL) { + return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) + } + query := req.URL.Query() + for key, expected := range listCase.expectedQueryParams { + actual := query.Get(key) + assert.Equal(t, actual, expected) + } + content, err := json.Marshal(types.ImagesPruneReport{ + ImagesDeleted: []types.ImageDelete{ + { + Deleted: "image_id1", + }, + { + Deleted: "image_id2", + }, + }, + SpaceReclaimed: 9999, + }) + if err != nil { + return nil, err + } + return &http.Response{ + StatusCode: http.StatusOK, + Body: ioutil.NopCloser(bytes.NewReader(content)), + }, nil + }), + version: "1.25", + } + + report, err := client.ImagesPrune(context.Background(), listCase.filters) + assert.NilError(t, err) + assert.Equal(t, len(report.ImagesDeleted), 2) + assert.Equal(t, report.SpaceReclaimed, uint64(9999)) + } +} diff --git a/vendor/github.com/docker/docker/client/image_tag.go b/vendor/github.com/docker/docker/client/image_tag.go index bdbf94add..dbcd078e1 100644 --- a/vendor/github.com/docker/docker/client/image_tag.go +++ b/vendor/github.com/docker/docker/client/image_tag.go @@ -1,21 +1,23 @@ package client import ( - "errors" - "fmt" "net/url" - "golang.org/x/net/context" - distreference "github.com/docker/distribution/reference" "github.com/docker/docker/api/types/reference" + "github.com/pkg/errors" + "golang.org/x/net/context" ) // ImageTag tags an image in the docker host -func (cli *Client) ImageTag(ctx context.Context, imageID, ref string) error { - distributionRef, err := distreference.ParseNamed(ref) +func (cli *Client) ImageTag(ctx context.Context, source, target string) error { + if _, err := distreference.ParseNamed(source); err != nil { + return errors.Wrapf(err, "Error parsing reference: %q is not a valid repository/tag", source) + } + + distributionRef, err := distreference.ParseNamed(target) if err != nil { - return fmt.Errorf("Error parsing reference: %q is not a valid repository/tag", ref) + return errors.Wrapf(err, "Error parsing reference: %q is not a valid repository/tag", target) } if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical { @@ -28,7 +30,7 @@ func (cli *Client) ImageTag(ctx context.Context, imageID, ref string) error { query.Set("repo", distributionRef.Name()) query.Set("tag", tag) - resp, err := cli.post(ctx, "/images/"+imageID+"/tag", query, nil, nil) + resp, err := cli.post(ctx, "/images/"+source+"/tag", query, nil, nil) ensureReaderClosed(resp) return err } diff --git a/vendor/github.com/docker/docker/client/image_tag_test.go b/vendor/github.com/docker/docker/client/image_tag_test.go index 7925db9f1..d37bd0e85 100644 --- a/vendor/github.com/docker/docker/client/image_tag_test.go +++ b/vendor/github.com/docker/docker/client/image_tag_test.go @@ -30,11 +30,22 @@ func TestImageTagInvalidReference(t *testing.T) { } err := client.ImageTag(context.Background(), "image_id", "aa/asdf$$^/aa") - if err == nil || err.Error() != `Error parsing reference: "aa/asdf$$^/aa" is not a valid repository/tag` { + if err == nil || err.Error() != `Error parsing reference: "aa/asdf$$^/aa" is not a valid repository/tag: invalid reference format` { t.Fatalf("expected ErrReferenceInvalidFormat, got %v", err) } } +func TestImageTagInvalidSourceImageName(t *testing.T) { + client := &Client{ + client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), + } + + err := client.ImageTag(context.Background(), "invalid_source_image_name_", "repo:tag") + if err == nil || err.Error() != "Error parsing reference: \"invalid_source_image_name_\" is not a valid repository/tag: invalid reference format" { + t.Fatalf("expected Parsing Reference Error, got %v", err) + } +} + func TestImageTag(t *testing.T) { expectedURL := "/images/image_id/tag" tagCases := []struct { diff --git a/vendor/github.com/docker/docker/client/network_prune_test.go b/vendor/github.com/docker/docker/client/network_prune_test.go new file mode 100644 index 000000000..07a5d41f2 --- /dev/null +++ b/vendor/github.com/docker/docker/client/network_prune_test.go @@ -0,0 +1,99 @@ +package client + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "strings" + "testing" + + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/pkg/testutil/assert" + "golang.org/x/net/context" +) + +func TestNetworksPruneError(t *testing.T) { + client := &Client{ + client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), + version: "1.25", + } + + filters := filters.NewArgs() + + _, err := client.NetworksPrune(context.Background(), filters) + if err == nil || err.Error() != "Error response from daemon: Server error" { + t.Fatalf("expected a Server Error, got %v", err) + } +} + +func TestNetworksPrune(t *testing.T) { + expectedURL := "/v1.25/networks/prune" + + danglingFilters := filters.NewArgs() + danglingFilters.Add("dangling", "true") + + noDanglingFilters := filters.NewArgs() + noDanglingFilters.Add("dangling", "false") + + listCases := []struct { + filters filters.Args + expectedQueryParams map[string]string + }{ + { + filters: filters.Args{}, + expectedQueryParams: map[string]string{ + "until": "", + "filter": "", + "filters": "", + }, + }, + { + filters: danglingFilters, + expectedQueryParams: map[string]string{ + "until": "", + "filter": "", + "filters": `{"dangling":{"true":true}}`, + }, + }, + { + filters: noDanglingFilters, + expectedQueryParams: map[string]string{ + "until": "", + "filter": "", + "filters": `{"dangling":{"false":true}}`, + }, + }, + } + for _, listCase := range listCases { + client := &Client{ + client: newMockClient(func(req *http.Request) (*http.Response, error) { + if !strings.HasPrefix(req.URL.Path, expectedURL) { + return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) + } + query := req.URL.Query() + for key, expected := range listCase.expectedQueryParams { + actual := query.Get(key) + assert.Equal(t, actual, expected) + } + content, err := json.Marshal(types.NetworksPruneReport{ + NetworksDeleted: []string{"network_id1", "network_id2"}, + }) + if err != nil { + return nil, err + } + return &http.Response{ + StatusCode: http.StatusOK, + Body: ioutil.NopCloser(bytes.NewReader(content)), + }, nil + }), + version: "1.25", + } + + report, err := client.NetworksPrune(context.Background(), listCase.filters) + assert.NilError(t, err) + assert.Equal(t, len(report.NetworksDeleted), 2) + } +} diff --git a/vendor/github.com/docker/docker/client/plugin_create.go b/vendor/github.com/docker/docker/client/plugin_create.go index a660ba573..27954aa57 100644 --- a/vendor/github.com/docker/docker/client/plugin_create.go +++ b/vendor/github.com/docker/docker/client/plugin_create.go @@ -12,7 +12,7 @@ import ( // PluginCreate creates a plugin func (cli *Client) PluginCreate(ctx context.Context, createContext io.Reader, createOptions types.PluginCreateOptions) error { headers := http.Header(make(map[string][]string)) - headers.Set("Content-Type", "application/tar") + headers.Set("Content-Type", "application/x-tar") query := url.Values{} query.Set("name", createOptions.RepoName) diff --git a/vendor/github.com/docker/docker/cmd/dockerd/daemon.go b/vendor/github.com/docker/docker/cmd/dockerd/daemon.go index 7b39066f0..ddc160d70 100644 --- a/vendor/github.com/docker/docker/cmd/dockerd/daemon.go +++ b/vendor/github.com/docker/docker/cmd/dockerd/daemon.go @@ -516,7 +516,7 @@ func (cli *DaemonCli) initMiddlewares(s *apiserver.Server, cfg *apiserver.Config // plugins present on the host and available to the daemon func validateAuthzPlugins(requestedPlugins []string, pg plugingetter.PluginGetter) error { for _, reqPlugin := range requestedPlugins { - if _, err := pg.Get(reqPlugin, authorization.AuthZApiImplements, plugingetter.LOOKUP); err != nil { + if _, err := pg.Get(reqPlugin, authorization.AuthZApiImplements, plugingetter.Lookup); err != nil { return err } } diff --git a/vendor/github.com/docker/docker/contrib/check-config.sh b/vendor/github.com/docker/docker/contrib/check-config.sh index d07e4ce36..a1b5cbc20 100755 --- a/vendor/github.com/docker/docker/contrib/check-config.sh +++ b/vendor/github.com/docker/docker/contrib/check-config.sh @@ -293,6 +293,8 @@ echo ' - "'$(wrap_color 'ipvlan' blue)'":' check_flags IPVLAN | sed 's/^/ /' echo ' - "'$(wrap_color 'macvlan' blue)'":' check_flags MACVLAN DUMMY | sed 's/^/ /' +echo ' - "'$(wrap_color 'ftp,tftp client in container' blue)'":' +check_flags NF_NAT_FTP NF_CONNTRACK_FTP NF_NAT_TFTP NF_CONNTRACK_TFTP | sed 's/^/ /' # only fail if no storage drivers available CODE=${EXITCODE} diff --git a/vendor/github.com/docker/docker/contrib/completion/bash/docker b/vendor/github.com/docker/docker/contrib/completion/bash/docker index 1b87a18e0..f34e2dfb2 100644 --- a/vendor/github.com/docker/docker/contrib/completion/bash/docker +++ b/vendor/github.com/docker/docker/contrib/completion/bash/docker @@ -23,6 +23,7 @@ # DOCKER_COMPLETION_SHOW_CONTAINER_IDS # DOCKER_COMPLETION_SHOW_NETWORK_IDS # DOCKER_COMPLETION_SHOW_NODE_IDS +# DOCKER_COMPLETION_SHOW_PLUGIN_IDS # DOCKER_COMPLETION_SHOW_SECRET_IDS # DOCKER_COMPLETION_SHOW_SERVICE_IDS # "no" - Show names only (default) @@ -286,9 +287,17 @@ __docker_complete_plugins_bundled() { # __docker_plugins_installed returns a list of all plugins that were installed with # the Docker plugin API. +# By default, only names are returned. +# Set DOCKER_COMPLETION_SHOW_PLUGIN_IDS=yes to also complete IDs. # For built-in pugins, see `__docker_plugins_bundled`. __docker_plugins_installed() { - __docker_q plugin ls | awk 'NR>1 {print $1}' + local fields + if [ "$DOCKER_COMPLETION_SHOW_PLUGIN_IDS" = yes ] ; then + fields='$1,$2' + else + fields='$2' + fi + __docker_q plugin ls | awk "NR>1 {print $fields}" } # __docker_complete_plugins_installed applies completion of plugins that were installed @@ -2689,10 +2698,7 @@ _docker_service_ps() { COMPREPLY=( $( compgen -W "--filter -f --help --no-resolve --no-trunc --quiet -q" -- "$cur" ) ) ;; *) - local counter=$(__docker_pos_first_nonflag '--filter|-f') - if [ $cword -eq $counter ]; then - __docker_complete_services - fi + __docker_complete_services ;; esac } @@ -3219,10 +3225,13 @@ _docker_plugin_create() { _docker_plugin_disable() { case "$cur" in -*) - COMPREPLY=( $( compgen -W "--help" -- "$cur" ) ) + COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) ) ;; *) - __docker_complete_plugins_installed + local counter=$(__docker_pos_first_nonflag) + if [ $cword -eq $counter ]; then + __docker_complete_plugins_installed + fi ;; esac } @@ -3239,7 +3248,10 @@ _docker_plugin_enable() { COMPREPLY=( $( compgen -W "--help --timeout" -- "$cur" ) ) ;; *) - __docker_complete_plugins_installed + local counter=$(__docker_pos_first_nonflag '--timeout') + if [ $cword -eq $counter ]; then + __docker_complete_plugins_installed + fi ;; esac } diff --git a/vendor/github.com/docker/docker/contrib/completion/fish/docker.fish b/vendor/github.com/docker/docker/contrib/completion/fish/docker.fish index 2715cb1aa..8833e8caa 100644 --- a/vendor/github.com/docker/docker/contrib/completion/fish/docker.fish +++ b/vendor/github.com/docker/docker/contrib/completion/fish/docker.fish @@ -135,7 +135,7 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s i -l interac complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l ipc -d 'Default is to create a private IPC namespace (POSIX SysV IPC) for the container' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l link -d 'Add link to another container in the form of :alias' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -s m -l memory -d 'Memory limit (format: [], where unit = b, k, m or g)' -complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l mac-address -d 'Container MAC address (e.g. 92:d0:c6:0a:29:33)' +complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l mac-address -d 'Container MAC address (e.g., 92:d0:c6:0a:29:33)' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l memory-swap -d "Total memory usage (memory + swap), set '-1' to disable swap (format: [], where unit = b, k, m or g)" complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l name -d 'Assign a name to the container' complete -c docker -A -f -n '__fish_seen_subcommand_from create' -l net -d 'Set the Network mode for the container' @@ -326,7 +326,7 @@ complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s i -l interactiv complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l ipc -d 'Default is to create a private IPC namespace (POSIX SysV IPC) for the container' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l link -d 'Add link to another container in the form of :alias' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -s m -l memory -d 'Memory limit (format: [], where unit = b, k, m or g)' -complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l mac-address -d 'Container MAC address (e.g. 92:d0:c6:0a:29:33)' +complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l mac-address -d 'Container MAC address (e.g., 92:d0:c6:0a:29:33)' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l memory-swap -d "Total memory usage (memory + swap), set '-1' to disable swap (format: [], where unit = b, k, m or g)" complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l name -d 'Assign a name to the container' complete -c docker -A -f -n '__fish_seen_subcommand_from run' -l net -d 'Set the Network mode for the container' diff --git a/vendor/github.com/docker/docker/contrib/completion/zsh/_docker b/vendor/github.com/docker/docker/contrib/completion/zsh/_docker index 8d00b13e6..2b7e822e3 100644 --- a/vendor/github.com/docker/docker/contrib/completion/zsh/_docker +++ b/vendor/github.com/docker/docker/contrib/completion/zsh/_docker @@ -541,12 +541,12 @@ __docker_container_subcommand() { "($help)*--group=[Set one or more supplementary user groups for the container]:group:_groups" "($help -h --hostname)"{-h=,--hostname=}"[Container host name]:hostname:_hosts" "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" - "($help)--ip=[Container IPv4 address]:IPv4: " - "($help)--ip6=[Container IPv6 address]:IPv6: " + "($help)--ip=[IPv4 address]:IPv4: " + "($help)--ip6=[IPv6 address]:IPv6: " "($help)--ipc=[IPC namespace to use]:IPC namespace: " "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" "($help)*--link=[Add link to another container]:link:->link" - "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " + "($help)*--link-local-ip=[Container IPv4/IPv6 link-local addresses]:IPv4/IPv6: " "($help)*"{-l=,--label=}"[Container metadata]:label: " "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" "($help)*--log-opt=[Log driver specific options]:log driver options:__docker_complete_log_options" @@ -917,7 +917,7 @@ __docker_image_subcommand() { "($help)*--label=[Set metadata for an image]:label=value: " \ "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " \ "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " \ - "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" + "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" \ "($help)--no-cache[Do not use cache when building the image]" \ "($help)--pull[Attempt to pull a newer version of the image]" \ "($help -q --quiet)"{-q,--quiet}"[Suppress verbose build output]" \ @@ -1142,8 +1142,8 @@ __docker_network_subcommand() { _arguments $(__docker_arguments) \ $opts_help \ "($help)*--alias=[Add network-scoped alias for the container]:alias: " \ - "($help)--ip=[Container IPv4 address]:IPv4: " \ - "($help)--ip6=[Container IPv6 address]:IPv6: " \ + "($help)--ip=[IPv4 address]:IPv4: " \ + "($help)--ip6=[IPv6 address]:IPv6: " \ "($help)*--link=[Add a link to another container]:link:->link" \ "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " \ "($help -)1:network:__docker_complete_networks" \ diff --git a/vendor/github.com/docker/docker/contrib/vagrant-docker/README.md b/vendor/github.com/docker/docker/contrib/vagrant-docker/README.md index 66e2fa587..736c78999 100644 --- a/vendor/github.com/docker/docker/contrib/vagrant-docker/README.md +++ b/vendor/github.com/docker/docker/contrib/vagrant-docker/README.md @@ -31,7 +31,7 @@ stop on runlevel [!2345] respawn script - /usr/bin/docker daemon -H=tcp://0.0.0.0:2375 + /usr/bin/dockerd -H=tcp://0.0.0.0:2375 end script ``` diff --git a/vendor/github.com/docker/docker/daemon/cluster/cluster.go b/vendor/github.com/docker/docker/daemon/cluster/cluster.go index 623fbc735..f6a17d6b6 100644 --- a/vendor/github.com/docker/docker/daemon/cluster/cluster.go +++ b/vendor/github.com/docker/docker/daemon/cluster/cluster.go @@ -52,7 +52,6 @@ import ( "time" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" distreference "github.com/docker/distribution/reference" apierrors "github.com/docker/docker/api/errors" apitypes "github.com/docker/docker/api/types" @@ -73,6 +72,7 @@ import ( "github.com/docker/swarmkit/manager/encryption" swarmnode "github.com/docker/swarmkit/node" "github.com/docker/swarmkit/protobuf/ptypes" + "github.com/opencontainers/go-digest" "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -320,6 +320,7 @@ func (c *Cluster) Init(req types.InitRequest) (string, error) { LocalAddr: localAddr, ListenAddr: net.JoinHostPort(listenHost, listenPort), AdvertiseAddr: net.JoinHostPort(advertiseHost, advertisePort), + availability: req.Availability, }) if err != nil { return "", err @@ -389,6 +390,7 @@ func (c *Cluster) Join(req types.JoinRequest) error { AdvertiseAddr: advertiseAddr, joinAddr: req.RemoteAddrs[0], joinToken: req.JoinToken, + availability: req.Availability, }) if err != nil { return err @@ -832,7 +834,7 @@ func (c *Cluster) GetServices(options apitypes.ServiceListOptions) ([]types.Serv // TODO(nishanttotla): After the packages converge, the function must // convert distreference.Named -> distreference.Canonical, and the logic simplified. func (c *Cluster) imageWithDigestString(ctx context.Context, image string, authConfig *apitypes.AuthConfig) (string, error) { - if _, err := digest.ParseDigest(image); err == nil { + if _, err := digest.Parse(image); err == nil { return "", errors.New("image reference is an image ID") } ref, err := distreference.ParseNamed(image) @@ -1072,10 +1074,8 @@ func (c *Cluster) RemoveService(input string) error { return err } - if _, err := state.controlClient.RemoveService(ctx, &swarmapi.RemoveServiceRequest{ServiceID: service.ID}); err != nil { - return err - } - return nil + _, err = state.controlClient.RemoveService(ctx, &swarmapi.RemoveServiceRequest{ServiceID: service.ID}) + return err } // ServiceLogs collects service logs and writes them back to `config.OutStream` @@ -1268,10 +1268,8 @@ func (c *Cluster) RemoveNode(input string, force bool) error { return err } - if _, err := state.controlClient.RemoveNode(ctx, &swarmapi.RemoveNodeRequest{NodeID: node.ID, Force: force}); err != nil { - return err - } - return nil + _, err = state.controlClient.RemoveNode(ctx, &swarmapi.RemoveNodeRequest{NodeID: node.ID, Force: force}) + return err } // GetTasks returns a list of tasks matching the filter options. @@ -1594,10 +1592,8 @@ func (c *Cluster) RemoveNetwork(input string) error { return err } - if _, err := state.controlClient.RemoveNetwork(ctx, &swarmapi.RemoveNetworkRequest{NetworkID: network.ID}); err != nil { - return err - } - return nil + _, err = state.controlClient.RemoveNetwork(ctx, &swarmapi.RemoveNetworkRequest{NetworkID: network.ID}) + return err } func (c *Cluster) populateNetworkID(ctx context.Context, client swarmapi.ControlClient, s *types.ServiceSpec) error { diff --git a/vendor/github.com/docker/docker/daemon/cluster/convert/node.go b/vendor/github.com/docker/docker/daemon/cluster/convert/node.go index 306f34e0b..acc7959b5 100644 --- a/vendor/github.com/docker/docker/daemon/cluster/convert/node.go +++ b/vendor/github.com/docker/docker/daemon/cluster/convert/node.go @@ -14,7 +14,7 @@ func NodeFromGRPC(n swarmapi.Node) types.Node { node := types.Node{ ID: n.ID, Spec: types.NodeSpec{ - Role: types.NodeRole(strings.ToLower(n.Spec.Role.String())), + Role: types.NodeRole(strings.ToLower(n.Spec.DesiredRole.String())), Availability: types.NodeAvailability(strings.ToLower(n.Spec.Availability.String())), }, Status: types.NodeStatus{ @@ -74,7 +74,7 @@ func NodeSpecToGRPC(s types.NodeSpec) (swarmapi.NodeSpec, error) { }, } if role, ok := swarmapi.NodeRole_value[strings.ToUpper(string(s.Role))]; ok { - spec.Role = swarmapi.NodeRole(role) + spec.DesiredRole = swarmapi.NodeRole(role) } else { return swarmapi.NodeSpec{}, fmt.Errorf("invalid Role: %q", s.Role) } diff --git a/vendor/github.com/docker/docker/daemon/cluster/executor/container/adapter.go b/vendor/github.com/docker/docker/daemon/cluster/executor/container/adapter.go index dcd13e916..cafa36bcb 100644 --- a/vendor/github.com/docker/docker/daemon/cluster/executor/container/adapter.go +++ b/vendor/github.com/docker/docker/daemon/cluster/executor/container/adapter.go @@ -11,7 +11,6 @@ import ( "time" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/backend" containertypes "github.com/docker/docker/api/types/container" @@ -24,6 +23,7 @@ import ( "github.com/docker/swarmkit/api" "github.com/docker/swarmkit/log" "github.com/docker/swarmkit/protobuf/ptypes" + "github.com/opencontainers/go-digest" "golang.org/x/net/context" "golang.org/x/time/rate" ) @@ -54,7 +54,7 @@ func (c *containerAdapter) pullImage(ctx context.Context) error { spec := c.container.spec() // Skip pulling if the image is referenced by image ID. - if _, err := digest.ParseDigest(spec.Image); err == nil { + if _, err := digest.Parse(spec.Image); err == nil { return nil } diff --git a/vendor/github.com/docker/docker/daemon/cluster/noderunner.go b/vendor/github.com/docker/docker/daemon/cluster/noderunner.go index 285bdddc5..dc24ff115 100644 --- a/vendor/github.com/docker/docker/daemon/cluster/noderunner.go +++ b/vendor/github.com/docker/docker/daemon/cluster/noderunner.go @@ -1,6 +1,7 @@ package cluster import ( + "fmt" "path/filepath" "runtime" "strings" @@ -51,6 +52,7 @@ type nodeStartConfig struct { joinToken string lockKey []byte autolock bool + availability types.NodeAvailability } func (n *nodeRunner) Ready() chan error { @@ -92,7 +94,7 @@ func (n *nodeRunner) start(conf nodeStartConfig) error { control = filepath.Join(n.cluster.runtimeRoot, controlSocket) } - node, err := swarmnode.New(&swarmnode.Config{ + swarmnodeConfig := swarmnode.Config{ Hostname: n.cluster.config.Name, ForceNewCluster: conf.forceNewCluster, ListenControlAPI: control, @@ -106,7 +108,15 @@ func (n *nodeRunner) start(conf nodeStartConfig) error { ElectionTick: 3, UnlockKey: conf.lockKey, AutoLockManagers: conf.autolock, - }) + } + if conf.availability != "" { + avail, ok := swarmapi.NodeSpec_Availability_value[strings.ToUpper(string(conf.availability))] + if !ok { + return fmt.Errorf("invalid Availability: %q", conf.availability) + } + swarmnodeConfig.Availability = swarmapi.NodeSpec_Availability(avail) + } + node, err := swarmnode.New(&swarmnodeConfig) if err != nil { return err } diff --git a/vendor/github.com/docker/docker/daemon/cluster/secrets.go b/vendor/github.com/docker/docker/daemon/cluster/secrets.go index 959ae2937..df26f13d4 100644 --- a/vendor/github.com/docker/docker/daemon/cluster/secrets.go +++ b/vendor/github.com/docker/docker/daemon/cluster/secrets.go @@ -101,10 +101,8 @@ func (c *Cluster) RemoveSecret(id string) error { SecretID: id, } - if _, err := state.controlClient.RemoveSecret(ctx, req); err != nil { - return err - } - return nil + _, err := state.controlClient.RemoveSecret(ctx, req) + return err } // UpdateSecret updates a secret in a managed swarm cluster. @@ -123,16 +121,13 @@ func (c *Cluster) UpdateSecret(id string, version uint64, spec types.SecretSpec) secretSpec := convert.SecretSpecToGRPC(spec) - if _, err := state.controlClient.UpdateSecret(ctx, + _, err := state.controlClient.UpdateSecret(ctx, &swarmapi.UpdateSecretRequest{ SecretID: id, SecretVersion: &swarmapi.Version{ Index: version, }, Spec: &secretSpec, - }); err != nil { - return err - } - - return nil + }) + return err } diff --git a/vendor/github.com/docker/docker/daemon/config_windows.go b/vendor/github.com/docker/docker/daemon/config_windows.go index df59dcf30..ec3f84005 100644 --- a/vendor/github.com/docker/docker/daemon/config_windows.go +++ b/vendor/github.com/docker/docker/daemon/config_windows.go @@ -21,7 +21,7 @@ type bridgeConfig struct { // Config defines the configuration of a docker daemon. // These are the configuration settings that you pass -// to the docker daemon when you launch it with say: `docker daemon -e windows` +// to the docker daemon when you launch it with say: `dockerd -e windows` type Config struct { CommonConfig diff --git a/vendor/github.com/docker/docker/daemon/container_operations.go b/vendor/github.com/docker/docker/daemon/container_operations.go index 507deaf77..a9095792c 100644 --- a/vendor/github.com/docker/docker/daemon/container_operations.go +++ b/vendor/github.com/docker/docker/daemon/container_operations.go @@ -410,7 +410,7 @@ func (daemon *Daemon) findAndAttachNetwork(container *container.Container, idOrN return n, config, nil } -// updateContainerNetworkSettings update the network settings +// updateContainerNetworkSettings updates the network settings func (daemon *Daemon) updateContainerNetworkSettings(container *container.Container, endpointsConfig map[string]*networktypes.EndpointSettings) { var n libnetwork.Network @@ -1035,7 +1035,7 @@ func (daemon *Daemon) ActivateContainerServiceBinding(containerName string) erro return sb.EnableService() } -// DeactivateContainerServiceBinding remove this container fromload balancer active rotation, and DNS response +// DeactivateContainerServiceBinding removes this container from load balancer active rotation, and DNS response func (daemon *Daemon) DeactivateContainerServiceBinding(containerName string) error { container, err := daemon.GetContainer(containerName) if err != nil { diff --git a/vendor/github.com/docker/docker/daemon/daemon.go b/vendor/github.com/docker/docker/daemon/daemon.go index e402d6f2e..eaa85d482 100644 --- a/vendor/github.com/docker/docker/daemon/daemon.go +++ b/vendor/github.com/docker/docker/daemon/daemon.go @@ -995,14 +995,15 @@ func (daemon *Daemon) initDiscovery(config *Config) error { // Reload reads configuration changes and modifies the // daemon according to those changes. // These are the settings that Reload changes: -// - Daemon labels. -// - Daemon debug log level. -// - Daemon insecure registries. +// - Daemon labels +// - Daemon debug log level +// - Insecure registries +// - Registry mirrors // - Daemon max concurrent downloads // - Daemon max concurrent uploads -// - Cluster discovery (reconfigure and restart). +// - Cluster discovery (reconfigure and restart) // - Daemon live restore -// - Daemon shutdown timeout (in seconds). +// - Daemon shutdown timeout (in seconds) func (daemon *Daemon) Reload(config *Config) (err error) { daemon.configStore.reloadLock.Lock() @@ -1035,6 +1036,14 @@ func (daemon *Daemon) Reload(config *Config) (err error) { return err } } + + if config.IsValueSet("registry-mirrors") { + daemon.configStore.Mirrors = config.Mirrors + if err := daemon.RegistryService.LoadMirrors(config.Mirrors); err != nil { + return err + } + } + if config.IsValueSet("live-restore") { daemon.configStore.LiveRestoreEnabled = config.LiveRestoreEnabled if err := daemon.containerdRemote.UpdateOptions(libcontainerd.WithLiveRestore(config.LiveRestoreEnabled)); err != nil { @@ -1087,6 +1096,16 @@ func (daemon *Daemon) Reload(config *Config) (err error) { attributes["insecure-registries"] = "[]" } + if daemon.configStore.Mirrors != nil { + mirrors, err := json.Marshal(daemon.configStore.Mirrors) + if err != nil { + return err + } + attributes["registry-mirrors"] = string(mirrors) + } else { + attributes["registry-mirrors"] = "[]" + } + attributes["cluster-store"] = daemon.configStore.ClusterStore if daemon.configStore.ClusterOpts != nil { opts, err := json.Marshal(daemon.configStore.ClusterOpts) diff --git a/vendor/github.com/docker/docker/daemon/daemon_test.go b/vendor/github.com/docker/docker/daemon/daemon_test.go index 00817bd1b..87550d455 100644 --- a/vendor/github.com/docker/docker/daemon/daemon_test.go +++ b/vendor/github.com/docker/docker/daemon/daemon_test.go @@ -341,6 +341,100 @@ func TestDaemonReloadLabels(t *testing.T) { } } +func TestDaemonReloadMirrors(t *testing.T) { + daemon := &Daemon{} + + daemon.RegistryService = registry.NewService(registry.ServiceOptions{ + InsecureRegistries: []string{}, + Mirrors: []string{ + "https://mirror.test1.com", + "https://mirror.test2.com", // this will be removed when reloading + "https://mirror.test3.com", // this will be removed when reloading + }, + }) + + daemon.configStore = &Config{} + + type pair struct { + valid bool + mirrors []string + after []string + } + + loadMirrors := []pair{ + { + valid: false, + mirrors: []string{"10.10.1.11:5000"}, // this mirror is invalid + after: []string{}, + }, + { + valid: false, + mirrors: []string{"mirror.test1.com"}, // this mirror is invalid + after: []string{}, + }, + { + valid: false, + mirrors: []string{"10.10.1.11:5000", "mirror.test1.com"}, // mirrors are invalid + after: []string{}, + }, + { + valid: true, + mirrors: []string{"https://mirror.test1.com", "https://mirror.test4.com"}, + after: []string{"https://mirror.test1.com/", "https://mirror.test4.com/"}, + }, + } + + for _, value := range loadMirrors { + valuesSets := make(map[string]interface{}) + valuesSets["registry-mirrors"] = value.mirrors + + newConfig := &Config{ + CommonConfig: CommonConfig{ + ServiceOptions: registry.ServiceOptions{ + Mirrors: value.mirrors, + }, + valuesSet: valuesSets, + }, + } + + err := daemon.Reload(newConfig) + if !value.valid && err == nil { + // mirrors should be invalid, should be a non-nil error + t.Fatalf("Expected daemon reload error with invalid mirrors: %s, while get nil", value.mirrors) + } + + if value.valid { + if err != nil { + // mirrors should be valid, should be no error + t.Fatal(err) + } + registryService := daemon.RegistryService.ServiceConfig() + + if len(registryService.Mirrors) != len(value.after) { + t.Fatalf("Expected %d daemon mirrors %s while get %d with %s", + len(value.after), + value.after, + len(registryService.Mirrors), + registryService.Mirrors) + } + + dataMap := map[string]struct{}{} + + for _, mirror := range registryService.Mirrors { + if _, exist := dataMap[mirror]; !exist { + dataMap[mirror] = struct{}{} + } + } + + for _, address := range value.after { + if _, exist := dataMap[address]; !exist { + t.Fatalf("Expected %s in daemon mirrors, while get none", address) + } + } + } + } +} + func TestDaemonReloadInsecureRegistries(t *testing.T) { daemon := &Daemon{} // initialize daemon with existing insecure registries: "127.0.0.0/8", "10.10.1.11:5000", "10.10.1.22:5000" diff --git a/vendor/github.com/docker/docker/daemon/daemon_unix.go b/vendor/github.com/docker/docker/daemon/daemon_unix.go index e8efb95be..6fb75c7c8 100644 --- a/vendor/github.com/docker/docker/daemon/daemon_unix.go +++ b/vendor/github.com/docker/docker/daemon/daemon_unix.go @@ -1190,6 +1190,12 @@ func (daemon *Daemon) initCgroupsPath(path string) error { return nil } + if daemon.configStore.CPURealtimePeriod == 0 && daemon.configStore.CPURealtimeRuntime == 0 { + return nil + } + + // Recursively create cgroup to ensure that the system and all parent cgroups have values set + // for the period and runtime as this limits what the children can be set to. daemon.initCgroupsPath(filepath.Dir(path)) _, root, err := cgroups.FindCgroupMountpointAndRoot("cpu") @@ -1199,15 +1205,18 @@ func (daemon *Daemon) initCgroupsPath(path string) error { path = filepath.Join(root, path) sysinfo := sysinfo.New(true) - if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) { - return err - } if sysinfo.CPURealtimePeriod && daemon.configStore.CPURealtimePeriod != 0 { + if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) { + return err + } if err := ioutil.WriteFile(filepath.Join(path, "cpu.rt_period_us"), []byte(strconv.FormatInt(daemon.configStore.CPURealtimePeriod, 10)), 0700); err != nil { return err } } if sysinfo.CPURealtimeRuntime && daemon.configStore.CPURealtimeRuntime != 0 { + if err := os.MkdirAll(path, 0755); err != nil && !os.IsExist(err) { + return err + } if err := ioutil.WriteFile(filepath.Join(path, "cpu.rt_runtime_us"), []byte(strconv.FormatInt(daemon.configStore.CPURealtimeRuntime, 10)), 0700); err != nil { return err } diff --git a/vendor/github.com/docker/docker/daemon/disk_usage.go b/vendor/github.com/docker/docker/daemon/disk_usage.go index c3b918660..fc77a3d8f 100644 --- a/vendor/github.com/docker/docker/daemon/disk_usage.go +++ b/vendor/github.com/docker/docker/daemon/disk_usage.go @@ -4,12 +4,12 @@ import ( "fmt" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/layer" "github.com/docker/docker/pkg/directory" "github.com/docker/docker/volume" + "github.com/opencontainers/go-digest" ) func (daemon *Daemon) getLayerRefs() map[layer.ChainID]int { diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/README.md b/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/README.md index 792474a8a..bed07869a 100644 --- a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/README.md +++ b/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/README.md @@ -88,7 +88,7 @@ status information about the driver. The devicemapper backend supports some options that you can specify when starting the docker daemon using the `--storage-opt` flags. -This uses the `dm` prefix and would be used something like `docker daemon --storage-opt dm.foo=bar`. +This uses the `dm` prefix and would be used something like `dockerd --storage-opt dm.foo=bar`. These options are currently documented both in [the man page](../../../man/docker.1.md) and in [the online diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/driver.go b/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/driver.go index 7cf422ce6..d1739c6a3 100644 --- a/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/driver.go +++ b/vendor/github.com/docker/docker/daemon/graphdriver/devmapper/driver.go @@ -151,7 +151,7 @@ func (d *Driver) Remove(id string) error { // This assumes the device has been properly Get/Put:ed and thus is unmounted if err := d.DeviceSet.DeleteDevice(id, false); err != nil { - return err + return fmt.Errorf("failed to remove device %s: %v", id, err) } mp := path.Join(d.home, "mnt", id) diff --git a/vendor/github.com/docker/docker/daemon/graphdriver/plugin.go b/vendor/github.com/docker/docker/daemon/graphdriver/plugin.go index 7294bcc5f..d89d1b496 100644 --- a/vendor/github.com/docker/docker/daemon/graphdriver/plugin.go +++ b/vendor/github.com/docker/docker/daemon/graphdriver/plugin.go @@ -22,7 +22,7 @@ func lookupPlugin(name string, pg plugingetter.PluginGetter, config Options) (Dr if !config.ExperimentalEnabled { return nil, fmt.Errorf("graphdriver plugins are only supported with experimental mode") } - pl, err := pg.Get(name, "GraphDriver", plugingetter.ACQUIRE) + pl, err := pg.Get(name, "GraphDriver", plugingetter.Acquire) if err != nil { return nil, fmt.Errorf("Error looking up graphdriver plugin %s: %v", name, err) } diff --git a/vendor/github.com/docker/docker/daemon/image_pull.go b/vendor/github.com/docker/docker/daemon/image_pull.go index 2157d1597..f1b5f83c7 100644 --- a/vendor/github.com/docker/docker/daemon/image_pull.go +++ b/vendor/github.com/docker/docker/daemon/image_pull.go @@ -5,7 +5,6 @@ import ( "strings" dist "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types" "github.com/docker/docker/builder" "github.com/docker/docker/distribution" @@ -13,6 +12,7 @@ import ( "github.com/docker/docker/pkg/progress" "github.com/docker/docker/reference" "github.com/docker/docker/registry" + "github.com/opencontainers/go-digest" "golang.org/x/net/context" ) @@ -32,7 +32,7 @@ func (daemon *Daemon) PullImage(ctx context.Context, image, tag string, metaHead if tag != "" { // The "tag" could actually be a digest. var dgst digest.Digest - dgst, err = digest.ParseDigest(tag) + dgst, err = digest.Parse(tag) if err == nil { ref, err = reference.WithDigest(reference.TrimNamed(ref), dgst) } else { diff --git a/vendor/github.com/docker/docker/daemon/list.go b/vendor/github.com/docker/docker/daemon/list.go index 02805ea62..615394f3d 100644 --- a/vendor/github.com/docker/docker/daemon/list.go +++ b/vendor/github.com/docker/docker/daemon/list.go @@ -623,7 +623,7 @@ func (daemon *Daemon) filterVolumes(vols []volume.Volume, filter filters.Args) ( } } if filter.Include("driver") { - if !filter.Match("driver", vol.DriverName()) { + if !filter.ExactMatch("driver", vol.DriverName()) { continue } } diff --git a/vendor/github.com/docker/docker/daemon/logger/etwlogs/etwlogs_windows.go b/vendor/github.com/docker/docker/daemon/logger/etwlogs/etwlogs_windows.go index c7fbdf23b..093387452 100644 --- a/vendor/github.com/docker/docker/daemon/logger/etwlogs/etwlogs_windows.go +++ b/vendor/github.com/docker/docker/daemon/logger/etwlogs/etwlogs_windows.go @@ -130,8 +130,10 @@ func unregisterETWProvider() { func callEventRegister() error { // The provider's GUID is {a3693192-9ed6-46d2-a981-f8226c8363bd} guid := syscall.GUID{ - 0xa3693192, 0x9ed6, 0x46d2, - [8]byte{0xa9, 0x81, 0xf8, 0x22, 0x6c, 0x83, 0x63, 0xbd}, + Data1: 0xa3693192, + Data2: 0x9ed6, + Data3: 0x46d2, + Data4: [8]byte{0xa9, 0x81, 0xf8, 0x22, 0x6c, 0x83, 0x63, 0xbd}, } ret, _, _ := procEventRegister.Call(uintptr(unsafe.Pointer(&guid)), 0, 0, uintptr(unsafe.Pointer(&providerHandle))) diff --git a/vendor/github.com/docker/docker/daemon/network.go b/vendor/github.com/docker/docker/daemon/network.go index e1acf7e2e..ace845989 100644 --- a/vendor/github.com/docker/docker/daemon/network.go +++ b/vendor/github.com/docker/docker/daemon/network.go @@ -12,8 +12,11 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/network" clustertypes "github.com/docker/docker/daemon/cluster/provider" + "github.com/docker/docker/pkg/plugingetter" "github.com/docker/docker/runconfig" "github.com/docker/libnetwork" + "github.com/docker/libnetwork/driverapi" + "github.com/docker/libnetwork/ipamapi" networktypes "github.com/docker/libnetwork/types" "github.com/pkg/errors" "golang.org/x/net/context" @@ -298,6 +301,10 @@ func (daemon *Daemon) createNetwork(create types.NetworkCreateRequest, id string return nil, err } + daemon.pluginRefCount(driver, driverapi.NetworkPluginEndpointType, plugingetter.Acquire) + if create.IPAM != nil { + daemon.pluginRefCount(create.IPAM.Driver, ipamapi.PluginEndpointType, plugingetter.Acquire) + } daemon.LogNetworkEvent(n, "create") return &types.NetworkCreateResponse{ @@ -306,6 +313,29 @@ func (daemon *Daemon) createNetwork(create types.NetworkCreateRequest, id string }, nil } +func (daemon *Daemon) pluginRefCount(driver, capability string, mode int) { + var builtinDrivers []string + + if capability == driverapi.NetworkPluginEndpointType { + builtinDrivers = daemon.netController.BuiltinDrivers() + } else if capability == ipamapi.PluginEndpointType { + builtinDrivers = daemon.netController.BuiltinIPAMDrivers() + } + + for _, d := range builtinDrivers { + if d == driver { + return + } + } + + if daemon.PluginStore != nil { + _, err := daemon.PluginStore.Get(driver, capability, mode) + if err != nil { + logrus.WithError(err).WithFields(logrus.Fields{"mode": mode, "driver": driver}).Error("Error handling plugin refcount operation") + } + } +} + func getIpamConfig(data []network.IPAMConfig) ([]*libnetwork.IpamConf, []*libnetwork.IpamConf, error) { ipamV4Cfg := []*libnetwork.IpamConf{} ipamV6Cfg := []*libnetwork.IpamConf{} @@ -377,6 +407,13 @@ func (daemon *Daemon) GetNetworkDriverList() []string { } pluginList := daemon.netController.BuiltinDrivers() + + managedPlugins := daemon.PluginStore.GetAllManagedPluginsByCap(driverapi.NetworkPluginEndpointType) + + for _, plugin := range managedPlugins { + pluginList = append(pluginList, plugin.Name()) + } + pluginMap := make(map[string]bool) for _, plugin := range pluginList { pluginMap[plugin] = true @@ -420,6 +457,9 @@ func (daemon *Daemon) deleteNetwork(networkID string, dynamic bool) error { if err := nw.Delete(); err != nil { return err } + daemon.pluginRefCount(nw.Type(), driverapi.NetworkPluginEndpointType, plugingetter.Release) + ipamType, _, _, _ := nw.Info().IpamConfig() + daemon.pluginRefCount(ipamType, ipamapi.PluginEndpointType, plugingetter.Release) daemon.LogNetworkEvent(nw, "destroy") return nil } diff --git a/vendor/github.com/docker/docker/daemon/prune.go b/vendor/github.com/docker/docker/daemon/prune.go index a693beb4e..40b5718dd 100644 --- a/vendor/github.com/docker/docker/daemon/prune.go +++ b/vendor/github.com/docker/docker/daemon/prune.go @@ -3,11 +3,12 @@ package daemon import ( "fmt" "regexp" + "time" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" + timetypes "github.com/docker/docker/api/types/time" "github.com/docker/docker/image" "github.com/docker/docker/layer" "github.com/docker/docker/pkg/directory" @@ -15,15 +16,24 @@ import ( "github.com/docker/docker/runconfig" "github.com/docker/docker/volume" "github.com/docker/libnetwork" + "github.com/opencontainers/go-digest" ) // ContainersPrune removes unused containers func (daemon *Daemon) ContainersPrune(pruneFilters filters.Args) (*types.ContainersPruneReport, error) { rep := &types.ContainersPruneReport{} + until, err := getUntilFromPruneFilters(pruneFilters) + if err != nil { + return nil, err + } + allContainers := daemon.List() for _, c := range allContainers { if !c.IsRunning() { + if !until.IsZero() && c.Created.After(until) { + continue + } cSize, _ := daemon.getSize(c) // TODO: sets RmLink to true? err := daemon.ContainerRm(c.ID, &types.ContainerRmConfig{}) @@ -84,6 +94,11 @@ func (daemon *Daemon) ImagesPrune(pruneFilters filters.Args) (*types.ImagesPrune } } + until, err := getUntilFromPruneFilters(pruneFilters) + if err != nil { + return nil, err + } + var allImages map[image.ID]*image.Image if danglingOnly { allImages = daemon.imageStore.Heads() @@ -104,6 +119,9 @@ func (daemon *Daemon) ImagesPrune(pruneFilters filters.Args) (*types.ImagesPrune if len(daemon.referenceStore.References(dgst)) == 0 && len(daemon.imageStore.Children(id)) != 0 { continue } + if !until.IsZero() && img.Created.After(until) { + continue + } topImages[id] = img } @@ -169,9 +187,17 @@ func (daemon *Daemon) ImagesPrune(pruneFilters filters.Args) (*types.ImagesPrune // localNetworksPrune removes unused local networks func (daemon *Daemon) localNetworksPrune(pruneFilters filters.Args) (*types.NetworksPruneReport, error) { rep := &types.NetworksPruneReport{} - var err error + + until, err := getUntilFromPruneFilters(pruneFilters) + if err != nil { + return rep, err + } + // When the function returns true, the walk will stop. l := func(nw libnetwork.Network) bool { + if !until.IsZero() && nw.Info().Created().After(until) { + return false + } nwName := nw.Name() predefined := runconfig.IsPreDefinedNetwork(nwName) if !predefined && len(nw.Endpoints()) == 0 { @@ -190,6 +216,12 @@ func (daemon *Daemon) localNetworksPrune(pruneFilters filters.Args) (*types.Netw // clusterNetworksPrune removes unused cluster networks func (daemon *Daemon) clusterNetworksPrune(pruneFilters filters.Args) (*types.NetworksPruneReport, error) { rep := &types.NetworksPruneReport{} + + until, err := getUntilFromPruneFilters(pruneFilters) + if err != nil { + return nil, err + } + cluster := daemon.GetCluster() networks, err := cluster.GetNetworks() if err != nil { @@ -200,6 +232,9 @@ func (daemon *Daemon) clusterNetworksPrune(pruneFilters filters.Args) (*types.Ne if nw.Name == "ingress" { continue } + if !until.IsZero() && nw.Created.After(until) { + continue + } // https://github.com/docker/docker/issues/24186 // `docker network inspect` unfortunately displays ONLY those containers that are local to that node. // So we try to remove it anyway and check the error @@ -234,3 +269,24 @@ func (daemon *Daemon) NetworksPrune(pruneFilters filters.Args) (*types.NetworksP } return rep, err } + +func getUntilFromPruneFilters(pruneFilters filters.Args) (time.Time, error) { + until := time.Time{} + if !pruneFilters.Include("until") { + return until, nil + } + untilFilters := pruneFilters.Get("until") + if len(untilFilters) > 1 { + return until, fmt.Errorf("more than one until filter specified") + } + ts, err := timetypes.GetTimestamp(untilFilters[0], time.Now()) + if err != nil { + return until, err + } + seconds, nanoseconds, err := timetypes.ParseTimestamps(ts, 0) + if err != nil { + return until, err + } + until = time.Unix(seconds, nanoseconds) + return until, nil +} diff --git a/vendor/github.com/docker/docker/distribution/config.go b/vendor/github.com/docker/docker/distribution/config.go index 78cf0530c..13ae46e0c 100644 --- a/vendor/github.com/docker/docker/distribution/config.go +++ b/vendor/github.com/docker/docker/distribution/config.go @@ -7,7 +7,6 @@ import ( "runtime" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest/schema2" "github.com/docker/docker/api/types" "github.com/docker/docker/distribution/metadata" @@ -18,6 +17,7 @@ import ( "github.com/docker/docker/reference" "github.com/docker/docker/registry" "github.com/docker/libtrust" + "github.com/opencontainers/go-digest" "golang.org/x/net/context" ) diff --git a/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service.go b/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service.go index fc410a46e..c31c7214e 100644 --- a/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service.go +++ b/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service.go @@ -7,9 +7,9 @@ import ( "encoding/json" "errors" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types" "github.com/docker/docker/layer" + "github.com/opencontainers/go-digest" ) // V2MetadataService maps layer IDs to a set of known metadata for diff --git a/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service_test.go b/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service_test.go index 7b0ecb157..8e3e4614c 100644 --- a/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service_test.go +++ b/vendor/github.com/docker/docker/distribution/metadata/v2_metadata_service_test.go @@ -8,8 +8,8 @@ import ( "reflect" "testing" - "github.com/docker/distribution/digest" "github.com/docker/docker/layer" + "github.com/opencontainers/go-digest" ) func TestV2MetadataService(t *testing.T) { diff --git a/vendor/github.com/docker/docker/distribution/pull.go b/vendor/github.com/docker/docker/distribution/pull.go index 48f4431f6..ac52ba1fc 100644 --- a/vendor/github.com/docker/docker/distribution/pull.go +++ b/vendor/github.com/docker/docker/distribution/pull.go @@ -5,12 +5,12 @@ import ( "fmt" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/api" "github.com/docker/docker/distribution/metadata" "github.com/docker/docker/pkg/progress" "github.com/docker/docker/reference" "github.com/docker/docker/registry" + "github.com/opencontainers/go-digest" "golang.org/x/net/context" ) diff --git a/vendor/github.com/docker/docker/distribution/pull_v2.go b/vendor/github.com/docker/docker/distribution/pull_v2.go index 88807edc7..053e81a08 100644 --- a/vendor/github.com/docker/docker/distribution/pull_v2.go +++ b/vendor/github.com/docker/docker/distribution/pull_v2.go @@ -12,7 +12,6 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest/manifestlist" "github.com/docker/distribution/manifest/schema1" "github.com/docker/distribution/manifest/schema2" @@ -29,6 +28,7 @@ import ( "github.com/docker/docker/pkg/stringid" "github.com/docker/docker/reference" "github.com/docker/docker/registry" + "github.com/opencontainers/go-digest" "golang.org/x/net/context" ) @@ -228,10 +228,7 @@ func (ld *v2LayerDescriptor) Download(ctx context.Context, progressOutput progre defer reader.Close() if ld.verifier == nil { - ld.verifier, err = digest.NewDigestVerifier(ld.digest) - if err != nil { - return nil, 0, xfer.DoNotRetry{Err: err} - } + ld.verifier = ld.digest.Verifier() } _, err = io.Copy(tmpFile, io.TeeReader(reader, ld.verifier)) @@ -716,10 +713,7 @@ func (p *v2Puller) pullSchema2Config(ctx context.Context, dgst digest.Digest) (c } // Verify image config digest - verifier, err := digest.NewDigestVerifier(dgst) - if err != nil { - return nil, err - } + verifier := dgst.Verifier() if _, err := verifier.Write(configJSON); err != nil { return nil, err } @@ -742,10 +736,7 @@ func schema2ManifestDigest(ref reference.Named, mfst distribution.Manifest) (dig // If pull by digest, then verify the manifest digest. if digested, isDigested := ref.(reference.Canonical); isDigested { - verifier, err := digest.NewDigestVerifier(digested.Digest()) - if err != nil { - return "", err - } + verifier := digested.Digest().Verifier() if _, err := verifier.Write(canonical); err != nil { return "", err } @@ -798,10 +789,7 @@ func verifySchema1Manifest(signedManifest *schema1.SignedManifest, ref reference // important to do this first, before any other content validation. If the // digest cannot be verified, don't even bother with those other things. if digested, isCanonical := ref.(reference.Canonical); isCanonical { - verifier, err := digest.NewDigestVerifier(digested.Digest()) - if err != nil { - return nil, err - } + verifier := digested.Digest().Verifier() if _, err := verifier.Write(signedManifest.Canonical); err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/distribution/pull_v2_test.go b/vendor/github.com/docker/docker/distribution/pull_v2_test.go index b745642e3..d65653311 100644 --- a/vendor/github.com/docker/docker/distribution/pull_v2_test.go +++ b/vendor/github.com/docker/docker/distribution/pull_v2_test.go @@ -8,9 +8,9 @@ import ( "strings" "testing" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest/schema1" "github.com/docker/docker/reference" + "github.com/opencontainers/go-digest" ) // TestFixManifestLayers checks that fixManifestLayers removes a duplicate diff --git a/vendor/github.com/docker/docker/distribution/push_v1.go b/vendor/github.com/docker/docker/distribution/push_v1.go index 0a12380b5..beaa9ddbc 100644 --- a/vendor/github.com/docker/docker/distribution/push_v1.go +++ b/vendor/github.com/docker/docker/distribution/push_v1.go @@ -5,7 +5,6 @@ import ( "sync" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/distribution/registry/client/transport" "github.com/docker/docker/distribution/metadata" "github.com/docker/docker/dockerversion" @@ -17,6 +16,7 @@ import ( "github.com/docker/docker/pkg/stringid" "github.com/docker/docker/reference" "github.com/docker/docker/registry" + "github.com/opencontainers/go-digest" "golang.org/x/net/context" ) diff --git a/vendor/github.com/docker/docker/distribution/push_v2.go b/vendor/github.com/docker/docker/distribution/push_v2.go index e56f80065..f2115b39b 100644 --- a/vendor/github.com/docker/docker/distribution/push_v2.go +++ b/vendor/github.com/docker/docker/distribution/push_v2.go @@ -13,7 +13,6 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest/schema1" "github.com/docker/distribution/manifest/schema2" distreference "github.com/docker/distribution/reference" @@ -27,6 +26,7 @@ import ( "github.com/docker/docker/pkg/stringid" "github.com/docker/docker/reference" "github.com/docker/docker/registry" + "github.com/opencontainers/go-digest" ) const ( @@ -435,7 +435,7 @@ func (pd *v2PushDescriptor) uploadUsingSession( return distribution.Descriptor{}, fmt.Errorf("unsupported layer media type %s", m) } - digester := digest.Canonical.New() + digester := digest.Canonical.Digester() tee := io.TeeReader(reader, digester.Hash()) nn, err := layerUpload.ReadFrom(tee) diff --git a/vendor/github.com/docker/docker/distribution/push_v2_test.go b/vendor/github.com/docker/docker/distribution/push_v2_test.go index 6a5216b1d..6aa372275 100644 --- a/vendor/github.com/docker/docker/distribution/push_v2_test.go +++ b/vendor/github.com/docker/docker/distribution/push_v2_test.go @@ -7,13 +7,13 @@ import ( "github.com/docker/distribution" "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest/schema2" distreference "github.com/docker/distribution/reference" "github.com/docker/docker/distribution/metadata" "github.com/docker/docker/layer" "github.com/docker/docker/pkg/progress" "github.com/docker/docker/reference" + "github.com/opencontainers/go-digest" ) func TestGetRepositoryMountCandidates(t *testing.T) { diff --git a/vendor/github.com/docker/docker/distribution/xfer/download_test.go b/vendor/github.com/docker/docker/distribution/xfer/download_test.go index 0d3af8231..69323bb86 100644 --- a/vendor/github.com/docker/docker/distribution/xfer/download_test.go +++ b/vendor/github.com/docker/docker/distribution/xfer/download_test.go @@ -12,10 +12,10 @@ import ( "time" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/docker/image" "github.com/docker/docker/layer" "github.com/docker/docker/pkg/progress" + "github.com/opencontainers/go-digest" "golang.org/x/net/context" ) diff --git a/vendor/github.com/docker/docker/docs/api/v1.18.md b/vendor/github.com/docker/docker/docs/api/v1.18.md index 3b811c151..7ecde39af 100644 --- a/vendor/github.com/docker/docker/docs/api/v1.18.md +++ b/vendor/github.com/docker/docker/docs/api/v1.18.md @@ -1192,6 +1192,7 @@ Build an image from a Dockerfile **Example request**: POST /v1.18/build HTTP/1.1 + Content-Type: application/x-tar {% raw %} {{ TAR STREAM }} @@ -1246,7 +1247,7 @@ or being killed. **Request Headers**: -- **Content-type** – Set to `"application/tar"`. +- **Content-type** – Set to `"application/x-tar"`. - **X-Registry-Config** – base64-encoded ConfigFile object **Status codes**: diff --git a/vendor/github.com/docker/docker/docs/api/v1.19.md b/vendor/github.com/docker/docker/docs/api/v1.19.md index e35b4f016..5ec41160a 100644 --- a/vendor/github.com/docker/docker/docs/api/v1.19.md +++ b/vendor/github.com/docker/docker/docs/api/v1.19.md @@ -1236,6 +1236,7 @@ Build an image from a Dockerfile **Example request**: POST /v1.19/build HTTP/1.1 + Content-Type: application/x-tar {% raw %} {{ TAR STREAM }} @@ -1292,7 +1293,7 @@ or being killed. **Request Headers**: -- **Content-type** – Set to `"application/tar"`. +- **Content-type** – Set to `"application/x-tar"`. - **X-Registry-Config** – base64-encoded ConfigFile object **Status codes**: diff --git a/vendor/github.com/docker/docker/docs/api/v1.20.md b/vendor/github.com/docker/docker/docs/api/v1.20.md index 43344e2ec..4d7ce43bf 100644 --- a/vendor/github.com/docker/docker/docs/api/v1.20.md +++ b/vendor/github.com/docker/docker/docs/api/v1.20.md @@ -1365,6 +1365,7 @@ Build an image from a Dockerfile **Example request**: POST /v1.20/build HTTP/1.1 + Content-Type: application/x-tar {% raw %} {{ TAR STREAM }} @@ -1425,7 +1426,7 @@ or being killed. **Request Headers**: -- **Content-type** – Set to `"application/tar"`. +- **Content-type** – Set to `"application/x-tar"`. - **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON object with the following structure: diff --git a/vendor/github.com/docker/docker/docs/api/v1.21.md b/vendor/github.com/docker/docker/docs/api/v1.21.md index fd491947b..8d0bd6b37 100644 --- a/vendor/github.com/docker/docker/docs/api/v1.21.md +++ b/vendor/github.com/docker/docker/docs/api/v1.21.md @@ -1448,6 +1448,7 @@ Build an image from a Dockerfile **Example request**: POST /v1.21/build HTTP/1.1 + Content-Type: application/x-tar {% raw %} {{ TAR STREAM }} @@ -1514,7 +1515,7 @@ or being killed. **Request Headers**: -- **Content-type** – Set to `"application/tar"`. +- **Content-type** – Set to `"application/x-tar"`. - **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON object with the following structure: diff --git a/vendor/github.com/docker/docker/docs/api/v1.22.md b/vendor/github.com/docker/docker/docs/api/v1.22.md index 443d18b68..0d4d9b55e 100644 --- a/vendor/github.com/docker/docker/docs/api/v1.22.md +++ b/vendor/github.com/docker/docker/docs/api/v1.22.md @@ -1627,6 +1627,7 @@ Build an image from a Dockerfile **Example request**: POST /v1.22/build HTTP/1.1 + Content-Type: application/x-tar {% raw %} {{ TAR STREAM }} @@ -1694,7 +1695,7 @@ or being killed. **Request Headers**: -- **Content-type** – Set to `"application/tar"`. +- **Content-type** – Set to `"application/x-tar"`. - **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON object with the following structure: diff --git a/vendor/github.com/docker/docker/docs/api/v1.23.md b/vendor/github.com/docker/docker/docs/api/v1.23.md index 3618d5a1c..07e75f55d 100644 --- a/vendor/github.com/docker/docker/docs/api/v1.23.md +++ b/vendor/github.com/docker/docker/docs/api/v1.23.md @@ -1662,6 +1662,7 @@ Build an image from a Dockerfile **Example request**: POST /v1.23/build HTTP/1.1 + Content-Type: application/x-tar {% raw %} {{ TAR STREAM }} @@ -1730,7 +1731,7 @@ or being killed. **Request Headers**: -- **Content-type** – Set to `"application/tar"`. +- **Content-type** – Set to `"application/x-tar"`. - **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON object with the following structure: diff --git a/vendor/github.com/docker/docker/docs/api/v1.24.md b/vendor/github.com/docker/docker/docs/api/v1.24.md index 156d07135..05737e7ae 100644 --- a/vendor/github.com/docker/docker/docs/api/v1.24.md +++ b/vendor/github.com/docker/docker/docs/api/v1.24.md @@ -1659,6 +1659,7 @@ Build an image from a Dockerfile **Example request**: POST /v1.24/build HTTP/1.1 + Content-Type: application/x-tar {% raw %} {{ TAR STREAM }} @@ -1727,7 +1728,7 @@ or being killed. **Request Headers**: -- **Content-type** – Set to `"application/tar"`. +- **Content-type** – Set to `"application/x-tar"`. - **X-Registry-Config** – A base64-url-safe-encoded Registry Auth Config JSON object with the following structure: @@ -4678,7 +4679,7 @@ image](#create-an-image) section for more details. as part of this service. - **Condition** – Condition for restart (`none`, `on-failure`, or `any`). - **Delay** – Delay between restart attempts. - - **Attempts** – Maximum attempts to restart a given container before giving up (default value + - **MaxAttempts** – Maximum attempts to restart a given container before giving up (default value is 0, which is ignored). - **Window** – Windows is the time window used to evaluate the restart policy (default value is 0, which is unbounded). diff --git a/vendor/github.com/docker/docker/docs/extend/config.md b/vendor/github.com/docker/docker/docs/extend/config.md index eca33803c..b98be592a 100644 --- a/vendor/github.com/docker/docker/docs/extend/config.md +++ b/vendor/github.com/docker/docker/docs/extend/config.md @@ -153,6 +153,10 @@ Config provides the base accessible fields for working with V0 plugin format capabilities of the plugin (*Linux only*), see list [`here`](https://github.com/opencontainers/runc/blob/master/libcontainer/SPEC.md#security) + - **`allowAllDevices`** *boolean* + + If `/dev` is bind mounted from the host, and allowAllDevices is set to true, the plugin will have `rwm` access to all devices on the host. + - **`devices`** *PluginDevice array* device of the plugin, (*Linux only*), struct consisting of the following fields, see [`DEVICES`](https://github.com/opencontainers/runtime-spec/blob/master/config-linux.md#devices) @@ -171,52 +175,49 @@ Config provides the base accessible fields for working with V0 plugin format ## Example Config -*Example showing the 'tiborvass/no-remove' plugin config.* +*Example showing the 'tiborvass/sample-volume-plugin' plugin config.* ```json { - "description": "A test plugin for Docker", - "documentation": "https://docs.docker.com/engine/extend/plugins/", - "entrypoint": ["plugin-no-remove", "/data"], - "interface": { - "types": ["docker.volumedriver/1.0"], - "socket": "plugins.sock" - }, - "network": { - "type": "host" - }, - "mounts": [ - { - "source": "/data", - "destination": "/data", - "type": "bind", - "options": ["shared", "rbind"] - }, - { - "destination": "/foobar", - "type": "tmpfs" - } - ], - "args": { - "name": "args", - "description": "command line arguments", - "value": [] - }, - "env": [ - { - "name": "DEBUG", - "description": "If set, prints debug messages", - "value": "1" - } - ], - "linux": { - "devices": [ - { - "name": "device", - "description": "a host device to mount", - "path": "/dev/cpu_dma_latency" - } - ] - } + "Args": { + "Description": "", + "Name": "", + "Settable": null, + "Value": null + }, + "Description": "A sample volume plugin for Docker", + "Documentation": "https://docs.docker.com/engine/extend/plugins/", + "Entrypoint": [ + "/usr/bin/sample-volume-plugin", + "/data" + ], + "Env": [ + { + "Description": "", + "Name": "DEBUG", + "Settable": [ + "value" + ], + "Value": "0" + } + ], + "Interface": { + "Socket": "plugin.sock", + "Types": [ + "docker.volumedriver/1.0" + ] + }, + "Linux": { + "Capabilities": null, + "AllowAllDevices": false, + "Devices": null + }, + "Mounts": null, + "Network": { + "Type": "" + }, + "PropagatedMount": "/data", + "User": {}, + "Workdir": "" } ``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/container_prune.md b/vendor/github.com/docker/docker/docs/reference/commandline/container_prune.md index 43156406e..f50e75f7a 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/container_prune.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/container_prune.md @@ -21,8 +21,10 @@ Usage: docker container prune [OPTIONS] Remove all stopped containers Options: - -f, --force Do not prompt for confirmation - --help Print usage +Options: + --filter filter Provide filter values (e.g. 'until=') + -f, --force Do not prompt for confirmation + --help Print usage ``` ## Examples @@ -38,6 +40,63 @@ f98f9c2aa1eaf727e4ec9c0283bc7d4aa4762fbdba7f26191f26c97f64090360 Total reclaimed space: 212 B ``` +## Filtering + +The filtering flag (`-f` or `--filter`) format is of "key=value". If there is more +than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "bif=baz"`) + +The currently supported filters are: + +* until (``) - only remove containers created before given timestamp + +The `until` filter can be Unix timestamps, date formatted +timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed +relative to the daemon machine’s time. Supported formats for date +formatted time stamps include RFC3339Nano, RFC3339, `2006-01-02T15:04:05`, +`2006-01-02T15:04:05.999999999`, `2006-01-02Z07:00`, and `2006-01-02`. The local +timezone on the daemon will be used if you do not provide either a `Z` or a +`+-00:00` timezone offset at the end of the timestamp. When providing Unix +timestamps enter seconds[.nanoseconds], where seconds is the number of seconds +that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap +seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a +fraction of a second no more than nine digits long. + +The following removes containers created more than 5 minutes ago: +```bash +$ docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.CreatedAt}}\t{{.Status}}' +CONTAINER ID IMAGE COMMAND CREATED AT STATUS +61b9efa71024 busybox "sh" 2017-01-04 13:23:33 -0800 PST Exited (0) 41 seconds ago +53a9bc23a516 busybox "sh" 2017-01-04 13:11:59 -0800 PST Exited (0) 12 minutes ago + +$ docker container prune --force --filter "until=5m" +Deleted Containers: +53a9bc23a5168b6caa2bfbefddf1b30f93c7ad57f3dec271fd32707497cb9369 + +Total reclaimed space: 25 B + +$ docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.CreatedAt}}\t{{.Status}}' +CONTAINER ID IMAGE COMMAND CREATED AT STATUS +61b9efa71024 busybox "sh" 2017-01-04 13:23:33 -0800 PST Exited (0) 44 seconds ago +``` + +The following removes containers created before `2017-01-04T13:10:00`: +```bash +$ docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.CreatedAt}}\t{{.Status}}' +CONTAINER ID IMAGE COMMAND CREATED AT STATUS +53a9bc23a516 busybox "sh" 2017-01-04 13:11:59 -0800 PST Exited (0) 7 minutes ago +4a75091a6d61 busybox "sh" 2017-01-04 13:09:53 -0800 PST Exited (0) 9 minutes ago + +$ docker container prune --force --filter "until=2017-01-04T13:10:00" +Deleted Containers: +4a75091a6d618526fcd8b33ccd6e5928ca2a64415466f768a6180004b0c72c6c + +Total reclaimed space: 27 B + +$ docker ps -a --format 'table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.CreatedAt}}\t{{.Status}}' +CONTAINER ID IMAGE COMMAND CREATED AT STATUS +53a9bc23a516 busybox "sh" 2017-01-04 13:11:59 -0800 PST Exited (0) 9 minutes ago +``` + ## Related information * [system df](system_df.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/create.md b/vendor/github.com/docker/docker/docs/reference/commandline/create.md index 0218af3a7..439e75fac 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/create.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/create.md @@ -66,8 +66,8 @@ Options: -i, --interactive Keep STDIN open even if not attached --io-maxbandwidth string Maximum IO bandwidth limit for the system drive (Windows only) --io-maxiops uint Maximum IOps limit for the system drive (Windows only) - --ip string Container IPv4 address (e.g. 172.30.100.104) - --ip6 string Container IPv6 address (e.g. 2001:db8::33) + --ip string IPv4 address (e.g., 172.30.100.104) + --ip6 string IPv6 address (e.g., 2001:db8::33) --ipc string IPC namespace to use --isolation string Container isolation technology --kernel-memory string Kernel memory limit @@ -77,7 +77,7 @@ Options: --link-local-ip value Container IPv4/IPv6 link-local addresses (default []) --log-driver string Logging driver for the container --log-opt value Log driver options (default []) - --mac-address string Container MAC address (e.g. 92:d0:c6:0a:29:33) + --mac-address string Container MAC address (e.g., 92:d0:c6:0a:29:33) -m, --memory string Memory limit --memory-reservation string Memory soft limit --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/dockerd.md b/vendor/github.com/docker/docker/docs/reference/commandline/dockerd.md index 8d4423e3a..80d776f91 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/dockerd.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/dockerd.md @@ -715,7 +715,7 @@ with the `--exec-opt` flag. All the flag's options have the `native` prefix. A single `native.cgroupdriver` option is available. The `native.cgroupdriver` option specifies the management of the container's -cgroups. You can specify only specify `cgroupfs` or `systemd`. If you specify +cgroups. You can only specify `cgroupfs` or `systemd`. If you specify `systemd` and it is not available, the system errors out. If you omit the `native.cgroupdriver` option,` cgroupfs` is used. @@ -730,8 +730,8 @@ Setting this option applies to all containers the daemon launches. Also Windows Container makes use of `--exec-opt` for special purpose. Docker user can specify default container isolation technology with this, for example: -```bash -$ sudo dockerd --exec-opt isolation=hyperv +```console +> dockerd --exec-opt isolation=hyperv ``` Will make `hyperv` the default isolation technology on Windows. If no isolation @@ -746,14 +746,12 @@ To set the DNS server for all Docker containers, use: $ sudo dockerd --dns 8.8.8.8 ``` - To set the DNS search domain for all Docker containers, use: ```bash $ sudo dockerd --dns-search example.com ``` - ## Insecure registries Docker considers a private registry either secure or insecure. In the rest of @@ -1289,6 +1287,7 @@ The list of currently supported options that can be reconfigured is this: be used to run containers - `authorization-plugin`: specifies the authorization plugins to use. - `insecure-registries`: it replaces the daemon insecure registries with a new set of insecure registries. If some existing insecure registries in daemon's configuration are not in newly reloaded insecure resgitries, these existing ones will be removed from daemon's config. +- `registry-mirrors`: it replaces the daemon registry mirrors with a new set of registry mirrors. If some existing registry mirrors in daemon's configuration are not in newly reloaded registry mirrors, these existing ones will be removed from daemon's config. Updating and reloading the cluster configurations such as `--cluster-store`, `--cluster-advertise` and `--cluster-store-opts` will take effect only if diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/events.md b/vendor/github.com/docker/docker/docs/reference/commandline/events.md index 24af2ab48..baa966d62 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/events.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/events.md @@ -36,7 +36,7 @@ Docker images report the following events: delete, import, load, pull, push, save, tag, untag -Docker plugins(experimental) report the following events: +Docker plugins report the following events: install, enable, disable, remove @@ -194,8 +194,8 @@ relative to the current time on the client machine: 2015-12-23T21:38:25.119625123Z network connect 8b111217944ba0ba844a65b13efcd57dc494932ee2527577758f939315ba2c5b (name=test-event-network-local, container=b4be644031a3d90b400f88ab3d4bdf4dc23adb250e696b6328b85441abe2c54e, type=bridge) $ docker events --filter 'type=plugin' (experimental) - 2016-07-25T17:30:14.825557616Z plugin pull ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/no-remove:latest) - 2016-07-25T17:30:14.888127370Z plugin enable ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/no-remove:latest) + 2016-07-25T17:30:14.825557616Z plugin pull ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/sample-volume-plugin:latest) + 2016-07-25T17:30:14.888127370Z plugin enable ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/sample-volume-plugin:latest) **Format:** diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/image_prune.md b/vendor/github.com/docker/docker/docs/reference/commandline/image_prune.md index a80b8d38c..e6450d3c5 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/image_prune.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/image_prune.md @@ -21,9 +21,10 @@ Usage: docker image prune [OPTIONS] Remove unused images Options: - -a, --all Remove all unused images, not just dangling ones - -f, --force Do not prompt for confirmation - --help Print usage + -a, --all Remove all unused images, not just dangling ones + --filter filter Provide filter values (e.g. 'until=') + -f, --force Do not prompt for confirmation + --help Print usage ``` Remove all dangling images. If `-a` is specified, will also remove all images not referenced by any container. @@ -62,6 +63,87 @@ deleted: sha256:2c675ee9ed53425e31a13e3390bf3f539bf8637000e4bcfbb85ee03ef4d910a1 Total reclaimed space: 16.43 MB ``` +## Filtering + +The filtering flag (`-f` or `--filter`) format is of "key=value". If there is more +than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "bif=baz"`) + +The currently supported filters are: + +* until (``) - only remove images created before given timestamp + +The `until` filter can be Unix timestamps, date formatted +timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed +relative to the daemon machine’s time. Supported formats for date +formatted time stamps include RFC3339Nano, RFC3339, `2006-01-02T15:04:05`, +`2006-01-02T15:04:05.999999999`, `2006-01-02Z07:00`, and `2006-01-02`. The local +timezone on the daemon will be used if you do not provide either a `Z` or a +`+-00:00` timezone offset at the end of the timestamp. When providing Unix +timestamps enter seconds[.nanoseconds], where seconds is the number of seconds +that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap +seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a +fraction of a second no more than nine digits long. + +The following removes images created before `2017-01-04T00:00:00`: +```bash +$ docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}\t{{.Size}}' +REPOSITORY TAG IMAGE ID CREATED AT SIZE +foo latest 2f287ac753da 2017-01-04 13:42:23 -0800 PST 3.98 MB +alpine latest 88e169ea8f46 2016-12-27 10:17:25 -0800 PST 3.98 MB +busybox latest e02e811dd08f 2016-10-07 14:03:58 -0700 PDT 1.09 MB + +$ docker image prune -a --force --filter "until=2017-01-04T00:00:00" +Deleted Images: +untagged: alpine:latest +untagged: alpine@sha256:dfbd4a3a8ebca874ebd2474f044a0b33600d4523d03b0df76e5c5986cb02d7e8 +untagged: busybox:latest +untagged: busybox@sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912 +deleted: sha256:e02e811dd08fd49e7f6032625495118e63f597eb150403d02e3238af1df240ba +deleted: sha256:e88b3f82283bc59d5e0df427c824e9f95557e661fcb0ea15fb0fb6f97760f9d9 + +Total reclaimed space: 1.093 MB + +$ docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedAt}}\t{{.Size}}' +REPOSITORY TAG IMAGE ID CREATED AT SIZE +foo latest 2f287ac753da 2017-01-04 13:42:23 -0800 PST 3.98 MB +``` + +The following removes images created more than 10 days (`240h`) ago: +```bash +$ docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +foo latest 2f287ac753da 14 seconds ago 3.98 MB +alpine latest 88e169ea8f46 8 days ago 3.98 MB +debian jessie 7b0a06c805e8 2 months ago 123 MB +busybox latest e02e811dd08f 2 months ago 1.09 MB +golang 1.7.0 138c2e655421 4 months ago 670 MB + +$ docker image prune -a --force --filter "until=240h" +Deleted Images: +untagged: golang:1.7.0 +untagged: golang@sha256:6765038c2b8f407fd6e3ecea043b44580c229ccfa2a13f6d85866cf2b4a9628e +deleted: sha256:138c2e6554219de65614d88c15521bfb2da674cbb0bf840de161f89ff4264b96 +deleted: sha256:ec353c2e1a673f456c4b78906d0d77f9d9456cfb5229b78c6a960bfb7496b76a +deleted: sha256:fe22765feaf3907526b4921c73ea6643ff9e334497c9b7e177972cf22f68ee93 +deleted: sha256:ff845959c80148421a5c3ae11cc0e6c115f950c89bc949646be55ed18d6a2912 +deleted: sha256:a4320831346648c03db64149eafc83092e2b34ab50ca6e8c13112388f25899a7 +deleted: sha256:4c76020202ee1d9709e703b7c6de367b325139e74eebd6b55b30a63c196abaf3 +deleted: sha256:d7afd92fb07236c8a2045715a86b7d5f0066cef025018cd3ca9a45498c51d1d6 +deleted: sha256:9e63c5bce4585dd7038d830a1f1f4e44cb1a1515b00e620ac718e934b484c938 +untagged: debian:jessie +untagged: debian@sha256:c1af755d300d0c65bb1194d24bce561d70c98a54fb5ce5b1693beb4f7988272f +deleted: sha256:7b0a06c805e8f23807fb8856621c60851727e85c7bcb751012c813f122734c8d +deleted: sha256:f96222d75c5563900bc4dd852179b720a0885de8f7a0619ba0ac76e92542bbc8 + +Total reclaimed space: 792.6 MB + +$ docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +foo latest 2f287ac753da About a minute ago 3.98 MB +alpine latest 88e169ea8f46 8 days ago 3.98 MB +busybox latest e02e811dd08f 2 months ago 1.09 MB +``` + ## Related information * [system df](system_df.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/index.md b/vendor/github.com/docker/docker/docs/reference/commandline/index.md index 2345406c4..87c7b4775 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/index.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/index.md @@ -147,3 +147,36 @@ read the [`dockerd`](dockerd.md) reference page. | [service rm](service_rm.md) | Remove a service from the swarm | | [service scale](service_scale.md) | Set the number of replicas for the desired state of the service | | [service update](service_update.md) | Update the attributes of a service | + +### Swarm secret commands + +| Command | Description | +|:--------|:-------------------------------------------------------------------| +| [secret create](secret_create.md) | Create a secret from a file or STDIN as content | +| [secret inspect](service_inspect.md) | Inspect the specified secret | +| [secret ls](secret_ls.md) | List secrets in the swarm | +| [secret rm](secret_rm.md) | Remove the specified secrets from the swarm | + +### Swarm stack commands + +| Command | Description | +|:--------|:-------------------------------------------------------------------| +| [stack deploy](stack_deploy.md) | Deploy a new stack or update an existing stack | +| [stack ls](stack_ls.md) | List stacks in the swarm | +| [stack ps](stack_ps.md) | List the tasks in the stack | +| [stack rm](stack_rm.md) | Remove the stack from the swarm | +| [stack services](stack_services.md) | List the services in the stack | + +### Plugin commands + +| Command | Description | +|:--------|:-------------------------------------------------------------------| +| [plugin create](plugin_create.md) | Create a plugin from a rootfs and configuration | +| [plugin disable](plugin_disable.md) | Disable a plugin | +| [plugin enbale](plugin_enable.md) | Enable a plugin | +| [plugin inspect](plugin_inspect.md) | Display detailed information on a plugin | +| [plugin install](plugin_install.md) | Install a plugin | +| [plugin ls](plugin_ls.md) | List plugins | +| [plugin push](plugin_push.md) | Push a plugin to a registry | +| [plugin rm](plugin_rm.md) | Remove a plugin | +| [plugin set](plugin_set.md) | Change settings for a plugin | diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/logs.md b/vendor/github.com/docker/docker/docs/reference/commandline/logs.md index 891e10b55..6d42929fb 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/logs.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/logs.md @@ -24,8 +24,8 @@ Options: --details Show extra details provided to logs -f, --follow Follow log output --help Print usage - --since string Show logs since timestamp - --tail string Number of lines to show from the end of the logs (default "all") + --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes) + --tail string Number of lines to show from the end of the logs (default "all") -t, --timestamps Show timestamps ``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/network_connect.md b/vendor/github.com/docker/docker/docs/reference/commandline/network_connect.md index 52459a5d5..1c8548a4f 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/network_connect.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/network_connect.md @@ -23,8 +23,8 @@ Connect a container to a network Options: --alias value Add network-scoped alias for the container (default []) --help Print usage - --ip string IP Address - --ip6 string IPv6 Address + --ip string IPv4 address (e.g., 172.30.100.104) + --ip6 string IPv6 address (e.g., 2001:db8::33) --link value Add link to another container (default []) --link-local-ip value Add a link-local address for the container (default []) ``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/network_prune.md b/vendor/github.com/docker/docker/docs/reference/commandline/network_prune.md index 5b6546560..a3878c297 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/network_prune.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/network_prune.md @@ -12,8 +12,9 @@ Usage: docker network prune [OPTIONS] Remove all unused networks Options: - -f, --force Do not prompt for confirmation - --help Print usage + --filter filter Provide filter values (e.g. 'until=') + -f, --force Do not prompt for confirmation + --help Print usage ``` Remove all unused networks. Unused networks are those which are not referenced by any containers. @@ -29,6 +30,51 @@ n1 n2 ``` +## Filtering + +The filtering flag (`-f` or `--filter`) format is of "key=value". If there is more +than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "bif=baz"`) + +The currently supported filters are: + +* until (``) - only remove networks created before given timestamp + +The `until` filter can be Unix timestamps, date formatted +timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed +relative to the daemon machine’s time. Supported formats for date +formatted time stamps include RFC3339Nano, RFC3339, `2006-01-02T15:04:05`, +`2006-01-02T15:04:05.999999999`, `2006-01-02Z07:00`, and `2006-01-02`. The local +timezone on the daemon will be used if you do not provide either a `Z` or a +`+-00:00` timezone offset at the end of the timestamp. When providing Unix +timestamps enter seconds[.nanoseconds], where seconds is the number of seconds +that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap +seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a +fraction of a second no more than nine digits long. + +The following removes networks created more than 5 minutes ago. Note that +system networks such as `bridge`, `host`, and `none` will never be pruned: + +```bash +$ docker network ls +NETWORK ID NAME DRIVER SCOPE +7430df902d7a bridge bridge local +ea92373fd499 foo-1-day-ago bridge local +ab53663ed3c7 foo-1-min-ago bridge local +97b91972bc3b host host local +f949d337b1f5 none null local + +$ docker network prune --force --filter until=5m +Deleted Networks: +foo-1-day-ago + +$ docker network ls +NETWORK ID NAME DRIVER SCOPE +7430df902d7a bridge bridge local +ab53663ed3c7 foo-1-min-ago bridge local +97b91972bc3b host host local +f949d337b1f5 none null local +``` + ## Related information * [network disconnect ](network_disconnect.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_disable.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_disable.md index 66b0ca946..f054fd066 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_disable.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_disable.md @@ -30,27 +30,27 @@ see [`docker plugin install`](plugin_install.md). Without the `-f` option, a plugin that has references (eg, volumes, networks) cannot be disabled. -The following example shows that the `no-remove` plugin is installed +The following example shows that the `sample-volume-plugin` plugin is installed and enabled: ```bash $ docker plugin ls -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/no-remove latest A test plugin for Docker true +ID NAME TAG DESCRIPTION ENABLED +69553ca1d123 tiborvass/sample-volume-plugin latest A test plugin for Docker true ``` To disable the plugin, use the following command: ```bash -$ docker plugin disable tiborvass/no-remove +$ docker plugin disable tiborvass/sample-volume-plugin -tiborvass/no-remove +tiborvass/sample-volume-plugin $ docker plugin ls -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/no-remove latest A test plugin for Docker false +ID NAME TAG DESCRIPTION ENABLED +69553ca1d123 tiborvass/sample-volume-plugin latest A test plugin for Docker false ``` ## Related information diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_enable.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_enable.md index 36fb7640a..060592ef0 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_enable.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_enable.md @@ -29,27 +29,27 @@ Enables a plugin. The plugin must be installed before it can be enabled, see [`docker plugin install`](plugin_install.md). -The following example shows that the `no-remove` plugin is installed, +The following example shows that the `sample-volume-plugin` plugin is installed, but disabled: ```bash $ docker plugin ls -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/no-remove latest A test plugin for Docker false +ID NAME TAG DESCRIPTION ENABLED +69553ca1d123 tiborvass/sample-volume-plugin latest A test plugin for Docker false ``` To enable the plugin, use the following command: ```bash -$ docker plugin enable tiborvass/no-remove +$ docker plugin enable tiborvass/sample-volume-plugin -tiborvass/no-remove +tiborvass/sample-volume-plugin $ docker plugin ls -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/no-remove latest A test plugin for Docker true +ID NAME TAG DESCRIPTION ENABLED +69553ca1d123 tiborvass/sample-volume-plugin latest A test plugin for Docker true ``` ## Related information diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_inspect.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_inspect.md index ded6bd2ee..d40cd40e7 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_inspect.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_inspect.md @@ -16,7 +16,7 @@ keywords: "plugin, inspect" # plugin inspect ```markdown -Usage: docker plugin inspect [OPTIONS] PLUGIN|ID [PLUGIN|ID...] +Usage: docker plugin inspect [OPTIONS] PLUGIN [PLUGIN...] Display detailed information on one or more plugins @@ -31,12 +31,12 @@ in a JSON array. Example output: ```bash -$ docker plugin inspect tiborvass/no-remove:latest +$ docker plugin inspect tiborvass/sample-volume-plugin:latest ``` ```JSON { "Id": "8c74c978c434745c3ade82f1bc0acf38d04990eaf494fa507c16d9f1daa99c21", - "Name": "tiborvass/no-remove:latest", + "Name": "tiborvass/sample-volume-plugin:latest", "Enabled": true, "Config": { "Mounts": [ @@ -79,7 +79,7 @@ $ docker plugin inspect tiborvass/no-remove:latest "Socket": "plugins.sock" }, "Entrypoint": [ - "plugin-no-remove", + "plugin-sample-volume-plugin", "/data" ], "Workdir": "", @@ -143,7 +143,7 @@ $ docker plugin inspect tiborvass/no-remove:latest ```bash -$ docker plugin inspect -f '{{.Id}}' tiborvass/no-remove:latest +$ docker plugin inspect -f '{{.Id}}' tiborvass/sample-volume-plugin:latest ``` ``` 8c74c978c434745c3ade82f1bc0acf38d04990eaf494fa507c16d9f1daa99c21 diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_install.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_install.md index 502eb441b..78dd23825 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_install.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_install.md @@ -33,20 +33,20 @@ the registry. Note that the minimum required registry version to distribute plugins is 2.3.0 -The following example installs `no-remove` plugin and [set](plugin_set.md) it's env variable +The following example installs `vieus/sshfs` plugin and [set](plugin_set.md) it's env variable `DEBUG` to 1. Install consists of pulling the plugin from Docker Hub, prompting the user to accept the list of privileges that the plugin needs, settings parameters and enabling the plugin. ```bash -$ docker plugin install tiborvass/no-remove DEBUG=1 +$ docker plugin install vieux/sshfs DEBUG=1 -Plugin "tiborvass/no-remove" is requesting the following privileges: +Plugin "vieux/sshfs" is requesting the following privileges: - network: [host] - - mount: [/data] - - device: [/dev/cpu_dma_latency] + - device: [/dev/fuse] + - capabilities: [CAP_SYS_ADMIN] Do you grant the above permissions? [y/N] y -tiborvass/no-remove +vieux/sshfs ``` After the plugin is installed, it appears in the list of plugins: @@ -55,7 +55,7 @@ After the plugin is installed, it appears in the list of plugins: $ docker plugin ls ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/no-remove latest A test plugin for Docker true +69553ca1d123 vieux/sshfs latest sshFS plugin for Docker true ``` ## Related information diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_ls.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_ls.md index b727b5334..e436213ec 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_ls.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_ls.md @@ -36,8 +36,8 @@ Example output: ```bash $ docker plugin ls -ID NAME TAG DESCRIPTION ENABLED -69553ca1d123 tiborvass/no-remove latest A test plugin for Docker true +ID NAME TAG DESCRIPTION ENABLED +69553ca1d123 tiborvass/sample-volume-plugin latest A test plugin for Docker true ``` ## Related information diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_rm.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_rm.md index 5a01dcaa1..31029324b 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_rm.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_rm.md @@ -33,14 +33,14 @@ a plugin using the [`docker plugin disable`](plugin_disable.md) before removing it (or use --force, use of force is not recommended, since it can affect functioning of running containers using the plugin). -The following example disables and removes the `no-remove:latest` plugin; +The following example disables and removes the `sample-volume-plugin:latest` plugin; ```bash -$ docker plugin disable tiborvass/no-remove -tiborvass/no-remove +$ docker plugin disable tiborvass/sample-volume-plugin +tiborvass/sample-volume-plugin -$ docker plugin rm tiborvass/no-remove:latest -tiborvass/no-remove +$ docker plugin rm tiborvass/sample-volume-plugin:latest +tiborvass/sample-volume-plugin ``` ## Related information diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_set.md b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_set.md index 9ea93aecf..c206a8a76 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/plugin_set.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/plugin_set.md @@ -33,15 +33,15 @@ The settings currently supported are: * args The following example change the env variable `DEBUG` on the -`no-remove` plugin. +`sample-volume-plugin` plugin. ```bash -$ docker plugin inspect -f {{.Settings.Env}} tiborvass/no-remove +$ docker plugin inspect -f {{.Settings.Env}} tiborvass/sample-volume-plugin [DEBUG=0] -$ docker plugin set tiborvass/no-remove DEBUG=1 +$ docker plugin set tiborvass/sample-volume-plugin DEBUG=1 -$ docker plugin inspect -f {{.Settings.Env}} tiborvass/no-remove +$ docker plugin inspect -f {{.Settings.Env}} tiborvass/sample-volume-plugin [DEBUG=1] ``` diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/run.md b/vendor/github.com/docker/docker/docs/reference/commandline/run.md index 619564701..d1f12a90e 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/run.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/run.md @@ -76,8 +76,8 @@ Options: the system uses bytes per second. --io-maxbandwidth and --io-maxiops are mutually exclusive options. --io-maxiops uint Maximum IOps limit for the system drive (Windows only) - --ip string Container IPv4 address (e.g. 172.30.100.104) - --ip6 string Container IPv6 address (e.g. 2001:db8::33) + --ip string IPv4 address (e.g., 172.30.100.104) + --ip6 string IPv6 address (e.g., 2001:db8::33) --ipc string IPC namespace to use --isolation string Container isolation technology --kernel-memory string Kernel memory limit @@ -87,7 +87,7 @@ Options: --link-local-ip value Container IPv4/IPv6 link-local addresses (default []) --log-driver string Logging driver for the container --log-opt value Log driver options (default []) - --mac-address string Container MAC address (e.g. 92:d0:c6:0a:29:33) + --mac-address string Container MAC address (e.g., 92:d0:c6:0a:29:33) -m, --memory string Memory limit --memory-reservation string Memory soft limit --memory-swap string Swap limit equal to memory plus swap: '-1' to enable unlimited swap @@ -668,38 +668,45 @@ signal that will be sent to the container to exit. After timeout elapses the con ### Specify isolation technology for container (--isolation) This option is useful in situations where you are running Docker containers on -Microsoft Windows. The `--isolation ` option sets a container's isolation -technology. On Linux, the only supported is the `default` option which uses +Windows. The `--isolation ` option sets a container's isolation technology. +On Linux, the only supported is the `default` option which uses Linux namespaces. These two commands are equivalent on Linux: -``` +```bash $ docker run -d busybox top $ docker run -d --isolation default busybox top ``` -On Microsoft Windows, can take any of these values: +On Windows, `--isolation` can take one of these values: -| Value | Description | -|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `default` | Use the value specified by the Docker daemon's `--exec-opt` . If the `daemon` does not specify an isolation technology, Microsoft Windows uses `process` as its default value. | -| `process` | Namespace isolation only. | -| `hyperv` | Hyper-V hypervisor partition-based isolation. | +| Value | Description | +|-----------|--------------------------------------------------------------------------------------------| +| `default` | Use the value specified by the Docker daemon's `--exec-opt` or system default (see below). | +| `process` | Shared-kernel namespace isolation (not supported on Windows client operating systems). | +| `hyperv` | Hyper-V hypervisor partition-based isolation. | -On Windows, the default isolation for client is `hyperv`, and for server is -`process`. Therefore when running on Windows server without a `daemon` option -set, these two commands are equivalent: -``` -$ docker run -d --isolation default busybox top -$ docker run -d --isolation process busybox top -``` +The default isolation on Windows server operating systems is `process`. The default (and only supported) +isolation on Windows client operating systems is `hyperv`. An attempt to start a container on a client +operating system with `--isolation process` will fail. -If you have set the `--exec-opt isolation=hyperv` option on the Docker `daemon`, -if running on Windows server, any of these commands also result in `hyperv` isolation: +On Windows server, assuming the default configuration, these commands are equivalent +and result in `process` isolation: +```PowerShell +PS C:\> docker run -d microsoft/nanoserver powershell echo process +PS C:\> docker run -d --isolation default microsoft/nanoserver powershell echo process +PS C:\> docker run -d --isolation process microsoft/nanoserver powershell echo process ``` -$ docker run -d --isolation default busybox top -$ docker run -d --isolation hyperv busybox top + +If you have set the `--exec-opt isolation=hyperv` option on the Docker `daemon`, or +are running against a Windows client-based daemon, these commands are equivalent and +result in `hyperv` isolation: + +```PowerShell +PS C:\> docker run -d microsoft/nanoserver powershell echo hyperv +PS C:\> docker run -d --isolation default microsoft/nanoserver powershell echo hyperv +PS C:\> docker run -d --isolation hyperv microsoft/nanoserver powershell echo hyperv ``` ### Configure namespaced kernel parameters (sysctls) at runtime diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/secret_create.md b/vendor/github.com/docker/docker/docs/reference/commandline/secret_create.md index ef2641a91..aebcebbcd 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/secret_create.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/secret_create.md @@ -16,12 +16,11 @@ keywords: ["secret, create"] # secret create ```Markdown -Usage: docker secret create [OPTIONS] SECRET +Usage: docker secret create [OPTIONS] SECRET file|- Create a secret from a file or STDIN as content Options: - -f, --file string Read from a file or STDIN ('-') --help Print usage -l, --label list Secret labels (default []) ``` @@ -34,32 +33,32 @@ command on a manager node. ### Create a secret ```bash -$ cat secret.json | docker secret create -f - secret.json +$ echo | docker secret create my_secret - mhv17xfe3gh6xc4rij5orpfds $ docker secret ls ID NAME CREATED UPDATED SIZE -mhv17xfe3gh6xc4rij5orpfds secret.json 2016-10-27 23:25:43.909181089 +0000 UTC 2016-10-27 23:25:43.909181089 +0000 UTC 1679 +mhv17xfe3gh6xc4rij5orpfds my_secret 2016-10-27 23:25:43.909181089 +0000 UTC 2016-10-27 23:25:43.909181089 +0000 UTC 1679 ``` ### Create a secret with a file ```bash -$ docker secret create --file secret.in secret.json +$ docker secret create my_secret ./secret.json mhv17xfe3gh6xc4rij5orpfds $ docker secret ls ID NAME CREATED UPDATED SIZE -mhv17xfe3gh6xc4rij5orpfds secret.json 2016-10-27 23:25:43.909181089 +0000 UTC 2016-10-27 23:25:43.909181089 +0000 UTC 1679 +mhv17xfe3gh6xc4rij5orpfds my_secret 2016-10-27 23:25:43.909181089 +0000 UTC 2016-10-27 23:25:43.909181089 +0000 UTC 1679 ``` ### Create a secret with labels ```bash -$ cat secret.json | docker secret create secret.json -f - --label env=dev --label rev=20161102 +$ docker secret create --label env=dev --label rev=20161102 my_secret ./secret.json jtn7g6aukl5ky7nr9gvwafoxh -$ docker secret inspect secret.json +$ docker secret inspect my_secret [ { "ID": "jtn7g6aukl5ky7nr9gvwafoxh", @@ -69,7 +68,7 @@ $ docker secret inspect secret.json "CreatedAt": "2016-11-03T20:54:12.924766548Z", "UpdatedAt": "2016-11-03T20:54:12.924766548Z", "Spec": { - "Name": "secret.json", + "Name": "my_secret", "Labels": { "env": "dev", "rev": "20161102" diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/service_inspect.md b/vendor/github.com/docker/docker/docs/reference/commandline/service_inspect.md index 8b4ab62d8..413ae99c2 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/service_inspect.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/service_inspect.md @@ -125,15 +125,18 @@ Service Mode: REPLICATED Placement: UpdateConfig: Parallelism: 0 + On failure: pause + Max failure ratio: 0 ContainerSpec: Image: nginx:alpine Resources: +Networks: net1 Endpoint Mode: vip Ports: - Name = - Protocol = tcp - TargetPort = 443 PublishedPort = 4443 + Protocol = tcp + TargetPort = 443 + PublishMode = ingress ``` You can also use `--format pretty` for the same effect. diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/service_ps.md b/vendor/github.com/docker/docker/docs/reference/commandline/service_ps.md index 61abb15f6..15ac59aca 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/service_ps.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/service_ps.md @@ -19,7 +19,7 @@ aliases: ["/engine/reference/commandline/service_tasks/"] ```Markdown Usage: docker service ps [OPTIONS] SERVICE -List the tasks of a service +List the tasks of one or more services Options: -f, --filter filter Filter output based on conditions provided @@ -29,7 +29,7 @@ Options: -q, --quiet Only display task IDs ``` -Lists the tasks that are running as part of the specified service. This command +Lists the tasks that are running as part of the specified services. This command has to be run targeting a manager node. ## Examples diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/stack_deploy.md b/vendor/github.com/docker/docker/docs/reference/commandline/stack_deploy.md index 28b760410..037feaebd 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/stack_deploy.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/stack_deploy.md @@ -96,4 +96,3 @@ axqh55ipl40h vossibility_vossibility-collector replicated 1/1 icecrime/ * [stack ps](stack_ps.md) * [stack rm](stack_rm.md) * [stack services](stack_services.md) -* [deploy](deploy.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/stack_ps.md b/vendor/github.com/docker/docker/docs/reference/commandline/stack_ps.md index 01dc63b7d..101e9feb1 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/stack_ps.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/stack_ps.md @@ -46,6 +46,6 @@ The currently supported filters are: ## Related information * [stack deploy](stack_deploy.md) -* [stack rm](stack_ls.md) +* [stack ls](stack_ls.md) * [stack rm](stack_rm.md) * [stack services](stack_services.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_init.md b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_init.md index 748454c63..2f3931618 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_init.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_init.md @@ -23,6 +23,7 @@ Initialize a swarm Options: --advertise-addr string Advertised address (format: [:port]) --autolock Enable manager autolocking (requiring an unlock key to start a stopped manager) + --availability string Availability of the node (active/pause/drain) (default "active") --cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s) --dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s) --external-ca external-ca Specifications of one or more certificate signing endpoints @@ -133,6 +134,16 @@ Snapshots compact the Raft log and allow for more efficient transfer of the state to new managers. However, there is a performance cost to taking snapshots frequently. +### `--availability` + +This flag specifies the availability of the node at the time the node joins a master. +Possible availability values are `active`, `pause`, or `drain`. + +This flag is useful in certain situations. For example, a cluster may want to have +dedicated manager nodes that are not served as worker nodes. This could be achieved +by passing `--availability=drain` to `docker swarm init`. + + ## Related information * [swarm join](swarm_join.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_join.md b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_join.md index 0e6dadb6c..06bba1f41 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/swarm_join.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/swarm_join.md @@ -22,6 +22,7 @@ Join a swarm as a node and/or manager Options: --advertise-addr string Advertised address (format: [:port]) + --availability string Availability of the node (active/pause/drain) (default "active") --help Print usage --listen-addr node-addr Listen address (format: [:port]) (default 0.0.0.0:2377) --token string Token for entry into the swarm @@ -94,6 +95,15 @@ This flag is generally not necessary when joining an existing swarm. Secret value required for nodes to join the swarm +### `--availability` + +This flag specifies the availability of the node at the time the node joins a master. +Possible availability values are `active`, `pause`, or `drain`. + +This flag is useful in certain situations. For example, a cluster may want to have +dedicated manager nodes that are not served as worker nodes. This could be achieved +by passing `--availability=drain` to `docker swarm join`. + ## Related information diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/system_prune.md b/vendor/github.com/docker/docker/docs/reference/commandline/system_prune.md index 46f8c4364..b6764a779 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/system_prune.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/system_prune.md @@ -21,9 +21,10 @@ Usage: docker system prune [OPTIONS] Delete unused data Options: - -a, --all Remove all unused data not just dangling ones - -f, --force Do not prompt for confirmation - --help Print usage + -a, --all Remove all unused images not just dangling ones + --filter filter Provide filter values (e.g. 'until=') + -f, --force Do not prompt for confirmation + --help Print usage ``` Remove all unused containers, volumes, networks and images (both dangling and unreferenced). @@ -64,6 +65,27 @@ deleted: sha256:3a88a5c81eb5c283e72db2dbc6d65cbfd8e80b6c89bb6e714cfaaa0eed99c548 Total reclaimed space: 13.5 MB ``` +## Filtering + +The filtering flag (`-f` or `--filter`) format is of "key=value". If there is more +than one filter, then pass multiple flags (e.g., `--filter "foo=bar" --filter "bif=baz"`) + +The currently supported filters are: + +* until (``) - only remove containers, images, and networks created before given timestamp + +The `until` filter can be Unix timestamps, date formatted +timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed +relative to the daemon machine’s time. Supported formats for date +formatted time stamps include RFC3339Nano, RFC3339, `2006-01-02T15:04:05`, +`2006-01-02T15:04:05.999999999`, `2006-01-02Z07:00`, and `2006-01-02`. The local +timezone on the daemon will be used if you do not provide either a `Z` or a +`+-00:00` timezone offset at the end of the timestamp. When providing Unix +timestamps enter seconds[.nanoseconds], where seconds is the number of seconds +that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap +seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a +fraction of a second no more than nine digits long. + ## Related information * [volume create](volume_create.md) diff --git a/vendor/github.com/docker/docker/docs/reference/commandline/volume_ls.md b/vendor/github.com/docker/docker/docs/reference/commandline/volume_ls.md index 90ecef2ab..8d012f137 100644 --- a/vendor/github.com/docker/docker/docs/reference/commandline/volume_ls.md +++ b/vendor/github.com/docker/docker/docs/reference/commandline/volume_ls.md @@ -76,9 +76,9 @@ local rosemary ### driver -The `driver` filter matches on all or part of a volume's driver name. +The `driver` filter matches volumes based on their driver. -The following filter matches all volumes with a driver name containing the `local` string. +The following example matches volumes that are created with the `local` driver: ```bash $ docker volume ls -f driver=local diff --git a/vendor/github.com/docker/docker/hack/Jenkins/W2L/setup.sh b/vendor/github.com/docker/docker/hack/Jenkins/W2L/setup.sh index 30e5884d9..3d211be6f 100644 --- a/vendor/github.com/docker/docker/hack/Jenkins/W2L/setup.sh +++ b/vendor/github.com/docker/docker/hack/Jenkins/W2L/setup.sh @@ -188,7 +188,7 @@ if [ $ec -eq 0 ]; then FROM docker:$COMMITHASH RUN hack/make.sh binary RUN cp bundles/latest/binary/docker /bin/docker -CMD docker daemon -D -H tcp://0.0.0.0:$port_inner $daemon_extra_args +CMD dockerd -D -H tcp://0.0.0.0:$port_inner $daemon_extra_args EOF else set -x diff --git a/vendor/github.com/docker/docker/hack/install.sh b/vendor/github.com/docker/docker/hack/install.sh index cc816324c..1b2c81986 100644 --- a/vendor/github.com/docker/docker/hack/install.sh +++ b/vendor/github.com/docker/docker/hack/install.sh @@ -26,12 +26,71 @@ set -e url="https://get.docker.com/" apt_url="https://apt.dockerproject.org" yum_url="https://yum.dockerproject.org" -gpg_fingerprint="58118E89F3A912897C070ADBF76221572C52609D" -key_servers=" -ha.pool.sks-keyservers.net -pgp.mit.edu -keyserver.ubuntu.com +docker_key="-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQINBFWln24BEADrBl5p99uKh8+rpvqJ48u4eTtjeXAWbslJotmC/CakbNSqOb9o +ddfzRvGVeJVERt/Q/mlvEqgnyTQy+e6oEYN2Y2kqXceUhXagThnqCoxcEJ3+KM4R +mYdoe/BJ/J/6rHOjq7Omk24z2qB3RU1uAv57iY5VGw5p45uZB4C4pNNsBJXoCvPn +TGAs/7IrekFZDDgVraPx/hdiwopQ8NltSfZCyu/jPpWFK28TR8yfVlzYFwibj5WK +dHM7ZTqlA1tHIG+agyPf3Rae0jPMsHR6q+arXVwMccyOi+ULU0z8mHUJ3iEMIrpT +X+80KaN/ZjibfsBOCjcfiJSB/acn4nxQQgNZigna32velafhQivsNREFeJpzENiG +HOoyC6qVeOgKrRiKxzymj0FIMLru/iFF5pSWcBQB7PYlt8J0G80lAcPr6VCiN+4c +NKv03SdvA69dCOj79PuO9IIvQsJXsSq96HB+TeEmmL+xSdpGtGdCJHHM1fDeCqkZ +hT+RtBGQL2SEdWjxbF43oQopocT8cHvyX6Zaltn0svoGs+wX3Z/H6/8P5anog43U +65c0A+64Jj00rNDr8j31izhtQMRo892kGeQAaaxg4Pz6HnS7hRC+cOMHUU4HA7iM +zHrouAdYeTZeZEQOA7SxtCME9ZnGwe2grxPXh/U/80WJGkzLFNcTKdv+rwARAQAB +tDdEb2NrZXIgUmVsZWFzZSBUb29sIChyZWxlYXNlZG9ja2VyKSA8ZG9ja2VyQGRv +Y2tlci5jb20+iQIcBBABCgAGBQJWw7vdAAoJEFyzYeVS+w0QHysP/i37m4SyoOCV +cnybl18vzwBEcp4VCRbXvHvOXty1gccVIV8/aJqNKgBV97lY3vrpOyiIeB8ETQeg +srxFE7t/Gz0rsLObqfLEHdmn5iBJRkhLfCpzjeOnyB3Z0IJB6UogO/msQVYe5CXJ +l6uwr0AmoiCBLrVlDAktxVh9RWch0l0KZRX2FpHu8h+uM0/zySqIidlYfLa3y5oH +scU+nGU1i6ImwDTD3ysZC5jp9aVfvUmcESyAb4vvdcAHR+bXhA/RW8QHeeMFliWw +7Z2jYHyuHmDnWG2yUrnCqAJTrWV+OfKRIzzJFBs4e88ru5h2ZIXdRepw/+COYj34 +LyzxR2cxr2u/xvxwXCkSMe7F4KZAphD+1ws61FhnUMi/PERMYfTFuvPrCkq4gyBj +t3fFpZ2NR/fKW87QOeVcn1ivXl9id3MMs9KXJsg7QasT7mCsee2VIFsxrkFQ2jNp +D+JAERRn9Fj4ArHL5TbwkkFbZZvSi6fr5h2GbCAXIGhIXKnjjorPY/YDX6X8AaHO +W1zblWy/CFr6VFl963jrjJgag0G6tNtBZLrclZgWhOQpeZZ5Lbvz2ZA5CqRrfAVc +wPNW1fObFIRtqV6vuVluFOPCMAAnOnqR02w9t17iVQjO3oVN0mbQi9vjuExXh1Yo +ScVetiO6LSmlQfVEVRTqHLMgXyR/EMo7iQIcBBABCgAGBQJXSWBlAAoJEFyzYeVS ++w0QeH0QAI6btAfYwYPuAjfRUy9qlnPhZ+xt1rnwsUzsbmo8K3XTNh+l/R08nu0d +sczw30Q1wju28fh1N8ay223+69f0+yICaXqR18AbGgFGKX7vo0gfEVaxdItUN3eH +NydGFzmeOKbAlrxIMECnSTG/TkFVYO9Ntlv9vSN2BupmTagTRErxLZKnVsWRzp+X +elwlgU5BCZ6U6Ze8+bIc6F1bZstf17X8i6XNV/rOCLx2yP0hn1osoljoLPpW8nzk +wvqYsYbCA28lMt1aqe0UWvRCqR0zxlKn17NZQqjbxcajEMCajoQ01MshmO5GWePV +iv2abCZ/iaC5zKqVT3deMJHLq7lum6qhA41E9gJH9QoqT+qgadheeFfoC1QP7cke ++tXmYg2R39p3l5Hmm+JQbP4f9V5mpWExvHGCSbcatr35tnakIJZugq2ogzsm1djC +Sz9222RXl9OoFqsm1bNzA78+/cOt5N2cyhU0bM2T/zgh42YbDD+JDU/HSmxUIpU+ +wrGvZGM2FU/up0DRxOC4U1fL6HHlj8liNJWfEg3vhougOh66gGF9ik5j4eIlNoz6 +lst+gmvlZQ9/9hRDeoG+AbhZeIlQ4CCw+Y1j/+fUxIzKHPVK+aFJd+oJVNvbojJW +/SgDdSMtFwqOvXyYcHl30Ws0gZUeDyAmNGZeJ3kFklnApDmeKK+OiQIiBBABCgAM +BQJXe5zTBYMHhh+AAAoJEDG4FaMBBnSp7YMQAJqrXoBonZAq07B6qUaT3aBCgnY4 +JshbXmFb/XrrS75f7YJDPx2fJJdqrbYDIHHgOjzxvp3ngPpOpJzI5sYmkaugeoCO +/KHu/+39XqgTB7fguzapRfbvuWp+qzPcHSdb9opnagfzKAze3DQnnLiwCPlsyvGp +zC4KzXgV2ze/4raaOye1kK7O0cHyapmn/q/TR3S8YapyXq5VpLThwJAw1SRDu0Yx +eXIAQiIfaSxT79EktoioW2CSV8/djt+gBjXnKYJJA8P1zzX7GNt/Rc2YG0Ot4v6t +BW16xqFTg+n5JzbeK5cZ1jbIXXfCcaZJyiM2MzYGhSJ9+EV7JYF05OAIWE4SGTRj +XMquQ2oMLSwMCPQHm+FCD9PXQ0tHYx6tKT34wksdmoWsdejl/n3NS+178mG1WI/l +N079h3im2gRwOykMou/QWs3vGw/xDoOYHPV2gJ7To9BLVnVK/hROgdFLZFeyRScN +zwKm57HmYMFA74tX601OiHhk1ymP2UUc25oDWpLXlfcRULJJlo/KfZZF3pmKwIq3 +CilGayFUi1NNwuavG76EcAVtVFUVFFIITwkhkuRbBHIytzEHYosFgD5/acK0Pauq +JnwrwKv0nWq3aK7nKiALAD+iZvPNjFZau3/APqLEmvmRnAElmugcHsWREFxMMjMM +VgYFiYKUAJO8u46eiQI4BBMBAgAiBQJVpZ9uAhsvBgsJCAcDAgYVCAIJCgsEFgID +AQIeAQIXgAAKCRD3YiFXLFJgnbRfEAC9Uai7Rv20QIDlDogRzd+Vebg4ahyoUdj0 +CH+nAk40RIoq6G26u1e+sdgjpCa8jF6vrx+smpgd1HeJdmpahUX0XN3X9f9qU9oj +9A4I1WDalRWJh+tP5WNv2ySy6AwcP9QnjuBMRTnTK27pk1sEMg9oJHK5p+ts8hlS +C4SluyMKH5NMVy9c+A9yqq9NF6M6d6/ehKfBFFLG9BX+XLBATvf1ZemGVHQusCQe +bTGv0C0V9yqtdPdRWVIEhHxyNHATaVYOafTj/EF0lDxLl6zDT6trRV5n9F1VCEh4 +Aal8L5MxVPcIZVO7NHT2EkQgn8CvWjV3oKl2GopZF8V4XdJRl90U/WDv/6cmfI08 +GkzDYBHhS8ULWRFwGKobsSTyIvnbk4NtKdnTGyTJCQ8+6i52s+C54PiNgfj2ieNn +6oOR7d+bNCcG1CdOYY+ZXVOcsjl73UYvtJrO0Rl/NpYERkZ5d/tzw4jZ6FCXgggA +/Zxcjk6Y1ZvIm8Mt8wLRFH9Nww+FVsCtaCXJLP8DlJLASMD9rl5QS9Ku3u7ZNrr5 +HWXPHXITX660jglyshch6CWeiUATqjIAzkEQom/kEnOrvJAtkypRJ59vYQOedZ1s +FVELMXg2UCkD/FwojfnVtjzYaTCeGwFQeqzHmM241iuOmBYPeyTY5veF49aBJA1g +EJOQTvBR8Q== +=Yhur +-----END PGP PUBLIC KEY BLOCK----- " mirror='' @@ -125,19 +184,6 @@ check_forked() { fi } -rpm_import_repository_key() { - local key=$1; shift - local tmpdir=$(mktemp -d) - chmod 600 "$tmpdir" - for key_server in $key_servers ; do - gpg --homedir "$tmpdir" --keyserver "$key_server" --recv-keys "$key" && break - done - gpg --homedir "$tmpdir" -k "$key" >/dev/null - gpg --homedir "$tmpdir" --export --armor "$key" > "$tmpdir"/repo.key - rpm --import "$tmpdir"/repo.key - rm -rf "$tmpdir" -} - semverParse() { major="${1%%.*}" minor="${1#$major.}" @@ -410,10 +456,7 @@ do_install() { ( set -x - for key_server in $key_servers ; do - $sh_c "apt-key adv --keyserver hkp://${key_server}:80 --recv-keys ${gpg_fingerprint}" && break - done - $sh_c "apt-key adv -k ${gpg_fingerprint} >/dev/null" + echo "$docker_key" | apt-key add - $sh_c "mkdir -p /etc/apt/sources.list.d" $sh_c "echo deb \[arch=$(dpkg --print-architecture)\] ${apt_url}/repo ${lsb_dist}-${dist_version} ${repo} > /etc/apt/sources.list.d/docker.list" $sh_c 'sleep 3; apt-get update; apt-get install -y -q docker-engine' diff --git a/vendor/github.com/docker/docker/image/fs.go b/vendor/github.com/docker/docker/image/fs.go index c37ef4942..e7d282532 100644 --- a/vendor/github.com/docker/docker/image/fs.go +++ b/vendor/github.com/docker/docker/image/fs.go @@ -8,8 +8,8 @@ import ( "sync" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/pkg/ioutils" + "github.com/opencontainers/go-digest" ) // DigestWalkFunc is function called by StoreBackend.Walk diff --git a/vendor/github.com/docker/docker/image/fs_test.go b/vendor/github.com/docker/docker/image/fs_test.go index 60390b80e..6555654e1 100644 --- a/vendor/github.com/docker/docker/image/fs_test.go +++ b/vendor/github.com/docker/docker/image/fs_test.go @@ -11,7 +11,7 @@ import ( "path/filepath" "testing" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) func TestFSGetSet(t *testing.T) { diff --git a/vendor/github.com/docker/docker/image/image.go b/vendor/github.com/docker/docker/image/image.go index 3796cf58a..c008f3e9b 100644 --- a/vendor/github.com/docker/docker/image/image.go +++ b/vendor/github.com/docker/docker/image/image.go @@ -6,8 +6,8 @@ import ( "io" "time" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types/container" + "github.com/opencontainers/go-digest" ) // ID is the content-addressable ID of an image. diff --git a/vendor/github.com/docker/docker/image/store.go b/vendor/github.com/docker/docker/image/store.go index b61c45609..26ae109a0 100644 --- a/vendor/github.com/docker/docker/image/store.go +++ b/vendor/github.com/docker/docker/image/store.go @@ -7,8 +7,9 @@ import ( "sync" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" + "github.com/docker/distribution/digestset" "github.com/docker/docker/layer" + "github.com/opencontainers/go-digest" ) // Store is an interface for creating and accessing images @@ -40,7 +41,7 @@ type store struct { ls LayerGetReleaser images map[ID]*imageMeta fs StoreBackend - digestSet *digest.Set + digestSet *digestset.Set } // NewImageStore returns new store object for given layer store @@ -49,7 +50,7 @@ func NewImageStore(fs StoreBackend, ls LayerGetReleaser) (Store, error) { ls: ls, images: make(map[ID]*imageMeta), fs: fs, - digestSet: digest.NewSet(), + digestSet: digestset.NewSet(), } // load all current images and retain layers @@ -170,7 +171,7 @@ func (is *store) Search(term string) (ID, error) { dgst, err := is.digestSet.Lookup(term) if err != nil { - if err == digest.ErrDigestNotFound { + if err == digestset.ErrDigestNotFound { err = fmt.Errorf("No such image: %s", term) } return "", err diff --git a/vendor/github.com/docker/docker/image/store_test.go b/vendor/github.com/docker/docker/image/store_test.go index 50f8aa8b8..e9c2f6d21 100644 --- a/vendor/github.com/docker/docker/image/store_test.go +++ b/vendor/github.com/docker/docker/image/store_test.go @@ -5,8 +5,8 @@ import ( "os" "testing" - "github.com/docker/distribution/digest" "github.com/docker/docker/layer" + "github.com/opencontainers/go-digest" ) func TestRestore(t *testing.T) { diff --git a/vendor/github.com/docker/docker/image/tarexport/load.go b/vendor/github.com/docker/docker/image/tarexport/load.go index 01edd91fb..f5d3e49cb 100644 --- a/vendor/github.com/docker/docker/image/tarexport/load.go +++ b/vendor/github.com/docker/docker/image/tarexport/load.go @@ -11,7 +11,6 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/docker/image" "github.com/docker/docker/image/v1" "github.com/docker/docker/layer" @@ -23,6 +22,7 @@ import ( "github.com/docker/docker/pkg/symlink" "github.com/docker/docker/pkg/system" "github.com/docker/docker/reference" + "github.com/opencontainers/go-digest" ) func (l *tarexporter) Load(inTar io.ReadCloser, outStream io.Writer, quiet bool) error { diff --git a/vendor/github.com/docker/docker/image/tarexport/save.go b/vendor/github.com/docker/docker/image/tarexport/save.go index 1ae931b8d..c85b1a2ba 100644 --- a/vendor/github.com/docker/docker/image/tarexport/save.go +++ b/vendor/github.com/docker/docker/image/tarexport/save.go @@ -10,13 +10,13 @@ import ( "time" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/docker/image" "github.com/docker/docker/image/v1" "github.com/docker/docker/layer" "github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/system" "github.com/docker/docker/reference" + "github.com/opencontainers/go-digest" "github.com/pkg/errors" ) diff --git a/vendor/github.com/docker/docker/image/v1/imagev1.go b/vendor/github.com/docker/docker/image/v1/imagev1.go index b52b447e8..0e8a23cb5 100644 --- a/vendor/github.com/docker/docker/image/v1/imagev1.go +++ b/vendor/github.com/docker/docker/image/v1/imagev1.go @@ -6,11 +6,11 @@ import ( "strings" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types/versions" "github.com/docker/docker/image" "github.com/docker/docker/layer" "github.com/docker/docker/pkg/stringid" + "github.com/opencontainers/go-digest" ) // noFallbackMinVersion is the minimum version for which v1compatibility diff --git a/vendor/github.com/docker/docker/integration-cli/benchmark_test.go b/vendor/github.com/docker/docker/integration-cli/benchmark_test.go index b87e131b7..ae0f67f6b 100644 --- a/vendor/github.com/docker/docker/integration-cli/benchmark_test.go +++ b/vendor/github.com/docker/docker/integration-cli/benchmark_test.go @@ -8,7 +8,7 @@ import ( "strings" "sync" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/check_test.go b/vendor/github.com/docker/docker/integration-cli/check_test.go index d160df551..3a8094391 100644 --- a/vendor/github.com/docker/docker/integration-cli/check_test.go +++ b/vendor/github.com/docker/docker/integration-cli/check_test.go @@ -16,6 +16,7 @@ import ( cliconfig "github.com/docker/docker/cli/config" "github.com/docker/docker/integration-cli/daemon" "github.com/docker/docker/integration-cli/environment" + "github.com/docker/docker/integration-cli/registry" "github.com/docker/docker/pkg/reexec" "github.com/go-check/check" ) @@ -172,7 +173,7 @@ func init() { type DockerRegistrySuite struct { ds *DockerSuite - reg *testRegistryV2 + reg *registry.V2 d *daemon.Daemon } @@ -181,7 +182,7 @@ func (s *DockerRegistrySuite) OnTimeout(c *check.C) { } func (s *DockerRegistrySuite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux, RegistryHosting) + testRequires(c, DaemonIsLinux, registry.Hosting) s.reg = setupRegistry(c, false, "", "") s.d = daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{ Experimental: experimentalDaemon, @@ -206,7 +207,7 @@ func init() { type DockerSchema1RegistrySuite struct { ds *DockerSuite - reg *testRegistryV2 + reg *registry.V2 d *daemon.Daemon } @@ -215,7 +216,7 @@ func (s *DockerSchema1RegistrySuite) OnTimeout(c *check.C) { } func (s *DockerSchema1RegistrySuite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux, RegistryHosting, NotArm64) + testRequires(c, DaemonIsLinux, registry.Hosting, NotArm64) s.reg = setupRegistry(c, true, "", "") s.d = daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{ Experimental: experimentalDaemon, @@ -240,7 +241,7 @@ func init() { type DockerRegistryAuthHtpasswdSuite struct { ds *DockerSuite - reg *testRegistryV2 + reg *registry.V2 d *daemon.Daemon } @@ -249,7 +250,7 @@ func (s *DockerRegistryAuthHtpasswdSuite) OnTimeout(c *check.C) { } func (s *DockerRegistryAuthHtpasswdSuite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux, RegistryHosting) + testRequires(c, DaemonIsLinux, registry.Hosting) s.reg = setupRegistry(c, false, "htpasswd", "") s.d = daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{ Experimental: experimentalDaemon, @@ -276,7 +277,7 @@ func init() { type DockerRegistryAuthTokenSuite struct { ds *DockerSuite - reg *testRegistryV2 + reg *registry.V2 d *daemon.Daemon } @@ -285,7 +286,7 @@ func (s *DockerRegistryAuthTokenSuite) OnTimeout(c *check.C) { } func (s *DockerRegistryAuthTokenSuite) SetUpTest(c *check.C) { - testRequires(c, DaemonIsLinux, RegistryHosting) + testRequires(c, DaemonIsLinux, registry.Hosting) s.d = daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{ Experimental: experimentalDaemon, }) @@ -449,12 +450,12 @@ func init() { type DockerTrustSuite struct { ds *DockerSuite - reg *testRegistryV2 + reg *registry.V2 not *testNotary } func (s *DockerTrustSuite) SetUpTest(c *check.C) { - testRequires(c, RegistryHosting, NotaryServerHosting) + testRequires(c, registry.Hosting, NotaryServerHosting) s.reg = setupRegistry(c, false, "", "") s.not = setupNotary(c) } @@ -487,7 +488,7 @@ func init() { type DockerTrustedSwarmSuite struct { swarmSuite DockerSwarmSuite trustSuite DockerTrustSuite - reg *testRegistryV2 + reg *registry.V2 not *testNotary } diff --git a/vendor/github.com/docker/docker/pkg/integration/checker/checker.go b/vendor/github.com/docker/docker/integration-cli/checker/checker.go similarity index 100% rename from vendor/github.com/docker/docker/pkg/integration/checker/checker.go rename to vendor/github.com/docker/docker/integration-cli/checker/checker.go diff --git a/vendor/github.com/docker/docker/integration-cli/daemon/daemon.go b/vendor/github.com/docker/docker/integration-cli/daemon/daemon.go index fab785da6..67e6066f5 100644 --- a/vendor/github.com/docker/docker/integration-cli/daemon/daemon.go +++ b/vendor/github.com/docker/docker/integration-cli/daemon/daemon.go @@ -2,15 +2,11 @@ package daemon import ( "bytes" - "crypto/tls" "encoding/json" "fmt" "io" "io/ioutil" - "net" "net/http" - "net/http/httputil" - "net/url" "os" "os/exec" "path/filepath" @@ -19,12 +15,13 @@ import ( "time" "github.com/docker/docker/api/types/events" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" "github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/stringid" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/docker/go-connections/sockets" "github.com/docker/go-connections/tlsconfig" "github.com/go-check/check" @@ -543,7 +540,7 @@ func (d *Daemon) queryRootDir() (string, error) { } var b []byte var i Info - b, err = integration.ReadBody(body) + b, err = testutil.ReadBody(body) if err == nil && resp.StatusCode == http.StatusOK { // read the docker root dir if err = json.Unmarshal(b, &i); err == nil { @@ -570,7 +567,7 @@ func (d *Daemon) WaitRun(contID string) error { // GetBaseDeviceSize returns the base device size of the daemon func (d *Daemon) GetBaseDeviceSize(c *check.C) int64 { - infoCmdOutput, _, err := integration.RunCommandPipelineWithOutput( + infoCmdOutput, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(d.dockerBinary, "-H", d.Sock(), "info"), exec.Command("grep", "Base Device Size"), ) @@ -617,14 +614,14 @@ func (d *Daemon) SockRequest(method, endpoint string, data interface{}) (int, [] if err != nil { return -1, nil, err } - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) return res.StatusCode, b, err } // SockRequestRaw executes a socket request on a daemon and returns an http // response and a reader for the output data. func (d *Daemon) SockRequestRaw(method, endpoint string, data io.Reader, ct string) (*http.Response, io.ReadCloser, error) { - return SockRequestRawToDaemon(method, endpoint, data, ct, d.Sock()) + return request.SockRequestRaw(method, endpoint, data, ct, d.Sock()) } // LogFileName returns the path the daemon's log file @@ -714,7 +711,7 @@ func (d *Daemon) ReloadConfig() error { errCh := make(chan error) started := make(chan struct{}) go func() { - _, body, err := SockRequestRawToDaemon("GET", "/events", nil, "", d.Sock()) + _, body, err := request.SockRequestRaw("GET", "/events", nil, "", d.Sock()) close(started) if err != nil { errCh <- err @@ -791,96 +788,6 @@ func WaitInspectWithArgs(dockerBinary, name, expr, expected string, timeout time return nil } -// SockRequestRawToDaemon creates an http request against the specified daemon socket -// FIXME(vdemeester) attach this to daemon ? -func SockRequestRawToDaemon(method, endpoint string, data io.Reader, ct, daemon string) (*http.Response, io.ReadCloser, error) { - req, client, err := newRequestClient(method, endpoint, data, ct, daemon) - if err != nil { - return nil, nil, err - } - - resp, err := client.Do(req) - if err != nil { - client.Close() - return nil, nil, err - } - body := ioutils.NewReadCloserWrapper(resp.Body, func() error { - defer resp.Body.Close() - return client.Close() - }) - - return resp, body, nil -} - -func getTLSConfig() (*tls.Config, error) { - dockerCertPath := os.Getenv("DOCKER_CERT_PATH") - - if dockerCertPath == "" { - return nil, errors.New("DOCKER_TLS_VERIFY specified, but no DOCKER_CERT_PATH environment variable") - } - - option := &tlsconfig.Options{ - CAFile: filepath.Join(dockerCertPath, "ca.pem"), - CertFile: filepath.Join(dockerCertPath, "cert.pem"), - KeyFile: filepath.Join(dockerCertPath, "key.pem"), - } - tlsConfig, err := tlsconfig.Client(*option) - if err != nil { - return nil, err - } - - return tlsConfig, nil -} - -// SockConn opens a connection on the specified socket -func SockConn(timeout time.Duration, daemon string) (net.Conn, error) { - daemonURL, err := url.Parse(daemon) - if err != nil { - return nil, errors.Wrapf(err, "could not parse url %q", daemon) - } - - var c net.Conn - switch daemonURL.Scheme { - case "npipe": - return npipeDial(daemonURL.Path, timeout) - case "unix": - return net.DialTimeout(daemonURL.Scheme, daemonURL.Path, timeout) - case "tcp": - if os.Getenv("DOCKER_TLS_VERIFY") != "" { - // Setup the socket TLS configuration. - tlsConfig, err := getTLSConfig() - if err != nil { - return nil, err - } - dialer := &net.Dialer{Timeout: timeout} - return tls.DialWithDialer(dialer, daemonURL.Scheme, daemonURL.Host, tlsConfig) - } - return net.DialTimeout(daemonURL.Scheme, daemonURL.Host, timeout) - default: - return c, errors.Errorf("unknown scheme %v (%s)", daemonURL.Scheme, daemon) - } -} - -func newRequestClient(method, endpoint string, data io.Reader, ct, daemon string) (*http.Request, *httputil.ClientConn, error) { - c, err := SockConn(time.Duration(10*time.Second), daemon) - if err != nil { - return nil, nil, errors.Errorf("could not dial docker daemon: %v", err) - } - - client := httputil.NewClientConn(c, nil) - - req, err := http.NewRequest(method, endpoint, data) - if err != nil { - client.Close() - return nil, nil, errors.Errorf("could not create new request: %v", err) - } - - if ct != "" { - req.Header.Set("Content-Type", ct) - } - return req, client, nil -} - // BuildImageCmdWithHost create a build command with the specified arguments. // FIXME(vdemeester) move this away func BuildImageCmdWithHost(dockerBinary, name, dockerfile, host string, useCache bool, buildFlags ...string) *exec.Cmd { diff --git a/vendor/github.com/docker/docker/integration-cli/daemon/daemon_swarm.go b/vendor/github.com/docker/docker/integration-cli/daemon/daemon_swarm.go index 2c18b977f..bc9fd41ac 100644 --- a/vendor/github.com/docker/docker/integration-cli/daemon/daemon_swarm.go +++ b/vendor/github.com/docker/docker/integration-cli/daemon/daemon_swarm.go @@ -10,7 +10,7 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" "github.com/pkg/errors" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_attach_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_attach_test.go index 6490069a5..88dba3e97 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_attach_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_attach_test.go @@ -12,9 +12,10 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/client" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/docker/docker/pkg/stdcopy" + "github.com/docker/docker/pkg/testutil" "github.com/go-check/check" "golang.org/x/net/websocket" ) @@ -23,7 +24,7 @@ func (s *DockerSuite) TestGetContainersAttachWebsocket(c *check.C) { testRequires(c, DaemonIsLinux) out, _ := dockerCmd(c, "run", "-dit", "busybox", "cat") - rwc, err := sockConn(time.Duration(10*time.Second), "") + rwc, err := request.SockConn(time.Duration(10*time.Second), daemonHost()) c.Assert(err, checker.IsNil) cleanedContainerID := strings.TrimSpace(out) @@ -73,22 +74,20 @@ func (s *DockerSuite) TestGetContainersAttachWebsocket(c *check.C) { // regression gh14320 func (s *DockerSuite) TestPostContainersAttachContainerNotFound(c *check.C) { - req, client, err := newRequestClient("POST", "/containers/doesnotexist/attach", nil, "", "") + client, err := request.NewClient(daemonHost()) c.Assert(err, checker.IsNil) - + req, err := request.New(daemonHost(), "/containers/doesnotexist/attach", request.Method(http.MethodPost)) resp, err := client.Do(req) // connection will shutdown, err should be "persistent connection closed" - c.Assert(err, checker.NotNil) // Server shutdown connection - - body, err := integration.ReadBody(resp.Body) - c.Assert(err, checker.IsNil) c.Assert(resp.StatusCode, checker.Equals, http.StatusNotFound) + content, err := testutil.ReadBody(resp.Body) + c.Assert(err, checker.IsNil) expected := "No such container: doesnotexist\r\n" - c.Assert(string(body), checker.Equals, expected) + c.Assert(string(content), checker.Equals, expected) } func (s *DockerSuite) TestGetContainersWsAttachContainerNotFound(c *check.C) { - status, body, err := sockRequest("GET", "/containers/doesnotexist/attach/ws", nil) + status, body, err := request.SockRequest("GET", "/containers/doesnotexist/attach/ws", nil, daemonHost()) c.Assert(status, checker.Equals, http.StatusNotFound) c.Assert(err, checker.IsNil) expected := "No such container: doesnotexist" @@ -140,12 +139,12 @@ func (s *DockerSuite) TestPostContainersAttach(c *check.C) { cid, _ := dockerCmd(c, "run", "-di", "busybox", "cat") cid = strings.TrimSpace(cid) // Attach to the container's stdout stream. - conn, br, err := sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stdout=1", nil, "text/plain") + conn, br, err := request.SockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stdout=1", nil, "text/plain", daemonHost()) c.Assert(err, checker.IsNil) // Check if the data from stdout can be received. expectSuccess(conn, br, "stdout", false) // Attach to the container's stderr stream. - conn, br, err = sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stderr=1", nil, "text/plain") + conn, br, err = request.SockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stderr=1", nil, "text/plain", daemonHost()) c.Assert(err, checker.IsNil) // Since the container only emits stdout, attaching to stderr should return nothing. expectTimeout(conn, br, "stdout") @@ -153,10 +152,10 @@ func (s *DockerSuite) TestPostContainersAttach(c *check.C) { // Test the similar functions of the stderr stream. cid, _ = dockerCmd(c, "run", "-di", "busybox", "/bin/sh", "-c", "cat >&2") cid = strings.TrimSpace(cid) - conn, br, err = sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stderr=1", nil, "text/plain") + conn, br, err = request.SockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stderr=1", nil, "text/plain", daemonHost()) c.Assert(err, checker.IsNil) expectSuccess(conn, br, "stderr", false) - conn, br, err = sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stdout=1", nil, "text/plain") + conn, br, err = request.SockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stdout=1", nil, "text/plain", daemonHost()) c.Assert(err, checker.IsNil) expectTimeout(conn, br, "stderr") @@ -164,12 +163,12 @@ func (s *DockerSuite) TestPostContainersAttach(c *check.C) { cid, _ = dockerCmd(c, "run", "-dit", "busybox", "/bin/sh", "-c", "cat >&2") cid = strings.TrimSpace(cid) // Attach to stdout only. - conn, br, err = sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stdout=1", nil, "text/plain") + conn, br, err = request.SockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stdout=1", nil, "text/plain", daemonHost()) c.Assert(err, checker.IsNil) expectSuccess(conn, br, "stdout", true) // Attach without stdout stream. - conn, br, err = sockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stderr=1", nil, "text/plain") + conn, br, err = request.SockRequestHijack("POST", "/containers/"+cid+"/attach?stream=1&stdin=1&stderr=1", nil, "text/plain", daemonHost()) c.Assert(err, checker.IsNil) // Nothing should be received because both the stdout and stderr of the container will be // sent to the client as stdout when tty is enabled. diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_auth_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_auth_test.go index bfcae31bd..cc903c01f 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_auth_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_auth_test.go @@ -4,7 +4,8 @@ import ( "net/http" "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -17,7 +18,7 @@ func (s *DockerSuite) TestAuthAPI(c *check.C) { } expected := "Get https://registry-1.docker.io/v2/: unauthorized: incorrect username or password" - status, body, err := sockRequest("POST", "/auth", config) + status, body, err := request.SockRequest("POST", "/auth", config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusUnauthorized) msg := getErrorMessage(c, body) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_build_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_build_test.go index 0cc97a95d..68eadca88 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_build_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_build_test.go @@ -7,8 +7,9 @@ import ( "regexp" "strings" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" + "github.com/docker/docker/pkg/testutil" "github.com/go-check/check" ) @@ -31,11 +32,11 @@ RUN find /tmp/` c.Assert(err, checker.IsNil) defer server.Close() - res, body, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+server.URL()+"/testD", nil, "application/json") + res, body, err := request.SockRequestRaw("POST", "/build?dockerfile=baz&remote="+server.URL()+"/testD", nil, "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - buf, err := integration.ReadBody(body) + buf, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) // Make sure Dockerfile exists. @@ -72,7 +73,7 @@ func (s *DockerSuite) TestBuildAPIRemoteTarballContext(c *check.C) { defer server.Close() - res, b, err := sockRequestRaw("POST", "/build?remote="+server.URL()+"/testT.tar", nil, "application/tar") + res, b, err := request.SockRequestRaw("POST", "/build?remote="+server.URL()+"/testT.tar", nil, "application/tar", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusOK) b.Close() @@ -121,12 +122,12 @@ RUN echo 'right' defer server.Close() url := "/build?dockerfile=custom&remote=" + server.URL() + "/testT.tar" - res, body, err := sockRequestRaw("POST", url, nil, "application/tar") + res, body, err := request.SockRequestRaw("POST", url, nil, "application/tar", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusOK) defer body.Close() - content, err := integration.ReadBody(body) + content, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) // Build used the wrong dockerfile. @@ -141,11 +142,11 @@ RUN echo from dockerfile`, c.Assert(err, checker.IsNil) defer git.Close() - res, body, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json") + res, body, err := request.SockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - buf, err := integration.ReadBody(body) + buf, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) out := string(buf) @@ -163,11 +164,11 @@ RUN echo from Dockerfile`, defer git.Close() // Make sure it tries to 'dockerfile' query param value - res, body, err := sockRequestRaw("POST", "/build?dockerfile=baz&remote="+git.RepoURL, nil, "application/json") + res, body, err := request.SockRequestRaw("POST", "/build?dockerfile=baz&remote="+git.RepoURL, nil, "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - buf, err := integration.ReadBody(body) + buf, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) out := string(buf) @@ -186,11 +187,11 @@ RUN echo from dockerfile`, defer git.Close() // Make sure it tries to 'dockerfile' query param value - res, body, err := sockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json") + res, body, err := request.SockRequestRaw("POST", "/build?remote="+git.RepoURL, nil, "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - buf, err := integration.ReadBody(body) + buf, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) out := string(buf) @@ -233,11 +234,11 @@ func (s *DockerSuite) TestBuildAPIUnnormalizedTarPaths(c *check.C) { // failed to close tar archive c.Assert(tw.Close(), checker.IsNil) - res, body, err := sockRequestRaw("POST", "/build", buffer, "application/x-tar") + res, body, err := request.SockRequestRaw("POST", "/build", buffer, "application/x-tar", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusOK) - out, err := integration.ReadBody(body) + out, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) lines := strings.Split(string(out), "\n") c.Assert(len(lines), checker.GreaterThan, 1) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_containers_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_containers_test.go index e0f2ec50d..359310a9d 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_containers_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_containers_test.go @@ -8,7 +8,6 @@ import ( "io" "io/ioutil" "net/http" - "net/http/httputil" "net/url" "os" "path/filepath" @@ -21,11 +20,12 @@ import ( containertypes "github.com/docker/docker/api/types/container" mounttypes "github.com/docker/docker/api/types/mount" networktypes "github.com/docker/docker/api/types/network" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/mount" "github.com/docker/docker/pkg/stringid" + "github.com/docker/docker/pkg/testutil" "github.com/docker/docker/volume" "github.com/go-check/check" ) @@ -37,7 +37,7 @@ func (s *DockerSuite) TestContainerAPIGetAll(c *check.C) { name := "getall" dockerCmd(c, "run", "--name", name, "busybox", "true") - status, body, err := sockRequest("GET", "/containers/json?all=1", nil) + status, body, err := request.SockRequest("GET", "/containers/json?all=1", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -57,7 +57,7 @@ func (s *DockerSuite) TestContainerAPIGetAll(c *check.C) { func (s *DockerSuite) TestContainerAPIGetJSONNoFieldsOmitted(c *check.C) { dockerCmd(c, "run", "busybox", "true") - status, body, err := sockRequest("GET", "/containers/json?all=1", nil) + status, body, err := request.SockRequest("GET", "/containers/json?all=1", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -98,7 +98,7 @@ func (s *DockerSuite) TestContainerAPIPsOmitFields(c *check.C) { port := 80 runSleepingContainer(c, "--name", name, "--expose", strconv.Itoa(port)) - status, body, err := sockRequest("GET", "/containers/json?all=1", nil) + status, body, err := request.SockRequest("GET", "/containers/json?all=1", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -130,7 +130,7 @@ func (s *DockerSuite) TestContainerAPIGetExport(c *check.C) { name := "exportcontainer" dockerCmd(c, "run", "--name", name, "busybox", "touch", "/test") - status, body, err := sockRequest("GET", "/containers/"+name+"/export", nil) + status, body, err := request.SockRequest("GET", "/containers/"+name+"/export", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -154,7 +154,7 @@ func (s *DockerSuite) TestContainerAPIGetChanges(c *check.C) { name := "changescontainer" dockerCmd(c, "run", "--name", name, "busybox", "rm", "/etc/passwd") - status, body, err := sockRequest("GET", "/containers/"+name+"/changes", nil) + status, body, err := request.SockRequest("GET", "/containers/"+name+"/changes", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -187,7 +187,7 @@ func (s *DockerSuite) TestGetContainerStats(c *check.C) { } bc := make(chan b, 1) go func() { - status, body, err := sockRequest("GET", "/containers/"+name+"/stats", nil) + status, body, err := request.SockRequest("GET", "/containers/"+name+"/stats", nil, daemonHost()) bc <- b{status, body, err} }() @@ -215,10 +215,10 @@ func (s *DockerSuite) TestGetContainerStatsRmRunning(c *check.C) { out, _ := runSleepingContainer(c) id := strings.TrimSpace(out) - buf := &integration.ChannelBuffer{make(chan []byte, 1)} + buf := &testutil.ChannelBuffer{make(chan []byte, 1)} defer buf.Close() - _, body, err := sockRequestRaw("GET", "/containers/"+id+"/stats?stream=1", nil, "application/json") + _, body, err := request.SockRequestRaw("GET", "/containers/"+id+"/stats?stream=1", nil, "application/json", daemonHost()) c.Assert(err, checker.IsNil) defer body.Close() @@ -257,7 +257,7 @@ func (s *DockerSuite) TestGetContainerStatsStream(c *check.C) { } bc := make(chan b, 1) go func() { - status, body, err := sockRequest("GET", "/containers/"+name+"/stats", nil) + status, body, err := request.SockRequest("GET", "/containers/"+name+"/stats", nil, daemonHost()) bc <- b{status, body, err} }() @@ -293,7 +293,7 @@ func (s *DockerSuite) TestGetContainerStatsNoStream(c *check.C) { } bc := make(chan b, 1) go func() { - status, body, err := sockRequest("GET", "/containers/"+name+"/stats?stream=0", nil) + status, body, err := request.SockRequest("GET", "/containers/"+name+"/stats?stream=0", nil, daemonHost()) bc <- b{status, body, err} }() @@ -329,7 +329,7 @@ func (s *DockerSuite) TestGetStoppedContainerStats(c *check.C) { // We expect an immediate response, but if it's not immediate, the test would hang, so put it in a goroutine // below we'll check this on a timeout. go func() { - resp, body, err := sockRequestRaw("GET", "/containers/"+name+"/stats", nil, "") + resp, body, err := request.SockRequestRaw("GET", "/containers/"+name+"/stats", nil, "", daemonHost()) body.Close() chResp <- stats{resp.StatusCode, err} }() @@ -350,7 +350,7 @@ func (s *DockerSuite) TestContainerAPIPause(c *check.C) { out, _ := dockerCmd(c, "run", "-d", "busybox", "sleep", "30") ContainerID := strings.TrimSpace(out) - status, _, err := sockRequest("POST", "/containers/"+ContainerID+"/pause", nil) + status, _, err := request.SockRequest("POST", "/containers/"+ContainerID+"/pause", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) @@ -361,7 +361,7 @@ func (s *DockerSuite) TestContainerAPIPause(c *check.C) { c.Fatalf("there should be one paused container and not %d", len(pausedContainers)) } - status, _, err = sockRequest("POST", "/containers/"+ContainerID+"/unpause", nil) + status, _, err = request.SockRequest("POST", "/containers/"+ContainerID+"/unpause", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) @@ -381,7 +381,7 @@ func (s *DockerSuite) TestContainerAPITop(c *check.C) { Processes [][]string } var top topResp - status, b, err := sockRequest("GET", "/containers/"+id+"/top?ps_args=aux", nil) + status, b, err := request.SockRequest("GET", "/containers/"+id+"/top?ps_args=aux", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) c.Assert(json.Unmarshal(b, &top), checker.IsNil) @@ -406,7 +406,7 @@ func (s *DockerSuite) TestContainerAPITopWindows(c *check.C) { Processes [][]string } var top topResp - status, b, err := sockRequest("GET", "/containers/"+id+"/top", nil) + status, b, err := request.SockRequest("GET", "/containers/"+id+"/top", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) c.Assert(json.Unmarshal(b, &top), checker.IsNil) @@ -434,7 +434,7 @@ func (s *DockerSuite) TestContainerAPICommit(c *check.C) { dockerCmd(c, "run", "--name="+cName, "busybox", "/bin/sh", "-c", "touch /test") name := "testcontainerapicommit" - status, b, err := sockRequest("POST", "/commit?repo="+name+"&testtag=tag&container="+cName, nil) + status, b, err := request.SockRequest("POST", "/commit?repo="+name+"&testtag=tag&container="+cName, nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) @@ -460,7 +460,7 @@ func (s *DockerSuite) TestContainerAPICommitWithLabelInConfig(c *check.C) { } name := "testcontainerapicommitwithconfig" - status, b, err := sockRequest("POST", "/commit?repo="+name+"&container="+cName, config) + status, b, err := request.SockRequest("POST", "/commit?repo="+name+"&container="+cName, config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) @@ -502,7 +502,7 @@ func (s *DockerSuite) TestContainerAPIBadPort(c *check.C) { jsonData := bytes.NewBuffer(nil) json.NewEncoder(jsonData).Encode(config) - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusInternalServerError) c.Assert(getErrorMessage(c, body), checker.Equals, `invalid port specification: "aa80"`, check.Commentf("Incorrect error msg: %s", body)) @@ -514,7 +514,7 @@ func (s *DockerSuite) TestContainerAPICreate(c *check.C) { "Cmd": []string{"/bin/sh", "-c", "touch /test && ls /test"}, } - status, b, err := sockRequest("POST", "/containers/create", config) + status, b, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) @@ -531,7 +531,7 @@ func (s *DockerSuite) TestContainerAPICreate(c *check.C) { func (s *DockerSuite) TestContainerAPICreateEmptyConfig(c *check.C) { config := map[string]interface{}{} - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusInternalServerError) @@ -552,7 +552,7 @@ func (s *DockerSuite) TestContainerAPICreateMultipleNetworksConfig(c *check.C) { }, } - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusBadRequest) msg := getErrorMessage(c, body) @@ -570,14 +570,14 @@ func (s *DockerSuite) TestContainerAPICreateWithHostName(c *check.C) { "Hostname": hostName, } - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) var container containertypes.ContainerCreateCreatedBody c.Assert(json.Unmarshal(body, &container), checker.IsNil) - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) + status, body, err = request.SockRequest("GET", "/containers/"+container.ID+"/json", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -593,14 +593,14 @@ func (s *DockerSuite) TestContainerAPICreateWithDomainName(c *check.C) { "Domainname": domainName, } - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) var container containertypes.ContainerCreateCreatedBody c.Assert(json.Unmarshal(body, &container), checker.IsNil) - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) + status, body, err = request.SockRequest("GET", "/containers/"+container.ID+"/json", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -628,14 +628,14 @@ func UtilCreateNetworkMode(c *check.C, networkMode string) { "HostConfig": map[string]interface{}{"NetworkMode": networkMode}, } - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) var container containertypes.ContainerCreateCreatedBody c.Assert(json.Unmarshal(body, &container), checker.IsNil) - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) + status, body, err = request.SockRequest("GET", "/containers/"+container.ID+"/json", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -653,14 +653,14 @@ func (s *DockerSuite) TestContainerAPICreateWithCpuSharesCpuset(c *check.C) { "CpusetCpus": "0", } - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) var container containertypes.ContainerCreateCreatedBody c.Assert(json.Unmarshal(body, &container), checker.IsNil) - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) + status, body, err = request.SockRequest("GET", "/containers/"+container.ID+"/json", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -683,7 +683,7 @@ func (s *DockerSuite) TestContainerAPIVerifyHeader(c *check.C) { create := func(ct string) (*http.Response, io.ReadCloser, error) { jsonData := bytes.NewBuffer(nil) c.Assert(json.NewEncoder(jsonData).Encode(config), checker.IsNil) - return sockRequestRaw("POST", "/containers/create", jsonData, ct) + return request.SockRequestRaw("POST", "/containers/create", jsonData, ct, daemonHost()) } // Try with no content-type @@ -719,11 +719,11 @@ func (s *DockerSuite) TestContainerAPIInvalidPortSyntax(c *check.C) { } }` - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") + res, body, err := request.SockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) c.Assert(string(b[:]), checker.Contains, "invalid port") } @@ -739,11 +739,11 @@ func (s *DockerSuite) TestContainerAPIRestartPolicyInvalidPolicyName(c *check.C) } }` - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") + res, body, err := request.SockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) c.Assert(string(b[:]), checker.Contains, "invalid restart policy") } @@ -759,11 +759,11 @@ func (s *DockerSuite) TestContainerAPIRestartPolicyRetryMismatch(c *check.C) { } }` - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") + res, body, err := request.SockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) c.Assert(string(b[:]), checker.Contains, "maximum retry count cannot be used with restart policy") } @@ -779,11 +779,11 @@ func (s *DockerSuite) TestContainerAPIRestartPolicyNegativeRetryCount(c *check.C } }` - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") + res, body, err := request.SockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) c.Assert(string(b[:]), checker.Contains, "maximum retry count cannot be negative") } @@ -799,7 +799,7 @@ func (s *DockerSuite) TestContainerAPIRestartPolicyDefaultRetryCount(c *check.C) } }` - res, _, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") + res, _, err := request.SockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusCreated) } @@ -830,11 +830,11 @@ func (s *DockerSuite) TestContainerAPIPostCreateNull(c *check.C) { "NetworkDisabled":false, "OnBuild":null}` - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") + res, body, err := request.SockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusCreated) - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) type createResp struct { ID string @@ -861,9 +861,9 @@ func (s *DockerSuite) TestCreateWithTooLowMemoryLimit(c *check.C) { "Memory": 524287 }` - res, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json") + res, body, err := request.SockRequestRaw("POST", "/containers/create", strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) - b, err2 := integration.ReadBody(body) + b, err2 := testutil.ReadBody(body) c.Assert(err2, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) @@ -875,7 +875,7 @@ func (s *DockerSuite) TestContainerAPIRename(c *check.C) { containerID := strings.TrimSpace(out) newName := "TestContainerAPIRenameNew" - statusCode, _, err := sockRequest("POST", "/containers/"+containerID+"/rename?name="+newName, nil) + statusCode, _, err := request.SockRequest("POST", "/containers/"+containerID+"/rename?name="+newName, nil, daemonHost()) c.Assert(err, checker.IsNil) // 204 No Content is expected, not 200 c.Assert(statusCode, checker.Equals, http.StatusNoContent) @@ -888,7 +888,7 @@ func (s *DockerSuite) TestContainerAPIKill(c *check.C) { name := "test-api-kill" runSleepingContainer(c, "-i", "--name", name) - status, _, err := sockRequest("POST", "/containers/"+name+"/kill", nil) + status, _, err := request.SockRequest("POST", "/containers/"+name+"/kill", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) @@ -900,7 +900,7 @@ func (s *DockerSuite) TestContainerAPIRestart(c *check.C) { name := "test-api-restart" runSleepingContainer(c, "-di", "--name", name) - status, _, err := sockRequest("POST", "/containers/"+name+"/restart?t=1", nil) + status, _, err := request.SockRequest("POST", "/containers/"+name+"/restart?t=1", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) c.Assert(waitInspect(name, "{{ .State.Restarting }} {{ .State.Running }}", "false true", 15*time.Second), checker.IsNil) @@ -912,7 +912,7 @@ func (s *DockerSuite) TestContainerAPIRestartNotimeoutParam(c *check.C) { id := strings.TrimSpace(out) c.Assert(waitRun(id), checker.IsNil) - status, _, err := sockRequest("POST", "/containers/"+name+"/restart", nil) + status, _, err := request.SockRequest("POST", "/containers/"+name+"/restart", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) c.Assert(waitInspect(name, "{{ .State.Restarting }} {{ .State.Running }}", "false true", 15*time.Second), checker.IsNil) @@ -926,16 +926,16 @@ func (s *DockerSuite) TestContainerAPIStart(c *check.C) { "OpenStdin": true, } - status, _, err := sockRequest("POST", "/containers/create?name="+name, config) + status, _, err := request.SockRequest("POST", "/containers/create?name="+name, config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) - status, _, err = sockRequest("POST", "/containers/"+name+"/start", nil) + status, _, err = request.SockRequest("POST", "/containers/"+name+"/start", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) // second call to start should give 304 - status, _, err = sockRequest("POST", "/containers/"+name+"/start", nil) + status, _, err = request.SockRequest("POST", "/containers/"+name+"/start", nil, daemonHost()) c.Assert(err, checker.IsNil) // TODO(tibor): figure out why this doesn't work on windows @@ -948,13 +948,13 @@ func (s *DockerSuite) TestContainerAPIStop(c *check.C) { name := "test-api-stop" runSleepingContainer(c, "-i", "--name", name) - status, _, err := sockRequest("POST", "/containers/"+name+"/stop?t=30", nil) + status, _, err := request.SockRequest("POST", "/containers/"+name+"/stop?t=30", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) c.Assert(waitInspect(name, "{{ .State.Running }}", "false", 60*time.Second), checker.IsNil) // second call to start should give 304 - status, _, err = sockRequest("POST", "/containers/"+name+"/stop?t=30", nil) + status, _, err = request.SockRequest("POST", "/containers/"+name+"/stop?t=30", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNotModified) } @@ -968,7 +968,7 @@ func (s *DockerSuite) TestContainerAPIWait(c *check.C) { } dockerCmd(c, "run", "--name", name, "busybox", sleepCmd, "2") - status, body, err := sockRequest("POST", "/containers/"+name+"/wait", nil) + status, body, err := request.SockRequest("POST", "/containers/"+name+"/wait", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) c.Assert(waitInspect(name, "{{ .State.Running }}", "false", 60*time.Second), checker.IsNil) @@ -986,7 +986,7 @@ func (s *DockerSuite) TestContainerAPICopyNotExistsAnyMore(c *check.C) { Resource: "/test.txt", } - status, _, err := sockRequest("POST", "/containers/"+name+"/copy", postData) + status, _, err := request.SockRequest("POST", "/containers/"+name+"/copy", postData, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNotFound) } @@ -1000,7 +1000,7 @@ func (s *DockerSuite) TestContainerAPICopyPre124(c *check.C) { Resource: "/test.txt", } - status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData) + status, body, err := request.SockRequest("POST", "/v1.23/containers/"+name+"/copy", postData, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -1030,7 +1030,7 @@ func (s *DockerSuite) TestContainerAPICopyResourcePathEmptyPr124(c *check.C) { Resource: "", } - status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData) + status, body, err := request.SockRequest("POST", "/v1.23/containers/"+name+"/copy", postData, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusInternalServerError) c.Assert(string(body), checker.Matches, "Path cannot be empty\n") @@ -1045,7 +1045,7 @@ func (s *DockerSuite) TestContainerAPICopyResourcePathNotFoundPre124(c *check.C) Resource: "/notexist", } - status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData) + status, body, err := request.SockRequest("POST", "/v1.23/containers/"+name+"/copy", postData, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusInternalServerError) c.Assert(string(body), checker.Matches, "Could not find the file /notexist in container "+name+"\n") @@ -1057,7 +1057,7 @@ func (s *DockerSuite) TestContainerAPICopyContainerNotFoundPr124(c *check.C) { Resource: "/something", } - status, _, err := sockRequest("POST", "/v1.23/containers/notexists/copy", postData) + status, _, err := request.SockRequest("POST", "/v1.23/containers/notexists/copy", postData, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNotFound) } @@ -1070,13 +1070,13 @@ func (s *DockerSuite) TestContainerAPIDelete(c *check.C) { dockerCmd(c, "stop", id) - status, _, err := sockRequest("DELETE", "/containers/"+id, nil) + status, _, err := request.SockRequest("DELETE", "/containers/"+id, nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) } func (s *DockerSuite) TestContainerAPIDeleteNotExist(c *check.C) { - status, body, err := sockRequest("DELETE", "/containers/doesnotexist", nil) + status, body, err := request.SockRequest("DELETE", "/containers/doesnotexist", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNotFound) c.Assert(getErrorMessage(c, body), checker.Matches, "No such container: doesnotexist") @@ -1088,7 +1088,7 @@ func (s *DockerSuite) TestContainerAPIDeleteForce(c *check.C) { id := strings.TrimSpace(out) c.Assert(waitRun(id), checker.IsNil) - status, _, err := sockRequest("DELETE", "/containers/"+id+"?force=1", nil) + status, _, err := request.SockRequest("DELETE", "/containers/"+id+"?force=1", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) } @@ -1109,7 +1109,7 @@ func (s *DockerSuite) TestContainerAPIDeleteRemoveLinks(c *check.C) { links := inspectFieldJSON(c, id2, "HostConfig.Links") c.Assert(links, checker.Equals, "[\"/tlink1:/tlink2/tlink1\"]", check.Commentf("expected to have links between containers")) - status, b, err := sockRequest("DELETE", "/containers/tlink2/tlink1?link=1", nil) + status, b, err := request.SockRequest("DELETE", "/containers/tlink2/tlink1?link=1", nil, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusNoContent, check.Commentf(string(b))) @@ -1123,7 +1123,7 @@ func (s *DockerSuite) TestContainerAPIDeleteConflict(c *check.C) { id := strings.TrimSpace(out) c.Assert(waitRun(id), checker.IsNil) - status, _, err := sockRequest("DELETE", "/containers/"+id, nil) + status, _, err := request.SockRequest("DELETE", "/containers/"+id, nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusConflict) } @@ -1145,7 +1145,7 @@ func (s *DockerSuite) TestContainerAPIDeleteRemoveVolume(c *check.C) { _, err = os.Stat(source) c.Assert(err, checker.IsNil) - status, _, err := sockRequest("DELETE", "/containers/"+id+"?v=1&force=1", nil) + status, _, err := request.SockRequest("DELETE", "/containers/"+id+"?v=1&force=1", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) _, err = os.Stat(source) @@ -1154,30 +1154,21 @@ func (s *DockerSuite) TestContainerAPIDeleteRemoveVolume(c *check.C) { // Regression test for https://github.com/docker/docker/issues/6231 func (s *DockerSuite) TestContainerAPIChunkedEncoding(c *check.C) { - conn, err := sockConn(time.Duration(10*time.Second), "") - c.Assert(err, checker.IsNil) - client := httputil.NewClientConn(conn, nil) - defer client.Close() config := map[string]interface{}{ "Image": "busybox", "Cmd": append([]string{"/bin/sh", "-c"}, sleepCommandForDaemonPlatform()...), "OpenStdin": true, } - b, err := json.Marshal(config) - c.Assert(err, checker.IsNil) - req, err := http.NewRequest("POST", "/containers/create", bytes.NewBuffer(b)) - c.Assert(err, checker.IsNil) - req.Header.Set("Content-Type", "application/json") - // This is a cheat to make the http request do chunked encoding - // Otherwise (just setting the Content-Encoding to chunked) net/http will overwrite - // https://golang.org/src/pkg/net/http/request.go?s=11980:12172 - req.ContentLength = -1 - - resp, err := client.Do(req) + resp, _, err := request.Post(daemonHost(), "/containers/create", request.JSONBody(config), func(req *http.Request) error { + // This is a cheat to make the http request do chunked encoding + // Otherwise (just setting the Content-Encoding to chunked) net/http will overwrite + // https://golang.org/src/pkg/net/http/request.go?s=11980:12172 + req.ContentLength = -1 + return nil + }) c.Assert(err, checker.IsNil, check.Commentf("error creating container with chunked encoding")) - resp.Body.Close() c.Assert(resp.StatusCode, checker.Equals, http.StatusCreated) } @@ -1187,7 +1178,7 @@ func (s *DockerSuite) TestContainerAPIPostContainerStop(c *check.C) { containerID := strings.TrimSpace(out) c.Assert(waitRun(containerID), checker.IsNil) - statusCode, _, err := sockRequest("POST", "/containers/"+containerID+"/stop", nil) + statusCode, _, err := request.SockRequest("POST", "/containers/"+containerID+"/stop", nil, daemonHost()) c.Assert(err, checker.IsNil) // 204 No Content is expected, not 200 c.Assert(statusCode, checker.Equals, http.StatusNoContent) @@ -1201,7 +1192,7 @@ func (s *DockerSuite) TestPostContainerAPICreateWithStringOrSliceEntrypoint(c *c Entrypoint string Cmd []string }{"busybox", "echo", []string{"hello", "world"}} - _, _, err := sockRequest("POST", "/containers/create?name=echotest", config) + _, _, err := request.SockRequest("POST", "/containers/create?name=echotest", config, daemonHost()) c.Assert(err, checker.IsNil) out, _ := dockerCmd(c, "start", "-a", "echotest") c.Assert(strings.TrimSpace(out), checker.Equals, "hello world") @@ -1211,7 +1202,7 @@ func (s *DockerSuite) TestPostContainerAPICreateWithStringOrSliceEntrypoint(c *c Entrypoint []string Cmd []string }{"busybox", []string{"echo"}, []string{"hello", "world"}} - _, _, err = sockRequest("POST", "/containers/create?name=echotest2", config2) + _, _, err = request.SockRequest("POST", "/containers/create?name=echotest2", config2, daemonHost()) c.Assert(err, checker.IsNil) out, _ = dockerCmd(c, "start", "-a", "echotest2") c.Assert(strings.TrimSpace(out), checker.Equals, "hello world") @@ -1224,7 +1215,7 @@ func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceCmd(c *check.C) { Entrypoint string Cmd string }{"busybox", "echo", "hello world"} - _, _, err := sockRequest("POST", "/containers/create?name=echotest", config) + _, _, err := request.SockRequest("POST", "/containers/create?name=echotest", config, daemonHost()) c.Assert(err, checker.IsNil) out, _ := dockerCmd(c, "start", "-a", "echotest") c.Assert(strings.TrimSpace(out), checker.Equals, "hello world") @@ -1233,7 +1224,7 @@ func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceCmd(c *check.C) { Image string Cmd []string }{"busybox", []string{"echo", "hello", "world"}} - _, _, err = sockRequest("POST", "/containers/create?name=echotest2", config2) + _, _, err = request.SockRequest("POST", "/containers/create?name=echotest2", config2, daemonHost()) c.Assert(err, checker.IsNil) out, _ = dockerCmd(c, "start", "-a", "echotest2") c.Assert(strings.TrimSpace(out), checker.Equals, "hello world") @@ -1248,7 +1239,7 @@ func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceCapAddDrop(c *che CapAdd string CapDrop string }{"busybox", "NET_ADMIN", "SYS_ADMIN"} - status, _, err := sockRequest("POST", "/containers/create?name=capaddtest0", config) + status, _, err := request.SockRequest("POST", "/containers/create?name=capaddtest0", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) @@ -1257,7 +1248,7 @@ func (s *DockerSuite) TestPostContainersCreateWithStringOrSliceCapAddDrop(c *che CapAdd []string CapDrop []string }{"busybox", []string{"NET_ADMIN", "SYS_ADMIN"}, []string{"SETGID"}} - status, _, err = sockRequest("POST", "/containers/create?name=capaddtest1", config2) + status, _, err = request.SockRequest("POST", "/containers/create?name=capaddtest1", config2, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) } @@ -1268,7 +1259,7 @@ func (s *DockerSuite) TestContainerAPICreateNoHostConfig118(c *check.C) { config := struct { Image string }{"busybox"} - status, _, err := sockRequest("POST", "/v1.18/containers/create", config) + status, _, err := request.SockRequest("POST", "/v1.18/containers/create", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) } @@ -1291,7 +1282,7 @@ func (s *DockerSuite) TestPutContainerArchiveErrSymlinkInVolumeToReadOnlyRootfs( readOnly: true, volumes: defaultVolumes(testVol), // Our bind mount is at /vol2 }) - defer deleteContainer(cID) + defer deleteContainer(false, cID) // Attempt to extract to a symlink in the volume which points to a // directory outside the volume. This should cause an error because the @@ -1300,7 +1291,7 @@ func (s *DockerSuite) TestPutContainerArchiveErrSymlinkInVolumeToReadOnlyRootfs( query.Set("path", "/vol2/symlinkToAbsDir") urlPath := fmt.Sprintf("/v1.20/containers/%s/archive?%s", cID, query.Encode()) - statusCode, body, err := sockRequest("PUT", urlPath, nil) + statusCode, body, err := request.SockRequest("PUT", urlPath, nil, daemonHost()) c.Assert(err, checker.IsNil) if !isCpCannotCopyReadOnly(fmt.Errorf(string(body))) { @@ -1309,7 +1300,7 @@ func (s *DockerSuite) TestPutContainerArchiveErrSymlinkInVolumeToReadOnlyRootfs( } func (s *DockerSuite) TestContainerAPIGetContainersJSONEmpty(c *check.C) { - status, body, err := sockRequest("GET", "/containers/json?all=1", nil) + status, body, err := request.SockRequest("GET", "/containers/json?all=1", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) c.Assert(string(body), checker.Equals, "[]\n") @@ -1324,7 +1315,7 @@ func (s *DockerSuite) TestPostContainersCreateWithWrongCpusetValues(c *check.C) CpusetCpus string }{"busybox", "1-42,,"} name := "wrong-cpuset-cpus" - status, body, err := sockRequest("POST", "/containers/create?name="+name, c1) + status, body, err := request.SockRequest("POST", "/containers/create?name="+name, c1, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusInternalServerError) expected := "Invalid value 1-42,, for cpuset cpus" @@ -1335,7 +1326,7 @@ func (s *DockerSuite) TestPostContainersCreateWithWrongCpusetValues(c *check.C) CpusetMems string }{"busybox", "42-3,1--"} name = "wrong-cpuset-mems" - status, body, err = sockRequest("POST", "/containers/create?name="+name, c2) + status, body, err = request.SockRequest("POST", "/containers/create?name="+name, c2, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusInternalServerError) expected = "Invalid value 42-3,1-- for cpuset mems" @@ -1350,7 +1341,7 @@ func (s *DockerSuite) TestPostContainersCreateShmSizeNegative(c *check.C) { "HostConfig": map[string]interface{}{"ShmSize": -1}, } - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusInternalServerError) c.Assert(getErrorMessage(c, body), checker.Contains, "SHM size can not be less than 0") @@ -1365,14 +1356,14 @@ func (s *DockerSuite) TestPostContainersCreateShmSizeHostConfigOmitted(c *check. "Cmd": "mount", } - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusCreated) var container containertypes.ContainerCreateCreatedBody c.Assert(json.Unmarshal(body, &container), check.IsNil) - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) + status, body, err = request.SockRequest("GET", "/containers/"+container.ID+"/json", nil, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusOK) @@ -1397,14 +1388,14 @@ func (s *DockerSuite) TestPostContainersCreateShmSizeOmitted(c *check.C) { "Cmd": "mount", } - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusCreated) var container containertypes.ContainerCreateCreatedBody c.Assert(json.Unmarshal(body, &container), check.IsNil) - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) + status, body, err = request.SockRequest("GET", "/containers/"+container.ID+"/json", nil, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusOK) @@ -1429,14 +1420,14 @@ func (s *DockerSuite) TestPostContainersCreateWithShmSize(c *check.C) { "HostConfig": map[string]interface{}{"ShmSize": 1073741824}, } - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusCreated) var container containertypes.ContainerCreateCreatedBody c.Assert(json.Unmarshal(body, &container), check.IsNil) - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) + status, body, err = request.SockRequest("GET", "/containers/"+container.ID+"/json", nil, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusOK) @@ -1459,14 +1450,14 @@ func (s *DockerSuite) TestPostContainersCreateMemorySwappinessHostConfigOmitted( "Image": "busybox", } - status, body, err := sockRequest("POST", "/containers/create", config) + status, body, err := request.SockRequest("POST", "/containers/create", config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusCreated) var container containertypes.ContainerCreateCreatedBody c.Assert(json.Unmarshal(body, &container), check.IsNil) - status, body, err = sockRequest("GET", "/containers/"+container.ID+"/json", nil) + status, body, err = request.SockRequest("GET", "/containers/"+container.ID+"/json", nil, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusOK) @@ -1486,7 +1477,7 @@ func (s *DockerSuite) TestPostContainersCreateWithOomScoreAdjInvalidRange(c *che OomScoreAdj int }{"busybox", 1001} name := "oomscoreadj-over" - status, b, err := sockRequest("POST", "/containers/create?name="+name, config) + status, b, err := request.SockRequest("POST", "/containers/create?name="+name, config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusInternalServerError) @@ -1501,7 +1492,7 @@ func (s *DockerSuite) TestPostContainersCreateWithOomScoreAdjInvalidRange(c *che OomScoreAdj int }{"busybox", -1001} name = "oomscoreadj-low" - status, b, err = sockRequest("POST", "/containers/create?name="+name, config) + status, b, err = request.SockRequest("POST", "/containers/create?name="+name, config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusInternalServerError) expected = "Invalid value -1001, range for oom score adj is [-1000, 1000]" @@ -1513,7 +1504,7 @@ func (s *DockerSuite) TestPostContainersCreateWithOomScoreAdjInvalidRange(c *che // test case for #22210 where an empty container name caused panic. func (s *DockerSuite) TestContainerAPIDeleteWithEmptyName(c *check.C) { - status, out, err := sockRequest("DELETE", "/containers/", nil) + status, out, err := request.SockRequest("DELETE", "/containers/", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusBadRequest) c.Assert(string(out), checker.Contains, "No container name or ID supplied") @@ -1530,11 +1521,11 @@ func (s *DockerSuite) TestContainerAPIStatsWithNetworkDisabled(c *check.C) { "NetworkDisabled": true, } - status, _, err := sockRequest("POST", "/containers/create?name="+name, config) + status, _, err := request.SockRequest("POST", "/containers/create?name="+name, config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) - status, _, err = sockRequest("POST", "/containers/"+name+"/start", nil) + status, _, err = request.SockRequest("POST", "/containers/"+name+"/start", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) @@ -1547,7 +1538,7 @@ func (s *DockerSuite) TestContainerAPIStatsWithNetworkDisabled(c *check.C) { } bc := make(chan b, 1) go func() { - status, body, err := sockRequest("GET", "/containers/"+name+"/stats", nil) + status, body, err := request.SockRequest("GET", "/containers/"+name+"/stats", nil, daemonHost()) bc <- b{status, body, err} }() @@ -1755,7 +1746,7 @@ func (s *DockerSuite) TestContainersAPICreateMountsValidation(c *check.C) { for i, x := range cases { c.Logf("case %d", i) - status, b, err := sockRequest("POST", "/containers/create", x.config) + status, b, err := request.SockRequest("POST", "/containers/create", x.config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, x.status, check.Commentf("%s\n%v", string(b), cases[i].config)) if len(x.msg) > 0 { @@ -1780,7 +1771,7 @@ func (s *DockerSuite) TestContainerAPICreateMountsBindRead(c *check.C) { "Cmd": []string{"/bin/sh", "-c", "cat /foo/bar"}, "HostConfig": map[string]interface{}{"Mounts": []map[string]interface{}{{"Type": "bind", "Source": tmpDir, "Target": destPath}}}, } - status, resp, err := sockRequest("POST", "/containers/create?name=test", data) + status, resp, err := request.SockRequest("POST", "/containers/create?name=test", data, daemonHost()) c.Assert(err, checker.IsNil, check.Commentf(string(resp))) c.Assert(status, checker.Equals, http.StatusCreated, check.Commentf(string(resp))) @@ -1868,7 +1859,7 @@ func (s *DockerSuite) TestContainersAPICreateMountsCreate(c *check.C) { } for i, x := range cases { c.Logf("case %d - config: %v", i, x.cfg) - status, data, err := sockRequest("POST", "/containers/create", wrapper{containertypes.Config{Image: testImg}, containertypes.HostConfig{Mounts: []mounttypes.Mount{x.cfg}}}) + status, data, err := request.SockRequest("POST", "/containers/create", wrapper{containertypes.Config{Image: testImg}, containertypes.HostConfig{Mounts: []mounttypes.Mount{x.cfg}}}, daemonHost()) c.Assert(err, checker.IsNil, check.Commentf(string(data))) c.Assert(status, checker.Equals, http.StatusCreated, check.Commentf(string(data))) @@ -1950,7 +1941,7 @@ func (s *DockerSuite) TestContainersAPICreateMountsTmpfs(c *check.C) { fmt.Sprintf("mount | grep 'tmpfs on %s'", target)}, "HostConfig": map[string]interface{}{"Mounts": []map[string]interface{}{x.cfg}}, } - status, resp, err := sockRequest("POST", "/containers/create?name="+cName, data) + status, resp, err := request.SockRequest("POST", "/containers/create?name="+cName, data, daemonHost()) c.Assert(err, checker.IsNil, check.Commentf(string(resp))) c.Assert(status, checker.Equals, http.StatusCreated, check.Commentf(string(resp))) out, _ := dockerCmd(c, "start", "-a", cName) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_create_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_create_test.go index 41011c315..c2616c2e7 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_create_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_create_test.go @@ -3,7 +3,8 @@ package main import ( "net/http" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -14,7 +15,7 @@ func (s *DockerSuite) TestAPICreateWithNotExistImage(c *check.C) { "Volumes": map[string]struct{}{"/tmp": {}}, } - status, body, err := sockRequest("POST", "/containers/create?name="+name, config) + status, body, err := request.SockRequest("POST", "/containers/create?name="+name, config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusNotFound) expected := "No such image: test456:v1" @@ -25,7 +26,7 @@ func (s *DockerSuite) TestAPICreateWithNotExistImage(c *check.C) { "Volumes": map[string]struct{}{"/tmp": {}}, } - status, body, err = sockRequest("POST", "/containers/create?name="+name, config2) + status, body, err = request.SockRequest("POST", "/containers/create?name="+name, config2, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusNotFound) expected = "No such image: test456:latest" @@ -35,7 +36,7 @@ func (s *DockerSuite) TestAPICreateWithNotExistImage(c *check.C) { "Image": "sha256:0cb40641836c461bc97c793971d84d758371ed682042457523e4ae701efeaaaa", } - status, body, err = sockRequest("POST", "/containers/create?name="+name, config3) + status, body, err = request.SockRequest("POST", "/containers/create?name="+name, config3, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusNotFound) expected = "No such image: sha256:0cb40641836c461bc97c793971d84d758371ed682042457523e4ae701efeaaaa" @@ -52,7 +53,7 @@ func (s *DockerSuite) TestAPICreateEmptyEnv(c *check.C) { "Cmd": []string{"true"}, } - status, body, err := sockRequest("POST", "/containers/create?name="+name, config) + status, body, err := request.SockRequest("POST", "/containers/create?name="+name, config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusInternalServerError) expected := "invalid environment variable:" @@ -64,7 +65,7 @@ func (s *DockerSuite) TestAPICreateEmptyEnv(c *check.C) { "Env": []string{"=", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}, "Cmd": []string{"true"}, } - status, body, err = sockRequest("POST", "/containers/create?name="+name, config) + status, body, err = request.SockRequest("POST", "/containers/create?name="+name, config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusInternalServerError) expected = "invalid environment variable: =" @@ -76,7 +77,7 @@ func (s *DockerSuite) TestAPICreateEmptyEnv(c *check.C) { "Env": []string{"=foo", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}, "Cmd": []string{"true"}, } - status, body, err = sockRequest("POST", "/containers/create?name="+name, config) + status, body, err = request.SockRequest("POST", "/containers/create?name="+name, config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusInternalServerError) expected = "invalid environment variable: =foo" diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_events_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_events_test.go index 3891c8737..45de688c6 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_events_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_events_test.go @@ -9,7 +9,8 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/docker/docker/pkg/jsonmessage" "github.com/go-check/check" ) @@ -21,7 +22,7 @@ func (s *DockerSuite) TestEventsAPIEmptyOutput(c *check.C) { } chResp := make(chan *apiResp) go func() { - resp, body, err := sockRequestRaw("GET", "/events", nil, "") + resp, body, err := request.SockRequestRaw("GET", "/events", nil, "", daemonHost()) body.Close() chResp <- &apiResp{resp, err} }() @@ -46,7 +47,7 @@ func (s *DockerSuite) TestEventsAPIBackwardsCompatible(c *check.C) { q := url.Values{} q.Set("since", ts) - _, body, err := sockRequestRaw("GET", "/events?"+q.Encode(), nil, "") + _, body, err := request.SockRequestRaw("GET", "/events?"+q.Encode(), nil, "", daemonHost()) c.Assert(err, checker.IsNil) defer body.Close() diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_exec_resize_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_exec_resize_test.go index cf4dded48..94ced6e0d 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_exec_resize_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_exec_resize_test.go @@ -9,7 +9,8 @@ import ( "strings" "sync" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -19,7 +20,7 @@ func (s *DockerSuite) TestExecResizeAPIHeightWidthNoInt(c *check.C) { cleanedContainerID := strings.TrimSpace(out) endpoint := "/exec/" + cleanedContainerID + "/resize?h=foo&w=bar" - status, _, err := sockRequest("POST", endpoint, nil) + status, _, err := request.SockRequest("POST", endpoint, nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusInternalServerError) } @@ -35,7 +36,7 @@ func (s *DockerSuite) TestExecResizeImmediatelyAfterExecStart(c *check.C) { "Cmd": []string{"/bin/sh"}, } uri := fmt.Sprintf("/containers/%s/exec", name) - status, body, err := sockRequest("POST", uri, data) + status, body, err := request.SockRequest("POST", uri, data, daemonHost()) if err != nil { return err } @@ -55,13 +56,13 @@ func (s *DockerSuite) TestExecResizeImmediatelyAfterExecStart(c *check.C) { } payload := bytes.NewBufferString(`{"Tty":true}`) - conn, _, err := sockRequestHijack("POST", fmt.Sprintf("/exec/%s/start", execID), payload, "application/json") + conn, _, err := request.SockRequestHijack("POST", fmt.Sprintf("/exec/%s/start", execID), payload, "application/json", daemonHost()) if err != nil { return fmt.Errorf("Failed to start the exec: %q", err.Error()) } defer conn.Close() - _, rc, err := sockRequestRaw("POST", fmt.Sprintf("/exec/%s/resize?h=24&w=80", execID), nil, "text/plain") + _, rc, err := request.SockRequestRaw("POST", fmt.Sprintf("/exec/%s/resize?h=24&w=80", execID), nil, "text/plain", daemonHost()) // It's probably a panic of the daemon if io.ErrUnexpectedEOF is returned. if err == io.ErrUnexpectedEOF { return fmt.Errorf("The daemon might have crashed.") diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_exec_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_exec_test.go index def43b748..422438c44 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_exec_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_exec_test.go @@ -10,8 +10,9 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" + "github.com/docker/docker/pkg/testutil" "github.com/go-check/check" ) @@ -20,7 +21,7 @@ func (s *DockerSuite) TestExecAPICreateNoCmd(c *check.C) { name := "exec_test" dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh") - status, body, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": nil}) + status, body, err := request.SockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": nil}, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusInternalServerError) @@ -37,11 +38,11 @@ func (s *DockerSuite) TestExecAPICreateNoValidContentType(c *check.C) { c.Fatalf("Can not encode data to json %s", err) } - res, body, err := sockRequestRaw("POST", fmt.Sprintf("/containers/%s/exec", name), jsonData, "text/plain") + res, body, err := request.SockRequestRaw("POST", fmt.Sprintf("/containers/%s/exec", name), jsonData, "text/plain", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) comment := check.Commentf("Expected message when creating exec command with invalid Content-Type specified") @@ -55,7 +56,7 @@ func (s *DockerSuite) TestExecAPICreateContainerPaused(c *check.C) { dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh") dockerCmd(c, "pause", name) - status, body, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": []string{"true"}}) + status, body, err := request.SockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": []string{"true"}}, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusConflict) @@ -95,7 +96,7 @@ func (s *DockerSuite) TestExecAPIStartEnsureHeaders(c *check.C) { dockerCmd(c, "run", "-d", "--name", "test", "busybox", "top") id := createExec(c, "test") - resp, _, err := sockRequestRaw("POST", fmt.Sprintf("/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "application/json") + resp, _, err := request.SockRequestRaw("POST", fmt.Sprintf("/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(resp.Header.Get("Server"), checker.Not(checker.Equals), "") } @@ -105,10 +106,10 @@ func (s *DockerSuite) TestExecAPIStartBackwardsCompatible(c *check.C) { runSleepingContainer(c, "-d", "--name", "test") id := createExec(c, "test") - resp, body, err := sockRequestRaw("POST", fmt.Sprintf("/v1.20/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "text/plain") + resp, body, err := request.SockRequestRaw("POST", fmt.Sprintf("/v1.20/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "text/plain", daemonHost()) c.Assert(err, checker.IsNil) - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) comment := check.Commentf("response body: %s", b) c.Assert(err, checker.IsNil, comment) c.Assert(resp.StatusCode, checker.Equals, http.StatusOK, comment) @@ -146,7 +147,7 @@ func (s *DockerSuite) TestExecAPIStartWithDetach(c *check.C) { "cmd": []string{"true"}, "AttachStdin": true, } - _, b, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), data) + _, b, err := request.SockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), data, daemonHost()) c.Assert(err, checker.IsNil, check.Commentf(string(b))) createResp := struct { @@ -154,14 +155,14 @@ func (s *DockerSuite) TestExecAPIStartWithDetach(c *check.C) { }{} c.Assert(json.Unmarshal(b, &createResp), checker.IsNil, check.Commentf(string(b))) - _, body, err := sockRequestRaw("POST", fmt.Sprintf("/exec/%s/start", createResp.ID), strings.NewReader(`{"Detach": true}`), "application/json") + _, body, err := request.SockRequestRaw("POST", fmt.Sprintf("/exec/%s/start", createResp.ID), strings.NewReader(`{"Detach": true}`), "application/json", daemonHost()) c.Assert(err, checker.IsNil) - b, err = integration.ReadBody(body) + b, err = testutil.ReadBody(body) comment := check.Commentf("response body: %s", b) c.Assert(err, checker.IsNil, comment) - resp, _, err := sockRequestRaw("GET", "/_ping", nil, "") + resp, _, err := request.SockRequestRaw("GET", "/_ping", nil, "", daemonHost()) c.Assert(err, checker.IsNil) if resp.StatusCode != http.StatusOK { c.Fatal("daemon is down, it should alive") @@ -169,7 +170,7 @@ func (s *DockerSuite) TestExecAPIStartWithDetach(c *check.C) { } func createExec(c *check.C, name string) string { - _, b, err := sockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": []string{"true"}}) + _, b, err := request.SockRequest("POST", fmt.Sprintf("/containers/%s/exec", name), map[string]interface{}{"Cmd": []string{"true"}}, daemonHost()) c.Assert(err, checker.IsNil, check.Commentf(string(b))) createResp := struct { @@ -180,17 +181,17 @@ func createExec(c *check.C, name string) string { } func startExec(c *check.C, id string, code int) { - resp, body, err := sockRequestRaw("POST", fmt.Sprintf("/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "application/json") + resp, body, err := request.SockRequestRaw("POST", fmt.Sprintf("/exec/%s/start", id), strings.NewReader(`{"Detach": true}`), "application/json", daemonHost()) c.Assert(err, checker.IsNil) - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) comment := check.Commentf("response body: %s", b) c.Assert(err, checker.IsNil, comment) c.Assert(resp.StatusCode, checker.Equals, code, comment) } func inspectExec(c *check.C, id string, out interface{}) { - resp, body, err := sockRequestRaw("GET", fmt.Sprintf("/exec/%s/json", id), nil, "") + resp, body, err := request.SockRequestRaw("GET", fmt.Sprintf("/exec/%s/json", id), nil, "", daemonHost()) c.Assert(err, checker.IsNil) defer body.Close() c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_images_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_images_test.go index cde8a7765..ff53f8e3e 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_images_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_images_test.go @@ -7,7 +7,8 @@ import ( "strings" "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -22,7 +23,7 @@ func (s *DockerSuite) TestAPIImagesFilter(c *check.C) { getImages := func(filter string) []image { v := url.Values{} v.Set("filter", filter) - status, b, err := sockRequest("GET", "/images/json?"+v.Encode(), nil) + status, b, err := request.SockRequest("GET", "/images/json?"+v.Encode(), nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -55,14 +56,14 @@ func (s *DockerSuite) TestAPIImagesSaveAndLoad(c *check.C) { c.Assert(err, checker.IsNil) id := strings.TrimSpace(out) - res, body, err := sockRequestRaw("GET", "/images/"+id+"/get", nil, "") + res, body, err := request.SockRequestRaw("GET", "/images/"+id+"/get", nil, "", daemonHost()) c.Assert(err, checker.IsNil) defer body.Close() c.Assert(res.StatusCode, checker.Equals, http.StatusOK) dockerCmd(c, "rmi", id) - res, loadBody, err := sockRequestRaw("POST", "/images/load", body, "application/x-tar") + res, loadBody, err := request.SockRequestRaw("POST", "/images/load", body, "application/x-tar", daemonHost()) c.Assert(err, checker.IsNil) defer loadBody.Close() c.Assert(res.StatusCode, checker.Equals, http.StatusOK) @@ -82,15 +83,15 @@ func (s *DockerSuite) TestAPIImagesDelete(c *check.C) { dockerCmd(c, "tag", name, "test:tag1") - status, _, err := sockRequest("DELETE", "/images/"+id, nil) + status, _, err := request.SockRequest("DELETE", "/images/"+id, nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusConflict) - status, _, err = sockRequest("DELETE", "/images/test:noexist", nil) + status, _, err = request.SockRequest("DELETE", "/images/test:noexist", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNotFound) //Status Codes:404 – no such image - status, _, err = sockRequest("DELETE", "/images/test:tag1", nil) + status, _, err = request.SockRequest("DELETE", "/images/test:tag1", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) } @@ -105,7 +106,7 @@ func (s *DockerSuite) TestAPIImagesHistory(c *check.C) { id := strings.TrimSpace(out) - status, body, err := sockRequest("GET", "/images/"+id+"/history", nil) + status, body, err := request.SockRequest("GET", "/images/"+id+"/history", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -121,7 +122,7 @@ func (s *DockerSuite) TestAPIImagesHistory(c *check.C) { func (s *DockerSuite) TestAPIImagesSearchJSONContentType(c *check.C) { testRequires(c, Network) - res, b, err := sockRequestRaw("GET", "/images/search?term=test", nil, "application/json") + res, b, err := request.SockRequestRaw("GET", "/images/search?term=test", nil, "application/json", daemonHost()) c.Assert(err, check.IsNil) b.Close() c.Assert(res.StatusCode, checker.Equals, http.StatusOK) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_info_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_info_test.go index 155609973..57dac36e1 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_info_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_info_test.go @@ -3,14 +3,15 @@ package main import ( "net/http" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) func (s *DockerSuite) TestInfoAPI(c *check.C) { endpoint := "/info" - status, body, err := sockRequest("GET", endpoint, nil) + status, body, err := request.SockRequest("GET", endpoint, nil, daemonHost()) c.Assert(status, checker.Equals, http.StatusOK) c.Assert(err, checker.IsNil) @@ -43,7 +44,7 @@ func (s *DockerSuite) TestInfoAPIVersioned(c *check.C) { testRequires(c, DaemonIsLinux) // Windows only supports 1.25 or later endpoint := "/v1.20/info" - status, body, err := sockRequest("GET", endpoint, nil) + status, body, err := request.SockRequest("GET", endpoint, nil, daemonHost()) c.Assert(status, checker.Equals, http.StatusOK) c.Assert(err, checker.IsNil) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_test.go index 546b224c9..30ba1aa09 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_test.go @@ -7,7 +7,8 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/versions/v1p20" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/docker/docker/pkg/stringutils" "github.com/go-check/check" ) @@ -107,7 +108,7 @@ func (s *DockerSuite) TestInspectAPIImageResponse(c *check.C) { dockerCmd(c, "tag", "busybox:latest", "busybox:mytag") endpoint := "/images/busybox/json" - status, body, err := sockRequest("GET", endpoint, nil) + status, body, err := request.SockRequest("GET", endpoint, nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_unix_test.go index f49a139c2..f7731f3d9 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_inspect_unix_test.go @@ -7,7 +7,8 @@ import ( "fmt" "net/http" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -19,7 +20,7 @@ func (s *DockerSuite) TestInspectAPICpusetInConfigPre120(c *check.C) { name := "cpusetinconfig-pre120" dockerCmd(c, "run", "--name", name, "--cpuset-cpus", "0", "busybox", "true") - status, body, err := sockRequest("GET", fmt.Sprintf("/v1.19/containers/%s/json", name), nil) + status, body, err := request.SockRequest("GET", fmt.Sprintf("/v1.19/containers/%s/json", name), nil, daemonHost()) c.Assert(status, check.Equals, http.StatusOK) c.Assert(err, check.IsNil) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_logs_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_logs_test.go index 2e8ffa9bd..94954adf0 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_logs_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_logs_test.go @@ -8,7 +8,8 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -25,7 +26,7 @@ func (s *DockerSuite) TestLogsAPIWithStdout(c *check.C) { chLog := make(chan logOut) go func() { - res, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/logs?follow=1&stdout=1×tamps=1", id), nil, "") + res, body, err := request.SockRequestRaw("GET", fmt.Sprintf("/containers/%s/logs?follow=1&stdout=1×tamps=1", id), nil, "", daemonHost()) if err != nil { chLog <- logOut{"", nil, err} return @@ -55,7 +56,7 @@ func (s *DockerSuite) TestLogsAPINoStdoutNorStderr(c *check.C) { name := "logs_test" dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "/bin/sh") - status, body, err := sockRequest("GET", fmt.Sprintf("/containers/%s/logs", name), nil) + status, body, err := request.SockRequest("GET", fmt.Sprintf("/containers/%s/logs", name), nil, daemonHost()) c.Assert(status, checker.Equals, http.StatusBadRequest) c.Assert(err, checker.IsNil) @@ -69,7 +70,7 @@ func (s *DockerSuite) TestLogsAPIFollowEmptyOutput(c *check.C) { t0 := time.Now() dockerCmd(c, "run", "-d", "-t", "--name", name, "busybox", "sleep", "10") - _, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/logs?follow=1&stdout=1&stderr=1&tail=all", name), bytes.NewBuffer(nil), "") + _, body, err := request.SockRequestRaw("GET", fmt.Sprintf("/containers/%s/logs?follow=1&stdout=1&stderr=1&tail=all", name), bytes.NewBuffer(nil), "", daemonHost()) t1 := time.Now() c.Assert(err, checker.IsNil) body.Close() @@ -81,7 +82,7 @@ func (s *DockerSuite) TestLogsAPIFollowEmptyOutput(c *check.C) { func (s *DockerSuite) TestLogsAPIContainerNotFound(c *check.C) { name := "nonExistentContainer" - resp, _, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/logs?follow=1&stdout=1&stderr=1&tail=all", name), bytes.NewBuffer(nil), "") + resp, _, err := request.SockRequestRaw("GET", fmt.Sprintf("/containers/%s/logs?follow=1&stdout=1&stderr=1&tail=all", name), bytes.NewBuffer(nil), "", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(resp.StatusCode, checker.Equals, http.StatusNotFound) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_network_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_network_test.go index 1cc66f090..b8cbb8ded 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_network_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_network_test.go @@ -11,7 +11,8 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/network" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -256,12 +257,12 @@ func createDeletePredefinedNetwork(c *check.C, name string) { } func isNetworkAvailable(c *check.C, name string) bool { - status, body, err := sockRequest("GET", "/networks", nil) - c.Assert(status, checker.Equals, http.StatusOK) + resp, body, err := request.Get(daemonHost(), "/networks") + c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) c.Assert(err, checker.IsNil) nJSON := []types.NetworkResource{} - err = json.Unmarshal(body, &nJSON) + err = json.NewDecoder(body).Decode(&nJSON) c.Assert(err, checker.IsNil) for _, n := range nJSON { @@ -282,12 +283,12 @@ func getNetworkIDByName(c *check.C, name string) string { c.Assert(err, checker.IsNil) v.Set("filters", filterJSON) - status, body, err := sockRequest("GET", "/networks?"+v.Encode(), nil) - c.Assert(status, checker.Equals, http.StatusOK) + resp, body, err := request.Get(daemonHost(), "/networks?"+v.Encode()) + c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) c.Assert(err, checker.IsNil) nJSON := []types.NetworkResource{} - err = json.Unmarshal(body, &nJSON) + err = json.NewDecoder(body).Decode(&nJSON) c.Assert(err, checker.IsNil) c.Assert(len(nJSON), checker.Equals, 1) @@ -295,28 +296,28 @@ func getNetworkIDByName(c *check.C, name string) string { } func getNetworkResource(c *check.C, id string) *types.NetworkResource { - _, obj, err := sockRequest("GET", "/networks/"+id, nil) + _, obj, err := request.Get(daemonHost(), "/networks/"+id) c.Assert(err, checker.IsNil) nr := types.NetworkResource{} - err = json.Unmarshal(obj, &nr) + err = json.NewDecoder(obj).Decode(&nr) c.Assert(err, checker.IsNil) return &nr } func createNetwork(c *check.C, config types.NetworkCreateRequest, shouldSucceed bool) string { - status, resp, err := sockRequest("POST", "/networks/create", config) + resp, body, err := request.Post(daemonHost(), "/networks/create", request.JSONBody(config)) if !shouldSucceed { - c.Assert(status, checker.Not(checker.Equals), http.StatusCreated) + c.Assert(resp.StatusCode, checker.Not(checker.Equals), http.StatusCreated) return "" } c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusCreated) + c.Assert(resp.StatusCode, checker.Equals, http.StatusCreated) var nr types.NetworkCreateResponse - err = json.Unmarshal(resp, &nr) + err = json.NewDecoder(body).Decode(&nr) c.Assert(err, checker.IsNil) return nr.ID @@ -327,8 +328,8 @@ func connectNetwork(c *check.C, nid, cid string) { Container: cid, } - status, _, err := sockRequest("POST", "/networks/"+nid+"/connect", config) - c.Assert(status, checker.Equals, http.StatusOK) + resp, _, err := request.Post(daemonHost(), "/networks/"+nid+"/connect", request.JSONBody(config)) + c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) c.Assert(err, checker.IsNil) } @@ -337,17 +338,17 @@ func disconnectNetwork(c *check.C, nid, cid string) { Container: cid, } - status, _, err := sockRequest("POST", "/networks/"+nid+"/disconnect", config) - c.Assert(status, checker.Equals, http.StatusOK) + resp, _, err := request.Post(daemonHost(), "/networks/"+nid+"/disconnect", request.JSONBody(config)) + c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) c.Assert(err, checker.IsNil) } func deleteNetwork(c *check.C, id string, shouldSucceed bool) { - status, _, err := sockRequest("DELETE", "/networks/"+id, nil) + resp, _, err := request.Delete(daemonHost(), "/networks/"+id) if !shouldSucceed { - c.Assert(status, checker.Not(checker.Equals), http.StatusOK) + c.Assert(resp.StatusCode, checker.Not(checker.Equals), http.StatusOK) return } - c.Assert(status, checker.Equals, http.StatusNoContent) + c.Assert(resp.StatusCode, checker.Equals, http.StatusNoContent) c.Assert(err, checker.IsNil) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_resize_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_resize_test.go index daf1b05d2..682f315a5 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_resize_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_resize_test.go @@ -4,7 +4,8 @@ import ( "net/http" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -13,7 +14,7 @@ func (s *DockerSuite) TestResizeAPIResponse(c *check.C) { cleanedContainerID := strings.TrimSpace(out) endpoint := "/containers/" + cleanedContainerID + "/resize?h=40&w=40" - status, _, err := sockRequest("POST", endpoint, nil) + status, _, err := request.SockRequest("POST", endpoint, nil, daemonHost()) c.Assert(status, check.Equals, http.StatusOK) c.Assert(err, check.IsNil) } @@ -23,7 +24,7 @@ func (s *DockerSuite) TestResizeAPIHeightWidthNoInt(c *check.C) { cleanedContainerID := strings.TrimSpace(out) endpoint := "/containers/" + cleanedContainerID + "/resize?h=foo&w=bar" - status, _, err := sockRequest("POST", endpoint, nil) + status, _, err := request.SockRequest("POST", endpoint, nil, daemonHost()) c.Assert(status, check.Equals, http.StatusInternalServerError) c.Assert(err, check.IsNil) } @@ -36,7 +37,7 @@ func (s *DockerSuite) TestResizeAPIResponseWhenContainerNotStarted(c *check.C) { dockerCmd(c, "wait", cleanedContainerID) endpoint := "/containers/" + cleanedContainerID + "/resize?h=40&w=40" - status, body, err := sockRequest("POST", endpoint, nil) + status, body, err := request.SockRequest("POST", endpoint, nil, daemonHost()) c.Assert(status, check.Equals, http.StatusInternalServerError) c.Assert(err, check.IsNil) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_service_update_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_service_update_test.go index c61d122c1..02b30b2c7 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_service_update_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_service_update_test.go @@ -4,8 +4,8 @@ package main import ( "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" - "github.com/docker/docker/pkg/integration/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_stats_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_stats_test.go index 23fbdbb74..3851be260 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_stats_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_stats_test.go @@ -13,7 +13,8 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/versions" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -25,7 +26,7 @@ func (s *DockerSuite) TestAPIStatsNoStreamGetCpu(c *check.C) { id := strings.TrimSpace(out) c.Assert(waitRun(id), checker.IsNil) - resp, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id), nil, "") + resp, body, err := request.SockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id), nil, "", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) c.Assert(resp.Header.Get("Content-Type"), checker.Equals, "application/json") @@ -64,7 +65,7 @@ func (s *DockerSuite) TestAPIStatsStoppedContainerInGoroutines(c *check.C) { id := strings.TrimSpace(out) getGoRoutines := func() int { - _, body, err := sockRequestRaw("GET", fmt.Sprintf("/info"), nil, "") + _, body, err := request.SockRequestRaw("GET", fmt.Sprintf("/info"), nil, "", daemonHost()) c.Assert(err, checker.IsNil) info := types.Info{} err = json.NewDecoder(body).Decode(&info) @@ -75,7 +76,7 @@ func (s *DockerSuite) TestAPIStatsStoppedContainerInGoroutines(c *check.C) { // When the HTTP connection is closed, the number of goroutines should not increase. routines := getGoRoutines() - _, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats", id), nil, "") + _, body, err := request.SockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats", id), nil, "", daemonHost()) c.Assert(err, checker.IsNil) body.Close() @@ -191,7 +192,7 @@ func (s *DockerSuite) TestAPIStatsNetworkStatsVersioning(c *check.C) { func getNetworkStats(c *check.C, id string) map[string]types.NetworkStats { var st *types.StatsJSON - _, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id), nil, "") + _, body, err := request.SockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id), nil, "", daemonHost()) c.Assert(err, checker.IsNil) err = json.NewDecoder(body).Decode(&st) @@ -208,7 +209,7 @@ func getNetworkStats(c *check.C, id string) map[string]types.NetworkStats { func getVersionedStats(c *check.C, id string, apiVersion string) map[string]interface{} { stats := make(map[string]interface{}) - _, body, err := sockRequestRaw("GET", fmt.Sprintf("/%s/containers/%s/stats?stream=false", apiVersion, id), nil, "") + _, body, err := request.SockRequestRaw("GET", fmt.Sprintf("/%s/containers/%s/stats?stream=false", apiVersion, id), nil, "", daemonHost()) c.Assert(err, checker.IsNil) defer body.Close() @@ -261,11 +262,11 @@ func jsonBlobHasGTE121NetworkStats(blob map[string]interface{}) bool { func (s *DockerSuite) TestAPIStatsContainerNotFound(c *check.C) { testRequires(c, DaemonIsLinux) - status, _, err := sockRequest("GET", "/containers/nonexistent/stats", nil) + status, _, err := request.SockRequest("GET", "/containers/nonexistent/stats", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNotFound) - status, _, err = sockRequest("GET", "/containers/nonexistent/stats?stream=0", nil) + status, _, err = request.SockRequest("GET", "/containers/nonexistent/stats?stream=0", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNotFound) } @@ -283,7 +284,7 @@ func (s *DockerSuite) TestAPIStatsNoStreamConnectedContainers(c *check.C) { ch := make(chan error) go func() { - resp, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id2), nil, "") + resp, body, err := request.SockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id2), nil, "", daemonHost()) defer body.Close() if err != nil { ch <- err diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_stats_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_stats_unix_test.go index 0995ce383..a367a6e13 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_stats_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_stats_unix_test.go @@ -8,14 +8,15 @@ import ( "net/http" "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) func (s *DockerSuite) TestAPIStatsContainerGetMemoryLimit(c *check.C) { testRequires(c, DaemonIsLinux, memoryLimitSupport) - resp, body, err := sockRequestRaw("GET", "/info", nil, "application/json") + resp, body, err := request.SockRequestRaw("GET", "/info", nil, "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) var info types.Info @@ -28,7 +29,7 @@ func (s *DockerSuite) TestAPIStatsContainerGetMemoryLimit(c *check.C) { dockerCmd(c, "run", "-d", "--name", conName, "busybox", "top") c.Assert(waitRun(conName), checker.IsNil) - resp, body, err = sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", conName), nil, "") + resp, body, err = request.SockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", conName), nil, "", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) c.Assert(resp.Header.Get("Content-Type"), checker.Equals, "application/json") diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_swarm_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_swarm_test.go index 33ad9611e..9310463b6 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_swarm_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_swarm_test.go @@ -4,6 +4,7 @@ package main import ( "fmt" + "net" "net/http" "os" "path/filepath" @@ -14,8 +15,8 @@ import ( "time" "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" - "github.com/docker/docker/pkg/integration/checker" "github.com/go-check/check" ) @@ -1317,3 +1318,14 @@ func (s *DockerSwarmSuite) TestAPISwarmUnlockNotLocked(c *check.C) { c.Assert(err, checker.NotNil) c.Assert(err.Error(), checker.Contains, "swarm is not locked") } + +// #29885 +func (s *DockerSwarmSuite) TestAPISwarmErrorHandling(c *check.C) { + ln, err := net.Listen("tcp", fmt.Sprintf(":%d", defaultSwarmPort)) + c.Assert(err, checker.IsNil) + defer ln.Close() + d := s.AddDaemon(c, false, false) + err = d.Init(swarm.InitRequest{}) + c.Assert(err, checker.NotNil) + c.Assert(err.Error(), checker.Contains, "address already in use") +} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_test.go index 714344d8d..a512c02c1 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_test.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "io/ioutil" "net/http" "net/http/httptest" "runtime" @@ -9,20 +10,21 @@ import ( "strings" "github.com/docker/docker/api" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) func (s *DockerSuite) TestAPIOptionsRoute(c *check.C) { - status, _, err := sockRequest("OPTIONS", "/", nil) + resp, _, err := request.Do(daemonHost(), "/", request.Method(http.MethodOptions)) c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusOK) + c.Assert(resp.StatusCode, checker.Equals, http.StatusOK) } func (s *DockerSuite) TestAPIGetEnabledCORS(c *check.C) { - res, body, err := sockRequestRaw("GET", "/version", nil, "") + res, body, err := request.SockRequestRaw("GET", "/version", nil, "", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusOK) body.Close() @@ -47,11 +49,14 @@ func (s *DockerSuite) TestAPIClientVersionOldNotSupported(c *check.C) { v[1] = strconv.Itoa(vMinInt) version := strings.Join(v, ".") - status, body, err := sockRequest("GET", "/v"+version+"/version", nil) + resp, body, err := request.Get(daemonHost(), "/v"+version+"/version") c.Assert(err, checker.IsNil) - c.Assert(status, checker.Equals, http.StatusBadRequest) + defer body.Close() + c.Assert(resp.StatusCode, checker.Equals, http.StatusBadRequest) expected := fmt.Sprintf("client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version", version, api.MinVersion) - c.Assert(strings.TrimSpace(string(body)), checker.Contains, expected) + content, err := ioutil.ReadAll(body) + c.Assert(err, checker.IsNil) + c.Assert(strings.TrimSpace(string(content)), checker.Contains, expected) } func (s *DockerSuite) TestAPIDockerAPIVersion(c *check.C) { @@ -75,11 +80,11 @@ func (s *DockerSuite) TestAPIDockerAPIVersion(c *check.C) { } func (s *DockerSuite) TestAPIErrorJSON(c *check.C) { - httpResp, body, err := sockRequestRaw("POST", "/containers/create", strings.NewReader(`{}`), "application/json") + httpResp, body, err := request.Post(daemonHost(), "/containers/create", request.JSONBody(struct{}{})) c.Assert(err, checker.IsNil) c.Assert(httpResp.StatusCode, checker.Equals, http.StatusInternalServerError) c.Assert(httpResp.Header.Get("Content-Type"), checker.Equals, "application/json") - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) c.Assert(getErrorMessage(c, b), checker.Equals, "Config cannot be empty in order to create a container") } @@ -88,32 +93,32 @@ func (s *DockerSuite) TestAPIErrorPlainText(c *check.C) { // Windows requires API 1.25 or later. This test is validating a behaviour which was present // in v1.23, but changed in 1.24, hence not applicable on Windows. See apiVersionSupportsJSONErrors testRequires(c, DaemonIsLinux) - httpResp, body, err := sockRequestRaw("POST", "/v1.23/containers/create", strings.NewReader(`{}`), "application/json") + httpResp, body, err := request.Post(daemonHost(), "/v1.23/containers/create", request.JSONBody(struct{}{})) c.Assert(err, checker.IsNil) c.Assert(httpResp.StatusCode, checker.Equals, http.StatusInternalServerError) c.Assert(httpResp.Header.Get("Content-Type"), checker.Contains, "text/plain") - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(string(b)), checker.Equals, "Config cannot be empty in order to create a container") } func (s *DockerSuite) TestAPIErrorNotFoundJSON(c *check.C) { // 404 is a different code path to normal errors, so test separately - httpResp, body, err := sockRequestRaw("GET", "/notfound", nil, "application/json") + httpResp, body, err := request.Get(daemonHost(), "/notfound", request.JSON) c.Assert(err, checker.IsNil) c.Assert(httpResp.StatusCode, checker.Equals, http.StatusNotFound) c.Assert(httpResp.Header.Get("Content-Type"), checker.Equals, "application/json") - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) c.Assert(getErrorMessage(c, b), checker.Equals, "page not found") } func (s *DockerSuite) TestAPIErrorNotFoundPlainText(c *check.C) { - httpResp, body, err := sockRequestRaw("GET", "/v1.23/notfound", nil, "application/json") + httpResp, body, err := request.Get(daemonHost(), "/v1.23/notfound", request.JSON) c.Assert(err, checker.IsNil) c.Assert(httpResp.StatusCode, checker.Equals, http.StatusNotFound) c.Assert(httpResp.Header.Get("Content-Type"), checker.Contains, "text/plain") - b, err := integration.ReadBody(body) + b, err := testutil.ReadBody(body) c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(string(b)), checker.Equals, "page not found") } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_update_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_update_unix_test.go index dfe14ec7b..1af6ed1e7 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_update_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_update_unix_test.go @@ -5,7 +5,8 @@ package main import ( "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -20,7 +21,7 @@ func (s *DockerSuite) TestAPIUpdateContainer(c *check.C) { "MemorySwap": 524288000, } dockerCmd(c, "run", "-d", "--name", name, "-m", "200M", "busybox", "top") - _, _, err := sockRequest("POST", "/containers/"+name+"/update", hostConfig) + _, _, err := request.SockRequest("POST", "/containers/"+name+"/update", hostConfig, daemonHost()) c.Assert(err, check.IsNil) c.Assert(inspectField(c, name, "HostConfig.Memory"), checker.Equals, "314572800") diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_version_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_version_test.go index eb2de5904..5f919deb7 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_version_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_version_test.go @@ -6,12 +6,13 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/dockerversion" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) func (s *DockerSuite) TestGetVersion(c *check.C) { - status, body, err := sockRequest("GET", "/version", nil) + status, body, err := request.SockRequest("GET", "/version", nil, daemonHost()) c.Assert(status, checker.Equals, http.StatusOK) c.Assert(err, checker.IsNil) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_api_volumes_test.go b/vendor/github.com/docker/docker/integration-cli/docker_api_volumes_test.go index d1d44005e..3cc03dfb3 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_api_volumes_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_api_volumes_test.go @@ -7,7 +7,8 @@ import ( "github.com/docker/docker/api/types" volumetypes "github.com/docker/docker/api/types/volume" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -15,7 +16,7 @@ func (s *DockerSuite) TestVolumesAPIList(c *check.C) { prefix, _ := getPrefixAndSlashFromDaemonPlatform() dockerCmd(c, "run", "-v", prefix+"/foo", "busybox") - status, b, err := sockRequest("GET", "/volumes", nil) + status, b, err := request.SockRequest("GET", "/volumes", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -29,7 +30,7 @@ func (s *DockerSuite) TestVolumesAPICreate(c *check.C) { config := volumetypes.VolumesCreateBody{ Name: "test", } - status, b, err := sockRequest("POST", "/volumes/create", config) + status, b, err := request.SockRequest("POST", "/volumes/create", config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusCreated, check.Commentf(string(b))) @@ -44,7 +45,7 @@ func (s *DockerSuite) TestVolumesAPIRemove(c *check.C) { prefix, _ := getPrefixAndSlashFromDaemonPlatform() dockerCmd(c, "run", "-v", prefix+"/foo", "--name=test", "busybox") - status, b, err := sockRequest("GET", "/volumes", nil) + status, b, err := request.SockRequest("GET", "/volumes", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK) @@ -53,12 +54,12 @@ func (s *DockerSuite) TestVolumesAPIRemove(c *check.C) { c.Assert(len(volumes.Volumes), checker.Equals, 1, check.Commentf("\n%v", volumes.Volumes)) v := volumes.Volumes[0] - status, _, err = sockRequest("DELETE", "/volumes/"+v.Name, nil) + status, _, err = request.SockRequest("DELETE", "/volumes/"+v.Name, nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusConflict, check.Commentf("Should not be able to remove a volume that is in use")) dockerCmd(c, "rm", "-f", "test") - status, data, err := sockRequest("DELETE", "/volumes/"+v.Name, nil) + status, data, err := request.SockRequest("DELETE", "/volumes/"+v.Name, nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent, check.Commentf(string(data))) @@ -68,11 +69,11 @@ func (s *DockerSuite) TestVolumesAPIInspect(c *check.C) { config := volumetypes.VolumesCreateBody{ Name: "test", } - status, b, err := sockRequest("POST", "/volumes/create", config) + status, b, err := request.SockRequest("POST", "/volumes/create", config, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusCreated, check.Commentf(string(b))) - status, b, err = sockRequest("GET", "/volumes", nil) + status, b, err = request.SockRequest("GET", "/volumes", nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK, check.Commentf(string(b))) @@ -81,7 +82,7 @@ func (s *DockerSuite) TestVolumesAPIInspect(c *check.C) { c.Assert(len(volumes.Volumes), checker.Equals, 1, check.Commentf("\n%v", volumes.Volumes)) var vol types.Volume - status, b, err = sockRequest("GET", "/volumes/"+config.Name, nil) + status, b, err = request.SockRequest("GET", "/volumes/"+config.Name, nil, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusOK, check.Commentf(string(b))) c.Assert(json.Unmarshal(b, &vol), checker.IsNil) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_test.go index 44a5ce463..a776b83ab 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_test.go @@ -10,7 +10,7 @@ import ( "sync" "time" - icmd "github.com/docker/docker/pkg/integration/cmd" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_unix_test.go index fb794ccc4..78f55e043 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_attach_unix_test.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/stringid" "github.com/go-check/check" "github.com/kr/pty" diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_plugin_v2_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_plugin_v2_test.go index 5fb000a1d..a23b72f48 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_plugin_v2_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_plugin_v2_test.go @@ -6,16 +6,16 @@ import ( "fmt" "strings" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" - "github.com/docker/docker/pkg/integration/checker" "github.com/go-check/check" ) var ( - authzPluginName = "tonistiigi/authz-no-volume-plugin" + authzPluginName = "riyaz/authz-no-volume-plugin" authzPluginTag = "latest" authzPluginNameWithTag = authzPluginName + ":" + authzPluginTag - authzPluginBadManifestName = "tonistiigi/authz-plugin-bad-manifest" + authzPluginBadManifestName = "riyaz/authz-plugin-bad-manifest" nonexistentAuthzPluginName = "riyaz/nonexistent-authz-plugin" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_unix_test.go index fe6bf8908..f003b0919 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_authz_unix_test.go @@ -22,9 +22,9 @@ import ( "net/http/httputil" "net/url" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" "github.com/docker/docker/pkg/authorization" - "github.com/docker/docker/pkg/integration/checker" "github.com/docker/docker/pkg/plugins" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_build_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_build_test.go index 2c66f0e9d..c2b20912c 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_build_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_build_test.go @@ -18,11 +18,11 @@ import ( "time" "github.com/docker/docker/builder/dockerfile/command" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" "github.com/docker/docker/pkg/stringutils" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -2086,7 +2086,7 @@ func (s *DockerSuite) TestBuildContextCleanup(c *check.C) { if err != nil { c.Fatalf("failed to list contents of tmp dir: %s", err) } - if err = integration.CompareDirectoryEntries(entries, entriesFinal); err != nil { + if err = testutil.CompareDirectoryEntries(entries, entriesFinal); err != nil { c.Fatalf("context should have been deleted, but wasn't") } @@ -2111,7 +2111,7 @@ func (s *DockerSuite) TestBuildContextCleanupFailedBuild(c *check.C) { if err != nil { c.Fatalf("failed to list contents of tmp dir: %s", err) } - if err = integration.CompareDirectoryEntries(entries, entriesFinal); err != nil { + if err = testutil.CompareDirectoryEntries(entries, entriesFinal); err != nil { c.Fatalf("context should have been deleted, but wasn't") } @@ -5342,7 +5342,7 @@ func (s *DockerSuite) TestBuildContainerWithCgroupParent(c *check.C) { if err != nil { c.Fatalf("failed to read '/proc/self/cgroup - %v", err) } - selfCgroupPaths := integration.ParseCgroupPaths(string(data)) + selfCgroupPaths := testutil.ParseCgroupPaths(string(data)) _, found := selfCgroupPaths["memory"] if !found { c.Fatalf("unable to find self memory cgroup path. CgroupsPath: %v", selfCgroupPaths) @@ -5433,7 +5433,7 @@ func (s *DockerTrustSuite) TestTrustedBuild(c *check.C) { name := "testtrustedbuild" buildCmd := buildImageCmd(name, dockerFile, true) - s.trustedCmd(buildCmd) + trustedExecCmd(buildCmd) out, _, err := runCommandWithOutput(buildCmd) if err != nil { c.Fatalf("Error running trusted build: %s\n%s", err, out) @@ -5464,7 +5464,7 @@ func (s *DockerTrustSuite) TestTrustedBuildUntrustedTag(c *check.C) { name := "testtrustedbuilduntrustedtag" buildCmd := buildImageCmd(name, dockerFile, true) - s.trustedCmd(buildCmd) + trustedExecCmd(buildCmd) out, _, err := runCommandWithOutput(buildCmd) if err == nil { c.Fatalf("Expected error on trusted build with untrusted tag: %s\n%s", err, out) @@ -5527,10 +5527,7 @@ func (s *DockerTrustSuite) TestTrustedBuildTagFromReleasesRole(c *check.C) { otherTag := fmt.Sprintf("%s:other", repoName) dockerCmd(c, "tag", "busybox", otherTag) - pushCmd := exec.Command(dockerBinary, "push", otherTag) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("Trusted push failed: %s", out)) + icmd.RunCmd(icmd.Command(dockerBinary, "push", otherTag), trustedCmd).Assert(c, icmd.Success) s.assertTargetInRoles(c, repoName, "other", "targets/releases") s.assertTargetNotInRoles(c, repoName, "other", "targets") @@ -5545,8 +5542,8 @@ func (s *DockerTrustSuite) TestTrustedBuildTagFromReleasesRole(c *check.C) { name := "testtrustedbuildreleasesrole" buildCmd := buildImageCmd(name, dockerFile, true) - s.trustedCmd(buildCmd) - out, _, err = runCommandWithOutput(buildCmd) + trustedExecCmd(buildCmd) + out, _, err := runCommandWithOutput(buildCmd) c.Assert(err, check.IsNil, check.Commentf("Trusted build failed: %s", out)) c.Assert(out, checker.Contains, fmt.Sprintf("FROM %s@sha", repoName)) } @@ -5566,10 +5563,7 @@ func (s *DockerTrustSuite) TestTrustedBuildTagIgnoresOtherDelegationRoles(c *che otherTag := fmt.Sprintf("%s:other", repoName) dockerCmd(c, "tag", "busybox", otherTag) - pushCmd := exec.Command(dockerBinary, "push", otherTag) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("Trusted push failed: %s", out)) + icmd.RunCmd(icmd.Command(dockerBinary, "push", otherTag), trustedCmd).Assert(c, icmd.Success) s.assertTargetInRoles(c, repoName, "other", "targets/other") s.assertTargetNotInRoles(c, repoName, "other", "targets") @@ -5584,8 +5578,8 @@ func (s *DockerTrustSuite) TestTrustedBuildTagIgnoresOtherDelegationRoles(c *che name := "testtrustedbuildotherrole" buildCmd := buildImageCmd(name, dockerFile, true) - s.trustedCmd(buildCmd) - out, _, err = runCommandWithOutput(buildCmd) + trustedExecCmd(buildCmd) + out, _, err := runCommandWithOutput(buildCmd) c.Assert(err, check.NotNil, check.Commentf("Trusted build expected to fail: %s", out)) } @@ -6580,7 +6574,7 @@ func (s *DockerSuite) TestBuildLabelOverwrite(c *check.C) { } func (s *DockerRegistryAuthHtpasswdSuite) TestBuildFromAuthenticatedRegistry(c *check.C) { - dockerCmd(c, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) + dockerCmd(c, "login", "-u", s.reg.Username(), "-p", s.reg.Password(), privateRegistryURL) baseImage := privateRegistryURL + "/baseimage" @@ -6625,7 +6619,7 @@ func (s *DockerRegistryAuthHtpasswdSuite) TestBuildWithExternalAuth(c *check.C) err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) c.Assert(err, checker.IsNil) - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) + dockerCmd(c, "--config", tmp, "login", "-u", s.reg.Username(), "-p", s.reg.Password(), privateRegistryURL) b, err := ioutil.ReadFile(configPath) c.Assert(err, checker.IsNil) @@ -7360,8 +7354,6 @@ func (s *DockerSuite) TestBuildWindowsEnvCaseInsensitive(c *check.C) { // Test case for 29667 func (s *DockerSuite) TestBuildWorkdirImageCmd(c *check.C) { - testRequires(c, DaemonIsLinux) - image := "testworkdirimagecmd" dockerfile := ` FROM busybox @@ -7371,7 +7363,13 @@ WORKDIR /foo/bar c.Assert(err, checker.IsNil, check.Commentf("Output: %s", out)) out, _ = dockerCmd(c, "inspect", "--format", "{{ json .Config.Cmd }}", image) - c.Assert(strings.TrimSpace(out), checker.Equals, `["sh"]`) + + // The Windows busybox image has a blank `cmd` + lookingFor := `["sh"]` + if daemonPlatform == "windows" { + lookingFor = "null" + } + c.Assert(strings.TrimSpace(out), checker.Equals, lookingFor) image = "testworkdirlabelimagecmd" dockerfile = ` @@ -7383,17 +7381,21 @@ LABEL a=b c.Assert(err, checker.IsNil, check.Commentf("Output: %s", out)) out, _ = dockerCmd(c, "inspect", "--format", "{{ json .Config.Cmd }}", image) - c.Assert(strings.TrimSpace(out), checker.Equals, `["sh"]`) + c.Assert(strings.TrimSpace(out), checker.Equals, lookingFor) } -// Test case for 28902/28090 +// Test case for 28902/28909 func (s *DockerSuite) TestBuildWorkdirCmd(c *check.C) { testRequires(c, DaemonIsLinux) dockerFile := ` - FROM golang:1.7-alpine + FROM busybox WORKDIR / ` - _, err := buildImage("testbuildworkdircmd", dockerFile, false) + _, err := buildImage("testbuildworkdircmd", dockerFile, true) + c.Assert(err, checker.IsNil) + + _, out, err := buildImageWithOut("testbuildworkdircmd", dockerFile, true) c.Assert(err, checker.IsNil) + c.Assert(strings.Count(out, "Using cache"), checker.Equals, 1) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_build_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_build_unix_test.go index 0205a927d..386ca4036 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_build_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_build_unix_test.go @@ -14,8 +14,9 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/docker/go-units" "github.com/go-check/check" ) @@ -100,12 +101,10 @@ func (s *DockerSuite) TestBuildAddChangeOwnership(c *check.C) { } defer testFile.Close() - chownCmd := exec.Command("chown", "daemon:daemon", "foo") - chownCmd.Dir = tmpDir - out, _, err := runCommandWithOutput(chownCmd) - if err != nil { - c.Fatal(err, out) - } + icmd.RunCmd(icmd.Cmd{ + Command: []string{"chown", "daemon:daemon", "foo"}, + Dir: tmpDir, + }).Assert(c, icmd.Success) if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil { c.Fatalf("failed to open destination dockerfile: %v", err) @@ -194,7 +193,7 @@ func (s *DockerSuite) TestBuildCancellationKillsSleep(c *check.C) { } // Get the exit status of `docker build`, check it exited because killed. - if err := buildCmd.Wait(); err != nil && !integration.IsKilled(err) { + if err := buildCmd.Wait(); err != nil && !testutil.IsKilled(err) { c.Fatalf("wait failed during build run: %T %s", err, err) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_by_digest_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_by_digest_test.go index c28ffaca9..85cfef43d 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_by_digest_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_by_digest_test.go @@ -8,13 +8,13 @@ import ( "regexp" "strings" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest/schema1" "github.com/docker/distribution/manifest/schema2" "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/stringutils" "github.com/go-check/check" + "github.com/opencontainers/go-digest" ) var ( @@ -39,7 +39,7 @@ func setupImageWithTag(c *check.C, tag string) (digest.Digest, error) { c.Assert(err, checker.IsNil, check.Commentf("image tagging failed: %s", out)) // delete the container as we don't need it any more - err = deleteContainer(containerName) + err = deleteContainer(false, containerName) c.Assert(err, checker.IsNil) // push the image @@ -533,7 +533,7 @@ func (s *DockerRegistrySuite) TestPullFailsWithAlteredManifest(c *check.C) { c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) // Load the target manifest blob. - manifestBlob := s.reg.readBlobContents(c, manifestDigest) + manifestBlob := s.reg.ReadBlobContents(c, manifestDigest) var imgManifest schema2.Manifest err = json.Unmarshal(manifestBlob, &imgManifest) @@ -544,13 +544,13 @@ func (s *DockerRegistrySuite) TestPullFailsWithAlteredManifest(c *check.C) { // Move the existing data file aside, so that we can replace it with a // malicious blob of data. NOTE: we defer the returned undo func. - undo := s.reg.tempMoveBlobData(c, manifestDigest) + undo := s.reg.TempMoveBlobData(c, manifestDigest) defer undo() alteredManifestBlob, err := json.MarshalIndent(imgManifest, "", " ") c.Assert(err, checker.IsNil, check.Commentf("unable to encode altered image manifest to JSON")) - s.reg.writeBlobContents(c, manifestDigest, alteredManifestBlob) + s.reg.WriteBlobContents(c, manifestDigest, alteredManifestBlob) // Now try pulling that image by digest. We should get an error about // digest verification for the manifest digest. @@ -573,7 +573,7 @@ func (s *DockerSchema1RegistrySuite) TestPullFailsWithAlteredManifest(c *check.C c.Assert(err, checker.IsNil, check.Commentf("error setting up image")) // Load the target manifest blob. - manifestBlob := s.reg.readBlobContents(c, manifestDigest) + manifestBlob := s.reg.ReadBlobContents(c, manifestDigest) var imgManifest schema1.Manifest err = json.Unmarshal(manifestBlob, &imgManifest) @@ -586,13 +586,13 @@ func (s *DockerSchema1RegistrySuite) TestPullFailsWithAlteredManifest(c *check.C // Move the existing data file aside, so that we can replace it with a // malicious blob of data. NOTE: we defer the returned undo func. - undo := s.reg.tempMoveBlobData(c, manifestDigest) + undo := s.reg.TempMoveBlobData(c, manifestDigest) defer undo() alteredManifestBlob, err := json.MarshalIndent(imgManifest, "", " ") c.Assert(err, checker.IsNil, check.Commentf("unable to encode altered image manifest to JSON")) - s.reg.writeBlobContents(c, manifestDigest, alteredManifestBlob) + s.reg.WriteBlobContents(c, manifestDigest, alteredManifestBlob) // Now try pulling that image by digest. We should get an error about // digest verification for the manifest digest. @@ -615,7 +615,7 @@ func (s *DockerRegistrySuite) TestPullFailsWithAlteredLayer(c *check.C) { c.Assert(err, checker.IsNil) // Load the target manifest blob. - manifestBlob := s.reg.readBlobContents(c, manifestDigest) + manifestBlob := s.reg.ReadBlobContents(c, manifestDigest) var imgManifest schema2.Manifest err = json.Unmarshal(manifestBlob, &imgManifest) @@ -626,11 +626,11 @@ func (s *DockerRegistrySuite) TestPullFailsWithAlteredLayer(c *check.C) { // Move the existing data file aside, so that we can replace it with a // malicious blob of data. NOTE: we defer the returned undo func. - undo := s.reg.tempMoveBlobData(c, targetLayerDigest) + undo := s.reg.TempMoveBlobData(c, targetLayerDigest) defer undo() // Now make a fake data blob in this directory. - s.reg.writeBlobContents(c, targetLayerDigest, []byte("This is not the data you are looking for.")) + s.reg.WriteBlobContents(c, targetLayerDigest, []byte("This is not the data you are looking for.")) // Now try pulling that image by digest. We should get an error about // digest verification for the target layer digest. @@ -658,7 +658,7 @@ func (s *DockerSchema1RegistrySuite) TestPullFailsWithAlteredLayer(c *check.C) { c.Assert(err, checker.IsNil) // Load the target manifest blob. - manifestBlob := s.reg.readBlobContents(c, manifestDigest) + manifestBlob := s.reg.ReadBlobContents(c, manifestDigest) var imgManifest schema1.Manifest err = json.Unmarshal(manifestBlob, &imgManifest) @@ -669,11 +669,11 @@ func (s *DockerSchema1RegistrySuite) TestPullFailsWithAlteredLayer(c *check.C) { // Move the existing data file aside, so that we can replace it with a // malicious blob of data. NOTE: we defer the returned undo func. - undo := s.reg.tempMoveBlobData(c, targetLayerDigest) + undo := s.reg.TempMoveBlobData(c, targetLayerDigest) defer undo() // Now make a fake data blob in this directory. - s.reg.writeBlobContents(c, targetLayerDigest, []byte("This is not the data you are looking for.")) + s.reg.WriteBlobContents(c, targetLayerDigest, []byte("This is not the data you are looking for.")) // Now try pulling that image by digest. We should get an error about // digest verification for the target layer digest. diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_commit_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_commit_test.go index d3a3e0e44..aa8162465 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_commit_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_commit_test.go @@ -3,7 +3,7 @@ package main import ( "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_config_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_config_test.go index 1d5e5ad3d..efe2ea761 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_config_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_config_test.go @@ -5,14 +5,14 @@ import ( "net/http" "net/http/httptest" "os" - "os/exec" "path/filepath" "runtime" "github.com/docker/docker/api" "github.com/docker/docker/dockerversion" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/homedir" - "github.com/docker/docker/pkg/integration/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -51,15 +51,18 @@ func (s *DockerSuite) TestConfigHTTPHeader(c *check.C) { err = ioutil.WriteFile(tmpCfg, []byte(data), 0600) c.Assert(err, checker.IsNil) - cmd := exec.Command(dockerBinary, "-H="+server.URL[7:], "ps") - out, _, _ := runCommandWithOutput(cmd) + result := icmd.RunCommand(dockerBinary, "-H="+server.URL[7:], "ps") + result.Assert(c, icmd.Expected{ + ExitCode: 1, + Error: "exit status 1", + }) c.Assert(headers["User-Agent"], checker.NotNil, check.Commentf("Missing User-Agent")) - c.Assert(headers["User-Agent"][0], checker.Equals, "Docker-Client/"+dockerversion.Version+" ("+runtime.GOOS+")", check.Commentf("Badly formatted User-Agent,out:%v", out)) + c.Assert(headers["User-Agent"][0], checker.Equals, "Docker-Client/"+dockerversion.Version+" ("+runtime.GOOS+")", check.Commentf("Badly formatted User-Agent,out:%v", result.Combined())) c.Assert(headers["Myheader"], checker.NotNil) - c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("Missing/bad header,out:%v", out)) + c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("Missing/bad header,out:%v", result.Combined())) } @@ -72,11 +75,10 @@ func (s *DockerSuite) TestConfigDir(c *check.C) { dockerCmd(c, "--config", cDir, "ps") // Test with env var too - cmd := exec.Command(dockerBinary, "ps") - cmd.Env = appendBaseEnv(true, "DOCKER_CONFIG="+cDir) - out, _, err := runCommandWithOutput(cmd) - - c.Assert(err, checker.IsNil, check.Commentf("ps2 didn't work,out:%v", out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "ps"}, + Env: appendBaseEnv(true, "DOCKER_CONFIG="+cDir), + }).Assert(c, icmd.Success) // Start a server so we can check to see if the config file was // loaded properly @@ -99,42 +101,51 @@ func (s *DockerSuite) TestConfigDir(c *check.C) { env := appendBaseEnv(false) - cmd = exec.Command(dockerBinary, "--config", cDir, "-H="+server.URL[7:], "ps") - cmd.Env = env - out, _, err = runCommandWithOutput(cmd) - - c.Assert(err, checker.NotNil, check.Commentf("out:%v", out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "--config", cDir, "-H=" + server.URL[7:], "ps"}, + Env: env, + }).Assert(c, icmd.Expected{ + ExitCode: 1, + Error: "exit status 1", + }) c.Assert(headers["Myheader"], checker.NotNil) - c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps3 - Missing header,out:%v", out)) + c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps3 - Missing header")) // Reset headers and try again using env var this time headers = map[string][]string{} - cmd = exec.Command(dockerBinary, "-H="+server.URL[7:], "ps") - cmd.Env = append(env, "DOCKER_CONFIG="+cDir) - out, _, err = runCommandWithOutput(cmd) - - c.Assert(err, checker.NotNil, check.Commentf("%v", out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "--config", cDir, "-H=" + server.URL[7:], "ps"}, + Env: append(env, "DOCKER_CONFIG="+cDir), + }).Assert(c, icmd.Expected{ + ExitCode: 1, + }) c.Assert(headers["Myheader"], checker.NotNil) - c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps4 - Missing header,out:%v", out)) + c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps4 - Missing header")) + // FIXME(vdemeester) should be a unit test // Reset headers and make sure flag overrides the env var headers = map[string][]string{} - cmd = exec.Command(dockerBinary, "--config", cDir, "-H="+server.URL[7:], "ps") - cmd.Env = append(env, "DOCKER_CONFIG=MissingDir") - out, _, err = runCommandWithOutput(cmd) - - c.Assert(err, checker.NotNil, check.Commentf("out:%v", out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "--config", cDir, "-H=" + server.URL[7:], "ps"}, + Env: append(env, "DOCKER_CONFIG=MissingDir"), + }).Assert(c, icmd.Expected{ + ExitCode: 1, + }) c.Assert(headers["Myheader"], checker.NotNil) - c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps5 - Missing header,out:%v", out)) + c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps5 - Missing header")) + // FIXME(vdemeester) should be a unit test // Reset headers and make sure flag overrides the env var. // Almost same as previous but make sure the "MissingDir" isn't // ignore - we don't want to default back to the env var. headers = map[string][]string{} - cmd = exec.Command(dockerBinary, "--config", "MissingDir", "-H="+server.URL[7:], "ps") - cmd.Env = append(env, "DOCKER_CONFIG="+cDir) - out, _, err = runCommandWithOutput(cmd) - - c.Assert(err, checker.NotNil, check.Commentf("out:%v", out)) - c.Assert(headers["Myheader"], checker.IsNil, check.Commentf("ps6 - Headers shouldn't be the expected value,out:%v", out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "--config", "MissingDir", "-H=" + server.URL[7:], "ps"}, + Env: append(env, "DOCKER_CONFIG="+cDir), + }).Assert(c, icmd.Expected{ + ExitCode: 1, + Error: "exit status 1", + }) + + c.Assert(headers["Myheader"], checker.IsNil, check.Commentf("ps6 - Headers shouldn't be the expected value")) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_from_container_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_from_container_test.go index 9ed7e8c72..30cacf42b 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_from_container_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_from_container_test.go @@ -4,7 +4,7 @@ import ( "os" "path/filepath" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_test.go index 4badeb120..510f94e65 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_test.go @@ -10,9 +10,9 @@ import ( "path/filepath" "strings" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -546,7 +546,7 @@ func (s *DockerSuite) TestCpToStdout(c *check.C) { // failed to set up container c.Assert(strings.TrimSpace(out), checker.Equals, "0") - out, _, err := integration.RunCommandPipelineWithOutput( + out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "cp", containerID+":/test", "-"), exec.Command("tar", "-vtf", "-")) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_test.go index f981cb8f8..5d48cefd0 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_test.go @@ -3,7 +3,7 @@ package main import ( "os" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_unix_test.go index 97890a9cb..a07dd6169 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_to_container_unix_test.go @@ -9,7 +9,7 @@ import ( "strconv" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/system" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_utils.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_utils.go index fb4b869e5..3c51ece1e 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_utils.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_cp_utils.go @@ -9,8 +9,8 @@ import ( "path/filepath" "strings" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/archive" - "github.com/docker/docker/pkg/integration/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_create_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_create_test.go index 6d9618c22..d23d39c45 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_create_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_create_test.go @@ -3,18 +3,16 @@ package main import ( "encoding/json" "fmt" + "io/ioutil" "os" "reflect" "strings" "time" - "os/exec" - - "io/ioutil" - - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/stringid" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/docker/go-connections/nat" "github.com/go-check/check" ) @@ -302,21 +300,12 @@ func (s *DockerTrustSuite) TestTrustedCreate(c *check.C) { repoName := s.setupTrustedImage(c, "trusted-create") // Try create - createCmd := exec.Command(dockerBinary, "create", repoName) - s.trustedCmd(createCmd) - out, _, err := runCommandWithOutput(createCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf("Missing expected output on trusted push:\n%s", out)) + icmd.RunCmd(icmd.Command(dockerBinary, "create", repoName), trustedCmd).Assert(c, SuccessTagging) dockerCmd(c, "rmi", repoName) // Try untrusted create to ensure we pushed the tag to the registry - createCmd = exec.Command(dockerBinary, "create", "--disable-content-trust=true", repoName) - s.trustedCmd(createCmd) - out, _, err = runCommandWithOutput(createCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Status: Downloaded", check.Commentf("Missing expected output on trusted create with --disable-content-trust:\n%s", out)) - + icmd.RunCmd(icmd.Command(dockerBinary, "create", "--disable-content-trust=true", repoName), trustedCmd).Assert(c, SuccessDownloadedOnStderr) } func (s *DockerTrustSuite) TestUntrustedCreate(c *check.C) { @@ -328,23 +317,17 @@ func (s *DockerTrustSuite) TestUntrustedCreate(c *check.C) { dockerCmd(c, "rmi", withTagName) // Try trusted create on untrusted tag - createCmd := exec.Command(dockerBinary, "create", withTagName) - s.trustedCmd(createCmd) - out, _, err := runCommandWithOutput(createCmd) - c.Assert(err, check.Not(check.IsNil)) - c.Assert(string(out), checker.Contains, fmt.Sprintf("does not have trust data for %s", repoName), check.Commentf("Missing expected output on trusted create:\n%s", out)) - + icmd.RunCmd(icmd.Command(dockerBinary, "create", withTagName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: fmt.Sprintf("does not have trust data for %s", repoName), + }) } func (s *DockerTrustSuite) TestTrustedIsolatedCreate(c *check.C) { repoName := s.setupTrustedImage(c, "trusted-isolated-create") // Try create - createCmd := exec.Command(dockerBinary, "--config", "/tmp/docker-isolated-create", "create", repoName) - s.trustedCmd(createCmd) - out, _, err := runCommandWithOutput(createCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf("Missing expected output on trusted push:\n%s", out)) + icmd.RunCmd(icmd.Command(dockerBinary, "--config", "/tmp/docker-isolated-create", "create", repoName), trustedCmd).Assert(c, SuccessTagging) dockerCmd(c, "rmi", repoName) } @@ -356,22 +339,21 @@ func (s *DockerTrustSuite) TestCreateWhenCertExpired(c *check.C) { // Certificates have 10 years of expiration elevenYearsFromNow := time.Now().Add(time.Hour * 24 * 365 * 11) - integration.RunAtDifferentDate(elevenYearsFromNow, func() { + testutil.RunAtDifferentDate(elevenYearsFromNow, func() { // Try create - createCmd := exec.Command(dockerBinary, "create", repoName) - s.trustedCmd(createCmd) - out, _, err := runCommandWithOutput(createCmd) - c.Assert(err, check.Not(check.IsNil)) - c.Assert(string(out), checker.Contains, "could not validate the path to a trusted root", check.Commentf("Missing expected output on trusted create in the distant future:\n%s", out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "create", repoName}, + }, trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "could not validate the path to a trusted root", + }) }) - integration.RunAtDifferentDate(elevenYearsFromNow, func() { + testutil.RunAtDifferentDate(elevenYearsFromNow, func() { // Try create - createCmd := exec.Command(dockerBinary, "create", "--disable-content-trust", repoName) - s.trustedCmd(createCmd) - out, _, err := runCommandWithOutput(createCmd) - c.Assert(err, check.Not(check.IsNil)) - c.Assert(string(out), checker.Contains, "Status: Downloaded", check.Commentf("Missing expected output on trusted create in the distant future:\n%s", out)) + result := icmd.RunCmd(icmd.Command(dockerBinary, "create", "--disable-content-trust", repoName), trustedCmd) + c.Assert(result.Error, check.Not(check.IsNil)) + c.Assert(string(result.Combined()), checker.Contains, "Status: Downloaded", check.Commentf("Missing expected output on trusted create in the distant future:\n%s", result.Combined())) }) } @@ -384,20 +366,12 @@ func (s *DockerTrustSuite) TestTrustedCreateFromBadTrustServer(c *check.C) { // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", repoName) - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push:\n%s", out)) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) dockerCmd(c, "rmi", repoName) // Try create - createCmd := exec.Command(dockerBinary, "create", repoName) - s.trustedCmd(createCmd) - out, _, err = runCommandWithOutput(createCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf("Missing expected output on trusted push:\n%s", out)) + icmd.RunCmd(icmd.Command(dockerBinary, "create", repoName), trustedCmd).Assert(c, SuccessTagging) dockerCmd(c, "rmi", repoName) @@ -411,23 +385,13 @@ func (s *DockerTrustSuite) TestTrustedCreateFromBadTrustServer(c *check.C) { dockerCmd(c, "--config", evilLocalConfigDir, "tag", "busybox", repoName) // Push up to the new server - pushCmd = exec.Command(dockerBinary, "--config", evilLocalConfigDir, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil) - c.Assert(string(out), checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push:\n%s", out)) + icmd.RunCmd(icmd.Command(dockerBinary, "--config", evilLocalConfigDir, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) // Now, try creating with the original client from this new trust server. This should fail because the new root is invalid. - createCmd = exec.Command(dockerBinary, "create", repoName) - s.trustedCmd(createCmd) - out, _, err = runCommandWithOutput(createCmd) - if err == nil { - c.Fatalf("Continuing with cached data even though it's an invalid root rotation: %s\n%s", err, out) - } - if !strings.Contains(out, "could not rotate trust to a new trusted root") { - c.Fatalf("Missing expected output on trusted create:\n%s", out) - } - + icmd.RunCmd(icmd.Command(dockerBinary, "create", repoName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "could not rotate trust to a new trusted root", + }) } func (s *DockerSuite) TestCreateStopSignal(c *check.C) { diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_plugins_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_plugins_test.go index b8bf5fb10..8457382c5 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_plugins_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_plugins_test.go @@ -4,13 +4,13 @@ package main import ( "os" - "os/exec" "path/filepath" "strings" "syscall" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/mount" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -92,10 +92,7 @@ func (s *DockerDaemonSuite) TestDaemonKillLiveRestoreWithPlugins(c *check.C) { c.Fatalf("Could not kill daemon: %v", err) } - cmd := exec.Command("pgrep", "-f", pluginProcessName) - if out, ec, err := runCommandWithOutput(cmd); ec != 0 { - c.Fatalf("Expected exit code '0', got %d err: %v output: %s ", ec, err, out) - } + icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success) } // TestDaemonShutdownLiveRestoreWithPlugins SIGTERMs daemon started with --live-restore. @@ -121,10 +118,7 @@ func (s *DockerDaemonSuite) TestDaemonShutdownLiveRestoreWithPlugins(c *check.C) c.Fatalf("Could not kill daemon: %v", err) } - cmd := exec.Command("pgrep", "-f", pluginProcessName) - if out, ec, err := runCommandWithOutput(cmd); ec != 0 { - c.Fatalf("Expected exit code '0', got %d err: %v output: %s ", ec, err, out) - } + icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success) } // TestDaemonShutdownWithPlugins shuts down running plugins. @@ -156,15 +150,13 @@ func (s *DockerDaemonSuite) TestDaemonShutdownWithPlugins(c *check.C) { } } - cmd := exec.Command("pgrep", "-f", pluginProcessName) - if out, ec, err := runCommandWithOutput(cmd); ec != 1 { - c.Fatalf("Expected exit code '1', got %d err: %v output: %s ", ec, err, out) - } + icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Expected{ + ExitCode: 1, + Error: "exit status 1", + }) s.d.Start(c, "--live-restore") - cmd = exec.Command("pgrep", "-f", pluginProcessName) - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil, check.Commentf(out)) + icmd.RunCommand("pgrep", "-f", pluginProcessName).Assert(c, icmd.Success) } // TestVolumePlugin tests volume creation using a plugin. diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_test.go index b6a3dd22b..4667e9b26 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_daemon_test.go @@ -21,13 +21,13 @@ import ( "syscall" "time" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" "github.com/docker/docker/pkg/mount" "github.com/docker/docker/pkg/stringid" - "github.com/docker/go-units" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" + units "github.com/docker/go-units" "github.com/docker/libnetwork/iptables" "github.com/docker/libtrust" "github.com/go-check/check" @@ -262,30 +262,15 @@ func (s *DockerDaemonSuite) TestDaemonIptablesClean(c *check.C) { c.Fatalf("Could not run top: %s, %v", out, err) } - // get output from iptables with container running ipTablesSearchString := "tcp dpt:80" - ipTablesCmd := exec.Command("iptables", "-nvL") - out, _, err := runCommandWithOutput(ipTablesCmd) - if err != nil { - c.Fatalf("Could not run iptables -nvL: %s, %v", out, err) - } - if !strings.Contains(out, ipTablesSearchString) { - c.Fatalf("iptables output should have contained %q, but was %q", ipTablesSearchString, out) - } + // get output from iptables with container running + verifyIPTablesContains(c, ipTablesSearchString) s.d.Stop(c) // get output from iptables after restart - ipTablesCmd = exec.Command("iptables", "-nvL") - out, _, err = runCommandWithOutput(ipTablesCmd) - if err != nil { - c.Fatalf("Could not run iptables -nvL: %s, %v", out, err) - } - - if strings.Contains(out, ipTablesSearchString) { - c.Fatalf("iptables output should not have contained %q, but was %q", ipTablesSearchString, out) - } + verifyIPTablesDoesNotContains(c, ipTablesSearchString) } func (s *DockerDaemonSuite) TestDaemonIptablesCreate(c *check.C) { @@ -297,36 +282,36 @@ func (s *DockerDaemonSuite) TestDaemonIptablesCreate(c *check.C) { // get output from iptables with container running ipTablesSearchString := "tcp dpt:80" - ipTablesCmd := exec.Command("iptables", "-nvL") - out, _, err := runCommandWithOutput(ipTablesCmd) - if err != nil { - c.Fatalf("Could not run iptables -nvL: %s, %v", out, err) - } - - if !strings.Contains(out, ipTablesSearchString) { - c.Fatalf("iptables output should have contained %q, but was %q", ipTablesSearchString, out) - } + verifyIPTablesContains(c, ipTablesSearchString) s.d.Restart(c) // make sure the container is not running runningOut, err := s.d.Cmd("inspect", "--format={{.State.Running}}", "top") if err != nil { - c.Fatalf("Could not inspect on container: %s, %v", out, err) + c.Fatalf("Could not inspect on container: %s, %v", runningOut, err) } if strings.TrimSpace(runningOut) != "true" { c.Fatalf("Container should have been restarted after daemon restart. Status running should have been true but was: %q", strings.TrimSpace(runningOut)) } // get output from iptables after restart - ipTablesCmd = exec.Command("iptables", "-nvL") - out, _, err = runCommandWithOutput(ipTablesCmd) - if err != nil { - c.Fatalf("Could not run iptables -nvL: %s, %v", out, err) + verifyIPTablesContains(c, ipTablesSearchString) +} + +func verifyIPTablesContains(c *check.C, ipTablesSearchString string) { + result := icmd.RunCommand("iptables", "-nvL") + result.Assert(c, icmd.Success) + if !strings.Contains(result.Combined(), ipTablesSearchString) { + c.Fatalf("iptables output should have contained %q, but was %q", ipTablesSearchString, result.Combined()) } +} - if !strings.Contains(out, ipTablesSearchString) { - c.Fatalf("iptables output after restart should have contained %q, but was %q", ipTablesSearchString, out) +func verifyIPTablesDoesNotContains(c *check.C, ipTablesSearchString string) { + result := icmd.RunCommand("iptables", "-nvL") + result.Assert(c, icmd.Success) + if strings.Contains(result.Combined(), ipTablesSearchString) { + c.Fatalf("iptables output should not have contained %q, but was %q", ipTablesSearchString, result.Combined()) } } @@ -396,8 +381,9 @@ func (s *DockerDaemonSuite) TestDaemonIPv6Enabled(c *check.C) { func (s *DockerDaemonSuite) TestDaemonIPv6FixedCIDR(c *check.C) { // IPv6 setup is messing with local bridge address. testRequires(c, SameHostDaemon) - setupV6(c) - defer teardownV6(c) + // Delete the docker0 bridge if its left around from previous daemon. It has to be recreated with + // ipv6 enabled + deleteInterface(c, "docker0") s.d.StartWithBusybox(c, "--ipv6", "--fixed-cidr-v6=2001:db8:2::/64", "--default-gateway-v6=2001:db8:2::100") @@ -423,8 +409,9 @@ func (s *DockerDaemonSuite) TestDaemonIPv6FixedCIDR(c *check.C) { func (s *DockerDaemonSuite) TestDaemonIPv6FixedCIDRAndMac(c *check.C) { // IPv6 setup is messing with local bridge address. testRequires(c, SameHostDaemon) - setupV6(c) - defer teardownV6(c) + // Delete the docker0 bridge if its left around from previous daemon. It has to be recreated with + // ipv6 enabled + deleteInterface(c, "docker0") s.d.StartWithBusybox(c, "--ipv6", "--fixed-cidr-v6=2001:db8:1::/64") @@ -564,10 +551,7 @@ func (s *DockerDaemonSuite) TestDaemonExitOnFailure(c *check.C) { c.Fatalf("Expected daemon not to start, got %v", err) } // look in the log and make sure we got the message that daemon is shutting down - runCmd := exec.Command("grep", "Error starting daemon", s.d.LogFileName()) - if out, _, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("Expected 'Error starting daemon' message; but doesn't exist in log: %q, err: %v", out, err) - } + icmd.RunCommand("grep", "Error starting daemon", s.d.LogFileName()).Assert(c, icmd.Success) } else { //if we didn't get an error and the daemon is running, this is a failure c.Fatal("Conflicting options should cause the daemon to error out with a failure") @@ -584,20 +568,15 @@ func (s *DockerDaemonSuite) TestDaemonBridgeExternal(c *check.C) { bridgeIP := "192.169.1.1/24" _, bridgeIPNet, _ := net.ParseCIDR(bridgeIP) - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) + createInterface(c, "bridge", bridgeName, bridgeIP) defer deleteInterface(c, bridgeName) d.StartWithBusybox(c, "--bridge", bridgeName) ipTablesSearchString := bridgeIPNet.String() - ipTablesCmd := exec.Command("iptables", "-t", "nat", "-nvL") - out, _, err = runCommandWithOutput(ipTablesCmd) - c.Assert(err, check.IsNil) - - c.Assert(strings.Contains(out, ipTablesSearchString), check.Equals, true, - check.Commentf("iptables output should have contained %q, but was %q", - ipTablesSearchString, out)) + icmd.RunCommand("iptables", "-t", "nat", "-nvL").Assert(c, icmd.Expected{ + Out: ipTablesSearchString, + }) _, err = d.Cmd("run", "-d", "--name", "ExtContainer", "busybox", "top") c.Assert(err, check.IsNil) @@ -617,41 +596,27 @@ func (s *DockerDaemonSuite) TestDaemonBridgeNone(c *check.C) { defer d.Restart(c) // verify docker0 iface is not there - out, _, err := runCommandWithOutput(exec.Command("ifconfig", "docker0")) - c.Assert(err, check.NotNil, check.Commentf("docker0 should not be present if daemon started with --bridge=none")) - c.Assert(strings.Contains(out, "Device not found"), check.Equals, true) + icmd.RunCommand("ifconfig", "docker0").Assert(c, icmd.Expected{ + ExitCode: 1, + Error: "exit status 1", + Err: "Device not found", + }) // verify default "bridge" network is not there - out, err = d.Cmd("network", "inspect", "bridge") + out, err := d.Cmd("network", "inspect", "bridge") c.Assert(err, check.NotNil, check.Commentf("\"bridge\" network should not be present if daemon started with --bridge=none")) c.Assert(strings.Contains(out, "No such network"), check.Equals, true) } -func createInterface(c *check.C, ifType string, ifName string, ipNet string) (string, error) { - args := []string{"link", "add", "name", ifName, "type", ifType} - ipLinkCmd := exec.Command("ip", args...) - out, _, err := runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - - ifCfgCmd := exec.Command("ifconfig", ifName, ipNet, "up") - out, _, err = runCommandWithOutput(ifCfgCmd) - return out, err +func createInterface(c *check.C, ifType string, ifName string, ipNet string) { + icmd.RunCommand("ip", "link", "add", "name", ifName, "type", ifType).Assert(c, icmd.Success) + icmd.RunCommand("ifconfig", ifName, ipNet, "up").Assert(c, icmd.Success) } func deleteInterface(c *check.C, ifName string) { - ifCmd := exec.Command("ip", "link", "delete", ifName) - out, _, err := runCommandWithOutput(ifCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - - flushCmd := exec.Command("iptables", "-t", "nat", "--flush") - out, _, err = runCommandWithOutput(flushCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - - flushCmd = exec.Command("iptables", "--flush") - out, _, err = runCommandWithOutput(flushCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) + icmd.RunCommand("ip", "link", "delete", ifName).Assert(c, icmd.Success) + icmd.RunCommand("iptables", "-t", "nat", "--flush").Assert(c, icmd.Success) + icmd.RunCommand("iptables", "--flush").Assert(c, icmd.Success) } func (s *DockerDaemonSuite) TestDaemonBridgeIP(c *check.C) { @@ -723,8 +688,7 @@ func (s *DockerDaemonSuite) TestDaemonBridgeFixedCidr(c *check.C) { bridgeName := "external-bridge" bridgeIP := "192.169.1.1/24" - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) + createInterface(c, "bridge", bridgeName, bridgeIP) defer deleteInterface(c, bridgeName) args := []string{"--bridge", bridgeName, "--fixed-cidr", "192.169.1.0/30"} @@ -747,14 +711,13 @@ func (s *DockerDaemonSuite) TestDaemonBridgeFixedCidr2(c *check.C) { bridgeName := "external-bridge" bridgeIP := "10.2.2.1/16" - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) + createInterface(c, "bridge", bridgeName, bridgeIP) defer deleteInterface(c, bridgeName) d.StartWithBusybox(c, "--bip", bridgeIP, "--fixed-cidr", "10.2.2.0/24") defer s.d.Restart(c) - out, err = d.Cmd("run", "-d", "--name", "bb", "busybox", "top") + out, err := d.Cmd("run", "-d", "--name", "bb", "busybox", "top") c.Assert(err, checker.IsNil, check.Commentf(out)) defer d.Cmd("stop", "bb") @@ -772,14 +735,13 @@ func (s *DockerDaemonSuite) TestDaemonBridgeFixedCIDREqualBridgeNetwork(c *check bridgeName := "external-bridge" bridgeIP := "172.27.42.1/16" - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) + createInterface(c, "bridge", bridgeName, bridgeIP) defer deleteInterface(c, bridgeName) d.StartWithBusybox(c, "--bridge", bridgeName, "--fixed-cidr", bridgeIP) defer s.d.Restart(c) - out, err = d.Cmd("run", "-d", "busybox", "top") + out, err := d.Cmd("run", "-d", "busybox", "top") c.Assert(err, check.IsNil, check.Commentf(out)) cid1 := strings.TrimSpace(out) defer d.Cmd("stop", cid1) @@ -871,21 +833,18 @@ func (s *DockerDaemonSuite) TestDaemonIP(c *check.C) { c.Assert(strings.Contains(out, "Error starting userland proxy"), check.Equals, true) ifName := "dummy" - out, err = createInterface(c, "dummy", ifName, ipStr) - c.Assert(err, check.IsNil, check.Commentf(out)) + createInterface(c, "dummy", ifName, ipStr) defer deleteInterface(c, ifName) _, err = d.Cmd("run", "-d", "-p", "8000:8000", "busybox", "top") c.Assert(err, check.IsNil) - ipTablesCmd := exec.Command("iptables", "-t", "nat", "-nvL") - out, _, err = runCommandWithOutput(ipTablesCmd) - c.Assert(err, check.IsNil) - + result := icmd.RunCommand("iptables", "-t", "nat", "-nvL") + result.Assert(c, icmd.Success) regex := fmt.Sprintf("DNAT.*%s.*dpt:8000", ip.String()) - matched, _ := regexp.MatchString(regex, out) + matched, _ := regexp.MatchString(regex, result.Combined()) c.Assert(matched, check.Equals, true, - check.Commentf("iptables output should have contained %q, but was %q", regex, out)) + check.Commentf("iptables output should have contained %q, but was %q", regex, result.Combined())) } func (s *DockerDaemonSuite) TestDaemonICCPing(c *check.C) { @@ -895,22 +854,18 @@ func (s *DockerDaemonSuite) TestDaemonICCPing(c *check.C) { bridgeName := "external-bridge" bridgeIP := "192.169.1.1/24" - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) + createInterface(c, "bridge", bridgeName, bridgeIP) defer deleteInterface(c, bridgeName) - args := []string{"--bridge", bridgeName, "--icc=false"} - d.StartWithBusybox(c, args...) + d.StartWithBusybox(c, "--bridge", bridgeName, "--icc=false") defer d.Restart(c) - ipTablesCmd := exec.Command("iptables", "-nvL", "FORWARD") - out, _, err = runCommandWithOutput(ipTablesCmd) - c.Assert(err, check.IsNil) - + result := icmd.RunCommand("iptables", "-nvL", "FORWARD") + result.Assert(c, icmd.Success) regex := fmt.Sprintf("DROP.*all.*%s.*%s", bridgeName, bridgeName) - matched, _ := regexp.MatchString(regex, out) + matched, _ := regexp.MatchString(regex, result.Combined()) c.Assert(matched, check.Equals, true, - check.Commentf("iptables output should have contained %q, but was %q", regex, out)) + check.Commentf("iptables output should have contained %q, but was %q", regex, result.Combined())) // Pinging another container must fail with --icc=false pingContainers(c, d, true) @@ -924,7 +879,7 @@ func (s *DockerDaemonSuite) TestDaemonICCPing(c *check.C) { // But, Pinging external or a Host interface must succeed pingCmd := fmt.Sprintf("ping -c 1 %s -W 1", ip.String()) runArgs := []string{"run", "--rm", "busybox", "sh", "-c", pingCmd} - _, err = d.Cmd(runArgs...) + _, err := d.Cmd(runArgs...) c.Assert(err, check.IsNil) } @@ -934,24 +889,20 @@ func (s *DockerDaemonSuite) TestDaemonICCLinkExpose(c *check.C) { bridgeName := "external-bridge" bridgeIP := "192.169.1.1/24" - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) + createInterface(c, "bridge", bridgeName, bridgeIP) defer deleteInterface(c, bridgeName) - args := []string{"--bridge", bridgeName, "--icc=false"} - d.StartWithBusybox(c, args...) + d.StartWithBusybox(c, "--bridge", bridgeName, "--icc=false") defer d.Restart(c) - ipTablesCmd := exec.Command("iptables", "-nvL", "FORWARD") - out, _, err = runCommandWithOutput(ipTablesCmd) - c.Assert(err, check.IsNil) - + result := icmd.RunCommand("iptables", "-nvL", "FORWARD") + result.Assert(c, icmd.Success) regex := fmt.Sprintf("DROP.*all.*%s.*%s", bridgeName, bridgeName) - matched, _ := regexp.MatchString(regex, out) + matched, _ := regexp.MatchString(regex, result.Combined()) c.Assert(matched, check.Equals, true, - check.Commentf("iptables output should have contained %q, but was %q", regex, out)) + check.Commentf("iptables output should have contained %q, but was %q", regex, result.Combined())) - out, err = d.Cmd("run", "-d", "--expose", "4567", "--name", "icc1", "busybox", "nc", "-l", "-p", "4567") + out, err := d.Cmd("run", "-d", "--expose", "4567", "--name", "icc1", "busybox", "nc", "-l", "-p", "4567") c.Assert(err, check.IsNil, check.Commentf(out)) out, err = d.Cmd("run", "--link", "icc1:icc1", "busybox", "nc", "icc1", "4567") @@ -962,14 +913,13 @@ func (s *DockerDaemonSuite) TestDaemonLinksIpTablesRulesWhenLinkAndUnlink(c *che bridgeName := "external-bridge" bridgeIP := "192.169.1.1/24" - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) + createInterface(c, "bridge", bridgeName, bridgeIP) defer deleteInterface(c, bridgeName) s.d.StartWithBusybox(c, "--bridge", bridgeName, "--icc=false") defer s.d.Restart(c) - _, err = s.d.Cmd("run", "-d", "--name", "child", "--publish", "8080:80", "busybox", "top") + _, err := s.d.Cmd("run", "-d", "--name", "child", "--publish", "8080:80", "busybox", "top") c.Assert(err, check.IsNil) _, err = s.d.Cmd("run", "-d", "--name", "parent", "--link", "child:http", "busybox", "top") c.Assert(err, check.IsNil) @@ -1464,10 +1414,7 @@ func (s *DockerDaemonSuite) TestCleanupMountsAfterDaemonAndContainerKill(c *chec c.Assert(strings.Contains(string(mountOut), id), check.Equals, true, comment) // kill the container - runCmd := exec.Command(ctrBinary, "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", "containers", "kill", id) - if out, ec, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("Failed to run ctr, ExitCode: %d, err: %v output: %s id: %s\n", ec, err, out, id) - } + icmd.RunCommand(ctrBinary, "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", "containers", "kill", id).Assert(c, icmd.Success) // restart daemon. d.Restart(c) @@ -1564,10 +1511,9 @@ func (s *DockerDaemonSuite) TestDaemonRestartCleanupNetns(c *check.C) { } // Test if the file still exists - out, _, err = runCommandWithOutput(exec.Command("stat", "-c", "%n", fileName)) - out = strings.TrimSpace(out) - c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) - c.Assert(out, check.Equals, fileName, check.Commentf("Output: %s", out)) + icmd.RunCommand("stat", "-c", "%n", fileName).Assert(c, icmd.Expected{ + Out: fileName, + }) // Remove the container and restart the daemon if out, err := s.d.Cmd("rm", "netns"); err != nil { @@ -1577,32 +1523,34 @@ func (s *DockerDaemonSuite) TestDaemonRestartCleanupNetns(c *check.C) { s.d.Restart(c) // Test again and see now the netns file does not exist - out, _, err = runCommandWithOutput(exec.Command("stat", "-c", "%n", fileName)) - out = strings.TrimSpace(out) - c.Assert(err, check.Not(check.IsNil), check.Commentf("Output: %s", out)) + icmd.RunCommand("stat", "-c", "%n", fileName).Assert(c, icmd.Expected{ + Err: "No such file or directory", + ExitCode: 1, + }) } // tests regression detailed in #13964 where DOCKER_TLS_VERIFY env is ignored func (s *DockerDaemonSuite) TestDaemonTLSVerifyIssue13964(c *check.C) { host := "tcp://localhost:4271" s.d.Start(c, "-H", host) - cmd := exec.Command(dockerBinary, "-H", host, "info") - cmd.Env = []string{"DOCKER_TLS_VERIFY=1", "DOCKER_CERT_PATH=fixtures/https"} - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, check.Not(check.IsNil), check.Commentf("%s", out)) - c.Assert(strings.Contains(out, "error during connect"), check.Equals, true) - + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "-H", host, "info"}, + Env: []string{"DOCKER_TLS_VERIFY=1", "DOCKER_CERT_PATH=fixtures/https"}, + }).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "error during connect", + }) } func setupV6(c *check.C) { // Hack to get the right IPv6 address on docker0, which has already been created result := icmd.RunCommand("ip", "addr", "add", "fe80::1/64", "dev", "docker0") - result.Assert(c, icmd.Expected{}) + result.Assert(c, icmd.Success) } func teardownV6(c *check.C) { result := icmd.RunCommand("ip", "addr", "del", "fe80::1/64", "dev", "docker0") - result.Assert(c, icmd.Expected{}) + result.Assert(c, icmd.Success) } func (s *DockerDaemonSuite) TestDaemonRestartWithContainerWithRestartPolicyAlways(c *check.C) { @@ -1708,10 +1656,7 @@ func (s *DockerDaemonSuite) TestDaemonCorruptedLogDriverAddress(c *check.C) { }) c.Assert(d.StartWithError("--log-driver=syslog", "--log-opt", "syslog-address=corrupted:42"), check.NotNil) expected := "Failed to set log opts: syslog-address should be in form proto://address" - runCmd := exec.Command("grep", expected, d.LogFileName()) - if out, _, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("Expected %q message; but doesn't exist in log: %q, err: %v", expected, out, err) - } + icmd.RunCommand("grep", expected, d.LogFileName()).Assert(c, icmd.Success) } // FIXME(vdemeester) should be a unit test @@ -1721,10 +1666,7 @@ func (s *DockerDaemonSuite) TestDaemonCorruptedFluentdAddress(c *check.C) { }) c.Assert(d.StartWithError("--log-driver=fluentd", "--log-opt", "fluentd-address=corrupted:c"), check.NotNil) expected := "Failed to set log opts: invalid fluentd-address corrupted:c: " - runCmd := exec.Command("grep", expected, d.LogFileName()) - if out, _, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("Expected %q message; but doesn't exist in log: %q, err: %v", expected, out, err) - } + icmd.RunCommand("grep", expected, d.LogFileName()).Assert(c, icmd.Success) } // FIXME(vdemeester) Use a new daemon instance instead of the Suite one @@ -1808,13 +1750,11 @@ func (s *DockerDaemonSuite) TestDaemonNoSpaceLeftOnDeviceError(c *check.C) { // create a 2MiB image and mount it as graph root // Why in a container? Because `mount` sometimes behaves weirdly and often fails outright on this test in debian:jessie (which is what the test suite runs under if run from the Makefile) dockerCmd(c, "run", "--rm", "-v", testDir+":/test", "busybox", "sh", "-c", "dd of=/test/testfs.img bs=1M seek=2 count=0") - out, _, err := runCommandWithOutput(exec.Command("mkfs.ext4", "-F", filepath.Join(testDir, "testfs.img"))) // `mkfs.ext4` is not in busybox - c.Assert(err, checker.IsNil, check.Commentf(out)) + icmd.RunCommand("mkfs.ext4", "-F", filepath.Join(testDir, "testfs.img")).Assert(c, icmd.Success) - cmd := exec.Command("losetup", "-f", "--show", filepath.Join(testDir, "testfs.img")) - loout, err := cmd.CombinedOutput() - c.Assert(err, checker.IsNil) - loopname := strings.TrimSpace(string(loout)) + result := icmd.RunCommand("losetup", "-f", "--show", filepath.Join(testDir, "testfs.img")) + result.Assert(c, icmd.Success) + loopname := strings.TrimSpace(string(result.Combined())) defer exec.Command("losetup", "-d", loopname).Run() dockerCmd(c, "run", "--privileged", "--rm", "-v", testDir+":/test:shared", "busybox", "sh", "-c", fmt.Sprintf("mkdir -p /test/test-mount && mount -t ext4 -no loop,rw %v /test/test-mount", loopname)) @@ -1899,7 +1839,7 @@ func (s *DockerDaemonSuite) TestDaemonCgroupParent(c *check.C) { out, err := s.d.Cmd("run", "--name", name, "busybox", "cat", "/proc/self/cgroup") c.Assert(err, checker.IsNil) - cgroupPaths := integration.ParseCgroupPaths(string(out)) + cgroupPaths := testutil.ParseCgroupPaths(string(out)) c.Assert(len(cgroupPaths), checker.Not(checker.Equals), 0, check.Commentf("unexpected output - %q", string(out))) out, err = s.d.Cmd("inspect", "-f", "{{.Id}}", name) c.Assert(err, checker.IsNil) @@ -2007,10 +1947,7 @@ func (s *DockerDaemonSuite) TestDaemonRestartWithKilledRunningContainer(t *check } // kill the container - runCmd := exec.Command(ctrBinary, "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", "containers", "kill", cid) - if out, ec, err := runCommandWithOutput(runCmd); err != nil { - t.Fatalf("Failed to run ctr, ExitCode: %d, err: '%v' output: '%s' cid: '%s'\n", ec, err, out, cid) - } + icmd.RunCommand(ctrBinary, "--address", "unix:///var/run/docker/libcontainerd/docker-containerd.sock", "containers", "kill", cid).Assert(t, icmd.Success) // Give time to containerd to process the command if we don't // the exit event might be received after we do the inspect @@ -2165,6 +2102,9 @@ func (s *DockerDaemonSuite) TestDaemonStartWithoutColors(c *check.C) { infoLog := "\x1b[34mINFO\x1b" + b := bytes.NewBuffer(nil) + done := make(chan bool) + p, tty, err := pty.Open() c.Assert(err, checker.IsNil) defer func() { @@ -2172,19 +2112,38 @@ func (s *DockerDaemonSuite) TestDaemonStartWithoutColors(c *check.C) { p.Close() }() - b := bytes.NewBuffer(nil) - go io.Copy(b, p) + go func() { + io.Copy(b, p) + done <- true + }() // Enable coloring explicitly s.d.StartWithLogFile(tty, "--raw-logs=false") s.d.Stop(c) + // Wait for io.Copy() before checking output + <-done c.Assert(b.String(), checker.Contains, infoLog) b.Reset() + // "tty" is already closed in prev s.d.Stop(), + // we have to close the other side "p" and open another pair of + // pty for the next test. + p.Close() + p, tty, err = pty.Open() + c.Assert(err, checker.IsNil) + + go func() { + io.Copy(b, p) + done <- true + }() + // Disable coloring explicitly s.d.StartWithLogFile(tty, "--raw-logs=true") s.d.Stop(c) + // Wait for io.Copy() before checking output + <-done + c.Assert(b.String(), check.Not(check.Equals), "") c.Assert(b.String(), check.Not(checker.Contains), infoLog) } @@ -2870,5 +2829,62 @@ func (s *DockerDaemonSuite) TestRemoveContainerAfterLiveRestore(c *check.C) { out, err = s.d.Cmd("rm", "top") c.Assert(err, check.IsNil, check.Commentf("Output: %s", out)) +} +// #29598 +func (s *DockerDaemonSuite) TestRestartPolicyWithLiveRestore(c *check.C) { + testRequires(c, DaemonIsLinux, SameHostDaemon) + s.d.StartWithBusybox(c, "--live-restore") + + out, err := s.d.Cmd("run", "-d", "--restart", "always", "busybox", "top") + c.Assert(err, check.IsNil, check.Commentf("output: %s", out)) + id := strings.TrimSpace(out) + + type state struct { + Running bool + StartedAt time.Time + } + out, err = s.d.Cmd("inspect", "-f", "{{json .State}}", id) + c.Assert(err, checker.IsNil, check.Commentf("output: %s", out)) + + var origState state + err = json.Unmarshal([]byte(strings.TrimSpace(out)), &origState) + c.Assert(err, checker.IsNil) + + s.d.Restart(c, "--live-restore") + + pid, err := s.d.Cmd("inspect", "-f", "{{.State.Pid}}", id) + c.Assert(err, check.IsNil) + pidint, err := strconv.Atoi(strings.TrimSpace(pid)) + c.Assert(err, check.IsNil) + c.Assert(pidint, checker.GreaterThan, 0) + c.Assert(syscall.Kill(pidint, syscall.SIGKILL), check.IsNil) + + ticker := time.NewTicker(50 * time.Millisecond) + timeout := time.After(10 * time.Second) + + for range ticker.C { + select { + case <-timeout: + c.Fatal("timeout waiting for container restart") + default: + } + + out, err := s.d.Cmd("inspect", "-f", "{{json .State}}", id) + c.Assert(err, checker.IsNil, check.Commentf("output: %s", out)) + + var newState state + err = json.Unmarshal([]byte(strings.TrimSpace(out)), &newState) + c.Assert(err, checker.IsNil) + + if !newState.Running { + continue + } + if newState.StartedAt.After(origState.StartedAt) { + break + } + } + + out, err = s.d.Cmd("stop", id) + c.Assert(err, check.IsNil, check.Commentf("output: %s", out)) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_diff_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_diff_test.go index 08cf6e1ca..c92853ddf 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_diff_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_diff_test.go @@ -4,7 +4,7 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_events_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_events_test.go index d45444266..013942ca2 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_events_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_events_test.go @@ -14,9 +14,10 @@ import ( eventtypes "github.com/docker/docker/api/types/events" eventstestutils "github.com/docker/docker/daemon/events/testutils" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -222,7 +223,7 @@ func (s *DockerSuite) TestEventsImageImport(c *check.C) { cleanedContainerID := strings.TrimSpace(out) since := daemonUnixTime(c) - out, _, err := integration.RunCommandPipelineWithOutput( + out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "export", cleanedContainerID), exec.Command(dockerBinary, "import", "-"), ) @@ -494,7 +495,7 @@ func (s *DockerSuite) TestEventsResize(c *check.C) { c.Assert(waitRun(cID), checker.IsNil) endpoint := "/containers/" + cID + "/resize?h=80&w=24" - status, _, err := sockRequest("POST", endpoint, nil) + status, _, err := request.SockRequest("POST", endpoint, nil, daemonHost()) c.Assert(status, checker.Equals, http.StatusOK) c.Assert(err, checker.IsNil) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_events_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_events_unix_test.go index 3348ff3e3..41bd35e3f 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_events_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_events_unix_test.go @@ -14,7 +14,7 @@ import ( "time" "unicode" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" "github.com/kr/pty" ) @@ -429,7 +429,7 @@ func (s *DockerDaemonSuite) TestDaemonEvents(c *check.C) { out, err = s.d.Cmd("events", "--since=0", "--until", daemonUnixTime(c)) c.Assert(err, checker.IsNil) - c.Assert(out, checker.Contains, fmt.Sprintf("daemon reload %s (cluster-advertise=, cluster-store=, cluster-store-opts={}, debug=true, default-runtime=runc, insecure-registries=[], labels=[\"bar=foo\"], live-restore=false, max-concurrent-downloads=1, max-concurrent-uploads=5, name=%s, runtimes=runc:{docker-runc []}, shutdown-timeout=10)", daemonID, daemonName)) + c.Assert(out, checker.Contains, fmt.Sprintf("daemon reload %s (cluster-advertise=, cluster-store=, cluster-store-opts={}, debug=true, default-runtime=runc, insecure-registries=[], labels=[\"bar=foo\"], live-restore=false, max-concurrent-downloads=1, max-concurrent-uploads=5, name=%s, registry-mirrors=[], runtimes=runc:{docker-runc []}, shutdown-timeout=10)", daemonID, daemonName)) } func (s *DockerDaemonSuite) TestDaemonEventsWithFilters(c *check.C) { diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_test.go index e3e92e4a2..bffd60b69 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_test.go @@ -15,8 +15,9 @@ import ( "sync" "time" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -355,14 +356,14 @@ func (s *DockerSuite) TestExecInspectID(c *check.C) { } // But we should still be able to query the execID - sc, body, err := sockRequest("GET", "/exec/"+execID+"/json", nil) + sc, body, err := request.SockRequest("GET", "/exec/"+execID+"/json", nil, daemonHost()) c.Assert(sc, checker.Equals, http.StatusOK, check.Commentf("received status != 200 OK: %d\n%s", sc, body)) // Now delete the container and then an 'inspect' on the exec should // result in a 404 (not 'container not running') out, ec := dockerCmd(c, "rm", "-f", id) c.Assert(ec, checker.Equals, 0, check.Commentf("error removing container: %s", out)) - sc, body, err = sockRequest("GET", "/exec/"+execID+"/json", nil) + sc, body, err = request.SockRequest("GET", "/exec/"+execID+"/json", nil, daemonHost()) c.Assert(sc, checker.Equals, http.StatusNotFound, check.Commentf("received status != 404: %d\n%s", sc, body)) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_unix_test.go index 3fbfcb233..5d8efc70d 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_exec_unix_test.go @@ -9,7 +9,7 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" "github.com/kr/pty" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_experimental_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_experimental_test.go index 6a49cc8cb..51181fe9c 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_experimental_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_experimental_test.go @@ -3,7 +3,7 @@ package main import ( "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_export_import_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_export_import_test.go index 069dc0816..fe117b9ae 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_export_import_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_export_import_test.go @@ -2,10 +2,10 @@ package main import ( "os" - "os/exec" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -18,12 +18,13 @@ func (s *DockerSuite) TestExportContainerAndImportImage(c *check.C) { out, _ := dockerCmd(c, "export", containerID) - importCmd := exec.Command(dockerBinary, "import", "-", "repo/testexp:v1") - importCmd.Stdin = strings.NewReader(out) - out, _, err := runCommandWithOutput(importCmd) - c.Assert(err, checker.IsNil, check.Commentf("failed to import image repo/testexp:v1: %s", out)) + result := icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "import", "-", "repo/testexp:v1"}, + Stdin: strings.NewReader(out), + }) + result.Assert(c, icmd.Success) - cleanedImageID := strings.TrimSpace(out) + cleanedImageID := strings.TrimSpace(result.Combined()) c.Assert(cleanedImageID, checker.Not(checker.Equals), "", check.Commentf("output should have been an image id")) } @@ -36,14 +37,15 @@ func (s *DockerSuite) TestExportContainerWithOutputAndImportImage(c *check.C) { dockerCmd(c, "export", "--output=testexp.tar", containerID) defer os.Remove("testexp.tar") - out, _, err := runCommandWithOutput(exec.Command("cat", "testexp.tar")) - c.Assert(err, checker.IsNil, check.Commentf(out)) + resultCat := icmd.RunCommand("cat", "testexp.tar") + resultCat.Assert(c, icmd.Success) - importCmd := exec.Command(dockerBinary, "import", "-", "repo/testexp:v1") - importCmd.Stdin = strings.NewReader(out) - out, _, err = runCommandWithOutput(importCmd) - c.Assert(err, checker.IsNil, check.Commentf("failed to import image repo/testexp:v1: %s", out)) + result := icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "import", "-", "repo/testexp:v1"}, + Stdin: strings.NewReader(resultCat.Combined()), + }) + result.Assert(c, icmd.Success) - cleanedImageID := strings.TrimSpace(out) + cleanedImageID := strings.TrimSpace(result.Combined()) c.Assert(cleanedImageID, checker.Not(checker.Equals), "", check.Commentf("output should have been an image id")) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_external_graphdriver_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_external_graphdriver_unix_test.go index a700f82a8..152bc6aa6 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_external_graphdriver_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_external_graphdriver_unix_test.go @@ -57,6 +57,10 @@ func (s *DockerExternalGraphdriverSuite) SetUpTest(c *check.C) { }) } +func (s *DockerExternalGraphdriverSuite) OnTimeout(c *check.C) { + s.d.DumpStackAndQuit() +} + func (s *DockerExternalGraphdriverSuite) TearDownTest(c *check.C) { if s.d != nil { s.d.Stop(c) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_external_volume_driver_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_external_volume_driver_unix_test.go index ad055e3d4..522242fa7 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_external_volume_driver_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_external_volume_driver_unix_test.go @@ -16,8 +16,8 @@ import ( "time" "github.com/docker/docker/api/types" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" - "github.com/docker/docker/pkg/integration/checker" "github.com/docker/docker/pkg/stringid" "github.com/docker/docker/volume" "github.com/go-check/check" diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_health_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_health_test.go index 6b7baebd0..ed692d357 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_health_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_health_test.go @@ -8,7 +8,7 @@ import ( "time" "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_help_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_help_test.go index 88fb2d77c..7c486858f 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_help_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_help_test.go @@ -2,18 +2,18 @@ package main import ( "fmt" - "os/exec" "runtime" "strings" "unicode" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/homedir" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) func (s *DockerSuite) TestHelpTextVerify(c *check.C) { + // FIXME(vdemeester) should be a unit test, probably using golden files ? testRequires(c, DaemonIsLinux) // Make sure main help text fits within 80 chars and that @@ -52,11 +52,12 @@ func (s *DockerSuite) TestHelpTextVerify(c *check.C) { scanForHome := runtime.GOOS != "windows" && home != "/" // Check main help text to make sure its not over 80 chars - helpCmd := exec.Command(dockerBinary, "help") - helpCmd.Env = newEnvs - out, _, err := runCommandWithOutput(helpCmd) - c.Assert(err, checker.IsNil, check.Commentf(out)) - lines := strings.Split(out, "\n") + result := icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "help"}, + Env: newEnvs, + }) + result.Assert(c, icmd.Success) + lines := strings.Split(result.Combined(), "\n") for _, line := range lines { // All lines should not end with a space c.Assert(line, checker.Not(checker.HasSuffix), " ", check.Commentf("Line should not end with a space")) @@ -75,16 +76,17 @@ func (s *DockerSuite) TestHelpTextVerify(c *check.C) { // Make sure each cmd's help text fits within 90 chars and that // on non-windows system we use ~ when possible (to shorten things). // Pull the list of commands from the "Commands:" section of docker help - helpCmd = exec.Command(dockerBinary, "help") - helpCmd.Env = newEnvs - out, _, err = runCommandWithOutput(helpCmd) - c.Assert(err, checker.IsNil, check.Commentf(out)) - i := strings.Index(out, "Commands:") - c.Assert(i, checker.GreaterOrEqualThan, 0, check.Commentf("Missing 'Commands:' in:\n%s", out)) + // FIXME(vdemeester) Why re-run help ? + //helpCmd = exec.Command(dockerBinary, "help") + //helpCmd.Env = newEnvs + //out, _, err = runCommandWithOutput(helpCmd) + //c.Assert(err, checker.IsNil, check.Commentf(out)) + i := strings.Index(result.Combined(), "Commands:") + c.Assert(i, checker.GreaterOrEqualThan, 0, check.Commentf("Missing 'Commands:' in:\n%s", result.Combined())) cmds := []string{} // Grab all chars starting at "Commands:" - helpOut := strings.Split(out[i:], "\n") + helpOut := strings.Split(result.Combined()[i:], "\n") // Skip first line, it is just "Commands:" helpOut = helpOut[1:] diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_history_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_history_test.go index 9979080b1..bc7d269d0 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_history_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_history_test.go @@ -6,7 +6,7 @@ import ( "strconv" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_images_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_images_test.go index 3b678a258..79a8a34b7 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_images_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_images_test.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/stringid" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_import_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_import_test.go index 080d3798c..c1a5f6572 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_import_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_import_test.go @@ -9,9 +9,9 @@ import ( "regexp" "strings" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -20,7 +20,7 @@ func (s *DockerSuite) TestImportDisplay(c *check.C) { out, _ := dockerCmd(c, "run", "-d", "busybox", "true") cleanedContainerID := strings.TrimSpace(out) - out, _, err := integration.RunCommandPipelineWithOutput( + out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "export", cleanedContainerID), exec.Command(dockerBinary, "import", "-"), ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_info_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_info_test.go index 063cd4f89..745893459 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_info_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_info_test.go @@ -6,8 +6,8 @@ import ( "net" "strings" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" - "github.com/docker/docker/pkg/integration/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_info_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_info_unix_test.go index b9323060d..d55c05c4a 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_info_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_info_unix_test.go @@ -3,7 +3,7 @@ package main import ( - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_inspect_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_inspect_test.go index f38e8d2ac..58a8a122f 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_inspect_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_inspect_test.go @@ -10,9 +10,8 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" - "github.com/docker/docker/integration-cli/environment" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -212,10 +211,6 @@ func (s *DockerSuite) TestInspectBindMountPoint(c *check.C) { prefix, slash := getPrefixAndSlashFromDaemonPlatform() if daemonPlatform == "windows" { modifier = "" - // TODO Windows: Temporary check - remove once TP5 support is dropped - if environment.WindowsKernelVersion(testEnv.DaemonKernelVersion()) < 14350 { - c.Skip("Needs later Windows build for RO volumes") - } // Linux creates the host directory if it doesn't exist. Windows does not. os.Mkdir(`c:\data`, os.ModeDir) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_kill_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_kill_test.go index 43164801d..db3696357 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_kill_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_kill_test.go @@ -6,7 +6,8 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -128,7 +129,7 @@ func (s *DockerSuite) TestKillStoppedContainerAPIPre120(c *check.C) { runSleepingContainer(c, "--name", "docker-kill-test-api", "-d") dockerCmd(c, "stop", "docker-kill-test-api") - status, _, err := sockRequest("POST", fmt.Sprintf("/v1.19/containers/%s/kill", "docker-kill-test-api"), nil) + status, _, err := request.SockRequest("POST", fmt.Sprintf("/v1.19/containers/%s/kill", "docker-kill-test-api"), nil, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusNoContent) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_links_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_links_test.go index 9eb1174e8..55f04ea26 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_links_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_links_test.go @@ -6,8 +6,8 @@ import ( "regexp" "strings" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/pkg/testutil" "github.com/docker/docker/runconfig" "github.com/go-check/check" ) @@ -102,7 +102,7 @@ func (s *DockerSuite) TestLinksInspectLinksStarted(c *check.C) { err := json.Unmarshal([]byte(links), &result) c.Assert(err, checker.IsNil) - output := integration.ConvertSliceOfStringsToMap(result) + output := testutil.ConvertSliceOfStringsToMap(result) c.Assert(output, checker.DeepEquals, expected) } @@ -121,7 +121,7 @@ func (s *DockerSuite) TestLinksInspectLinksStopped(c *check.C) { err := json.Unmarshal([]byte(links), &result) c.Assert(err, checker.IsNil) - output := integration.ConvertSliceOfStringsToMap(result) + output := testutil.ConvertSliceOfStringsToMap(result) c.Assert(output, checker.DeepEquals, expected) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_links_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_links_unix_test.go index 1af927930..dbff2911a 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_links_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_links_unix_test.go @@ -6,7 +6,7 @@ import ( "io/ioutil" "os" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_login_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_login_test.go index 9cf5f2f37..94dc03778 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_login_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_login_test.go @@ -4,7 +4,7 @@ import ( "bytes" "os/exec" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) @@ -21,10 +21,10 @@ func (s *DockerSuite) TestLoginWithoutTTY(c *check.C) { func (s *DockerRegistryAuthHtpasswdSuite) TestLoginToPrivateRegistry(c *check.C) { // wrong credentials - out, _, err := dockerCmdWithError("login", "-u", s.reg.username, "-p", "WRONGPASSWORD", privateRegistryURL) + out, _, err := dockerCmdWithError("login", "-u", s.reg.Username(), "-p", "WRONGPASSWORD", privateRegistryURL) c.Assert(err, checker.NotNil, check.Commentf(out)) c.Assert(out, checker.Contains, "401 Unauthorized") // now it's fine - dockerCmd(c, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) + dockerCmd(c, "login", "-u", s.reg.Username(), "-p", s.reg.Password(), privateRegistryURL) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_logout_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_logout_test.go index a5f4b108c..49ee1f786 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_logout_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_logout_test.go @@ -8,7 +8,7 @@ import ( "os/exec" "path/filepath" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) @@ -35,7 +35,7 @@ func (s *DockerRegistryAuthHtpasswdSuite) TestLogoutWithExternalAuth(c *check.C) err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) c.Assert(err, checker.IsNil) - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) + dockerCmd(c, "--config", tmp, "login", "-u", s.reg.Username(), "-p", s.reg.Password(), privateRegistryURL) b, err := ioutil.ReadFile(configPath) c.Assert(err, checker.IsNil) @@ -71,7 +71,7 @@ func (s *DockerRegistryAuthHtpasswdSuite) TestLogoutWithWrongHostnamesStored(c * os.Setenv("PATH", testPath) cmd := exec.Command("docker-credential-shell-test", "store") - stdin := bytes.NewReader([]byte(fmt.Sprintf(`{"ServerURL": "https://%s", "Username": "%s", "Secret": "%s"}`, privateRegistryURL, s.reg.username, s.reg.password))) + stdin := bytes.NewReader([]byte(fmt.Sprintf(`{"ServerURL": "https://%s", "Username": "%s", "Secret": "%s"}`, privateRegistryURL, s.reg.Username(), s.reg.Password()))) cmd.Stdin = stdin c.Assert(cmd.Run(), checker.IsNil) @@ -84,7 +84,7 @@ func (s *DockerRegistryAuthHtpasswdSuite) TestLogoutWithWrongHostnamesStored(c * err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) c.Assert(err, checker.IsNil) - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) + dockerCmd(c, "--config", tmp, "login", "-u", s.reg.Username(), "-p", s.reg.Password(), privateRegistryURL) b, err := ioutil.ReadFile(configPath) c.Assert(err, checker.IsNil) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_logs_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_logs_test.go index 2126ce921..47fb1ebc5 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_logs_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_logs_test.go @@ -8,9 +8,10 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/jsonlog" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -188,14 +189,14 @@ func (s *DockerSuite) TestLogsSince(c *check.C) { // Test with default value specified and parameter omitted expected := []string{"log1", "log2", "log3"} - for _, cmd := range []*exec.Cmd{ - exec.Command(dockerBinary, "logs", "-t", name), - exec.Command(dockerBinary, "logs", "-t", "--since=0", name), + for _, cmd := range [][]string{ + {"logs", "-t", name}, + {"logs", "-t", "--since=0", name}, } { - out, _, err = runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil, check.Commentf("failed to log container: %s", out)) + result := icmd.RunCommand(dockerBinary, cmd...) + result.Assert(c, icmd.Success) for _, v := range expected { - c.Assert(out, checker.Contains, v) + c.Assert(result.Combined(), checker.Contains, v) } } } @@ -254,11 +255,11 @@ func (s *DockerSuite) TestLogsFollowSlowStdoutConsumer(c *check.C) { c.Assert(logCmd.Start(), checker.IsNil) // First read slowly - bytes1, err := integration.ConsumeWithSpeed(stdout, 10, 50*time.Millisecond, stopSlowRead) + bytes1, err := testutil.ConsumeWithSpeed(stdout, 10, 50*time.Millisecond, stopSlowRead) c.Assert(err, checker.IsNil) // After the container has finished we can continue reading fast - bytes2, err := integration.ConsumeWithSpeed(stdout, 32*1024, 0, nil) + bytes2, err := testutil.ConsumeWithSpeed(stdout, 32*1024, 0, nil) c.Assert(err, checker.IsNil) actual := bytes1 + bytes2 diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_nat_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_nat_test.go index 7f4cc2cbd..c1617c216 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_nat_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_nat_test.go @@ -6,7 +6,7 @@ import ( "net" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_netmode_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_netmode_test.go index 4dfad937b..7e63e9bf9 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_netmode_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_netmode_test.go @@ -1,7 +1,7 @@ package main import ( - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/runconfig" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_network_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_network_unix_test.go index 1b33d3fbe..795d80099 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_network_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_network_unix_test.go @@ -16,10 +16,10 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/versions/v1p20" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" "github.com/docker/docker/pkg/stringid" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/docker/docker/runconfig" "github.com/docker/libnetwork/driverapi" remoteapi "github.com/docker/libnetwork/drivers/remote/api" @@ -777,7 +777,7 @@ func (s *DockerNetworkSuite) TestDockerPluginV2NetworkDriver(c *check.C) { testRequires(c, DaemonIsLinux, IsAmd64, Network) var ( - npName = "tonistiigi/test-docker-netplugin" + npName = "tiborvass/test-docker-netplugin" npTag = "latest" npNameWithTag = npName + ":" + npTag ) @@ -803,15 +803,14 @@ func (s *DockerDaemonSuite) TestDockerNetworkNoDiscoveryDefaultBridgeNetwork(c * hostsFile := "/etc/hosts" bridgeName := "external-bridge" bridgeIP := "192.169.255.254/24" - out, err := createInterface(c, "bridge", bridgeName, bridgeIP) - c.Assert(err, check.IsNil, check.Commentf(out)) + createInterface(c, "bridge", bridgeName, bridgeIP) defer deleteInterface(c, bridgeName) s.d.StartWithBusybox(c, "--bridge", bridgeName) defer s.d.Restart(c) // run two containers and store first container's etc/hosts content - out, err = s.d.Cmd("run", "-d", "busybox", "top") + out, err := s.d.Cmd("run", "-d", "busybox", "top") c.Assert(err, check.IsNil) cid1 := strings.TrimSpace(out) defer s.d.Cmd("stop", cid1) @@ -1413,7 +1412,7 @@ func verifyIPAddresses(c *check.C, cName, nwname, ipv4, ipv6 string) { func (s *DockerNetworkSuite) TestDockerNetworkConnectLinkLocalIP(c *check.C) { // create one test network - dockerCmd(c, "network", "create", "n0") + dockerCmd(c, "network", "create", "--ipv6", "--subnet=2001:db8:1234::/64", "n0") assertNwIsAvailable(c, "n0") // run a container with incorrect link-local address diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_oom_killed_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_oom_killed_test.go index bcf59f860..54c34d206 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_oom_killed_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_oom_killed_test.go @@ -3,7 +3,7 @@ package main import ( - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_pause_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_pause_test.go index 47bfab447..a67e17309 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_pause_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_pause_test.go @@ -3,7 +3,7 @@ package main import ( "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_plugins_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_plugins_test.go index 13ded6ee8..7b402ad17 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_plugins_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_plugins_test.go @@ -2,22 +2,23 @@ package main import ( "fmt" - "os/exec" - - "github.com/docker/docker/pkg/integration/checker" - "github.com/go-check/check" - "io/ioutil" "os" "path/filepath" "strings" + + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" + "github.com/go-check/check" ) var ( pluginProcessName = "sample-volume-plugin" - pName = "tonistiigi/sample-volume-plugin" + pName = "tiborvass/sample-volume-plugin" + npName = "tiborvass/test-docker-netplugin" pTag = "latest" pNameWithTag = pName + ":" + pTag + npNameWithTag = npName + ":" + pTag ) func (s *DockerSuite) TestPluginBasicOps(c *check.C) { @@ -87,6 +88,33 @@ func (s *DockerSuite) TestPluginActive(c *check.C) { c.Assert(out, checker.Contains, pNameWithTag) } +func (s *DockerSuite) TestPluginActiveNetwork(c *check.C) { + testRequires(c, DaemonIsLinux, IsAmd64, Network) + out, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", npNameWithTag) + c.Assert(err, checker.IsNil) + + out, _, err = dockerCmdWithError("network", "create", "-d", npNameWithTag, "test") + c.Assert(err, checker.IsNil) + + nID := strings.TrimSpace(out) + + out, _, err = dockerCmdWithError("plugin", "remove", npNameWithTag) + c.Assert(out, checker.Contains, "is in use") + + _, _, err = dockerCmdWithError("network", "rm", nID) + c.Assert(err, checker.IsNil) + + out, _, err = dockerCmdWithError("plugin", "remove", npNameWithTag) + c.Assert(out, checker.Contains, "is enabled") + + _, _, err = dockerCmdWithError("plugin", "disable", npNameWithTag) + c.Assert(err, checker.IsNil) + + out, _, err = dockerCmdWithError("plugin", "remove", npNameWithTag) + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, npNameWithTag) +} + func (s *DockerSuite) TestPluginInstallDisable(c *check.C) { testRequires(c, DaemonIsLinux, IsAmd64, Network) out, _, err := dockerCmdWithError("plugin", "install", "--grant-all-permissions", "--disable", pName) @@ -276,15 +304,11 @@ func (s *DockerTrustSuite) TestPluginTrustedInstall(c *check.C) { trustedName := s.setupTrustedplugin(c, pNameWithTag, "trusted-plugin-install") - installCmd := exec.Command(dockerBinary, "plugin", "install", "--grant-all-permissions", trustedName) - s.trustedCmd(installCmd) - out, _, err := runCommandWithOutput(installCmd) + icmd.RunCmd(icmd.Command(dockerBinary, "plugin", "install", "--grant-all-permissions", trustedName), trustedCmd).Assert(c, icmd.Expected{ + Out: trustedName, + }) - c.Assert(strings.TrimSpace(out), checker.Contains, trustedName) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Contains, trustedName) - - out, _, err = dockerCmdWithError("plugin", "ls") + out, _, err := dockerCmdWithError("plugin", "ls") c.Assert(err, checker.IsNil) c.Assert(out, checker.Contains, "true") @@ -301,11 +325,7 @@ func (s *DockerTrustSuite) TestPluginTrustedInstall(c *check.C) { c.Assert(strings.TrimSpace(out), checker.Contains, trustedName) // Try untrusted pull to ensure we pushed the tag to the registry - installCmd = exec.Command(dockerBinary, "plugin", "install", "--disable-content-trust=true", "--grant-all-permissions", trustedName) - s.trustedCmd(installCmd) - out, _, err = runCommandWithOutput(installCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Downloaded", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "plugin", "install", "--disable-content-trust=true", "--grant-all-permissions", trustedName), trustedCmd).Assert(c, SuccessDownloaded) out, _, err = dockerCmdWithError("plugin", "ls") c.Assert(err, checker.IsNil) @@ -323,12 +343,10 @@ func (s *DockerTrustSuite) TestPluginUntrustedInstall(c *check.C) { dockerCmd(c, "plugin", "rm", "-f", pluginName) // Try trusted install on untrusted plugin - installCmd := exec.Command(dockerBinary, "plugin", "install", "--grant-all-permissions", pluginName) - s.trustedCmd(installCmd) - out, _, err := runCommandWithOutput(installCmd) - - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Error: remote trust data does not exist", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "plugin", "install", "--grant-all-permissions", pluginName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Error: remote trust data does not exist", + }) } func (s *DockerSuite) TestPluginIDPrefix(c *check.C) { diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_port_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_port_test.go index 80b00fe93..bcb87f5f3 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_port_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_port_test.go @@ -7,7 +7,7 @@ import ( "sort" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_proxy_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_proxy_test.go index c15f90d1b..3344985a0 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_proxy_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_proxy_test.go @@ -2,23 +2,20 @@ package main import ( "net" - "os/exec" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) func (s *DockerSuite) TestCLIProxyDisableProxyUnixSock(c *check.C) { - testRequires(c, DaemonIsLinux) - testRequires(c, SameHostDaemon) // test is valid when DOCKER_HOST=unix://.. - - cmd := exec.Command(dockerBinary, "info") - cmd.Env = appendBaseEnv(false, "HTTP_PROXY=http://127.0.0.1:9999") - - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil, check.Commentf("%v", out)) + testRequires(c, DaemonIsLinux, SameHostDaemon) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "info"}, + Env: appendBaseEnv(false, "HTTP_PROXY=http://127.0.0.1:9999"), + }).Assert(c, icmd.Success) } // Can't use localhost here since go has a special case to not use proxy if connecting to localhost @@ -41,12 +38,14 @@ func (s *DockerDaemonSuite) TestCLIProxyProxyTCPSock(c *check.C) { c.Assert(ip, checker.Not(checker.Equals), "") s.d.Start(c, "-H", "tcp://"+ip+":2375") - cmd := exec.Command(dockerBinary, "info") - cmd.Env = []string{"DOCKER_HOST=tcp://" + ip + ":2375", "HTTP_PROXY=127.0.0.1:9999"} - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.NotNil, check.Commentf("%v", out)) + + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "info"}, + Env: []string{"DOCKER_HOST=tcp://" + ip + ":2375", "HTTP_PROXY=127.0.0.1:9999"}, + }).Assert(c, icmd.Expected{Error: "exit status 1", ExitCode: 1}) // Test with no_proxy - cmd.Env = append(cmd.Env, "NO_PROXY="+ip) - out, _, err = runCommandWithOutput(exec.Command(dockerBinary, "info")) - c.Assert(err, checker.IsNil, check.Commentf("%v", out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "info"}, + Env: []string{"DOCKER_HOST=tcp://" + ip + ":2375", "HTTP_PROXY=127.0.0.1:9999", "NO_PROXY=" + ip}, + }).Assert(c, icmd.Success) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_prune_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_prune_unix_test.go index 8186f1b83..79d7d3cf5 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_prune_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_prune_unix_test.go @@ -5,9 +5,10 @@ package main import ( "strconv" "strings" + "time" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" - "github.com/docker/docker/pkg/integration/checker" "github.com/go-check/check" ) @@ -90,3 +91,23 @@ func (s *DockerDaemonSuite) TestPruneImageDangling(c *check.C) { c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id) } + +func (s *DockerSuite) TestPruneContainerUntil(c *check.C) { + out, _ := dockerCmd(c, "run", "-d", "busybox") + id1 := strings.TrimSpace(out) + c.Assert(waitExited(id1, 5*time.Second), checker.IsNil) + + until := daemonUnixTime(c) + + out, _ = dockerCmd(c, "run", "-d", "busybox") + id2 := strings.TrimSpace(out) + c.Assert(waitExited(id2, 5*time.Second), checker.IsNil) + + out, _ = dockerCmd(c, "container", "prune", "--force", "--filter", "until="+until) + c.Assert(strings.TrimSpace(out), checker.Contains, id1) + c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id2) + + out, _ = dockerCmd(c, "ps", "-a", "-q", "--no-trunc") + c.Assert(strings.TrimSpace(out), checker.Not(checker.Contains), id1) + c.Assert(strings.TrimSpace(out), checker.Contains, id2) +} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_ps_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_ps_test.go index e36bd00f6..b8920dd50 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_ps_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_ps_test.go @@ -11,9 +11,9 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/stringid" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -669,22 +669,19 @@ func (s *DockerSuite) TestPsImageIDAfterUpdate(c *check.C) { originalImageName := "busybox:TestPsImageIDAfterUpdate-original" updatedImageName := "busybox:TestPsImageIDAfterUpdate-updated" - runCmd := exec.Command(dockerBinary, "tag", "busybox:latest", originalImageName) - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.IsNil) + icmd.RunCommand(dockerBinary, "tag", "busybox:latest", originalImageName).Assert(c, icmd.Success) originalImageID, err := getIDByName(originalImageName) c.Assert(err, checker.IsNil) - runCmd = exec.Command(dockerBinary, append([]string{"run", "-d", originalImageName}, sleepCommandForDaemonPlatform()...)...) - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.IsNil) - containerID := strings.TrimSpace(out) + result := icmd.RunCommand(dockerBinary, append([]string{"run", "-d", originalImageName}, sleepCommandForDaemonPlatform()...)...) + result.Assert(c, icmd.Success) + containerID := strings.TrimSpace(result.Combined()) - linesOut, err := exec.Command(dockerBinary, "ps", "--no-trunc").CombinedOutput() - c.Assert(err, checker.IsNil) + result = icmd.RunCommand(dockerBinary, "ps", "--no-trunc") + result.Assert(c, icmd.Success) - lines := strings.Split(strings.TrimSpace(string(linesOut)), "\n") + lines := strings.Split(strings.TrimSpace(string(result.Combined())), "\n") // skip header lines = lines[1:] c.Assert(len(lines), checker.Equals, 1) @@ -694,18 +691,13 @@ func (s *DockerSuite) TestPsImageIDAfterUpdate(c *check.C) { c.Assert(f[1], checker.Equals, originalImageName) } - runCmd = exec.Command(dockerBinary, "commit", containerID, updatedImageName) - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.IsNil) - - runCmd = exec.Command(dockerBinary, "tag", updatedImageName, originalImageName) - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.IsNil) + icmd.RunCommand(dockerBinary, "commit", containerID, updatedImageName).Assert(c, icmd.Success) + icmd.RunCommand(dockerBinary, "tag", updatedImageName, originalImageName).Assert(c, icmd.Success) - linesOut, err = exec.Command(dockerBinary, "ps", "--no-trunc").CombinedOutput() - c.Assert(err, checker.IsNil) + result = icmd.RunCommand(dockerBinary, "ps", "--no-trunc") + result.Assert(c, icmd.Success) - lines = strings.Split(strings.TrimSpace(string(linesOut)), "\n") + lines = strings.Split(strings.TrimSpace(string(result.Combined())), "\n") // skip header lines = lines[1:] c.Assert(len(lines), checker.Equals, 1) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_local_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_local_test.go index cb14c2c70..c504f543f 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_local_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_local_test.go @@ -5,18 +5,18 @@ import ( "fmt" "io/ioutil" "os" - "os/exec" "path/filepath" "runtime" "strings" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest" "github.com/docker/distribution/manifest/manifestlist" "github.com/docker/distribution/manifest/schema2" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" + "github.com/opencontainers/go-digest" ) // testPullImageWithAliases pulls a specific image tag and verifies that any aliases (i.e., other @@ -87,8 +87,8 @@ func testConcurrentPullWholeRepo(c *check.C) { for i := 0; i != numPulls; i++ { go func() { - _, _, err := runCommandWithOutput(exec.Command(dockerBinary, "pull", "-a", repoName)) - results <- err + result := icmd.RunCommand(dockerBinary, "pull", "-a", repoName) + results <- result.Error }() } @@ -125,8 +125,8 @@ func testConcurrentFailingPull(c *check.C) { for i := 0; i != numPulls; i++ { go func() { - _, _, err := runCommandWithOutput(exec.Command(dockerBinary, "pull", repoName+":asdfasdf")) - results <- err + result := icmd.RunCommand(dockerBinary, "pull", repoName+":asdfasdf") + results <- result.Error }() } @@ -175,8 +175,8 @@ func testConcurrentPullMultipleTags(c *check.C) { for _, repo := range repos { go func(repo string) { - _, _, err := runCommandWithOutput(exec.Command(dockerBinary, "pull", repo)) - results <- err + result := icmd.RunCommand(dockerBinary, "pull", repo) + results <- result.Error }(repo) } @@ -347,7 +347,7 @@ func (s *DockerRegistrySuite) TestPullManifestList(c *check.C) { manifestListDigest := digest.FromBytes(manifestListJSON) hexDigest := manifestListDigest.Hex() - registryV2Path := filepath.Join(s.reg.dir, "docker", "registry", "v2") + registryV2Path := s.reg.Path() // Write manifest list to blob store blobDir := filepath.Join(registryV2Path, "blobs", "sha256", hexDigest[:2], hexDigest) @@ -411,7 +411,7 @@ func (s *DockerRegistryAuthHtpasswdSuite) TestPullWithExternalAuthLoginWithSchem err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) c.Assert(err, checker.IsNil) - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) + dockerCmd(c, "--config", tmp, "login", "-u", s.reg.Username(), "-p", s.reg.Password(), privateRegistryURL) b, err := ioutil.ReadFile(configPath) c.Assert(err, checker.IsNil) @@ -421,7 +421,7 @@ func (s *DockerRegistryAuthHtpasswdSuite) TestPullWithExternalAuthLoginWithSchem dockerCmd(c, "--config", tmp, "push", repoName) dockerCmd(c, "--config", tmp, "logout", privateRegistryURL) - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, "https://"+privateRegistryURL) + dockerCmd(c, "--config", tmp, "login", "-u", s.reg.Username(), "-p", s.reg.Password(), "https://"+privateRegistryURL) dockerCmd(c, "--config", tmp, "pull", repoName) // likewise push should work @@ -456,7 +456,7 @@ func (s *DockerRegistryAuthHtpasswdSuite) TestPullWithExternalAuth(c *check.C) { err = ioutil.WriteFile(configPath, []byte(externalAuthConfig), 0644) c.Assert(err, checker.IsNil) - dockerCmd(c, "--config", tmp, "login", "-u", s.reg.username, "-p", s.reg.password, privateRegistryURL) + dockerCmd(c, "--config", tmp, "login", "-u", s.reg.Username(), "-p", s.reg.Password(), privateRegistryURL) b, err := ioutil.ReadFile(configPath) c.Assert(err, checker.IsNil) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_test.go index 10c641fb1..40da4c1fe 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_test.go @@ -7,9 +7,9 @@ import ( "sync" "time" - "github.com/docker/distribution/digest" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" + "github.com/opencontainers/go-digest" ) // TestPullFromCentralRegistry pulls an image from the central registry and verifies that the client @@ -26,7 +26,7 @@ func (s *DockerHubPullSuite) TestPullFromCentralRegistry(c *check.C) { matches := regexp.MustCompile(`Digest: (.+)\n`).FindAllStringSubmatch(out, -1) c.Assert(len(matches), checker.Equals, 1, check.Commentf("expected exactly one image digest in the output")) c.Assert(len(matches[0]), checker.Equals, 2, check.Commentf("unexpected number of submatches for the digest")) - _, err := digest.ParseDigest(matches[0][1]) + _, err := digest.Parse(matches[0][1]) c.Check(err, checker.IsNil, check.Commentf("invalid digest %q in output", matches[0][1])) // We should have a single entry in images. diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_trusted_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_trusted_test.go index b89c7a523..b068bb23f 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_trusted_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_pull_trusted_test.go @@ -3,12 +3,11 @@ package main import ( "fmt" "io/ioutil" - "os/exec" - "strings" "time" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -16,33 +15,18 @@ func (s *DockerTrustSuite) TestTrustedPull(c *check.C) { repoName := s.setupTrustedImage(c, "trusted-pull") // Try pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmd).Assert(c, SuccessTagging) dockerCmd(c, "rmi", repoName) // Try untrusted pull to ensure we pushed the tag to the registry - pullCmd = exec.Command(dockerBinary, "pull", "--disable-content-trust=true", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Downloaded", check.Commentf(out)) - + icmd.RunCmd(icmd.Command(dockerBinary, "pull", "--disable-content-trust=true", repoName), trustedCmd).Assert(c, SuccessDownloaded) } func (s *DockerTrustSuite) TestTrustedIsolatedPull(c *check.C) { repoName := s.setupTrustedImage(c, "trusted-isolated-pull") // Try pull (run from isolated directory without trust information) - pullCmd := exec.Command(dockerBinary, "--config", "/tmp/docker-isolated", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf(string(out))) + icmd.RunCmd(icmd.Command(dockerBinary, "--config", "/tmp/docker-isolated", "pull", repoName), trustedCmd).Assert(c, SuccessTagging) dockerCmd(c, "rmi", repoName) } @@ -55,12 +39,10 @@ func (s *DockerTrustSuite) TestUntrustedPull(c *check.C) { dockerCmd(c, "rmi", repoName) // Try trusted pull on untrusted tag - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Error: remote trust data does not exist", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Error: remote trust data does not exist", + }) } func (s *DockerTrustSuite) TestPullWhenCertExpired(c *check.C) { @@ -70,24 +52,21 @@ func (s *DockerTrustSuite) TestPullWhenCertExpired(c *check.C) { // Certificates have 10 years of expiration elevenYearsFromNow := time.Now().Add(time.Hour * 24 * 365 * 11) - integration.RunAtDifferentDate(elevenYearsFromNow, func() { + testutil.RunAtDifferentDate(elevenYearsFromNow, func() { // Try pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "could not validate the path to a trusted root", check.Commentf(out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "pull", repoName}, + }, trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "could not validate the path to a trusted root", + }) }) - integration.RunAtDifferentDate(elevenYearsFromNow, func() { + testutil.RunAtDifferentDate(elevenYearsFromNow, func() { // Try pull - pullCmd := exec.Command(dockerBinary, "pull", "--disable-content-trust", repoName) - s.trustedCmd(pullCmd) - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Downloaded", check.Commentf(out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "pull", "--disable-content-trust", repoName}, + }, trustedCmd).Assert(c, SuccessDownloaded) }) } @@ -101,21 +80,11 @@ func (s *DockerTrustSuite) TestTrustedPullFromBadTrustServer(c *check.C) { // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", repoName) - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Signing and pushing trust metadata", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) dockerCmd(c, "rmi", repoName) // Try pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmd).Assert(c, SuccessTagging) dockerCmd(c, "rmi", repoName) // Kill the notary server, start a new "evil" one. @@ -129,23 +98,13 @@ func (s *DockerTrustSuite) TestTrustedPullFromBadTrustServer(c *check.C) { dockerCmd(c, "--config", evilLocalConfigDir, "tag", "busybox", repoName) // Push up to the new server - pushCmd = exec.Command(dockerBinary, "--config", evilLocalConfigDir, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Signing and pushing trust metadata", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "--config", evilLocalConfigDir, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) // Now, try pulling with the original client from this new trust server. This should fail because the new root is invalid. - pullCmd = exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - if err == nil { - c.Fatalf("Continuing with cached data even though it's an invalid root rotation: %s\n%s", err, out) - } - if !strings.Contains(out, "could not rotate trust to a new trusted root") { - c.Fatalf("Missing expected output on trusted pull:\n%s", out) - } + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "could not rotate trust to a new trusted root", + }) } func (s *DockerTrustSuite) TestTrustedPullWithExpiredSnapshot(c *check.C) { @@ -155,55 +114,36 @@ func (s *DockerTrustSuite) TestTrustedPullWithExpiredSnapshot(c *check.C) { dockerCmd(c, "tag", "busybox", repoName) // Push with default passphrases - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Signing and pushing trust metadata", check.Commentf(out)) - + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) dockerCmd(c, "rmi", repoName) // Snapshots last for three years. This should be expired fourYearsLater := time.Now().Add(time.Hour * 24 * 365 * 4) - integration.RunAtDifferentDate(fourYearsLater, func() { + testutil.RunAtDifferentDate(fourYearsLater, func() { // Try pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - - c.Assert(err, check.NotNil, check.Commentf("Missing expected error running trusted pull with expired snapshots")) - c.Assert(string(out), checker.Contains, "repository out-of-date", check.Commentf(out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "pull", repoName}, + }, trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "repository out-of-date", + }) }) } func (s *DockerTrustSuite) TestTrustedOfflinePull(c *check.C) { repoName := s.setupTrustedImage(c, "trusted-offline-pull") - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmdWithServer(pullCmd, "https://invalidnotaryserver") - out, _, err := runCommandWithOutput(pullCmd) - - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "error contacting notary server", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmdWithServer("https://invalidnotaryserver")).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "error contacting notary server", + }) // Do valid trusted pull to warm cache - pullCmd = exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf(out)) - + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmd).Assert(c, SuccessTagging) dockerCmd(c, "rmi", repoName) // Try pull again with invalid notary server, should use cache - pullCmd = exec.Command(dockerBinary, "pull", repoName) - s.trustedCmdWithServer(pullCmd, "https://invalidnotaryserver") - out, _, err = runCommandWithOutput(pullCmd) - - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Tagging", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmdWithServer("https://invalidnotaryserver")).Assert(c, SuccessTagging) } func (s *DockerTrustSuite) TestTrustedPullDelete(c *check.C) { @@ -214,29 +154,16 @@ func (s *DockerTrustSuite) TestTrustedPullDelete(c *check.C) { CMD echo trustedpulldelete `, true) - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - if err != nil { - c.Fatalf("Error running trusted push: %s\n%s", err, out) - } - if !strings.Contains(string(out), "Signing and pushing trust metadata") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) - if out, status := dockerCmd(c, "rmi", repoName); status != 0 { - c.Fatalf("Error removing image %q\n%s", repoName, out) - } + dockerCmd(c, "rmi", repoName) // Try pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) + result := icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmd) + result.Assert(c, icmd.Success) - c.Assert(err, check.IsNil, check.Commentf(out)) - - matches := digestRegex.FindStringSubmatch(out) - c.Assert(matches, checker.HasLen, 2, check.Commentf("unable to parse digest from pull output: %s", out)) + matches := digestRegex.FindStringSubmatch(result.Combined()) + c.Assert(matches, checker.HasLen, 2, check.Commentf("unable to parse digest from pull output: %s", result.Combined())) pullDigest := matches[1] imageID := inspectField(c, repoName, "Id") @@ -263,18 +190,13 @@ func (s *DockerTrustSuite) TestTrustedPullReadsFromReleasesRole(c *check.C) { // Push with targets first, initializing the repo dockerCmd(c, "tag", "busybox", targetName) - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "push", targetName), trustedCmd).Assert(c, icmd.Success) s.assertTargetInRoles(c, repoName, "latest", "targets") // Try pull, check we retrieve from targets role - pullCmd := exec.Command(dockerBinary, "-D", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "retrieving target for targets role") + icmd.RunCmd(icmd.Command(dockerBinary, "-D", "pull", repoName), trustedCmd).Assert(c, icmd.Expected{ + Err: "retrieving target for targets role", + }) // Now we'll create the releases role, and try pushing and pulling s.notaryCreateDelegation(c, repoName, "targets/releases", s.not.keys[0].Public) @@ -283,31 +205,23 @@ func (s *DockerTrustSuite) TestTrustedPullReadsFromReleasesRole(c *check.C) { // try a pull, check that we can still pull because we can still read the // old tag in the targets role - pullCmd = exec.Command(dockerBinary, "-D", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "retrieving target for targets role") + icmd.RunCmd(icmd.Command(dockerBinary, "-D", "pull", repoName), trustedCmd).Assert(c, icmd.Expected{ + Err: "retrieving target for targets role", + }) // try a pull -a, check that it succeeds because we can still pull from the // targets role - pullCmd = exec.Command(dockerBinary, "-D", "pull", "-a", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "-D", "pull", "-a", repoName), trustedCmd).Assert(c, icmd.Success) // Push, should sign with targets/releases dockerCmd(c, "tag", "busybox", targetName) - pushCmd = exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) + icmd.RunCmd(icmd.Command(dockerBinary, "push", targetName), trustedCmd).Assert(c, icmd.Success) s.assertTargetInRoles(c, repoName, "latest", "targets", "targets/releases") // Try pull, check we retrieve from targets/releases role - pullCmd = exec.Command(dockerBinary, "-D", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(out, checker.Contains, "retrieving target for targets/releases role") + icmd.RunCmd(icmd.Command(dockerBinary, "-D", "pull", repoName), trustedCmd).Assert(c, icmd.Expected{ + Err: "retrieving target for targets/releases role", + }) // Create another delegation that we'll sign with s.notaryCreateDelegation(c, repoName, "targets/other", s.not.keys[1].Public) @@ -315,16 +229,13 @@ func (s *DockerTrustSuite) TestTrustedPullReadsFromReleasesRole(c *check.C) { s.notaryPublish(c, repoName) dockerCmd(c, "tag", "busybox", targetName) - pushCmd = exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) + icmd.RunCmd(icmd.Command(dockerBinary, "push", targetName), trustedCmd).Assert(c, icmd.Success) s.assertTargetInRoles(c, repoName, "latest", "targets", "targets/releases", "targets/other") // Try pull, check we retrieve from targets/releases role - pullCmd = exec.Command(dockerBinary, "-D", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(out, checker.Contains, "retrieving target for targets/releases role") + icmd.RunCmd(icmd.Command(dockerBinary, "-D", "pull", repoName), trustedCmd).Assert(c, icmd.Expected{ + Err: "retrieving target for targets/releases role", + }) } func (s *DockerTrustSuite) TestTrustedPullIgnoresOtherDelegationRoles(c *check.C) { @@ -341,26 +252,22 @@ func (s *DockerTrustSuite) TestTrustedPullIgnoresOtherDelegationRoles(c *check.C // Push should write to the delegation role, not targets dockerCmd(c, "tag", "busybox", targetName) - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "push", targetName), trustedCmd).Assert(c, icmd.Success) s.assertTargetInRoles(c, repoName, "latest", "targets/other") s.assertTargetNotInRoles(c, repoName, "latest", "targets") // Try pull - we should fail, since pull will only pull from the targets/releases // role or the targets role - pullCmd := exec.Command(dockerBinary, "-D", "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "No trust data for") + dockerCmd(c, "tag", "busybox", targetName) + icmd.RunCmd(icmd.Command(dockerBinary, "-D", "pull", repoName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "No trust data for", + }) // try a pull -a: we should fail since pull will only pull from the targets/releases // role or the targets role - pullCmd = exec.Command(dockerBinary, "-D", "pull", "-a", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "No trusted tags for") + icmd.RunCmd(icmd.Command(dockerBinary, "-D", "pull", "-a", repoName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "No trusted tags for", + }) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_push_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_push_test.go index 2dec07825..aa1b0bd9c 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_push_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_push_test.go @@ -7,7 +7,6 @@ import ( "net/http" "net/http/httptest" "os" - "os/exec" "path/filepath" "strings" "sync" @@ -15,8 +14,9 @@ import ( "github.com/docker/distribution/reference" cliconfig "github.com/docker/docker/cli/config" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -135,13 +135,13 @@ func testPushEmptyLayer(c *check.C) { c.Assert(err, check.IsNil, check.Commentf("Could not open test tarball")) defer freader.Close() - importCmd := exec.Command(dockerBinary, "import", "-", repoName) - importCmd.Stdin = freader - out, _, err := runCommandWithOutput(importCmd) - c.Assert(err, check.IsNil, check.Commentf("import failed: %q", out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "import", "-", repoName}, + Stdin: freader, + }).Assert(c, icmd.Success) // Now verify we can push it - out, _, err = dockerCmdWithError("push", repoName) + out, _, err := dockerCmdWithError("push", repoName) c.Assert(err, check.IsNil, check.Commentf("pushing the image to the private registry has failed: %s", out)) } @@ -177,8 +177,8 @@ func testConcurrentPush(c *check.C) { for _, repo := range repos { go func(repo string) { - _, _, err := runCommandWithOutput(exec.Command(dockerBinary, "push", repo)) - results <- err + result := icmd.RunCommand(dockerBinary, "push", repo) + results <- result.Error }(repo) } @@ -287,18 +287,12 @@ func (s *DockerTrustSuite) TestTrustedPush(c *check.C) { // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", repoName) - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("Error running trusted push: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) // Try pull after push - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Image is up to date", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmd).Assert(c, icmd.Expected{ + Out: "Status: Image is up to date", + }) // Assert that we rotated the snapshot key to the server by checking our local keystore contents, err := ioutil.ReadDir(filepath.Join(cliconfig.Dir(), "trust/private/tuf_keys", privateRegistryURL, "dockerclitrusted/pushtest")) @@ -312,18 +306,12 @@ func (s *DockerTrustSuite) TestTrustedPushWithEnvPasswords(c *check.C) { // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", repoName) - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmdWithPassphrases(pushCmd, "12345678", "12345678") - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("Error running trusted push: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmdWithPassphrases("12345678", "12345678")).Assert(c, SuccessSigningAndPushing) // Try pull after push - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Image is up to date", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmd).Assert(c, icmd.Expected{ + Out: "Status: Image is up to date", + }) } func (s *DockerTrustSuite) TestTrustedPushWithFailingServer(c *check.C) { @@ -331,12 +319,11 @@ func (s *DockerTrustSuite) TestTrustedPushWithFailingServer(c *check.C) { // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", repoName) - pushCmd := exec.Command(dockerBinary, "push", repoName) // Using a name that doesn't resolve to an address makes this test faster - s.trustedCmdWithServer(pushCmd, "https://server.invalid:81/") - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.NotNil, check.Commentf("Missing error while running trusted push w/ no server")) - c.Assert(out, checker.Contains, "error contacting notary server", check.Commentf("Missing expected output on trusted push")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmdWithServer("https://server.invalid:81/")).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "error contacting notary server", + }) } func (s *DockerTrustSuite) TestTrustedPushWithoutServerAndUntrusted(c *check.C) { @@ -344,12 +331,9 @@ func (s *DockerTrustSuite) TestTrustedPushWithoutServerAndUntrusted(c *check.C) // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", repoName) - pushCmd := exec.Command(dockerBinary, "push", "--disable-content-trust", repoName) - // Using a name that doesn't resolve to an address makes this test faster - s.trustedCmdWithServer(pushCmd, "https://server.invalid") - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push with no server and --disable-content-trust failed: %s\n%s", err, out)) - c.Assert(out, check.Not(checker.Contains), "Error establishing connection to notary repository", check.Commentf("Missing expected output on trusted push with --disable-content-trust:")) + result := icmd.RunCmd(icmd.Command(dockerBinary, "push", "--disable-content-trust", repoName), trustedCmdWithServer("https://server.invalid:81/")) + result.Assert(c, icmd.Success) + c.Assert(result.Combined(), check.Not(checker.Contains), "Error establishing connection to notary repository", check.Commentf("Missing expected output on trusted push with --disable-content-trust:")) } func (s *DockerTrustSuite) TestTrustedPushWithExistingTag(c *check.C) { @@ -358,18 +342,12 @@ func (s *DockerTrustSuite) TestTrustedPushWithExistingTag(c *check.C) { dockerCmd(c, "tag", "busybox", repoName) dockerCmd(c, "push", repoName) - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) // Try pull after push - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Image is up to date", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmd).Assert(c, icmd.Expected{ + Out: "Status: Image is up to date", + }) } func (s *DockerTrustSuite) TestTrustedPushWithExistingSignedTag(c *check.C) { @@ -378,28 +356,14 @@ func (s *DockerTrustSuite) TestTrustedPushWithExistingSignedTag(c *check.C) { dockerCmd(c, "tag", "busybox", repoName) // Do a trusted push - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) // Do another trusted push - pushCmd = exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) - + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) dockerCmd(c, "rmi", repoName) // Try pull to ensure the double push did not break our ability to pull - pullCmd := exec.Command(dockerBinary, "pull", repoName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf("Error running trusted pull: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Status: Downloaded", check.Commentf("Missing expected output on trusted pull with --disable-content-trust")) - + icmd.RunCmd(icmd.Command(dockerBinary, "pull", repoName), trustedCmd).Assert(c, SuccessDownloaded) } func (s *DockerTrustSuite) TestTrustedPushWithIncorrectPassphraseForNonRoot(c *check.C) { @@ -408,18 +372,13 @@ func (s *DockerTrustSuite) TestTrustedPushWithIncorrectPassphraseForNonRoot(c *c dockerCmd(c, "tag", "busybox", repoName) // Push with default passphrases - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push:\n%s", out)) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) // Push with wrong passphrases - pushCmd = exec.Command(dockerBinary, "push", repoName) - s.trustedCmdWithPassphrases(pushCmd, "12345678", "87654321") - out, _, err = runCommandWithOutput(pushCmd) - c.Assert(err, check.NotNil, check.Commentf("Error missing from trusted push with short targets passphrase: \n%s", out)) - c.Assert(out, checker.Contains, "could not find necessary signing keys", check.Commentf("Missing expected output on trusted push with short targets/snapsnot passphrase")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmdWithPassphrases("12345678", "87654321")).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "could not find necessary signing keys", + }) } func (s *DockerTrustSuite) TestTrustedPushWithExpiredSnapshot(c *check.C) { @@ -429,22 +388,19 @@ func (s *DockerTrustSuite) TestTrustedPushWithExpiredSnapshot(c *check.C) { dockerCmd(c, "tag", "busybox", repoName) // Push with default passphrases - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) // Snapshots last for three years. This should be expired fourYearsLater := time.Now().Add(time.Hour * 24 * 365 * 4) - integration.RunAtDifferentDate(fourYearsLater, func() { + testutil.RunAtDifferentDate(fourYearsLater, func() { // Push with wrong passphrases - pushCmd = exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - c.Assert(err, check.NotNil, check.Commentf("Error missing from trusted push with expired snapshot: \n%s", out)) - c.Assert(out, checker.Contains, "repository out-of-date", check.Commentf("Missing expected output on trusted push with expired snapshot")) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "push", repoName}, + }, trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "repository out-of-date", + }) }) } @@ -455,22 +411,15 @@ func (s *DockerTrustSuite) TestTrustedPushWithExpiredTimestamp(c *check.C) { dockerCmd(c, "tag", "busybox", repoName) // Push with default passphrases - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) // The timestamps expire in two weeks. Lets check three threeWeeksLater := time.Now().Add(time.Hour * 24 * 21) // Should succeed because the server transparently re-signs one - integration.RunAtDifferentDate(threeWeeksLater, func() { - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("Error running trusted push: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with expired timestamp")) + testutil.RunAtDifferentDate(threeWeeksLater, func() { + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), + trustedCmd).Assert(c, SuccessSigningAndPushing) }) } @@ -487,11 +436,7 @@ func (s *DockerTrustSuite) TestTrustedPushWithReleasesDelegationOnly(c *check.C) // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", targetName) - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", targetName), trustedCmd).Assert(c, SuccessSigningAndPushing) // check to make sure that the target has been added to targets/releases and not targets s.assertTargetInRoles(c, repoName, "latest", "targets/releases") s.assertTargetNotInRoles(c, repoName, "latest", "targets") @@ -499,11 +444,9 @@ func (s *DockerTrustSuite) TestTrustedPushWithReleasesDelegationOnly(c *check.C) // Try pull after push os.RemoveAll(filepath.Join(cliconfig.Dir(), "trust")) - pullCmd := exec.Command(dockerBinary, "pull", targetName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.IsNil, check.Commentf(out)) - c.Assert(string(out), checker.Contains, "Status: Image is up to date", check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", targetName), trustedCmd).Assert(c, icmd.Expected{ + Out: "Status: Image is up to date", + }) } func (s *DockerTrustSuite) TestTrustedPushSignsAllFirstLevelRolesWeHaveKeysFor(c *check.C) { @@ -527,11 +470,7 @@ func (s *DockerTrustSuite) TestTrustedPushSignsAllFirstLevelRolesWeHaveKeysFor(c // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", targetName) - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", targetName), trustedCmd).Assert(c, SuccessSigningAndPushing) // check to make sure that the target has been added to targets/role1 and targets/role2, and // not targets (because there are delegations) or targets/role3 (due to missing key) or @@ -543,10 +482,9 @@ func (s *DockerTrustSuite) TestTrustedPushSignsAllFirstLevelRolesWeHaveKeysFor(c os.RemoveAll(filepath.Join(cliconfig.Dir(), "trust")) // pull should fail because none of these are the releases role - pullCmd := exec.Command(dockerBinary, "pull", targetName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.NotNil, check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", targetName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + }) } func (s *DockerTrustSuite) TestTrustedPushSignsForRolesWithKeysAndValidPaths(c *check.C) { @@ -568,11 +506,7 @@ func (s *DockerTrustSuite) TestTrustedPushSignsForRolesWithKeysAndValidPaths(c * // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", targetName) - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.IsNil, check.Commentf("trusted push failed: %s\n%s", err, out)) - c.Assert(out, checker.Contains, "Signing and pushing trust metadata", check.Commentf("Missing expected output on trusted push with existing tag")) + icmd.RunCmd(icmd.Command(dockerBinary, "push", targetName), trustedCmd).Assert(c, SuccessSigningAndPushing) // check to make sure that the target has been added to targets/role1 and targets/role4, and // not targets (because there are delegations) or targets/role2 (due to path restrictions) or @@ -584,10 +518,9 @@ func (s *DockerTrustSuite) TestTrustedPushSignsForRolesWithKeysAndValidPaths(c * os.RemoveAll(filepath.Join(cliconfig.Dir(), "trust")) // pull should fail because none of these are the releases role - pullCmd := exec.Command(dockerBinary, "pull", targetName) - s.trustedCmd(pullCmd) - out, _, err = runCommandWithOutput(pullCmd) - c.Assert(err, check.NotNil, check.Commentf(out)) + icmd.RunCmd(icmd.Command(dockerBinary, "pull", targetName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + }) } func (s *DockerTrustSuite) TestTrustedPushDoesntSignTargetsIfDelegationsExist(c *check.C) { @@ -603,13 +536,10 @@ func (s *DockerTrustSuite) TestTrustedPushDoesntSignTargetsIfDelegationsExist(c // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", targetName) - pushCmd := exec.Command(dockerBinary, "push", targetName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - c.Assert(err, check.NotNil, check.Commentf("trusted push succeeded but should have failed:\n%s", out)) - c.Assert(out, checker.Contains, "no valid signing keys", - check.Commentf("Missing expected output on trusted push without keys")) - + icmd.RunCmd(icmd.Command(dockerBinary, "push", targetName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "no valid signing keys", + }) s.assertTargetNotInRoles(c, repoName, "latest", "targets", "targets/role1") } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_registry_user_agent_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_registry_user_agent_test.go index 4db3b33ac..7d1989e2b 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_registry_user_agent_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_registry_user_agent_test.go @@ -5,6 +5,7 @@ import ( "net/http" "regexp" + "github.com/docker/docker/integration-cli/registry" "github.com/go-check/check" ) @@ -46,8 +47,8 @@ func regexpCheckUA(c *check.C, ua string) { c.Assert(bMatchUpstreamUA, check.Equals, true, check.Commentf("(Upstream) Docker Client User-Agent malformed")) } -func registerUserAgentHandler(reg *testRegistry, result *string) { - reg.registerHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { +func registerUserAgentHandler(reg *registry.Mock, result *string) { + reg.RegisterHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(404) var ua string for k, v := range r.Header { @@ -70,30 +71,30 @@ func (s *DockerRegistrySuite) TestUserAgentPassThrough(c *check.C) { loginUA string ) - buildReg, err := newTestRegistry(c) + buildReg, err := registry.NewMock(c) c.Assert(err, check.IsNil) registerUserAgentHandler(buildReg, &buildUA) - buildRepoName := fmt.Sprintf("%s/busybox", buildReg.hostport) + buildRepoName := fmt.Sprintf("%s/busybox", buildReg.URL()) - pullReg, err := newTestRegistry(c) + pullReg, err := registry.NewMock(c) c.Assert(err, check.IsNil) registerUserAgentHandler(pullReg, &pullUA) - pullRepoName := fmt.Sprintf("%s/busybox", pullReg.hostport) + pullRepoName := fmt.Sprintf("%s/busybox", pullReg.URL()) - pushReg, err := newTestRegistry(c) + pushReg, err := registry.NewMock(c) c.Assert(err, check.IsNil) registerUserAgentHandler(pushReg, &pushUA) - pushRepoName := fmt.Sprintf("%s/busybox", pushReg.hostport) + pushRepoName := fmt.Sprintf("%s/busybox", pushReg.URL()) - loginReg, err := newTestRegistry(c) + loginReg, err := registry.NewMock(c) c.Assert(err, check.IsNil) registerUserAgentHandler(loginReg, &loginUA) s.d.Start(c, - "--insecure-registry", buildReg.hostport, - "--insecure-registry", pullReg.hostport, - "--insecure-registry", pushReg.hostport, - "--insecure-registry", loginReg.hostport, + "--insecure-registry", buildReg.URL(), + "--insecure-registry", pullReg.URL(), + "--insecure-registry", pushReg.URL(), + "--insecure-registry", loginReg.URL(), "--disable-legacy-registry=true") dockerfileName, cleanup1, err := makefile(fmt.Sprintf("FROM %s", buildRepoName)) @@ -102,7 +103,7 @@ func (s *DockerRegistrySuite) TestUserAgentPassThrough(c *check.C) { s.d.Cmd("build", "--file", dockerfileName, ".") regexpCheckUA(c, buildUA) - s.d.Cmd("login", "-u", "richard", "-p", "testtest", loginReg.hostport) + s.d.Cmd("login", "-u", "richard", "-p", "testtest", loginReg.URL()) regexpCheckUA(c, loginUA) s.d.Cmd("pull", pullRepoName) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_rename_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_rename_test.go index 373d614b5..7371438d1 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_rename_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_rename_test.go @@ -3,9 +3,9 @@ package main import ( "strings" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/stringid" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_restart_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_restart_test.go index d2c566944..a35eb7d4f 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_restart_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_restart_test.go @@ -6,7 +6,7 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_rm_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_rm_test.go index 4cc5a1afd..cce7ec617 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_rm_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_rm_test.go @@ -4,7 +4,7 @@ import ( "io/ioutil" "os" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_rmi_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_rmi_test.go index cb16d9d88..84ec6a8b0 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_rmi_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_rmi_test.go @@ -2,12 +2,12 @@ package main import ( "fmt" - "os/exec" "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/stringid" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -175,12 +175,11 @@ func (s *DockerSuite) TestRmiTagWithExistingContainers(c *check.C) { func (s *DockerSuite) TestRmiForceWithExistingContainers(c *check.C) { image := "busybox-clone" - cmd := exec.Command(dockerBinary, "build", "--no-cache", "-t", image, "-") - cmd.Stdin = strings.NewReader(`FROM busybox -MAINTAINER foo`) - - out, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil, check.Commentf("Could not build %s: %s", image, out)) + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "build", "--no-cache", "-t", image, "-"}, + Stdin: strings.NewReader(`FROM busybox +MAINTAINER foo`), + }).Assert(c, icmd.Success) dockerCmd(c, "run", "--name", "test-force-rmi", image, "/bin/true") diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_run_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_run_test.go index 35f8beddb..6f3d11b59 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_run_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_run_test.go @@ -21,12 +21,12 @@ import ( "sync" "time" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/mount" "github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringutils" + "github.com/docker/docker/pkg/testutil" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/docker/docker/runconfig" "github.com/docker/go-connections/nat" "github.com/docker/libnetwork/resolvconf" @@ -498,7 +498,7 @@ func (s *DockerSuite) TestRunVolumesFromInReadWriteMode(c *check.C) { func (s *DockerSuite) TestVolumesFromGetsProperMode(c *check.C) { testRequires(c, SameHostDaemon) prefix, slash := getPrefixAndSlashFromDaemonPlatform() - hostpath := integration.RandomTmpDirPath("test", daemonPlatform) + hostpath := testutil.RandomTmpDirPath("test", daemonPlatform) if err := os.MkdirAll(hostpath, 0755); err != nil { c.Fatalf("Failed to create %s: %q", hostpath, err) } @@ -521,8 +521,8 @@ func (s *DockerSuite) TestVolumesFromGetsProperMode(c *check.C) { // Test for GH#10618 func (s *DockerSuite) TestRunNoDupVolumes(c *check.C) { - path1 := integration.RandomTmpDirPath("test1", daemonPlatform) - path2 := integration.RandomTmpDirPath("test2", daemonPlatform) + path1 := testutil.RandomTmpDirPath("test1", daemonPlatform) + path2 := testutil.RandomTmpDirPath("test2", daemonPlatform) someplace := ":/someplace" if daemonPlatform == "windows" { @@ -819,21 +819,21 @@ func (s *DockerSuite) TestRunEnvironment(c *check.C) { // TODO Windows: Environment handling is different between Linux and // Windows and this test relies currently on unix functionality. testRequires(c, DaemonIsLinux) - cmd := exec.Command(dockerBinary, "run", "-h", "testing", "-e=FALSE=true", "-e=TRUE", "-e=TRICKY", "-e=HOME=", "busybox", "env") - cmd.Env = append(os.Environ(), - "TRUE=false", - "TRICKY=tri\ncky\n", - ) - - out, _, err := runCommandWithOutput(cmd) - if err != nil { - c.Fatal(err, out) - } + result := icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "run", "-h", "testing", "-e=FALSE=true", "-e=TRUE", "-e=TRICKY", "-e=HOME=", "busybox", "env"}, + Env: append(os.Environ(), + "TRUE=false", + "TRICKY=tri\ncky\n", + ), + }) + result.Assert(c, icmd.Success) - actualEnv := strings.Split(strings.TrimSpace(out), "\n") + actualEnv := strings.Split(strings.TrimSpace(result.Combined()), "\n") sort.Strings(actualEnv) goodEnv := []string{ + // The first two should not be tested here, those are "inherent" environment variable. This test validates + // the -e behavior, not the default environment variable (that could be subject to change) "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "HOSTNAME=testing", "FALSE=true", @@ -863,15 +863,13 @@ func (s *DockerSuite) TestRunEnvironmentErase(c *check.C) { // not set in our local env that they're removed (if present) in // the container - cmd := exec.Command(dockerBinary, "run", "-e", "FOO", "-e", "HOSTNAME", "busybox", "env") - cmd.Env = appendBaseEnv(true) - - out, _, err := runCommandWithOutput(cmd) - if err != nil { - c.Fatal(err, out) - } + result := icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "run", "-e", "FOO", "-e", "HOSTNAME", "busybox", "env"}, + Env: appendBaseEnv(true), + }) + result.Assert(c, icmd.Success) - actualEnv := strings.Split(strings.TrimSpace(out), "\n") + actualEnv := strings.Split(strings.TrimSpace(result.Combined()), "\n") sort.Strings(actualEnv) goodEnv := []string{ @@ -897,15 +895,13 @@ func (s *DockerSuite) TestRunEnvironmentOverride(c *check.C) { // Test to make sure that when we use -e on env vars that are // already in the env that we're overriding them - cmd := exec.Command(dockerBinary, "run", "-e", "HOSTNAME", "-e", "HOME=/root2", "busybox", "env") - cmd.Env = appendBaseEnv(true, "HOSTNAME=bar") - - out, _, err := runCommandWithOutput(cmd) - if err != nil { - c.Fatal(err, out) - } + result := icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "run", "-e", "HOSTNAME", "-e", "HOME=/root2", "busybox", "env"}, + Env: appendBaseEnv(true, "HOSTNAME=bar"), + }) + result.Assert(c, icmd.Success) - actualEnv := strings.Split(strings.TrimSpace(out), "\n") + actualEnv := strings.Split(strings.TrimSpace(result.Combined()), "\n") sort.Strings(actualEnv) goodEnv := []string{ @@ -2111,13 +2107,10 @@ func (s *DockerSuite) TestRunDeallocatePortOnMissingIptablesRule(c *check.C) { id := strings.TrimSpace(out) ip := inspectField(c, id, "NetworkSettings.Networks.bridge.IPAddress") - iptCmd := exec.Command("iptables", "-D", "DOCKER", "-d", fmt.Sprintf("%s/32", ip), - "!", "-i", "docker0", "-o", "docker0", "-p", "tcp", "-m", "tcp", "--dport", "23", "-j", "ACCEPT") - out, _, err := runCommandWithOutput(iptCmd) - if err != nil { - c.Fatal(err, out) - } - if err := deleteContainer(id); err != nil { + icmd.RunCommand("iptables", "-D", "DOCKER", "-d", fmt.Sprintf("%s/32", ip), + "!", "-i", "docker0", "-o", "docker0", "-p", "tcp", "-m", "tcp", "--dport", "23", "-j", "ACCEPT").Assert(c, icmd.Success) + + if err := deleteContainer(false, id); err != nil { c.Fatal(err) } @@ -2275,7 +2268,7 @@ func (s *DockerSuite) TestVolumesNoCopyData(c *check.C) { c.Fatalf("Data was copied on volumes-from but shouldn't be:\n%q", out) } - tmpDir := integration.RandomTmpDirPath("docker_test_bind_mount_copy_data", daemonPlatform) + tmpDir := testutil.RandomTmpDirPath("docker_test_bind_mount_copy_data", daemonPlatform) if out, _, err := dockerCmdWithError("run", "-v", tmpDir+":/foo", "dataimage", "ls", "-lh", "/foo/bar"); err == nil || !strings.Contains(out, "No such file or directory") { c.Fatalf("Data was copied on bind-mount but shouldn't be:\n%q", out) } @@ -2344,7 +2337,7 @@ func (s *DockerSuite) TestRunSlowStdoutConsumer(c *check.C) { if err := cont.Start(); err != nil { c.Fatal(err) } - n, err := integration.ConsumeWithSpeed(stdout, 10000, 5*time.Millisecond, nil) + n, err := testutil.ConsumeWithSpeed(stdout, 10000, 5*time.Millisecond, nil) if err != nil { c.Fatal(err) } @@ -3269,30 +3262,11 @@ func (s *DockerTrustSuite) TestTrustedRun(c *check.C) { repoName := s.setupTrustedImage(c, "trusted-run") // Try run - runCmd := exec.Command(dockerBinary, "run", repoName) - s.trustedCmd(runCmd) - out, _, err := runCommandWithOutput(runCmd) - if err != nil { - c.Fatalf("Error running trusted run: %s\n%s\n", err, out) - } - - if !strings.Contains(string(out), "Tagging") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } - + icmd.RunCmd(icmd.Command(dockerBinary, "run", repoName), trustedCmd).Assert(c, SuccessTagging) dockerCmd(c, "rmi", repoName) // Try untrusted run to ensure we pushed the tag to the registry - runCmd = exec.Command(dockerBinary, "run", "--disable-content-trust=true", repoName) - s.trustedCmd(runCmd) - out, _, err = runCommandWithOutput(runCmd) - if err != nil { - c.Fatalf("Error running trusted run: %s\n%s", err, out) - } - - if !strings.Contains(string(out), "Status: Downloaded") { - c.Fatalf("Missing expected output on trusted run with --disable-content-trust:\n%s", out) - } + icmd.RunCmd(icmd.Command(dockerBinary, "run", "--disable-content-trust=true", repoName), trustedCmd).Assert(c, SuccessDownloadedOnStderr) } func (s *DockerTrustSuite) TestUntrustedRun(c *check.C) { @@ -3305,16 +3279,10 @@ func (s *DockerTrustSuite) TestUntrustedRun(c *check.C) { dockerCmd(c, "rmi", repoName) // Try trusted run on untrusted tag - runCmd := exec.Command(dockerBinary, "run", repoName) - s.trustedCmd(runCmd) - out, _, err := runCommandWithOutput(runCmd) - if err == nil { - c.Fatalf("Error expected when running trusted run with:\n%s", out) - } - - if !strings.Contains(string(out), "does not have trust data for") { - c.Fatalf("Missing expected output on trusted run:\n%s", out) - } + icmd.RunCmd(icmd.Command(dockerBinary, "run", repoName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 125, + Err: "does not have trust data for", + }) } func (s *DockerTrustSuite) TestRunWhenCertExpired(c *check.C) { @@ -3326,32 +3294,21 @@ func (s *DockerTrustSuite) TestRunWhenCertExpired(c *check.C) { // Certificates have 10 years of expiration elevenYearsFromNow := time.Now().Add(time.Hour * 24 * 365 * 11) - integration.RunAtDifferentDate(elevenYearsFromNow, func() { + testutil.RunAtDifferentDate(elevenYearsFromNow, func() { // Try run - runCmd := exec.Command(dockerBinary, "run", repoName) - s.trustedCmd(runCmd) - out, _, err := runCommandWithOutput(runCmd) - if err == nil { - c.Fatalf("Error running trusted run in the distant future: %s\n%s", err, out) - } - - if !strings.Contains(string(out), "could not validate the path to a trusted root") { - c.Fatalf("Missing expected output on trusted run in the distant future:\n%s", out) - } + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "run", repoName}, + }, trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "could not validate the path to a trusted root", + }) }) - integration.RunAtDifferentDate(elevenYearsFromNow, func() { + testutil.RunAtDifferentDate(elevenYearsFromNow, func() { // Try run - runCmd := exec.Command(dockerBinary, "run", "--disable-content-trust", repoName) - s.trustedCmd(runCmd) - out, _, err := runCommandWithOutput(runCmd) - if err != nil { - c.Fatalf("Error running untrusted run in the distant future: %s\n%s", err, out) - } - - if !strings.Contains(string(out), "Status: Downloaded") { - c.Fatalf("Missing expected output on untrusted run in the distant future:\n%s", out) - } + icmd.RunCmd(icmd.Cmd{ + Command: []string{dockerBinary, "run", "--disable-content-trust", repoName}, + }, trustedCmd).Assert(c, SuccessDownloaded) }) } @@ -3367,30 +3324,11 @@ func (s *DockerTrustSuite) TestTrustedRunFromBadTrustServer(c *check.C) { // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", repoName) - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - if err != nil { - c.Fatalf("Error running trusted push: %s\n%s", err, out) - } - if !strings.Contains(string(out), "Signing and pushing trust metadata") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } - + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) dockerCmd(c, "rmi", repoName) // Try run - runCmd := exec.Command(dockerBinary, "run", repoName) - s.trustedCmd(runCmd) - out, _, err = runCommandWithOutput(runCmd) - if err != nil { - c.Fatalf("Error running trusted run: %s\n%s", err, out) - } - - if !strings.Contains(string(out), "Tagging") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } - + icmd.RunCmd(icmd.Command(dockerBinary, "run", repoName), trustedCmd).Assert(c, SuccessTagging) dockerCmd(c, "rmi", repoName) // Kill the notary server, start a new "evil" one. @@ -3405,27 +3343,13 @@ func (s *DockerTrustSuite) TestTrustedRunFromBadTrustServer(c *check.C) { dockerCmd(c, "--config", evilLocalConfigDir, "tag", "busybox", repoName) // Push up to the new server - pushCmd = exec.Command(dockerBinary, "--config", evilLocalConfigDir, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err = runCommandWithOutput(pushCmd) - if err != nil { - c.Fatalf("Error running trusted push: %s\n%s", err, out) - } - if !strings.Contains(string(out), "Signing and pushing trust metadata") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } + icmd.RunCmd(icmd.Command(dockerBinary, "--config", evilLocalConfigDir, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) // Now, try running with the original client from this new trust server. This should fail because the new root is invalid. - runCmd = exec.Command(dockerBinary, "run", repoName) - s.trustedCmd(runCmd) - out, _, err = runCommandWithOutput(runCmd) - - if err == nil { - c.Fatalf("Continuing with cached data even though it's an invalid root rotation: %s\n%s", err, out) - } - if !strings.Contains(out, "could not rotate trust to a new trusted root") { - c.Fatalf("Missing expected output on trusted run:\n%s", out) - } + icmd.RunCmd(icmd.Command(dockerBinary, "run", repoName), trustedCmd).Assert(c, icmd.Expected{ + ExitCode: 125, + Err: "could not rotate trust to a new trusted root", + }) } func (s *DockerSuite) TestPtraceContainerProcsFromHost(c *check.C) { @@ -3532,7 +3456,7 @@ func (s *DockerSuite) TestRunContainerWithCgroupParent(c *check.C) { if err != nil { c.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err) } - cgroupPaths := integration.ParseCgroupPaths(string(out)) + cgroupPaths := testutil.ParseCgroupPaths(string(out)) if len(cgroupPaths) == 0 { c.Fatalf("unexpected output - %q", string(out)) } @@ -3561,7 +3485,7 @@ func (s *DockerSuite) TestRunContainerWithCgroupParentAbsPath(c *check.C) { if err != nil { c.Fatalf("unexpected failure when running container with --cgroup-parent option - %s\n%v", string(out), err) } - cgroupPaths := integration.ParseCgroupPaths(string(out)) + cgroupPaths := testutil.ParseCgroupPaths(string(out)) if len(cgroupPaths) == 0 { c.Fatalf("unexpected output - %q", string(out)) } @@ -3600,7 +3524,7 @@ func (s *DockerSuite) TestRunInvalidCgroupParent(c *check.C) { c.Fatalf("SECURITY: --cgroup-parent with ../../ relative paths cause files to be created in the host (this is bad) !!") } - cgroupPaths := integration.ParseCgroupPaths(string(out)) + cgroupPaths := testutil.ParseCgroupPaths(string(out)) if len(cgroupPaths) == 0 { c.Fatalf("unexpected output - %q", string(out)) } @@ -3639,7 +3563,7 @@ func (s *DockerSuite) TestRunAbsoluteInvalidCgroupParent(c *check.C) { c.Fatalf("SECURITY: --cgroup-parent with /../../ garbage paths cause files to be created in the host (this is bad) !!") } - cgroupPaths := integration.ParseCgroupPaths(string(out)) + cgroupPaths := testutil.ParseCgroupPaths(string(out)) if len(cgroupPaths) == 0 { c.Fatalf("unexpected output - %q", string(out)) } @@ -4012,23 +3936,19 @@ func (s *DockerSuite) TestRunWrongCpusetMemsFlagValue(c *check.C) { // TestRunNonExecutableCmd checks that 'docker run busybox foo' exits with error code 127' func (s *DockerSuite) TestRunNonExecutableCmd(c *check.C) { name := "testNonExecutableCmd" - runCmd := exec.Command(dockerBinary, "run", "--name", name, "busybox", "foo") - _, exit, _ := runCommandWithOutput(runCmd) - stateExitCode := findContainerExitCode(c, name) - if !(exit == 127 && strings.Contains(stateExitCode, "127")) { - c.Fatalf("Run non-executable command should have errored with exit code 127, but we got exit: %d, State.ExitCode: %s", exit, stateExitCode) - } + icmd.RunCommand(dockerBinary, "run", "--name", name, "busybox", "foo").Assert(c, icmd.Expected{ + ExitCode: 127, + Error: "exit status 127", + }) } // TestRunNonExistingCmd checks that 'docker run busybox /bin/foo' exits with code 127. func (s *DockerSuite) TestRunNonExistingCmd(c *check.C) { name := "testNonExistingCmd" - runCmd := exec.Command(dockerBinary, "run", "--name", name, "busybox", "/bin/foo") - _, exit, _ := runCommandWithOutput(runCmd) - stateExitCode := findContainerExitCode(c, name) - if !(exit == 127 && strings.Contains(stateExitCode, "127")) { - c.Fatalf("Run non-existing command should have errored with exit code 127, but we got exit: %d, State.ExitCode: %s", exit, stateExitCode) - } + icmd.RunCommand(dockerBinary, "run", "--name", name, "busybox", "/bin/foo").Assert(c, icmd.Expected{ + ExitCode: 127, + Error: "exit status 127", + }) } // TestCmdCannotBeInvoked checks that 'docker run busybox /etc' exits with 126, or @@ -4040,30 +3960,28 @@ func (s *DockerSuite) TestCmdCannotBeInvoked(c *check.C) { expected = 127 } name := "testCmdCannotBeInvoked" - runCmd := exec.Command(dockerBinary, "run", "--name", name, "busybox", "/etc") - _, exit, _ := runCommandWithOutput(runCmd) - stateExitCode := findContainerExitCode(c, name) - if !(exit == expected && strings.Contains(stateExitCode, strconv.Itoa(expected))) { - c.Fatalf("Run cmd that cannot be invoked should have errored with code %d, but we got exit: %d, State.ExitCode: %s", expected, exit, stateExitCode) - } + icmd.RunCommand(dockerBinary, "run", "--name", name, "busybox", "/etc").Assert(c, icmd.Expected{ + ExitCode: expected, + Error: fmt.Sprintf("exit status %d", expected), + }) } // TestRunNonExistingImage checks that 'docker run foo' exits with error msg 125 and contains 'Unable to find image' +// FIXME(vdemeester) should be a unit test func (s *DockerSuite) TestRunNonExistingImage(c *check.C) { - runCmd := exec.Command(dockerBinary, "run", "foo") - out, exit, err := runCommandWithOutput(runCmd) - if !(err != nil && exit == 125 && strings.Contains(out, "Unable to find image")) { - c.Fatalf("Run non-existing image should have errored with 'Unable to find image' code 125, but we got out: %s, exit: %d, err: %s", out, exit, err) - } + icmd.RunCommand(dockerBinary, "run", "foo").Assert(c, icmd.Expected{ + ExitCode: 125, + Err: "Unable to find image", + }) } // TestDockerFails checks that 'docker run -foo busybox' exits with 125 to signal docker run failed +// FIXME(vdemeester) should be a unit test func (s *DockerSuite) TestDockerFails(c *check.C) { - runCmd := exec.Command(dockerBinary, "run", "-foo", "busybox") - out, exit, err := runCommandWithOutput(runCmd) - if !(err != nil && exit == 125) { - c.Fatalf("Docker run with flag not defined should exit with 125, but we got out: %s, exit: %d, err: %s", out, exit, err) - } + icmd.RunCommand(dockerBinary, "run", "-foo", "busybox").Assert(c, icmd.Expected{ + ExitCode: 125, + Error: "exit status 125", + }) } // TestRunInvalidReference invokes docker run with a bad reference. @@ -4490,9 +4408,9 @@ func (s *DockerSuite) TestRunServicingContainer(c *check.C) { err := waitExited(containerID, 60*time.Second) c.Assert(err, checker.IsNil) - cmd := exec.Command("powershell", "echo", `(Get-WinEvent -ProviderName "Microsoft-Windows-Hyper-V-Compute" -FilterXPath 'Event[System[EventID=2010]]' -MaxEvents 1).Message`) - out2, _, err := runCommandWithOutput(cmd) - c.Assert(err, checker.IsNil) + result := icmd.RunCommand("powershell", "echo", `(Get-WinEvent -ProviderName "Microsoft-Windows-Hyper-V-Compute" -FilterXPath 'Event[System[EventID=2010]]' -MaxEvents 1).Message`) + result.Assert(c, icmd.Success) + out2 := result.Combined() c.Assert(out2, checker.Contains, `"Servicing":true`, check.Commentf("Servicing container does not appear to have been started: %s", out2)) c.Assert(out2, checker.Contains, `Windows Container (Servicing)`, check.Commentf("Didn't find 'Windows Container (Servicing): %s", out2)) c.Assert(out2, checker.Contains, containerID+"_servicing", check.Commentf("Didn't find '%s_servicing': %s", containerID+"_servicing", out2)) @@ -4635,7 +4553,7 @@ func (s *delayedReader) Read([]byte) (int, error) { // #28823 (originally #28639) func (s *DockerSuite) TestRunMountReadOnlyDevShm(c *check.C) { - testRequires(c, SameHostDaemon, DaemonIsLinux) + testRequires(c, SameHostDaemon, DaemonIsLinux, NotUserNamespace) emptyDir, err := ioutil.TempDir("", "test-read-only-dev-shm") c.Assert(err, check.IsNil) defer os.RemoveAll(emptyDir) @@ -4648,7 +4566,7 @@ func (s *DockerSuite) TestRunMountReadOnlyDevShm(c *check.C) { // Test case for 29129 func (s *DockerSuite) TestRunHostnameInHostMode(c *check.C) { - testRequires(c, DaemonIsLinux) + testRequires(c, DaemonIsLinux, NotUserNamespace) expectedOutput := "foobar\nfoobar" out, _ := dockerCmd(c, "run", "--net=host", "--hostname=foobar", "busybox", "sh", "-c", `echo $HOSTNAME && hostname`) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_run_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_run_unix_test.go index 97f8e826e..172368e79 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_run_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_run_unix_test.go @@ -16,11 +16,12 @@ import ( "syscall" "time" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/homedir" - "github.com/docker/docker/pkg/integration/checker" "github.com/docker/docker/pkg/mount" "github.com/docker/docker/pkg/parsers" "github.com/docker/docker/pkg/sysinfo" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" "github.com/kr/pty" ) @@ -884,7 +885,6 @@ func (s *DockerSuite) TestRunTmpfsMountsWithOptions(c *check.C) { } func (s *DockerSuite) TestRunSysctls(c *check.C) { - testRequires(c, DaemonIsLinux) var err error @@ -907,11 +907,11 @@ func (s *DockerSuite) TestRunSysctls(c *check.C) { c.Assert(err, check.IsNil) c.Assert(sysctls["net.ipv4.ip_forward"], check.Equals, "0") - runCmd := exec.Command(dockerBinary, "run", "--sysctl", "kernel.foobar=1", "--name", "test2", "busybox", "cat", "/proc/sys/kernel/foobar") - out, _, _ = runCommandWithOutput(runCmd) - if !strings.Contains(out, "invalid argument") { - c.Fatalf("expected --sysctl to fail, got %s", out) - } + icmd.RunCommand(dockerBinary, "run", "--sysctl", "kernel.foobar=1", "--name", "test2", + "busybox", "cat", "/proc/sys/kernel/foobar").Assert(c, icmd.Expected{ + ExitCode: 125, + Err: "invalid argument", + }) } // TestRunSeccompProfileDenyUnshare checks that 'docker run --security-opt seccomp=/tmp/profile.json debian:jessie unshare' exits with operation not permitted. @@ -935,11 +935,12 @@ func (s *DockerSuite) TestRunSeccompProfileDenyUnshare(c *check.C) { if _, err := tmpFile.Write([]byte(jsonData)); err != nil { c.Fatal(err) } - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "apparmor=unconfined", "--security-opt", "seccomp="+tmpFile.Name(), "debian:jessie", "unshare", "-p", "-m", "-f", "-r", "mount", "-t", "proc", "none", "/proc") - out, _, _ := runCommandWithOutput(runCmd) - if !strings.Contains(out, "Operation not permitted") { - c.Fatalf("expected unshare with seccomp profile denied to fail, got %s", out) - } + icmd.RunCommand(dockerBinary, "run", "--security-opt", "apparmor=unconfined", + "--security-opt", "seccomp="+tmpFile.Name(), + "debian:jessie", "unshare", "-p", "-m", "-f", "-r", "mount", "-t", "proc", "none", "/proc").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) } // TestRunSeccompProfileDenyChmod checks that 'docker run --security-opt seccomp=/tmp/profile.json busybox chmod 400 /etc/hostname' exits with operation not permitted. @@ -969,11 +970,11 @@ func (s *DockerSuite) TestRunSeccompProfileDenyChmod(c *check.C) { if _, err := tmpFile.Write([]byte(jsonData)); err != nil { c.Fatal(err) } - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "seccomp="+tmpFile.Name(), "busybox", "chmod", "400", "/etc/hostname") - out, _, _ := runCommandWithOutput(runCmd) - if !strings.Contains(out, "Operation not permitted") { - c.Fatalf("expected chmod with seccomp profile denied to fail, got %s", out) - } + icmd.RunCommand(dockerBinary, "run", "--security-opt", "seccomp="+tmpFile.Name(), + "busybox", "chmod", "400", "/etc/hostname").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) } // TestRunSeccompProfileDenyUnshareUserns checks that 'docker run debian:jessie unshare --map-root-user --user sh -c whoami' with a specific profile to @@ -1006,11 +1007,12 @@ func (s *DockerSuite) TestRunSeccompProfileDenyUnshareUserns(c *check.C) { if _, err := tmpFile.Write([]byte(jsonData)); err != nil { c.Fatal(err) } - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "apparmor=unconfined", "--security-opt", "seccomp="+tmpFile.Name(), "debian:jessie", "unshare", "--map-root-user", "--user", "sh", "-c", "whoami") - out, _, _ := runCommandWithOutput(runCmd) - if !strings.Contains(out, "Operation not permitted") { - c.Fatalf("expected unshare userns with seccomp profile denied to fail, got %s", out) - } + icmd.RunCommand(dockerBinary, "run", + "--security-opt", "apparmor=unconfined", "--security-opt", "seccomp="+tmpFile.Name(), + "debian:jessie", "unshare", "--map-root-user", "--user", "sh", "-c", "whoami").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) } // TestRunSeccompProfileDenyCloneUserns checks that 'docker run syscall-test' @@ -1019,11 +1021,10 @@ func (s *DockerSuite) TestRunSeccompProfileDenyCloneUserns(c *check.C) { testRequires(c, SameHostDaemon, seccompEnabled) ensureSyscallTest(c) - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "userns-test", "id") - out, _, err := runCommandWithOutput(runCmd) - if err == nil || !strings.Contains(out, "clone failed: Operation not permitted") { - c.Fatalf("expected clone userns with default seccomp profile denied to fail, got %s: %v", out, err) - } + icmd.RunCommand(dockerBinary, "run", "syscall-test", "userns-test", "id").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "clone failed: Operation not permitted", + }) } // TestRunSeccompUnconfinedCloneUserns checks that @@ -1033,10 +1034,10 @@ func (s *DockerSuite) TestRunSeccompUnconfinedCloneUserns(c *check.C) { ensureSyscallTest(c) // make sure running w privileged is ok - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "seccomp=unconfined", "syscall-test", "userns-test", "id") - if out, _, err := runCommandWithOutput(runCmd); err != nil || !strings.Contains(out, "nobody") { - c.Fatalf("expected clone userns with --security-opt seccomp=unconfined to succeed, got %s: %v", out, err) - } + icmd.RunCommand(dockerBinary, "run", "--security-opt", "seccomp=unconfined", + "syscall-test", "userns-test", "id").Assert(c, icmd.Expected{ + Out: "nobody", + }) } // TestRunSeccompAllowPrivCloneUserns checks that 'docker run --privileged syscall-test' @@ -1046,10 +1047,9 @@ func (s *DockerSuite) TestRunSeccompAllowPrivCloneUserns(c *check.C) { ensureSyscallTest(c) // make sure running w privileged is ok - runCmd := exec.Command(dockerBinary, "run", "--privileged", "syscall-test", "userns-test", "id") - if out, _, err := runCommandWithOutput(runCmd); err != nil || !strings.Contains(out, "nobody") { - c.Fatalf("expected clone userns with --privileged to succeed, got %s: %v", out, err) - } + icmd.RunCommand(dockerBinary, "run", "--privileged", "syscall-test", "userns-test", "id").Assert(c, icmd.Expected{ + Out: "nobody", + }) } // TestRunSeccompProfileAllow32Bit checks that 32 bit code can run on x86_64 @@ -1058,10 +1058,7 @@ func (s *DockerSuite) TestRunSeccompProfileAllow32Bit(c *check.C) { testRequires(c, SameHostDaemon, seccompEnabled, IsAmd64) ensureSyscallTest(c) - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "exit32-test", "id") - if out, _, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("expected to be able to run 32 bit code, got %s: %v", out, err) - } + icmd.RunCommand(dockerBinary, "run", "syscall-test", "exit32-test", "id").Assert(c, icmd.Success) } // TestRunSeccompAllowSetrlimit checks that 'docker run debian:jessie ulimit -v 1048510' succeeds. @@ -1069,10 +1066,7 @@ func (s *DockerSuite) TestRunSeccompAllowSetrlimit(c *check.C) { testRequires(c, SameHostDaemon, seccompEnabled) // ulimit uses setrlimit, so we want to make sure we don't break it - runCmd := exec.Command(dockerBinary, "run", "debian:jessie", "bash", "-c", "ulimit -v 1048510") - if out, _, err := runCommandWithOutput(runCmd); err != nil { - c.Fatalf("expected ulimit with seccomp to succeed, got %s: %v", out, err) - } + icmd.RunCommand(dockerBinary, "run", "debian:jessie", "bash", "-c", "ulimit -v 1048510").Assert(c, icmd.Success) } func (s *DockerSuite) TestRunSeccompDefaultProfileAcct(c *check.C) { @@ -1147,10 +1141,10 @@ func (s *DockerSuite) TestRunNoNewPrivSetuid(c *check.C) { ensureNNPTest(c) // test that running a setuid binary results in no effective uid transition - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "no-new-privileges", "--user", "1000", "nnp-test", "/usr/bin/nnp-test") - if out, _, err := runCommandWithOutput(runCmd); err != nil || !strings.Contains(out, "EUID=1000") { - c.Fatalf("expected output to contain EUID=1000, got %s: %v", out, err) - } + icmd.RunCommand(dockerBinary, "run", "--security-opt", "no-new-privileges", "--user", "1000", + "nnp-test", "/usr/bin/nnp-test").Assert(c, icmd.Expected{ + Out: "EUID=1000", + }) } func (s *DockerSuite) TestUserNoEffectiveCapabilitiesChown(c *check.C) { @@ -1158,19 +1152,17 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesChown(c *check.C) { ensureSyscallTest(c) // test that a root user has default capability CAP_CHOWN - runCmd := exec.Command(dockerBinary, "run", "busybox", "chown", "100", "/tmp") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) + dockerCmd(c, "run", "busybox", "chown", "100", "/tmp") // test that non root user does not have default capability CAP_CHOWN - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "busybox", "chown", "100", "/tmp") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--user", "1000:1000", "busybox", "chown", "100", "/tmp").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) // test that root user can drop default capability CAP_CHOWN - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "chown", "busybox", "chown", "100", "/tmp") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--cap-drop", "chown", "busybox", "chown", "100", "/tmp").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) } func (s *DockerSuite) TestUserNoEffectiveCapabilitiesDacOverride(c *check.C) { @@ -1178,15 +1170,12 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesDacOverride(c *check.C) { ensureSyscallTest(c) // test that a root user has default capability CAP_DAC_OVERRIDE - runCmd := exec.Command(dockerBinary, "run", "busybox", "sh", "-c", "echo test > /etc/passwd") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) + dockerCmd(c, "run", "busybox", "sh", "-c", "echo test > /etc/passwd") // test that non root user does not have default capability CAP_DAC_OVERRIDE - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "busybox", "sh", "-c", "echo test > /etc/passwd") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Permission denied") - // TODO test that root user can drop default capability CAP_DAC_OVERRIDE + icmd.RunCommand(dockerBinary, "run", "--user", "1000:1000", "busybox", "sh", "-c", "echo test > /etc/passwd").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Permission denied", + }) } func (s *DockerSuite) TestUserNoEffectiveCapabilitiesFowner(c *check.C) { @@ -1194,14 +1183,12 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesFowner(c *check.C) { ensureSyscallTest(c) // test that a root user has default capability CAP_FOWNER - runCmd := exec.Command(dockerBinary, "run", "busybox", "chmod", "777", "/etc/passwd") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) + dockerCmd(c, "run", "busybox", "chmod", "777", "/etc/passwd") // test that non root user does not have default capability CAP_FOWNER - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "busybox", "chmod", "777", "/etc/passwd") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--user", "1000:1000", "busybox", "chmod", "777", "/etc/passwd").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) // TODO test that root user can drop default capability CAP_FOWNER } @@ -1212,19 +1199,17 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesSetuid(c *check.C) { ensureSyscallTest(c) // test that a root user has default capability CAP_SETUID - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "setuid-test") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) + dockerCmd(c, "run", "syscall-test", "setuid-test") // test that non root user does not have default capability CAP_SETUID - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "setuid-test") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "setuid-test").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) // test that root user can drop default capability CAP_SETUID - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "setuid", "syscall-test", "setuid-test") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--cap-drop", "setuid", "syscall-test", "setuid-test").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) } func (s *DockerSuite) TestUserNoEffectiveCapabilitiesSetgid(c *check.C) { @@ -1232,19 +1217,17 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesSetgid(c *check.C) { ensureSyscallTest(c) // test that a root user has default capability CAP_SETGID - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "setgid-test") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) + dockerCmd(c, "run", "syscall-test", "setgid-test") // test that non root user does not have default capability CAP_SETGID - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "setgid-test") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "setgid-test").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) // test that root user can drop default capability CAP_SETGID - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "setgid", "syscall-test", "setgid-test") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--cap-drop", "setgid", "syscall-test", "setgid-test").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) } // TODO CAP_SETPCAP @@ -1254,19 +1237,17 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesNetBindService(c *check.C) ensureSyscallTest(c) // test that a root user has default capability CAP_NET_BIND_SERVICE - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "socket-test") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) + dockerCmd(c, "run", "syscall-test", "socket-test") // test that non root user does not have default capability CAP_NET_BIND_SERVICE - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "socket-test") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Permission denied") + icmd.RunCommand(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "socket-test").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Permission denied", + }) // test that root user can drop default capability CAP_NET_BIND_SERVICE - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "net_bind_service", "syscall-test", "socket-test") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Permission denied") + icmd.RunCommand(dockerBinary, "run", "--cap-drop", "net_bind_service", "syscall-test", "socket-test").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Permission denied", + }) } func (s *DockerSuite) TestUserNoEffectiveCapabilitiesNetRaw(c *check.C) { @@ -1274,19 +1255,17 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesNetRaw(c *check.C) { ensureSyscallTest(c) // test that a root user has default capability CAP_NET_RAW - runCmd := exec.Command(dockerBinary, "run", "syscall-test", "raw-test") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) + dockerCmd(c, "run", "syscall-test", "raw-test") // test that non root user does not have default capability CAP_NET_RAW - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "raw-test") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--user", "1000:1000", "syscall-test", "raw-test").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) // test that root user can drop default capability CAP_NET_RAW - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "net_raw", "syscall-test", "raw-test") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--cap-drop", "net_raw", "syscall-test", "raw-test").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) } func (s *DockerSuite) TestUserNoEffectiveCapabilitiesChroot(c *check.C) { @@ -1294,19 +1273,17 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesChroot(c *check.C) { ensureSyscallTest(c) // test that a root user has default capability CAP_SYS_CHROOT - runCmd := exec.Command(dockerBinary, "run", "busybox", "chroot", "/", "/bin/true") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) + dockerCmd(c, "run", "busybox", "chroot", "/", "/bin/true") // test that non root user does not have default capability CAP_SYS_CHROOT - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "busybox", "chroot", "/", "/bin/true") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--user", "1000:1000", "busybox", "chroot", "/", "/bin/true").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) // test that root user can drop default capability CAP_SYS_CHROOT - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "sys_chroot", "busybox", "chroot", "/", "/bin/true") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--cap-drop", "sys_chroot", "busybox", "chroot", "/", "/bin/true").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) } func (s *DockerSuite) TestUserNoEffectiveCapabilitiesMknod(c *check.C) { @@ -1314,19 +1291,18 @@ func (s *DockerSuite) TestUserNoEffectiveCapabilitiesMknod(c *check.C) { ensureSyscallTest(c) // test that a root user has default capability CAP_MKNOD - runCmd := exec.Command(dockerBinary, "run", "busybox", "mknod", "/tmp/node", "b", "1", "2") - _, _, err := runCommandWithOutput(runCmd) - c.Assert(err, check.IsNil) + dockerCmd(c, "run", "busybox", "mknod", "/tmp/node", "b", "1", "2") // test that non root user does not have default capability CAP_MKNOD - runCmd = exec.Command(dockerBinary, "run", "--user", "1000:1000", "busybox", "mknod", "/tmp/node", "b", "1", "2") - out, _, err := runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + // test that root user can drop default capability CAP_SYS_CHROOT + icmd.RunCommand(dockerBinary, "run", "--user", "1000:1000", "busybox", "mknod", "/tmp/node", "b", "1", "2").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) // test that root user can drop default capability CAP_MKNOD - runCmd = exec.Command(dockerBinary, "run", "--cap-drop", "mknod", "busybox", "mknod", "/tmp/node", "b", "1", "2") - out, _, err = runCommandWithOutput(runCmd) - c.Assert(err, checker.NotNil, check.Commentf(out)) - c.Assert(out, checker.Contains, "Operation not permitted") + icmd.RunCommand(dockerBinary, "run", "--cap-drop", "mknod", "busybox", "mknod", "/tmp/node", "b", "1", "2").Assert(c, icmd.Expected{ + ExitCode: 1, + Err: "Operation not permitted", + }) } // TODO CAP_AUDIT_WRITE @@ -1336,14 +1312,16 @@ func (s *DockerSuite) TestRunApparmorProcDirectory(c *check.C) { testRequires(c, SameHostDaemon, Apparmor) // running w seccomp unconfined tests the apparmor profile - runCmd := exec.Command(dockerBinary, "run", "--security-opt", "seccomp=unconfined", "busybox", "chmod", "777", "/proc/1/cgroup") - if out, _, err := runCommandWithOutput(runCmd); err == nil || !(strings.Contains(out, "Permission denied") || strings.Contains(out, "Operation not permitted")) { - c.Fatalf("expected chmod 777 /proc/1/cgroup to fail, got %s: %v", out, err) + result := icmd.RunCommand(dockerBinary, "run", "--security-opt", "seccomp=unconfined", "busybox", "chmod", "777", "/proc/1/cgroup") + result.Assert(c, icmd.Expected{ExitCode: 1}) + if !(strings.Contains(result.Combined(), "Permission denied") || strings.Contains(result.Combined(), "Operation not permitted")) { + c.Fatalf("expected chmod 777 /proc/1/cgroup to fail, got %s: %v", result.Combined(), result.Error) } - runCmd = exec.Command(dockerBinary, "run", "--security-opt", "seccomp=unconfined", "busybox", "chmod", "777", "/proc/1/attr/current") - if out, _, err := runCommandWithOutput(runCmd); err == nil || !(strings.Contains(out, "Permission denied") || strings.Contains(out, "Operation not permitted")) { - c.Fatalf("expected chmod 777 /proc/1/attr/current to fail, got %s: %v", out, err) + result = icmd.RunCommand(dockerBinary, "run", "--security-opt", "seccomp=unconfined", "busybox", "chmod", "777", "/proc/1/attr/current") + result.Assert(c, icmd.Expected{ExitCode: 1}) + if !(strings.Contains(result.Combined(), "Permission denied") || strings.Contains(result.Combined(), "Operation not permitted")) { + c.Fatalf("expected chmod 777 /proc/1/attr/current to fail, got %s: %v", result.Combined(), result.Error) } } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_test.go index 5be695948..73e19558a 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_test.go @@ -13,10 +13,10 @@ import ( "strings" "time" - "github.com/docker/distribution/digest" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/pkg/testutil" "github.com/go-check/check" + "github.com/opencontainers/go-digest" ) // save a repo using gz compression and try to load it using stdout @@ -30,7 +30,7 @@ func (s *DockerSuite) TestSaveXzAndLoadRepoStdout(c *check.C) { dockerCmd(c, "inspect", repoName) - repoTarball, _, err := integration.RunCommandPipelineWithOutput( + repoTarball, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", repoName), exec.Command("xz", "-c"), exec.Command("gzip", "-c")) @@ -57,7 +57,7 @@ func (s *DockerSuite) TestSaveXzGzAndLoadRepoStdout(c *check.C) { dockerCmd(c, "inspect", repoName) - out, _, err := integration.RunCommandPipelineWithOutput( + out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", repoName), exec.Command("xz", "-c"), exec.Command("gzip", "-c")) @@ -82,7 +82,7 @@ func (s *DockerSuite) TestSaveSingleTag(c *check.C) { out, _ := dockerCmd(c, "images", "-q", "--no-trunc", repoName) cleanedImageID := strings.TrimSpace(out) - out, _, err := integration.RunCommandPipelineWithOutput( + out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", fmt.Sprintf("%v:latest", repoName)), exec.Command("tar", "t"), exec.Command("grep", "-E", fmt.Sprintf("(^repositories$|%v)", cleanedImageID))) @@ -101,7 +101,7 @@ func (s *DockerSuite) TestSaveCheckTimes(c *check.C) { c.Assert(err, checker.IsNil, check.Commentf("failed to marshal from %q: err %v", repoName, err)) c.Assert(len(data), checker.Not(checker.Equals), 0, check.Commentf("failed to marshal the data from %q", repoName)) tarTvTimeFormat := "2006-01-02 15:04" - out, _, err = integration.RunCommandPipelineWithOutput( + out, _, err = testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", repoName), exec.Command("tar", "tv"), exec.Command("grep", "-E", fmt.Sprintf("%s %s", data[0].Created.Format(tarTvTimeFormat), digest.Digest(data[0].ID).Hex()))) @@ -159,7 +159,7 @@ func (s *DockerSuite) TestSaveAndLoadRepoFlags(c *check.C) { before, _ := dockerCmd(c, "inspect", repoName) - out, _, err := integration.RunCommandPipelineWithOutput( + out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", repoName), exec.Command(dockerBinary, "load")) c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err)) @@ -188,7 +188,7 @@ func (s *DockerSuite) TestSaveMultipleNames(c *check.C) { // Make two images dockerCmd(c, "tag", "emptyfs:latest", fmt.Sprintf("%v-two:latest", repoName)) - out, _, err := integration.RunCommandPipelineWithOutput( + out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", fmt.Sprintf("%v-one", repoName), fmt.Sprintf("%v-two:latest", repoName)), exec.Command("tar", "xO", "repositories"), exec.Command("grep", "-q", "-E", "(-one|-two)"), @@ -220,7 +220,7 @@ func (s *DockerSuite) TestSaveRepoWithMultipleImages(c *check.C) { deleteImages(repoName) // create the archive - out, _, err := integration.RunCommandPipelineWithOutput( + out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", repoName, "busybox:latest"), exec.Command("tar", "t")) c.Assert(err, checker.IsNil, check.Commentf("failed to save multiple images: %s, %v", out, err)) @@ -267,7 +267,7 @@ func (s *DockerSuite) TestSaveDirectoryPermissions(c *check.C) { true) c.Assert(err, checker.IsNil, check.Commentf("%v", err)) - out, _, err := integration.RunCommandPipelineWithOutput( + out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", name), exec.Command("tar", "-xf", "-", "-C", extractionDirectory), ) @@ -286,7 +286,7 @@ func (s *DockerSuite) TestSaveDirectoryPermissions(c *check.C) { c.Assert(err, checker.IsNil, check.Commentf("failed to open %s: %s", layerPath, err)) defer f.Close() - entries, err := integration.ListTar(f) + entries, err := testutil.ListTar(f) for _, e := range entries { if !strings.Contains(e, "dev/") { entriesSansDev = append(entriesSansDev, e) @@ -364,7 +364,7 @@ func (s *DockerSuite) TestSaveLoadNoTag(c *check.C) { id := inspectField(c, name, "Id") // Test to make sure that save w/o name just shows imageID during load - out, _, err := integration.RunCommandPipelineWithOutput( + out, _, err := testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", id), exec.Command(dockerBinary, "load")) c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err)) @@ -375,7 +375,7 @@ func (s *DockerSuite) TestSaveLoadNoTag(c *check.C) { c.Assert(out, checker.Contains, id) // Test to make sure that save by name shows that name during load - out, _, err = integration.RunCommandPipelineWithOutput( + out, _, err = testutil.RunCommandPipelineWithOutput( exec.Command(dockerBinary, "save", name), exec.Command(dockerBinary, "load")) c.Assert(err, checker.IsNil, check.Commentf("failed to save and load repo: %s, %v", out, err)) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_unix_test.go index 49ffff0bc..50b0ea6a6 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_save_load_unix_test.go @@ -11,8 +11,8 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" "github.com/kr/pty" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_search_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_search_test.go index 5a32f2ab9..2660a969c 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_search_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_search_test.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_create_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_create_test.go index 38d292eec..a67b4d392 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_create_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_create_test.go @@ -8,7 +8,7 @@ import ( "strings" "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) @@ -55,7 +55,7 @@ func (s *DockerSwarmSuite) TestSecretCreateWithLabels(c *check.C) { func (s *DockerSwarmSuite) TestSecretCreateResolve(c *check.C) { d := s.AddDaemon(c, true, true) - name := "foo" + name := "test_secret" id := d.CreateSecret(c, swarm.SecretSpec{ swarm.Annotations{ Name: name, @@ -121,20 +121,11 @@ func (s *DockerSwarmSuite) TestSecretCreateWithFile(c *check.C) { c.Assert(err, checker.IsNil, check.Commentf("failed to write to temporary file")) testName := "test_secret" - out, err := d.Cmd("secret", "create", "--file", testFile.Name(), testName) + out, err := d.Cmd("secret", "create", testName, testFile.Name()) c.Assert(err, checker.IsNil) c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "", check.Commentf(out)) id := strings.TrimSpace(out) secret := d.GetSecret(c, id) c.Assert(secret.Spec.Name, checker.Equals, testName) - - testName = "test_secret_2" - out, err = d.Cmd("secret", "create", testName, "-f", testFile.Name()) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "", check.Commentf(out)) - - id = strings.TrimSpace(out) - secret = d.GetSecret(c, id) - c.Assert(secret.Spec.Name, checker.Equals, testName) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_inspect_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_inspect_test.go index 3a4f0edc8..32b2ffee9 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_inspect_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_secret_inspect_test.go @@ -6,7 +6,7 @@ import ( "encoding/json" "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_create_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_create_test.go index 0fabd7a26..f6ca6ddaf 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_create_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_create_test.go @@ -10,7 +10,7 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_health_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_health_test.go index 81df257e5..28481c70a 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_health_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_health_test.go @@ -8,7 +8,7 @@ import ( "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/daemon/cluster/executor/container" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_logs_experimental_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_logs_experimental_test.go index 0c4adcecf..ba514fcd7 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_logs_experimental_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_logs_experimental_test.go @@ -9,7 +9,7 @@ import ( "os/exec" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_scale_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_scale_test.go index 29cca2358..c96fa5cf8 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_scale_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_scale_test.go @@ -6,7 +6,7 @@ import ( "fmt" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_update_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_update_test.go index ccbf3f763..b561e651a 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_service_update_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_service_update_test.go @@ -7,7 +7,7 @@ import ( "fmt" "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_stack_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_stack_test.go index 1ff791bc1..2354e1aaf 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_stack_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_stack_test.go @@ -4,7 +4,7 @@ import ( "io/ioutil" "os" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_start_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_start_test.go index f7e1b6e8f..9eb93fb82 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_start_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_start_test.go @@ -5,8 +5,8 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_stats_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_stats_test.go index 5cb1a3ea0..56355a543 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_stats_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_stats_test.go @@ -7,7 +7,7 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_stop_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_stop_test.go index 103d01374..1be41203b 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_stop_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_stop_test.go @@ -1,7 +1,7 @@ package main import ( - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_test.go index a67af7999..61e5fc3f4 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_test.go @@ -15,8 +15,8 @@ import ( "time" "github.com/docker/docker/api/types/swarm" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" - "github.com/docker/docker/pkg/integration/checker" "github.com/docker/libnetwork/driverapi" "github.com/docker/libnetwork/ipamapi" remoteipam "github.com/docker/libnetwork/ipams/remote/api" @@ -119,16 +119,6 @@ func (s *DockerSwarmSuite) TestSwarmIncompatibleDaemon(c *check.C) { d.Start(c) } -// Test case for #24090 -func (s *DockerSwarmSuite) TestSwarmNodeListHostname(c *check.C) { - d := s.AddDaemon(c, true, true) - - // The first line should contain "HOSTNAME" - out, err := d.Cmd("node", "ls") - c.Assert(err, checker.IsNil) - c.Assert(strings.Split(out, "\n")[0], checker.Contains, "HOSTNAME") -} - func (s *DockerSwarmSuite) TestSwarmServiceTemplatingHostname(c *check.C) { d := s.AddDaemon(c, true, true) @@ -235,51 +225,23 @@ func (s *DockerSwarmSuite) TestSwarmNodeTaskListFilter(c *check.C) { func (s *DockerSwarmSuite) TestSwarmPublishAdd(c *check.C) { d := s.AddDaemon(c, true, true) - testCases := []struct { - name string - publishAdd []string - ports string - }{ - { - name: "simple-syntax", - publishAdd: []string{ - "80:80", - "80:80", - "80:80", - "80:20", - }, - ports: "[{ tcp 80 80 ingress}]", - }, - { - name: "complex-syntax", - publishAdd: []string{ - "target=90,published=90,protocol=tcp,mode=ingress", - "target=90,published=90,protocol=tcp,mode=ingress", - "target=90,published=90,protocol=tcp,mode=ingress", - "target=30,published=90,protocol=tcp,mode=ingress", - }, - ports: "[{ tcp 90 90 ingress}]", - }, - } - - for _, tc := range testCases { - out, err := d.Cmd("service", "create", "--name", tc.name, "--label", "x=y", "busybox", "top") - c.Assert(err, checker.IsNil, check.Commentf(out)) - c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") + name := "top" + out, err := d.Cmd("service", "create", "--name", name, "--label", "x=y", "busybox", "top") + c.Assert(err, checker.IsNil) + c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") - out, err = d.CmdRetryOutOfSequence("service", "update", "--publish-add", tc.publishAdd[0], tc.name) - c.Assert(err, checker.IsNil, check.Commentf(out)) + out, err = d.Cmd("service", "update", "--publish-add", "80:80", name) + c.Assert(err, checker.IsNil) - out, err = d.CmdRetryOutOfSequence("service", "update", "--publish-add", tc.publishAdd[1], tc.name) - c.Assert(err, checker.IsNil, check.Commentf(out)) + out, err = d.CmdRetryOutOfSequence("service", "update", "--publish-add", "80:80", name) + c.Assert(err, checker.IsNil) - out, err = d.CmdRetryOutOfSequence("service", "update", "--publish-add", tc.publishAdd[2], "--publish-add", tc.publishAdd[3], tc.name) - c.Assert(err, checker.NotNil, check.Commentf(out)) + out, err = d.CmdRetryOutOfSequence("service", "update", "--publish-add", "80:80", "--publish-add", "80:20", name) + c.Assert(err, checker.NotNil) - out, err = d.Cmd("service", "inspect", "--format", "{{ .Spec.EndpointSpec.Ports }}", tc.name) - c.Assert(err, checker.IsNil) - c.Assert(strings.TrimSpace(out), checker.Equals, tc.ports) - } + out, err = d.Cmd("service", "inspect", "--format", "{{ .Spec.EndpointSpec.Ports }}", name) + c.Assert(err, checker.IsNil) + c.Assert(strings.TrimSpace(out), checker.Equals, "[{ tcp 80 80 ingress}]") } func (s *DockerSwarmSuite) TestSwarmServiceWithGroup(c *check.C) { @@ -499,13 +461,6 @@ func (s *DockerSwarmSuite) TestPsListContainersFilterIsTask(c *check.C) { const globalNetworkPlugin = "global-network-plugin" const globalIPAMPlugin = "global-ipam-plugin" -func (s *DockerSwarmSuite) SetUpSuite(c *check.C) { - mux := http.NewServeMux() - s.server = httptest.NewServer(mux) - c.Assert(s.server, check.NotNil, check.Commentf("Failed to start an HTTP Server")) - setupRemoteGlobalNetworkPlugin(c, mux, s.server.URL, globalNetworkPlugin, globalIPAMPlugin) -} - func setupRemoteGlobalNetworkPlugin(c *check.C, mux *http.ServeMux, url, netDrv, ipamDrv string) { mux.HandleFunc("/Plugin.Activate", func(w http.ResponseWriter, r *http.Request) { @@ -675,6 +630,16 @@ func setupRemoteGlobalNetworkPlugin(c *check.C, mux *http.ServeMux, url, netDrv, } func (s *DockerSwarmSuite) TestSwarmNetworkPlugin(c *check.C) { + mux := http.NewServeMux() + s.server = httptest.NewServer(mux) + c.Assert(s.server, check.NotNil, check.Commentf("Failed to start an HTTP Server")) + setupRemoteGlobalNetworkPlugin(c, mux, s.server.URL, globalNetworkPlugin, globalIPAMPlugin) + defer func() { + s.server.Close() + err := os.RemoveAll("/etc/docker/plugins") + c.Assert(err, checker.IsNil) + }() + d := s.AddDaemon(c, true, true) out, err := d.Cmd("network", "create", "-d", globalNetworkPlugin, "foo") @@ -1410,24 +1375,6 @@ func (s *DockerSwarmSuite) TestSwarmNetworkIPAMOptions(c *check.C) { c.Assert(strings.TrimSpace(out), checker.Equals, "map[foo:bar]") } -// TODO: migrate to a unit test -// This test could be migrated to unit test and save costly integration test, -// once PR #29143 is merged. -func (s *DockerSwarmSuite) TestSwarmUpdateWithoutArgs(c *check.C) { - d := s.AddDaemon(c, true, true) - - expectedOutput := ` -Usage: docker swarm update [OPTIONS] - -Update the swarm - -Options:` - - out, err := d.Cmd("swarm", "update") - c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) - c.Assert(out, checker.Contains, expectedOutput, check.Commentf(out)) -} - func (s *DockerTrustedSwarmSuite) TestTrustedServiceCreate(c *check.C) { d := s.swarmSuite.AddDaemon(c, true, true) @@ -1436,7 +1383,7 @@ func (s *DockerTrustedSwarmSuite) TestTrustedServiceCreate(c *check.C) { name := "trusted" serviceCmd := d.Command("-D", "service", "create", "--name", name, repoName, "top") - s.trustSuite.trustedCmd(serviceCmd) + trustedExecCmd(serviceCmd) out, _, err := runCommandWithOutput(serviceCmd) c.Assert(err, checker.IsNil, check.Commentf(out)) c.Assert(out, checker.Contains, "resolved image tag to", check.Commentf(out)) @@ -1455,7 +1402,7 @@ func (s *DockerTrustedSwarmSuite) TestTrustedServiceCreate(c *check.C) { name = "untrusted" serviceCmd = d.Command("service", "create", "--name", name, repoName, "top") - s.trustSuite.trustedCmd(serviceCmd) + trustedExecCmd(serviceCmd) out, _, err = runCommandWithOutput(serviceCmd) c.Assert(err, check.NotNil, check.Commentf(out)) @@ -1484,7 +1431,7 @@ func (s *DockerTrustedSwarmSuite) TestTrustedServiceUpdate(c *check.C) { c.Assert(out, check.Not(checker.Contains), repoName+"@", check.Commentf(out)) serviceCmd := d.Command("-D", "service", "update", "--image", repoName, name) - s.trustSuite.trustedCmd(serviceCmd) + trustedExecCmd(serviceCmd) out, _, err = runCommandWithOutput(serviceCmd) c.Assert(err, checker.IsNil, check.Commentf(out)) c.Assert(out, checker.Contains, "resolved image tag to", check.Commentf(out)) @@ -1502,7 +1449,7 @@ func (s *DockerTrustedSwarmSuite) TestTrustedServiceUpdate(c *check.C) { dockerCmd(c, "rmi", repoName) serviceCmd = d.Command("service", "update", "--image", repoName, name) - s.trustSuite.trustedCmd(serviceCmd) + trustedExecCmd(serviceCmd) out, _, err = runCommandWithOutput(serviceCmd) c.Assert(err, check.NotNil, check.Commentf(out)) @@ -1555,3 +1502,131 @@ func (s *DockerSwarmSuite) TestSwarmNetworkCreateDup(c *check.C) { } } } + +func (s *DockerSwarmSuite) TestSwarmServicePsMultipleServiceIDs(c *check.C) { + d := s.AddDaemon(c, true, true) + + name1 := "top1" + out, err := d.Cmd("service", "create", "--name", name1, "--replicas=3", "busybox", "top") + c.Assert(err, checker.IsNil) + c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") + id1 := strings.TrimSpace(out) + + name2 := "top2" + out, err = d.Cmd("service", "create", "--name", name2, "--replicas=3", "busybox", "top") + c.Assert(err, checker.IsNil) + c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") + id2 := strings.TrimSpace(out) + + // make sure task has been deployed. + waitAndAssert(c, defaultReconciliationTimeout, d.CheckActiveContainerCount, checker.Equals, 6) + + out, err = d.Cmd("service", "ps", name1) + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, name1+".1") + c.Assert(out, checker.Contains, name1+".2") + c.Assert(out, checker.Contains, name1+".3") + c.Assert(out, checker.Not(checker.Contains), name2+".1") + c.Assert(out, checker.Not(checker.Contains), name2+".2") + c.Assert(out, checker.Not(checker.Contains), name2+".3") + + out, err = d.Cmd("service", "ps", name1, name2) + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, name1+".1") + c.Assert(out, checker.Contains, name1+".2") + c.Assert(out, checker.Contains, name1+".3") + c.Assert(out, checker.Contains, name2+".1") + c.Assert(out, checker.Contains, name2+".2") + c.Assert(out, checker.Contains, name2+".3") + + // Name Prefix + out, err = d.Cmd("service", "ps", "to") + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, name1+".1") + c.Assert(out, checker.Contains, name1+".2") + c.Assert(out, checker.Contains, name1+".3") + c.Assert(out, checker.Contains, name2+".1") + c.Assert(out, checker.Contains, name2+".2") + c.Assert(out, checker.Contains, name2+".3") + + // Name Prefix (no hit) + out, err = d.Cmd("service", "ps", "noname") + c.Assert(err, checker.NotNil) + c.Assert(out, checker.Contains, "no such services: noname") + + out, err = d.Cmd("service", "ps", id1) + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, name1+".1") + c.Assert(out, checker.Contains, name1+".2") + c.Assert(out, checker.Contains, name1+".3") + c.Assert(out, checker.Not(checker.Contains), name2+".1") + c.Assert(out, checker.Not(checker.Contains), name2+".2") + c.Assert(out, checker.Not(checker.Contains), name2+".3") + + out, err = d.Cmd("service", "ps", id1, id2) + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, name1+".1") + c.Assert(out, checker.Contains, name1+".2") + c.Assert(out, checker.Contains, name1+".3") + c.Assert(out, checker.Contains, name2+".1") + c.Assert(out, checker.Contains, name2+".2") + c.Assert(out, checker.Contains, name2+".3") +} + +func (s *DockerSwarmSuite) TestSwarmPublishDuplicatePorts(c *check.C) { + d := s.AddDaemon(c, true, true) + + out, err := d.Cmd("service", "create", "--publish", "5000:80", "--publish", "5001:80", "--publish", "80", "--publish", "80", "busybox", "top") + c.Assert(err, check.IsNil, check.Commentf(out)) + id := strings.TrimSpace(out) + + // make sure task has been deployed. + waitAndAssert(c, defaultReconciliationTimeout, d.CheckActiveContainerCount, checker.Equals, 1) + + // Total len = 4, with 2 dynamic ports and 2 non-dynamic ports + // Dynamic ports are likely to be 30000 and 30001 but doesn't matter + out, err = d.Cmd("service", "inspect", "--format", "{{.Endpoint.Ports}} len={{len .Endpoint.Ports}}", id) + c.Assert(err, check.IsNil, check.Commentf(out)) + c.Assert(out, checker.Contains, "len=4") + c.Assert(out, checker.Contains, "{ tcp 80 5000 ingress}") + c.Assert(out, checker.Contains, "{ tcp 80 5001 ingress}") +} + +func (s *DockerSwarmSuite) TestSwarmJoinWithDrain(c *check.C) { + d := s.AddDaemon(c, true, true) + + out, err := d.Cmd("node", "ls") + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Not(checker.Contains), "Drain") + + out, err = d.Cmd("swarm", "join-token", "-q", "manager") + c.Assert(err, checker.IsNil) + c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") + + token := strings.TrimSpace(out) + + d1 := s.AddDaemon(c, false, false) + + out, err = d1.Cmd("swarm", "join", "--availability=drain", "--token", token, d.ListenAddr) + c.Assert(err, checker.IsNil) + c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") + + out, err = d.Cmd("node", "ls") + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, "Drain") + + out, err = d1.Cmd("node", "ls") + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, "Drain") +} + +func (s *DockerSwarmSuite) TestSwarmInitWithDrain(c *check.C) { + d := s.AddDaemon(c, false, false) + + out, err := d.Cmd("swarm", "init", "--availability", "drain") + c.Assert(err, checker.IsNil, check.Commentf("out: %v", out)) + + out, err = d.Cmd("node", "ls") + c.Assert(err, checker.IsNil) + c.Assert(out, checker.Contains, "Drain") +} diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_unix_test.go index 96e77e258..a74426a1f 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_swarm_unix_test.go @@ -7,7 +7,7 @@ import ( "strings" "github.com/docker/docker/api/types/swarm" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_tag_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_tag_test.go index 60b89dca0..7c3a5e2b9 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_tag_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_tag_test.go @@ -4,7 +4,7 @@ import ( "fmt" "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringutils" "github.com/go-check/check" diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_top_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_top_test.go index caae29024..6b5c0a06f 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_top_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_top_test.go @@ -3,8 +3,8 @@ package main import ( "strings" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_update_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_update_test.go index 0b31bb45f..1ab3e5c30 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_update_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_update_test.go @@ -4,7 +4,7 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_update_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_update_unix_test.go index 580ff0260..37885d017 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_update_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_update_unix_test.go @@ -5,15 +5,16 @@ package main import ( "encoding/json" "fmt" - "github.com/kr/pty" "os/exec" "strings" "time" "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/docker/docker/pkg/parsers/kernel" "github.com/go-check/check" + "github.com/kr/pty" ) func (s *DockerSuite) TestUpdateRunningContainer(c *check.C) { @@ -219,7 +220,7 @@ func (s *DockerSuite) TestUpdateStats(c *check.C) { c.Assert(waitRun(name), checker.IsNil) getMemLimit := func(id string) uint64 { - resp, body, err := sockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id), nil, "") + resp, body, err := request.SockRequestRaw("GET", fmt.Sprintf("/containers/%s/stats?stream=false", id), nil, "", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(resp.Header.Get("Content-Type"), checker.Equals, "application/json") diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_userns_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_userns_test.go index a1e862fbc..8311401d0 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_userns_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_userns_test.go @@ -12,10 +12,10 @@ import ( "strconv" "strings" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/system" + "github.com/docker/docker/pkg/testutil" "github.com/go-check/check" ) @@ -62,12 +62,12 @@ func (s *DockerDaemonSuite) TestDaemonUserNamespaceRootSetting(c *check.C) { c.Assert(err, checker.IsNil, check.Commentf("Could not inspect running container: out: %q", pid)) // check the uid and gid maps for the PID to ensure root is remapped // (cmd = cat /proc//uid_map | grep -E '0\s+9999\s+1') - out, rc1, err := integration.RunCommandPipelineWithOutput( + out, rc1, err := testutil.RunCommandPipelineWithOutput( exec.Command("cat", "/proc/"+strings.TrimSpace(pid)+"/uid_map"), exec.Command("grep", "-E", fmt.Sprintf("0[[:space:]]+%d[[:space:]]+", uid))) c.Assert(rc1, checker.Equals, 0, check.Commentf("Didn't match uid_map: output: %s", out)) - out, rc2, err := integration.RunCommandPipelineWithOutput( + out, rc2, err := testutil.RunCommandPipelineWithOutput( exec.Command("cat", "/proc/"+strings.TrimSpace(pid)+"/gid_map"), exec.Command("grep", "-E", fmt.Sprintf("0[[:space:]]+%d[[:space:]]+", gid))) c.Assert(rc2, checker.Equals, 0, check.Commentf("Didn't match gid_map: output: %s", out)) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_v2_only_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_v2_only_test.go index 228d77c4c..6e0d94459 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_v2_only_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_v2_only_test.go @@ -6,6 +6,7 @@ import ( "net/http" "os" + "github.com/docker/docker/integration-cli/registry" "github.com/go-check/check" ) @@ -36,29 +37,29 @@ func makefile(contents string) (string, func(), error) { // TestV2Only ensures that a daemon in v2-only mode does not // attempt to contact any v1 registry endpoints. func (s *DockerRegistrySuite) TestV2Only(c *check.C) { - reg, err := newTestRegistry(c) + reg, err := registry.NewMock(c) c.Assert(err, check.IsNil) - reg.registerHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { + reg.RegisterHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(404) }) - reg.registerHandler("/v1/.*", func(w http.ResponseWriter, r *http.Request) { + reg.RegisterHandler("/v1/.*", func(w http.ResponseWriter, r *http.Request) { c.Fatal("V1 registry contacted") }) - repoName := fmt.Sprintf("%s/busybox", reg.hostport) + repoName := fmt.Sprintf("%s/busybox", reg.URL()) - s.d.Start(c, "--insecure-registry", reg.hostport, "--disable-legacy-registry=true") + s.d.Start(c, "--insecure-registry", reg.URL(), "--disable-legacy-registry=true") - dockerfileName, cleanup, err := makefile(fmt.Sprintf("FROM %s/busybox", reg.hostport)) + dockerfileName, cleanup, err := makefile(fmt.Sprintf("FROM %s/busybox", reg.URL())) c.Assert(err, check.IsNil, check.Commentf("Unable to create test dockerfile")) defer cleanup() s.d.Cmd("build", "--file", dockerfileName, ".") s.d.Cmd("run", repoName) - s.d.Cmd("login", "-u", "richard", "-p", "testtest", "-e", "testuser@testdomain.com", reg.hostport) + s.d.Cmd("login", "-u", "richard", "-p", "testtest", "-e", "testuser@testdomain.com", reg.URL()) s.d.Cmd("tag", "busybox", repoName) s.d.Cmd("push", repoName) s.d.Cmd("pull", repoName) @@ -68,49 +69,49 @@ func (s *DockerRegistrySuite) TestV2Only(c *check.C) { // and ensure v1 endpoints are hit for the following operations: // login, push, pull, build & run func (s *DockerRegistrySuite) TestV1(c *check.C) { - reg, err := newTestRegistry(c) + reg, err := registry.NewMock(c) c.Assert(err, check.IsNil) v2Pings := 0 - reg.registerHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { + reg.RegisterHandler("/v2/", func(w http.ResponseWriter, r *http.Request) { v2Pings++ // V2 ping 404 causes fallback to v1 w.WriteHeader(404) }) v1Pings := 0 - reg.registerHandler("/v1/_ping", func(w http.ResponseWriter, r *http.Request) { + reg.RegisterHandler("/v1/_ping", func(w http.ResponseWriter, r *http.Request) { v1Pings++ }) v1Logins := 0 - reg.registerHandler("/v1/users/", func(w http.ResponseWriter, r *http.Request) { + reg.RegisterHandler("/v1/users/", func(w http.ResponseWriter, r *http.Request) { v1Logins++ }) v1Repo := 0 - reg.registerHandler("/v1/repositories/busybox/", func(w http.ResponseWriter, r *http.Request) { + reg.RegisterHandler("/v1/repositories/busybox/", func(w http.ResponseWriter, r *http.Request) { v1Repo++ }) - reg.registerHandler("/v1/repositories/busybox/images", func(w http.ResponseWriter, r *http.Request) { + reg.RegisterHandler("/v1/repositories/busybox/images", func(w http.ResponseWriter, r *http.Request) { v1Repo++ }) - s.d.Start(c, "--insecure-registry", reg.hostport, "--disable-legacy-registry=false") + s.d.Start(c, "--insecure-registry", reg.URL(), "--disable-legacy-registry=false") - dockerfileName, cleanup, err := makefile(fmt.Sprintf("FROM %s/busybox", reg.hostport)) + dockerfileName, cleanup, err := makefile(fmt.Sprintf("FROM %s/busybox", reg.URL())) c.Assert(err, check.IsNil, check.Commentf("Unable to create test dockerfile")) defer cleanup() s.d.Cmd("build", "--file", dockerfileName, ".") c.Assert(v1Repo, check.Equals, 1, check.Commentf("Expected v1 repository access after build")) - repoName := fmt.Sprintf("%s/busybox", reg.hostport) + repoName := fmt.Sprintf("%s/busybox", reg.URL()) s.d.Cmd("run", repoName) c.Assert(v1Repo, check.Equals, 2, check.Commentf("Expected v1 repository access after run")) - s.d.Cmd("login", "-u", "richard", "-p", "testtest", reg.hostport) + s.d.Cmd("login", "-u", "richard", "-p", "testtest", reg.URL()) c.Assert(v1Logins, check.Equals, 1, check.Commentf("Expected v1 login attempt")) s.d.Cmd("tag", "busybox", repoName) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_version_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_version_test.go index 7672beb73..074a7db47 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_version_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_version_test.go @@ -3,7 +3,7 @@ package main import ( "strings" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_volume_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_volume_test.go index d9bd000d2..4c5b09086 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_volume_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_volume_test.go @@ -8,8 +8,8 @@ import ( "path/filepath" "strings" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -184,19 +184,6 @@ func (s *DockerSuite) TestVolumeCLILsFilterDangling(c *check.C) { c.Assert(out, check.Not(checker.Contains), "testnotinuse1\n", check.Commentf("expected volume 'testnotinuse1' in output")) c.Assert(out, checker.Contains, "testisinuse1\n", check.Commentf("execpeted volume 'testisinuse1' in output")) c.Assert(out, checker.Contains, "testisinuse2\n", check.Commentf("expected volume 'testisinuse2' in output")) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "driver=invalidDriver") - outArr := strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 1, check.Commentf("%s\n", out)) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "driver=local") - outArr = strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 4, check.Commentf("\n%s", out)) - - out, _ = dockerCmd(c, "volume", "ls", "--filter", "driver=loc") - outArr = strings.Split(strings.TrimSpace(out), "\n") - c.Assert(len(outArr), check.Equals, 4, check.Commentf("\n%s", out)) - } func (s *DockerSuite) TestVolumeCLILsErrorWithInvalidFilterName(c *check.C) { @@ -226,11 +213,11 @@ func (s *DockerSuite) TestVolumeCLIRm(c *check.C) { volumeID := "testing" dockerCmd(c, "run", "-v", volumeID+":"+prefix+"/foo", "--name=test", "busybox", "sh", "-c", "echo hello > /foo/bar") - out, _, err := runCommandWithOutput(exec.Command(dockerBinary, "volume", "rm", "testing")) - c.Assert( - err, - check.Not(check.IsNil), - check.Commentf("Should not be able to remove volume that is in use by a container\n%s", out)) + + icmd.RunCommand(dockerBinary, "volume", "rm", "testing").Assert(c, icmd.Expected{ + ExitCode: 1, + Error: "exit status 1", + }) out, _ = dockerCmd(c, "run", "--volumes-from=test", "--name=test2", "busybox", "sh", "-c", "cat /foo/bar") c.Assert(strings.TrimSpace(out), check.Equals, "hello") @@ -377,6 +364,37 @@ func (s *DockerSuite) TestVolumeCLILsFilterLabels(c *check.C) { c.Assert(len(outArr), check.Equals, 1, check.Commentf("\n%s", out)) } +func (s *DockerSuite) TestVolumeCLILsFilterDrivers(c *check.C) { + // using default volume driver local to create volumes + testVol1 := "testvol-1" + out, _, err := dockerCmdWithError("volume", "create", testVol1) + c.Assert(err, check.IsNil) + + testVol2 := "testvol-2" + out, _, err = dockerCmdWithError("volume", "create", testVol2) + c.Assert(err, check.IsNil) + + // filter with driver=local + out, _ = dockerCmd(c, "volume", "ls", "--filter", "driver=local") + c.Assert(out, checker.Contains, "testvol-1\n", check.Commentf("expected volume 'testvol-1' in output")) + c.Assert(out, checker.Contains, "testvol-2\n", check.Commentf("expected volume 'testvol-2' in output")) + + // filter with driver=invaliddriver + out, _ = dockerCmd(c, "volume", "ls", "--filter", "driver=invaliddriver") + outArr := strings.Split(strings.TrimSpace(out), "\n") + c.Assert(len(outArr), check.Equals, 1, check.Commentf("\n%s", out)) + + // filter with driver=loca + out, _ = dockerCmd(c, "volume", "ls", "--filter", "driver=loca") + outArr = strings.Split(strings.TrimSpace(out), "\n") + c.Assert(len(outArr), check.Equals, 1, check.Commentf("\n%s", out)) + + // filter with driver= + out, _ = dockerCmd(c, "volume", "ls", "--filter", "driver=") + outArr = strings.Split(strings.TrimSpace(out), "\n") + c.Assert(len(outArr), check.Equals, 1, check.Commentf("\n%s", out)) +} + func (s *DockerSuite) TestVolumeCLIRmForceUsage(c *check.C) { out, _ := dockerCmd(c, "volume", "create") id := strings.TrimSpace(out) @@ -401,8 +419,7 @@ func (s *DockerSuite) TestVolumeCLIRmForce(c *check.C) { c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") // Mountpoint is in the form of "/var/lib/docker/volumes/.../_data", removing `/_data` path := strings.TrimSuffix(strings.TrimSpace(out), "/_data") - out, _, err := runCommandWithOutput(exec.Command("rm", "-rf", path)) - c.Assert(err, check.IsNil) + icmd.RunCommand("rm", "-rf", path).Assert(c, icmd.Success) dockerCmd(c, "volume", "rm", "-f", "test") out, _ = dockerCmd(c, "volume", "ls") diff --git a/vendor/github.com/docker/docker/integration-cli/docker_cli_wait_test.go b/vendor/github.com/docker/docker/integration-cli/docker_cli_wait_test.go index 961aef552..6f45bf07a 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_cli_wait_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_cli_wait_test.go @@ -6,7 +6,8 @@ import ( "strings" "time" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -36,7 +37,7 @@ func (s *DockerSuite) TestWaitBlockedExitZero(c *check.C) { chWait := make(chan string) go func() { chWait <- "" - out, _, _ := runCommandWithOutput(exec.Command(dockerBinary, "wait", containerID)) + out := icmd.RunCommand(dockerBinary, "wait", containerID).Combined() chWait <- out }() diff --git a/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_test.go b/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_test.go index a00119717..a29d3f463 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_test.go @@ -7,8 +7,9 @@ import ( "net/http" "strings" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" + "github.com/docker/docker/pkg/testutil" "github.com/go-check/check" ) @@ -22,7 +23,7 @@ func (s *DockerSuite) TestDeprecatedContainerAPIStartHostConfig(c *check.C) { config := map[string]interface{}{ "Binds": []string{"/aa:/bb"}, } - status, body, err := sockRequest("POST", "/containers/"+name+"/start", config) + status, body, err := request.SockRequest("POST", "/containers/"+name+"/start", config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusBadRequest) c.Assert(string(body), checker.Contains, "was deprecated since v1.10") @@ -41,15 +42,15 @@ func (s *DockerSuite) TestDeprecatedContainerAPIStartVolumeBinds(c *check.C) { "Volumes": map[string]struct{}{path: {}}, } - status, _, err := sockRequest("POST", formatV123StartAPIURL("/containers/create?name="+name), config) + status, _, err := request.SockRequest("POST", formatV123StartAPIURL("/containers/create?name="+name), config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) - bindPath := integration.RandomTmpDirPath("test", daemonPlatform) + bindPath := testutil.RandomTmpDirPath("test", daemonPlatform) config = map[string]interface{}{ "Binds": []string{bindPath + ":" + path}, } - status, _, err = sockRequest("POST", formatV123StartAPIURL("/containers/"+name+"/start"), config) + status, _, err = request.SockRequest("POST", formatV123StartAPIURL("/containers/"+name+"/start"), config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) @@ -68,17 +69,17 @@ func (s *DockerSuite) TestDeprecatedContainerAPIStartDupVolumeBinds(c *check.C) "Volumes": map[string]struct{}{"/tmp": {}}, } - status, _, err := sockRequest("POST", formatV123StartAPIURL("/containers/create?name="+name), config) + status, _, err := request.SockRequest("POST", formatV123StartAPIURL("/containers/create?name="+name), config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) - bindPath1 := integration.RandomTmpDirPath("test1", daemonPlatform) - bindPath2 := integration.RandomTmpDirPath("test2", daemonPlatform) + bindPath1 := testutil.RandomTmpDirPath("test1", daemonPlatform) + bindPath2 := testutil.RandomTmpDirPath("test2", daemonPlatform) config = map[string]interface{}{ "Binds": []string{bindPath1 + ":/tmp", bindPath2 + ":/tmp"}, } - status, body, err := sockRequest("POST", formatV123StartAPIURL("/containers/"+name+"/start"), config) + status, body, err := request.SockRequest("POST", formatV123StartAPIURL("/containers/"+name+"/start"), config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusInternalServerError) c.Assert(string(body), checker.Contains, "Duplicate mount point", check.Commentf("Expected failure due to duplicate bind mounts to same path, instead got: %q with error: %v", string(body), err)) @@ -98,14 +99,14 @@ func (s *DockerSuite) TestDeprecatedContainerAPIStartVolumesFrom(c *check.C) { "Volumes": map[string]struct{}{volPath: {}}, } - status, _, err := sockRequest("POST", formatV123StartAPIURL("/containers/create?name="+name), config) + status, _, err := request.SockRequest("POST", formatV123StartAPIURL("/containers/create?name="+name), config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusCreated) config = map[string]interface{}{ "VolumesFrom": []string{volName}, } - status, _, err = sockRequest("POST", formatV123StartAPIURL("/containers/"+name+"/start"), config) + status, _, err = request.SockRequest("POST", formatV123StartAPIURL("/containers/"+name+"/start"), config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) @@ -128,7 +129,7 @@ func (s *DockerSuite) TestDeprecatedPostContainerBindNormalVolume(c *check.C) { dockerCmd(c, "create", "-v", "/foo", "--name=two", "busybox") bindSpec := map[string][]string{"Binds": {fooDir + ":/foo"}} - status, _, err := sockRequest("POST", formatV123StartAPIURL("/containers/two/start"), bindSpec) + status, _, err := request.SockRequest("POST", formatV123StartAPIURL("/containers/two/start"), bindSpec, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(status, checker.Equals, http.StatusNoContent) @@ -149,9 +150,9 @@ func (s *DockerSuite) TestDeprecatedStartWithTooLowMemoryLimit(c *check.C) { "Memory": 524287 }` - res, body, err := sockRequestRaw("POST", formatV123StartAPIURL("/containers/"+containerID+"/start"), strings.NewReader(config), "application/json") + res, body, err := request.SockRequestRaw("POST", formatV123StartAPIURL("/containers/"+containerID+"/start"), strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) - b, err2 := integration.ReadBody(body) + b, err2 := testutil.ReadBody(body) c.Assert(err2, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusInternalServerError) c.Assert(string(b), checker.Contains, "Minimum memory limit allowed is 4MB") @@ -168,7 +169,7 @@ func (s *DockerSuite) TestDeprecatedPostContainersStartWithoutLinksInHostConfig( hc := inspectFieldJSON(c, name, "HostConfig") config := `{"HostConfig":` + hc + `}` - res, b, err := sockRequestRaw("POST", formatV123StartAPIURL("/containers/"+name+"/start"), strings.NewReader(config), "application/json") + res, b, err := request.SockRequestRaw("POST", formatV123StartAPIURL("/containers/"+name+"/start"), strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusNoContent) b.Close() @@ -186,7 +187,7 @@ func (s *DockerSuite) TestDeprecatedPostContainersStartWithLinksInHostConfig(c * hc := inspectFieldJSON(c, name, "HostConfig") config := `{"HostConfig":` + hc + `}` - res, b, err := sockRequestRaw("POST", formatV123StartAPIURL("/containers/"+name+"/start"), strings.NewReader(config), "application/json") + res, b, err := request.SockRequestRaw("POST", formatV123StartAPIURL("/containers/"+name+"/start"), strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusNoContent) b.Close() @@ -204,7 +205,7 @@ func (s *DockerSuite) TestDeprecatedPostContainersStartWithLinksInHostConfigIdLi hc := inspectFieldJSON(c, name, "HostConfig") config := `{"HostConfig":` + hc + `}` - res, b, err := sockRequestRaw("POST", formatV123StartAPIURL("/containers/"+name+"/start"), strings.NewReader(config), "application/json") + res, b, err := request.SockRequestRaw("POST", formatV123StartAPIURL("/containers/"+name+"/start"), strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusNoContent) b.Close() @@ -218,7 +219,7 @@ func (s *DockerSuite) TestDeprecatedStartWithNilDNS(c *check.C) { config := `{"HostConfig": {"Dns": null}}` - res, b, err := sockRequestRaw("POST", formatV123StartAPIURL("/containers/"+containerID+"/start"), strings.NewReader(config), "application/json") + res, b, err := request.SockRequestRaw("POST", formatV123StartAPIURL("/containers/"+containerID+"/start"), strings.NewReader(config), "application/json", daemonHost()) c.Assert(err, checker.IsNil) c.Assert(res.StatusCode, checker.Equals, http.StatusNoContent) b.Close() diff --git a/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_unix_test.go b/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_unix_test.go index 94ef9b1a0..5fc6c2ddf 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_unix_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_deprecated_api_v124_unix_test.go @@ -5,7 +5,8 @@ package main import ( "fmt" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + "github.com/docker/docker/integration-cli/request" "github.com/go-check/check" ) @@ -21,7 +22,7 @@ func (s *DockerNetworkSuite) TestDeprecatedDockerNetworkStartAPIWithHostconfig(c "NetworkMode": netName, }, } - _, _, err := sockRequest("POST", formatV123StartAPIURL("/containers/"+conName+"/start"), config) + _, _, err := request.SockRequest("POST", formatV123StartAPIURL("/containers/"+conName+"/start"), config, daemonHost()) c.Assert(err, checker.IsNil) c.Assert(waitRun(conName), checker.IsNil) networks := inspectField(c, conName, "NetworkSettings.Networks") diff --git a/vendor/github.com/docker/docker/integration-cli/docker_experimental_network_test.go b/vendor/github.com/docker/docker/integration-cli/docker_experimental_network_test.go index 70b3851f5..31ad7adf4 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_experimental_network_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_experimental_network_test.go @@ -3,13 +3,12 @@ package main import ( - "os/exec" "strings" "time" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/pkg/parsers/kernel" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -48,8 +47,7 @@ func (s *DockerNetworkSuite) TestDockerNetworkMacvlanPersistance(c *check.C) { // master dummy interface 'dm' abbreviation represents 'docker macvlan' master := "dm-dummy0" // simulate the master link the vlan tagged subinterface parent link will use - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) + createMasterDummy(c, master) // create a network specifying the desired sub-interface name dockerCmd(c, "network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.60", "dm-persist") assertNwIsAvailable(c, "dm-persist") @@ -67,8 +65,7 @@ func (s *DockerNetworkSuite) TestDockerNetworkIpvlanPersistance(c *check.C) { // master dummy interface 'di' notation represent 'docker ipvlan' master := "di-dummy0" // simulate the master link the vlan tagged subinterface parent link will use - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) + createMasterDummy(c, master) // create a network specifying the desired sub-interface name dockerCmd(c, "network", "create", "--driver=ipvlan", "-o", "parent=di-dummy0.70", "di-persist") assertNwIsAvailable(c, "di-persist") @@ -86,8 +83,7 @@ func (s *DockerNetworkSuite) TestDockerNetworkMacvlanSubIntCreate(c *check.C) { // master dummy interface 'dm' abbreviation represents 'docker macvlan' master := "dm-dummy0" // simulate the master link the vlan tagged subinterface parent link will use - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) + createMasterDummy(c, master) // create a network specifying the desired sub-interface name dockerCmd(c, "network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.50", "dm-subinterface") assertNwIsAvailable(c, "dm-subinterface") @@ -101,8 +97,7 @@ func (s *DockerNetworkSuite) TestDockerNetworkIpvlanSubIntCreate(c *check.C) { // master dummy interface 'dm' abbreviation represents 'docker ipvlan' master := "di-dummy0" // simulate the master link the vlan tagged subinterface parent link will use - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) + createMasterDummy(c, master) // create a network specifying the desired sub-interface name dockerCmd(c, "network", "create", "--driver=ipvlan", "-o", "parent=di-dummy0.60", "di-subinterface") assertNwIsAvailable(c, "di-subinterface") @@ -115,17 +110,15 @@ func (s *DockerNetworkSuite) TestDockerNetworkMacvlanOverlapParent(c *check.C) { testRequires(c, DaemonIsLinux, macvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) // master dummy interface 'dm' abbreviation represents 'docker macvlan' master := "dm-dummy0" - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = createVlanInterface(c, master, "dm-dummy0.40", "40") - c.Assert(err, check.IsNil, check.Commentf(out)) + createMasterDummy(c, master) + createVlanInterface(c, master, "dm-dummy0.40", "40") // create a network using an existing parent interface dockerCmd(c, "network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.40", "dm-subinterface") assertNwIsAvailable(c, "dm-subinterface") // attempt to create another network using the same parent iface that should fail - out, _, err = dockerCmdWithError("network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.40", "dm-parent-net-overlap") + out, _, err := dockerCmdWithError("network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.40", "dm-parent-net-overlap") // verify that the overlap returns an error - c.Assert(err, check.NotNil) + c.Assert(err, check.NotNil, check.Commentf(out)) // cleanup the master interface which also collects the slave dev deleteInterface(c, "dm-dummy0") } @@ -135,17 +128,15 @@ func (s *DockerNetworkSuite) TestDockerNetworkIpvlanOverlapParent(c *check.C) { testRequires(c, DaemonIsLinux, ipvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) // master dummy interface 'dm' abbreviation represents 'docker ipvlan' master := "di-dummy0" - out, err := createMasterDummy(c, master) - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = createVlanInterface(c, master, "di-dummy0.30", "30") - c.Assert(err, check.IsNil, check.Commentf(out)) + createMasterDummy(c, master) + createVlanInterface(c, master, "di-dummy0.30", "30") // create a network using an existing parent interface dockerCmd(c, "network", "create", "--driver=ipvlan", "-o", "parent=di-dummy0.30", "di-subinterface") assertNwIsAvailable(c, "di-subinterface") // attempt to create another network using the same parent iface that should fail - out, _, err = dockerCmdWithError("network", "create", "--driver=ipvlan", "-o", "parent=di-dummy0.30", "di-parent-net-overlap") + out, _, err := dockerCmdWithError("network", "create", "--driver=ipvlan", "-o", "parent=di-dummy0.30", "di-parent-net-overlap") // verify that the overlap returns an error - c.Assert(err, check.NotNil) + c.Assert(err, check.NotNil, check.Commentf(out)) // cleanup the master interface which also collects the slave dev deleteInterface(c, "di-dummy0") } @@ -488,9 +479,8 @@ func (s *DockerSuite) TestDockerNetworkMacVlanExistingParent(c *check.C) { // macvlan bridge mode - empty parent interface containers can reach each other internally but not externally testRequires(c, DaemonIsLinux, macvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) netName := "dm-parent-exists" - out, err := createMasterDummy(c, "dm-dummy0") + createMasterDummy(c, "dm-dummy0") //out, err := createVlanInterface(c, "dm-parent", "dm-slave", "macvlan", "bridge") - c.Assert(err, check.IsNil, check.Commentf(out)) // create a network using an existing parent interface dockerCmd(c, "network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0", netName) assertNwIsAvailable(c, netName) @@ -498,20 +488,16 @@ func (s *DockerSuite) TestDockerNetworkMacVlanExistingParent(c *check.C) { dockerCmd(c, "network", "rm", netName) assertNwNotAvailable(c, netName) // verify the network delete did not delete the predefined link - out, err = linkExists(c, "dm-dummy0") - c.Assert(err, check.IsNil, check.Commentf(out)) + linkExists(c, "dm-dummy0") deleteInterface(c, "dm-dummy0") - c.Assert(err, check.IsNil, check.Commentf(out)) } func (s *DockerSuite) TestDockerNetworkMacVlanSubinterface(c *check.C) { // macvlan bridge mode - empty parent interface containers can reach each other internally but not externally testRequires(c, DaemonIsLinux, macvlanKernelSupport, NotUserNamespace, NotArm, ExperimentalDaemon) netName := "dm-subinterface" - out, err := createMasterDummy(c, "dm-dummy0") - c.Assert(err, check.IsNil, check.Commentf(out)) - out, err = createVlanInterface(c, "dm-dummy0", "dm-dummy0.20", "20") - c.Assert(err, check.IsNil, check.Commentf(out)) + createMasterDummy(c, "dm-dummy0") + createVlanInterface(c, "dm-dummy0", "dm-dummy0.20", "20") // create a network using an existing parent interface dockerCmd(c, "network", "create", "--driver=macvlan", "-o", "parent=dm-dummy0.20", netName) assertNwIsAvailable(c, netName) @@ -522,7 +508,7 @@ func (s *DockerSuite) TestDockerNetworkMacVlanSubinterface(c *check.C) { dockerCmd(c, "run", "-d", "--net=dm-subinterface", "--name=second", "busybox", "top") c.Assert(waitRun("second"), check.IsNil) // verify containers can communicate - _, _, err = dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") + _, _, err := dockerCmdWithError("exec", "second", "ping", "-c", "1", "first") c.Assert(err, check.IsNil) // remove the containers @@ -532,56 +518,25 @@ func (s *DockerSuite) TestDockerNetworkMacVlanSubinterface(c *check.C) { dockerCmd(c, "network", "rm", netName) assertNwNotAvailable(c, netName) // verify the network delete did not delete the predefined sub-interface - out, err = linkExists(c, "dm-dummy0.20") - c.Assert(err, check.IsNil, check.Commentf(out)) + linkExists(c, "dm-dummy0.20") // delete the parent interface which also collects the slave deleteInterface(c, "dm-dummy0") - c.Assert(err, check.IsNil, check.Commentf(out)) } -func createMasterDummy(c *check.C, master string) (string, error) { +func createMasterDummy(c *check.C, master string) { // ip link add type dummy - args := []string{"link", "add", master, "type", "dummy"} - ipLinkCmd := exec.Command("ip", args...) - out, _, err := runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - // ip link set dummy_name up - args = []string{"link", "set", master, "up"} - ipLinkCmd = exec.Command("ip", args...) - out, _, err = runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - return out, err + icmd.RunCommand("ip", "link", "add", master, "type", "dummy").Assert(c, icmd.Success) + icmd.RunCommand("ip", "link", "set", master, "up").Assert(c, icmd.Success) } -func createVlanInterface(c *check.C, master, slave, id string) (string, error) { +func createVlanInterface(c *check.C, master, slave, id string) { // ip link add link name . type vlan id - args := []string{"link", "add", "link", master, "name", slave, "type", "vlan", "id", id} - ipLinkCmd := exec.Command("ip", args...) - out, _, err := runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } + icmd.RunCommand("ip", "link", "add", "link", master, "name", slave, "type", "vlan", "id", id).Assert(c, icmd.Success) // ip link set up - args = []string{"link", "set", slave, "up"} - ipLinkCmd = exec.Command("ip", args...) - out, _, err = runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - return out, err + icmd.RunCommand("ip", "link", "set", slave, "up").Assert(c, icmd.Success) } -func linkExists(c *check.C, master string) (string, error) { +func linkExists(c *check.C, master string) { // verify the specified link exists, ip link show - args := []string{"link", "show", master} - ipLinkCmd := exec.Command("ip", args...) - out, _, err := runCommandWithOutput(ipLinkCmd) - if err != nil { - return out, err - } - return out, err + icmd.RunCommand("ip", "link", "show", master).Assert(c, icmd.Success) } diff --git a/vendor/github.com/docker/docker/integration-cli/docker_hub_pull_suite_test.go b/vendor/github.com/docker/docker/integration-cli/docker_hub_pull_suite_test.go index 475c371c5..a01c3d44a 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_hub_pull_suite_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_hub_pull_suite_test.go @@ -5,8 +5,8 @@ import ( "runtime" "strings" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" - "github.com/docker/docker/pkg/integration/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/docker_utils_test.go b/vendor/github.com/docker/docker/integration-cli/docker_utils_test.go index 90939dc7c..3fd08077b 100644 --- a/vendor/github.com/docker/docker/integration-cli/docker_utils_test.go +++ b/vendor/github.com/docker/docker/integration-cli/docker_utils_test.go @@ -1,7 +1,6 @@ package main import ( - "bufio" "bytes" "encoding/json" "errors" @@ -11,7 +10,6 @@ import ( "net" "net/http" "net/http/httptest" - "net/http/httputil" "net/url" "os" "os/exec" @@ -23,13 +21,13 @@ import ( "github.com/docker/docker/api/types" volumetypes "github.com/docker/docker/api/types/volume" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/daemon" + "github.com/docker/docker/integration-cli/registry" + "github.com/docker/docker/integration-cli/request" "github.com/docker/docker/opts" - "github.com/docker/docker/pkg/integration" - "github.com/docker/docker/pkg/integration/checker" - icmd "github.com/docker/docker/pkg/integration/cmd" - "github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/stringutils" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/go-check/check" ) @@ -41,84 +39,16 @@ func daemonHost() string { return daemonURLStr } -// FIXME(vdemeester) should probably completely move to daemon struct/methods -func sockConn(timeout time.Duration, daemonStr string) (net.Conn, error) { - if daemonStr == "" { - daemonStr = daemonHost() - } - return daemon.SockConn(timeout, daemonStr) -} - -func sockRequest(method, endpoint string, data interface{}) (int, []byte, error) { - jsonData := bytes.NewBuffer(nil) - if err := json.NewEncoder(jsonData).Encode(data); err != nil { - return -1, nil, err - } - - res, body, err := sockRequestRaw(method, endpoint, jsonData, "application/json") - if err != nil { - return -1, nil, err - } - b, err := integration.ReadBody(body) - return res.StatusCode, b, err -} - -func sockRequestRaw(method, endpoint string, data io.Reader, ct string) (*http.Response, io.ReadCloser, error) { - return sockRequestRawToDaemon(method, endpoint, data, ct, "") -} - -func sockRequestRawToDaemon(method, endpoint string, data io.Reader, ct, daemon string) (*http.Response, io.ReadCloser, error) { - req, client, err := newRequestClient(method, endpoint, data, ct, daemon) - if err != nil { - return nil, nil, err - } - - resp, err := client.Do(req) - if err != nil { - client.Close() - return nil, nil, err - } - body := ioutils.NewReadCloserWrapper(resp.Body, func() error { - defer resp.Body.Close() - return client.Close() - }) - - return resp, body, nil -} - -func sockRequestHijack(method, endpoint string, data io.Reader, ct string) (net.Conn, *bufio.Reader, error) { - req, client, err := newRequestClient(method, endpoint, data, ct, "") - if err != nil { - return nil, nil, err - } - - client.Do(req) - conn, br := client.Hijack() - return conn, br, nil -} - -func newRequestClient(method, endpoint string, data io.Reader, ct, daemon string) (*http.Request, *httputil.ClientConn, error) { - c, err := sockConn(time.Duration(10*time.Second), daemon) - if err != nil { - return nil, nil, fmt.Errorf("could not dial docker daemon: %v", err) - } - - client := httputil.NewClientConn(c, nil) - - req, err := http.NewRequest(method, endpoint, data) - if err != nil { - client.Close() - return nil, nil, fmt.Errorf("could not create new request: %v", err) - } - - if ct != "" { - req.Header.Set("Content-Type", ct) - } - return req, client, nil -} - -func deleteContainer(container ...string) error { +// FIXME(vdemeester) move this away are remove ignoreNoSuchContainer bool +func deleteContainer(ignoreNoSuchContainer bool, container ...string) error { result := icmd.RunCommand(dockerBinary, append([]string{"rm", "-fv"}, container...)...) + if ignoreNoSuchContainer && result.Error != nil { + // If the error is "No such container: ..." this means the container doesn't exists anymore, + // we can safely ignore that one. + if strings.Contains(result.Stderr(), "No such container") { + return nil + } + } return result.Compare(icmd.Success) } @@ -137,7 +67,7 @@ func deleteAllContainers(c *check.C) { c.Assert(err, checker.IsNil, check.Commentf("containers: %v", containers)) if containers != "" { - err = deleteContainer(strings.Split(strings.TrimSpace(containers), "\n")...) + err = deleteContainer(true, strings.Split(strings.TrimSpace(containers), "\n")...) c.Assert(err, checker.IsNil) } } @@ -154,7 +84,7 @@ func deleteAllNetworks(c *check.C) { // nat is a pre-defined network on Windows and cannot be removed continue } - status, b, err := sockRequest("DELETE", "/networks/"+n.Name, nil) + status, b, err := request.SockRequest("DELETE", "/networks/"+n.Name, nil, daemonHost()) if err != nil { errs = append(errs, err.Error()) continue @@ -168,7 +98,7 @@ func deleteAllNetworks(c *check.C) { func getAllNetworks() ([]types.NetworkResource, error) { var networks []types.NetworkResource - _, b, err := sockRequest("GET", "/networks", nil) + _, b, err := request.SockRequest("GET", "/networks", nil, daemonHost()) if err != nil { return nil, err } @@ -184,7 +114,7 @@ func deleteAllPlugins(c *check.C) { var errs []string for _, p := range plugins { pluginName := p.Name - status, b, err := sockRequest("DELETE", "/plugins/"+pluginName+"?force=1", nil) + status, b, err := request.SockRequest("DELETE", "/plugins/"+pluginName+"?force=1", nil, daemonHost()) if err != nil { errs = append(errs, err.Error()) continue @@ -198,7 +128,7 @@ func deleteAllPlugins(c *check.C) { func getAllPlugins() (types.PluginsListResponse, error) { var plugins types.PluginsListResponse - _, b, err := sockRequest("GET", "/plugins", nil) + _, b, err := request.SockRequest("GET", "/plugins", nil, daemonHost()) if err != nil { return nil, err } @@ -213,7 +143,7 @@ func deleteAllVolumes(c *check.C) { c.Assert(err, checker.IsNil) var errs []string for _, v := range volumes { - status, b, err := sockRequest("DELETE", "/volumes/"+v.Name, nil) + status, b, err := request.SockRequest("DELETE", "/volumes/"+v.Name, nil, daemonHost()) if err != nil { errs = append(errs, err.Error()) continue @@ -227,7 +157,7 @@ func deleteAllVolumes(c *check.C) { func getAllVolumes() ([]*types.Volume, error) { var volumes volumetypes.VolumesListOKBody - _, b, err := sockRequest("GET", "/volumes", nil) + _, b, err := request.SockRequest("GET", "/volumes", nil, daemonHost()) if err != nil { return nil, err } @@ -595,7 +525,7 @@ func (f *remoteFileServer) Close() error { if f.container == "" { return nil } - return deleteContainer(f.container) + return deleteContainer(false, f.container) } func newRemoteFileServer(ctx *FakeContext) (*remoteFileServer, error) { @@ -809,10 +739,12 @@ func buildImageFromContextWithOut(name string, ctx *FakeContext, useCache bool, } args = append(args, buildFlags...) args = append(args, ".") - buildCmd := exec.Command(dockerBinary, args...) - buildCmd.Dir = ctx.Dir - out, exitCode, err := runCommandWithOutput(buildCmd) - if err != nil || exitCode != 0 { + result := icmd.RunCmd(icmd.Cmd{ + Command: append([]string{dockerBinary}, args...), + Dir: ctx.Dir, + }) + out := result.Combined() + if result.Error != nil || result.ExitCode != 0 { return "", "", fmt.Errorf("failed to build the image: %s", out) } id, err := getIDByName(name) @@ -1057,7 +989,7 @@ func daemonTime(c *check.C) time.Time { return time.Now() } - status, body, err := sockRequest("GET", "/info", nil) + status, body, err := request.SockRequest("GET", "/info", nil, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusOK) @@ -1083,8 +1015,8 @@ func parseEventTime(t time.Time) string { return fmt.Sprintf("%d.%09d", t.Unix(), int64(t.Nanosecond())) } -func setupRegistry(c *check.C, schema1 bool, auth, tokenURL string) *testRegistryV2 { - reg, err := newTestRegistryV2(c, schema1, auth, tokenURL) +func setupRegistry(c *check.C, schema1 bool, auth, tokenURL string) *registry.V2 { + reg, err := registry.NewV2(schema1, auth, tokenURL, privateRegistryURL) c.Assert(err, check.IsNil) // Wait for registry to be ready to serve requests. @@ -1183,7 +1115,7 @@ func waitInspectWithArgs(name, expr, expected string, timeout time.Duration, arg func getInspectBody(c *check.C, version, id string) []byte { endpoint := fmt.Sprintf("/%s/containers/%s/json", version, id) - status, body, err := sockRequest("GET", endpoint, nil) + status, body, err := request.SockRequest("GET", endpoint, nil, daemonHost()) c.Assert(err, check.IsNil) c.Assert(status, check.Equals, http.StatusOK) return body @@ -1215,7 +1147,7 @@ func getGoroutineNumber() (int, error) { i := struct { NGoroutines int }{} - status, b, err := sockRequest("GET", "/info", nil) + status, b, err := request.SockRequest("GET", "/info", nil, daemonHost()) if err != nil { return 0, err } diff --git a/vendor/github.com/docker/docker/integration-cli/environment/environment.go b/vendor/github.com/docker/docker/integration-cli/environment/environment.go index 895ebcc17..6ae24ce80 100644 --- a/vendor/github.com/docker/docker/integration-cli/environment/environment.go +++ b/vendor/github.com/docker/docker/integration-cli/environment/environment.go @@ -169,16 +169,20 @@ func (e *Execution) MinimalBaseImage() string { return e.baseImage } -// DaemonKernelVersion is the kernel version of the daemon +// DaemonKernelVersion is the kernel version of the daemon as a string, as returned +// by an INFO call to the daemon. func (e *Execution) DaemonKernelVersion() string { return e.daemonKernelVersion } -// WindowsKernelVersion is used on Windows to distinguish between different -// versions. This is necessary to enable certain tests based on whether -// the platform supports it. For example, Windows Server 2016 TP3 did -// not support volumes, but TP4 did. -func WindowsKernelVersion(kernelVersion string) int { - winKV, _ := strconv.Atoi(strings.Split(kernelVersion, " ")[1]) - return winKV +// DaemonKernelVersionNumeric is the kernel version of the daemon as an integer. +// Mostly useful on Windows where DaemonKernelVersion holds the full string such +// as `10.0 14393 (14393.447.amd64fre.rs1_release_inmarket.161102-0100)`, but +// integration tests really only need the `14393` piece to make decisions. +func (e *Execution) DaemonKernelVersionNumeric() int { + if e.daemonPlatform != "windows" { + return -1 + } + v, _ := strconv.Atoi(strings.Split(e.daemonKernelVersion, " ")[1]) + return v } diff --git a/vendor/github.com/docker/docker/integration-cli/events_utils_test.go b/vendor/github.com/docker/docker/integration-cli/events_utils_test.go index ba241796b..9350edcb9 100644 --- a/vendor/github.com/docker/docker/integration-cli/events_utils_test.go +++ b/vendor/github.com/docker/docker/integration-cli/events_utils_test.go @@ -11,7 +11,7 @@ import ( "github.com/Sirupsen/logrus" eventstestutils "github.com/docker/docker/daemon/events/testutils" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/fixtures_linux_daemon_test.go b/vendor/github.com/docker/docker/integration-cli/fixtures_linux_daemon_test.go index 58aedfaf3..63956dbfb 100644 --- a/vendor/github.com/docker/docker/integration-cli/fixtures_linux_daemon_test.go +++ b/vendor/github.com/docker/docker/integration-cli/fixtures_linux_daemon_test.go @@ -10,8 +10,8 @@ import ( "strings" "sync" + "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/integration-cli/fixtures/load" - "github.com/docker/docker/pkg/integration/checker" "github.com/go-check/check" ) diff --git a/vendor/github.com/docker/docker/integration-cli/registry_test.go b/vendor/github.com/docker/docker/integration-cli/registry/registry.go similarity index 53% rename from vendor/github.com/docker/docker/integration-cli/registry_test.go rename to vendor/github.com/docker/docker/integration-cli/registry/registry.go index 5181570af..800fdd1a3 100644 --- a/vendor/github.com/docker/docker/integration-cli/registry_test.go +++ b/vendor/github.com/docker/docker/integration-cli/registry/registry.go @@ -1,4 +1,4 @@ -package main +package registry import ( "fmt" @@ -8,8 +8,7 @@ import ( "os/exec" "path/filepath" - "github.com/docker/distribution/digest" - "github.com/go-check/check" + "github.com/opencontainers/go-digest" ) const ( @@ -17,16 +16,29 @@ const ( v2binarySchema1 = "registry-v2-schema1" ) -type testRegistryV2 struct { - cmd *exec.Cmd - dir string - auth string - username string - password string - email string +type testingT interface { + logT + Fatal(...interface{}) + Fatalf(string, ...interface{}) } -func newTestRegistryV2(c *check.C, schema1 bool, auth, tokenURL string) (*testRegistryV2, error) { +type logT interface { + Logf(string, ...interface{}) +} + +// V2 represent a registry version 2 +type V2 struct { + cmd *exec.Cmd + registryURL string + dir string + auth string + username string + password string + email string +} + +// NewV2 creates a v2 registry server +func NewV2(schema1 bool, auth, tokenURL, registryURL string) (*V2, error) { tmp, err := ioutil.TempDir("", "registry-test-") if err != nil { return nil, err @@ -78,7 +90,7 @@ http: } defer config.Close() - if _, err := fmt.Fprintf(config, template, tmp, privateRegistryURL, authTemplate); err != nil { + if _, err := fmt.Fprintf(config, template, tmp, registryURL, authTemplate); err != nil { os.RemoveAll(tmp) return nil, err } @@ -90,31 +102,30 @@ http: cmd := exec.Command(binary, confPath) if err := cmd.Start(); err != nil { os.RemoveAll(tmp) - if os.IsNotExist(err) { - c.Skip(err.Error()) - } return nil, err } - return &testRegistryV2{ - cmd: cmd, - dir: tmp, - auth: auth, - username: username, - password: password, - email: email, + return &V2{ + cmd: cmd, + dir: tmp, + auth: auth, + username: username, + password: password, + email: email, + registryURL: registryURL, }, nil } -func (t *testRegistryV2) Ping() error { +// Ping sends an http request to the current registry, and fail if it doesn't respond correctly +func (r *V2) Ping() error { // We always ping through HTTP for our test registry. - resp, err := http.Get(fmt.Sprintf("http://%s/v2/", privateRegistryURL)) + resp, err := http.Get(fmt.Sprintf("http://%s/v2/", r.registryURL)) if err != nil { return err } resp.Body.Close() fail := resp.StatusCode != http.StatusOK - if t.auth != "" { + if r.auth != "" { // unauthorized is a _good_ status when pinging v2/ and it needs auth fail = fail && resp.StatusCode != http.StatusUnauthorized } @@ -124,50 +135,55 @@ func (t *testRegistryV2) Ping() error { return nil } -func (t *testRegistryV2) Close() { - t.cmd.Process.Kill() - os.RemoveAll(t.dir) +// Close kills the registry server +func (r *V2) Close() { + r.cmd.Process.Kill() + os.RemoveAll(r.dir) } -func (t *testRegistryV2) getBlobFilename(blobDigest digest.Digest) string { +func (r *V2) getBlobFilename(blobDigest digest.Digest) string { // Split the digest into its algorithm and hex components. dgstAlg, dgstHex := blobDigest.Algorithm(), blobDigest.Hex() // The path to the target blob data looks something like: // baseDir + "docker/registry/v2/blobs/sha256/a3/a3ed...46d4/data" - return fmt.Sprintf("%s/docker/registry/v2/blobs/%s/%s/%s/data", t.dir, dgstAlg, dgstHex[:2], dgstHex) + return fmt.Sprintf("%s/docker/registry/v2/blobs/%s/%s/%s/data", r.dir, dgstAlg, dgstHex[:2], dgstHex) } -func (t *testRegistryV2) readBlobContents(c *check.C, blobDigest digest.Digest) []byte { +// ReadBlobContents read the file corresponding to the specified digest +func (r *V2) ReadBlobContents(t testingT, blobDigest digest.Digest) []byte { // Load the target manifest blob. - manifestBlob, err := ioutil.ReadFile(t.getBlobFilename(blobDigest)) + manifestBlob, err := ioutil.ReadFile(r.getBlobFilename(blobDigest)) if err != nil { - c.Fatalf("unable to read blob: %s", err) + t.Fatalf("unable to read blob: %s", err) } return manifestBlob } -func (t *testRegistryV2) writeBlobContents(c *check.C, blobDigest digest.Digest, data []byte) { - if err := ioutil.WriteFile(t.getBlobFilename(blobDigest), data, os.FileMode(0644)); err != nil { - c.Fatalf("unable to write malicious data blob: %s", err) +// WriteBlobContents write the file corresponding to the specified digest with the given content +func (r *V2) WriteBlobContents(t testingT, blobDigest digest.Digest, data []byte) { + if err := ioutil.WriteFile(r.getBlobFilename(blobDigest), data, os.FileMode(0644)); err != nil { + t.Fatalf("unable to write malicious data blob: %s", err) } } -func (t *testRegistryV2) tempMoveBlobData(c *check.C, blobDigest digest.Digest) (undo func()) { +// TempMoveBlobData moves the existing data file aside, so that we can replace it with a +// malicious blob of data for example. +func (r *V2) TempMoveBlobData(t testingT, blobDigest digest.Digest) (undo func()) { tempFile, err := ioutil.TempFile("", "registry-temp-blob-") if err != nil { - c.Fatalf("unable to get temporary blob file: %s", err) + t.Fatalf("unable to get temporary blob file: %s", err) } tempFile.Close() - blobFilename := t.getBlobFilename(blobDigest) + blobFilename := r.getBlobFilename(blobDigest) // Move the existing data file aside, so that we can replace it with a // another blob of data. if err := os.Rename(blobFilename, tempFile.Name()); err != nil { os.Remove(tempFile.Name()) - c.Fatalf("unable to move data blob: %s", err) + t.Fatalf("unable to move data blob: %s", err) } return func() { @@ -175,3 +191,18 @@ func (t *testRegistryV2) tempMoveBlobData(c *check.C, blobDigest digest.Digest) os.Remove(tempFile.Name()) } } + +// Username returns the configured user name of the server +func (r *V2) Username() string { + return r.username +} + +// Password returns the configured password of the server +func (r *V2) Password() string { + return r.password +} + +// Path returns the path where the registry write data +func (r *V2) Path() string { + return filepath.Join(r.dir, "docker", "registry", "v2") +} diff --git a/vendor/github.com/docker/docker/integration-cli/registry_mock_test.go b/vendor/github.com/docker/docker/integration-cli/registry/registry_mock.go similarity index 59% rename from vendor/github.com/docker/docker/integration-cli/registry_mock_test.go rename to vendor/github.com/docker/docker/integration-cli/registry/registry_mock.go index 300bf4642..5d1980f81 100644 --- a/vendor/github.com/docker/docker/integration-cli/registry_mock_test.go +++ b/vendor/github.com/docker/docker/integration-cli/registry/registry_mock.go @@ -1,4 +1,4 @@ -package main +package registry import ( "net/http" @@ -6,27 +6,28 @@ import ( "regexp" "strings" "sync" - - "github.com/go-check/check" ) type handlerFunc func(w http.ResponseWriter, r *http.Request) -type testRegistry struct { +// Mock represent a registry mock +type Mock struct { server *httptest.Server hostport string handlers map[string]handlerFunc mu sync.Mutex } -func (tr *testRegistry) registerHandler(path string, h handlerFunc) { +// RegisterHandler register the specified handler for the registry mock +func (tr *Mock) RegisterHandler(path string, h handlerFunc) { tr.mu.Lock() defer tr.mu.Unlock() tr.handlers[path] = h } -func newTestRegistry(c *check.C) (*testRegistry, error) { - testReg := &testRegistry{handlers: make(map[string]handlerFunc)} +// NewMock creates a registry mock +func NewMock(t testingT) (*Mock, error) { + testReg := &Mock{handlers: make(map[string]handlerFunc)} ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { url := r.URL.String() @@ -36,7 +37,7 @@ func newTestRegistry(c *check.C) (*testRegistry, error) { for re, function := range testReg.handlers { matched, err = regexp.MatchString(re, url) if err != nil { - c.Fatal("Error with handler regexp") + t.Fatal("Error with handler regexp") } if matched { function(w, r) @@ -45,7 +46,7 @@ func newTestRegistry(c *check.C) (*testRegistry, error) { } if !matched { - c.Fatalf("Unable to match %s with regexp", url) + t.Fatalf("Unable to match %s with regexp", url) } })) @@ -53,3 +54,8 @@ func newTestRegistry(c *check.C) (*testRegistry, error) { testReg.hostport = strings.Replace(ts.URL, "http://", "", 1) return testReg, nil } + +// URL returns the url of the registry +func (tr *Mock) URL() string { + return tr.hostport +} diff --git a/vendor/github.com/docker/docker/integration-cli/registry/requirement.go b/vendor/github.com/docker/docker/integration-cli/registry/requirement.go new file mode 100644 index 000000000..cde48da47 --- /dev/null +++ b/vendor/github.com/docker/docker/integration-cli/registry/requirement.go @@ -0,0 +1,12 @@ +package registry + +import "os/exec" + +// Hosting returns wether the host can host a registry (v2) or not +func Hosting() bool { + // for now registry binary is built only if we're running inside + // container through `make test`. Figure that out by testing if + // registry binary is in PATH. + _, err := exec.LookPath(v2binary) + return err == nil +} diff --git a/vendor/github.com/docker/docker/integration-cli/daemon/npipe.go b/vendor/github.com/docker/docker/integration-cli/request/npipe.go similarity index 91% rename from vendor/github.com/docker/docker/integration-cli/daemon/npipe.go rename to vendor/github.com/docker/docker/integration-cli/request/npipe.go index 4e164aae4..e6ab03945 100644 --- a/vendor/github.com/docker/docker/integration-cli/daemon/npipe.go +++ b/vendor/github.com/docker/docker/integration-cli/request/npipe.go @@ -1,6 +1,6 @@ // +build !windows -package daemon +package request import ( "net" diff --git a/vendor/github.com/docker/docker/integration-cli/daemon/npipe_windows.go b/vendor/github.com/docker/docker/integration-cli/request/npipe_windows.go similarity index 91% rename from vendor/github.com/docker/docker/integration-cli/daemon/npipe_windows.go rename to vendor/github.com/docker/docker/integration-cli/request/npipe_windows.go index d3c13be5d..a268aac92 100644 --- a/vendor/github.com/docker/docker/integration-cli/daemon/npipe_windows.go +++ b/vendor/github.com/docker/docker/integration-cli/request/npipe_windows.go @@ -1,4 +1,4 @@ -package daemon +package request import ( "net" diff --git a/vendor/github.com/docker/docker/integration-cli/request/request.go b/vendor/github.com/docker/docker/integration-cli/request/request.go new file mode 100644 index 000000000..72e15b73d --- /dev/null +++ b/vendor/github.com/docker/docker/integration-cli/request/request.go @@ -0,0 +1,263 @@ +package request + +import ( + "bufio" + "bytes" + "crypto/tls" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "net/http/httputil" + "net/url" + "os" + "path/filepath" + "time" + + dclient "github.com/docker/docker/client" + "github.com/docker/docker/pkg/ioutils" + "github.com/docker/docker/pkg/testutil" + "github.com/docker/go-connections/sockets" + "github.com/docker/go-connections/tlsconfig" + "github.com/pkg/errors" +) + +// Method creates a modifier that sets the specified string as the request method +func Method(method string) func(*http.Request) error { + return func(req *http.Request) error { + req.Method = method + return nil + } +} + +// JSON sets the Content-Type request header to json +func JSON(req *http.Request) error { + req.Header.Set("Content-Type", "application/json") + return nil +} + +// JSONBody creates a modifier that encodes the specified data to a JSON string and set it as request body. It also sets +// the Content-Type header of the request. +func JSONBody(data interface{}) func(*http.Request) error { + return func(req *http.Request) error { + jsonData := bytes.NewBuffer(nil) + if err := json.NewEncoder(jsonData).Encode(data); err != nil { + return err + } + req.Body = ioutil.NopCloser(jsonData) + req.Header.Set("Content-Type", "application/json") + return nil + } +} + +// Post creates and execute a POST request on the specified host and endpoint, with the specified request modifiers +func Post(host, endpoint string, modifiers ...func(*http.Request) error) (*http.Response, io.ReadCloser, error) { + return Do(host, endpoint, append(modifiers, Method(http.MethodPost))...) +} + +// Delete creates and execute a DELETE request on the specified host and endpoint, with the specified request modifiers +func Delete(host, endpoint string, modifiers ...func(*http.Request) error) (*http.Response, io.ReadCloser, error) { + return Do(host, endpoint, append(modifiers, Method(http.MethodDelete))...) +} + +// Get creates and execute a GET request on the specified host and endpoint, with the specified request modifiers +func Get(host, endpoint string, modifiers ...func(*http.Request) error) (*http.Response, io.ReadCloser, error) { + return Do(host, endpoint, modifiers...) +} + +// Do creates and execute a request on the specified host and endpoint, with the specified request modifiers +func Do(host, endpoint string, modifiers ...func(*http.Request) error) (*http.Response, io.ReadCloser, error) { + req, err := New(host, endpoint, modifiers...) + if err != nil { + return nil, nil, err + } + client, err := NewClient(host) + if err != nil { + return nil, nil, err + } + resp, err := client.Do(req) + var body io.ReadCloser + if resp != nil { + body = ioutils.NewReadCloserWrapper(resp.Body, func() error { + defer resp.Body.Close() + return nil + }) + } + return resp, body, err +} + +// New creates a new http Request to the specified host and endpoint, with the specified request modifiers +func New(host, endpoint string, modifiers ...func(*http.Request) error) (*http.Request, error) { + _, addr, _, err := dclient.ParseHost(host) + if err != nil { + return nil, err + } + if err != nil { + return nil, errors.Wrapf(err, "could not parse url %q", host) + } + req, err := http.NewRequest("GET", endpoint, nil) + if err != nil { + return nil, fmt.Errorf("could not create new request: %v", err) + } + + req.URL.Scheme = "http" + req.URL.Host = addr + + for _, config := range modifiers { + if err := config(req); err != nil { + return nil, err + } + } + return req, nil +} + +// NewClient creates an http client for the specific host +func NewClient(host string) (*http.Client, error) { + // FIXME(vdemeester) 10*time.Second timeout of SockRequest… ? + proto, addr, _, err := dclient.ParseHost(host) + if err != nil { + return nil, err + } + transport := new(http.Transport) + if proto == "tcp" && os.Getenv("DOCKER_TLS_VERIFY") != "" { + // Setup the socket TLS configuration. + tlsConfig, err := getTLSConfig() + if err != nil { + return nil, err + } + transport = &http.Transport{TLSClientConfig: tlsConfig} + } + err = sockets.ConfigureTransport(transport, proto, addr) + return &http.Client{ + Transport: transport, + }, err +} + +// FIXME(vdemeester) httputil.ClientConn is deprecated, use http.Client instead (closer to actual client) +// Deprecated: Use New instead of NewRequestClient +// Deprecated: use request.Do (or Get, Delete, Post) instead +func newRequestClient(method, endpoint string, data io.Reader, ct, daemon string, modifiers ...func(*http.Request)) (*http.Request, *httputil.ClientConn, error) { + c, err := SockConn(time.Duration(10*time.Second), daemon) + if err != nil { + return nil, nil, fmt.Errorf("could not dial docker daemon: %v", err) + } + + client := httputil.NewClientConn(c, nil) + + req, err := http.NewRequest(method, endpoint, data) + if err != nil { + client.Close() + return nil, nil, fmt.Errorf("could not create new request: %v", err) + } + + for _, opt := range modifiers { + opt(req) + } + + if ct != "" { + req.Header.Set("Content-Type", ct) + } + return req, client, nil +} + +// SockRequest create a request against the specified host (with method, endpoint and other request modifier) and +// returns the status code, and the content as an byte slice +// Deprecated: use request.Do instead +func SockRequest(method, endpoint string, data interface{}, daemon string, modifiers ...func(*http.Request)) (int, []byte, error) { + jsonData := bytes.NewBuffer(nil) + if err := json.NewEncoder(jsonData).Encode(data); err != nil { + return -1, nil, err + } + + res, body, err := SockRequestRaw(method, endpoint, jsonData, "application/json", daemon, modifiers...) + if err != nil { + return -1, nil, err + } + b, err := testutil.ReadBody(body) + return res.StatusCode, b, err +} + +// SockRequestRaw create a request against the specified host (with method, endpoint and other request modifier) and +// returns the http response, the output as a io.ReadCloser +// Deprecated: use request.Do (or Get, Delete, Post) instead +func SockRequestRaw(method, endpoint string, data io.Reader, ct, daemon string, modifiers ...func(*http.Request)) (*http.Response, io.ReadCloser, error) { + req, client, err := newRequestClient(method, endpoint, data, ct, daemon, modifiers...) + if err != nil { + return nil, nil, err + } + + resp, err := client.Do(req) + body := ioutils.NewReadCloserWrapper(resp.Body, func() error { + defer resp.Body.Close() + return client.Close() + }) + if err != nil { + client.Close() + } + + return resp, body, err +} + +// SockRequestHijack creates a connection to specified host (with method, contenttype, …) and returns a hijacked connection +// and the output as a `bufio.Reader` +func SockRequestHijack(method, endpoint string, data io.Reader, ct string, daemon string, modifiers ...func(*http.Request)) (net.Conn, *bufio.Reader, error) { + req, client, err := newRequestClient(method, endpoint, data, ct, daemon, modifiers...) + if err != nil { + return nil, nil, err + } + + client.Do(req) + conn, br := client.Hijack() + return conn, br, nil +} + +// SockConn opens a connection on the specified socket +func SockConn(timeout time.Duration, daemon string) (net.Conn, error) { + daemonURL, err := url.Parse(daemon) + if err != nil { + return nil, errors.Wrapf(err, "could not parse url %q", daemon) + } + + var c net.Conn + switch daemonURL.Scheme { + case "npipe": + return npipeDial(daemonURL.Path, timeout) + case "unix": + return net.DialTimeout(daemonURL.Scheme, daemonURL.Path, timeout) + case "tcp": + if os.Getenv("DOCKER_TLS_VERIFY") != "" { + // Setup the socket TLS configuration. + tlsConfig, err := getTLSConfig() + if err != nil { + return nil, err + } + dialer := &net.Dialer{Timeout: timeout} + return tls.DialWithDialer(dialer, daemonURL.Scheme, daemonURL.Host, tlsConfig) + } + return net.DialTimeout(daemonURL.Scheme, daemonURL.Host, timeout) + default: + return c, errors.Errorf("unknown scheme %v (%s)", daemonURL.Scheme, daemon) + } +} + +func getTLSConfig() (*tls.Config, error) { + dockerCertPath := os.Getenv("DOCKER_CERT_PATH") + + if dockerCertPath == "" { + return nil, errors.New("DOCKER_TLS_VERIFY specified, but no DOCKER_CERT_PATH environment variable") + } + + option := &tlsconfig.Options{ + CAFile: filepath.Join(dockerCertPath, "ca.pem"), + CertFile: filepath.Join(dockerCertPath, "cert.pem"), + KeyFile: filepath.Join(dockerCertPath, "key.pem"), + } + tlsConfig, err := tlsconfig.Client(*option) + if err != nil { + return nil, err + } + + return tlsConfig, nil +} diff --git a/vendor/github.com/docker/docker/integration-cli/requirements_test.go b/vendor/github.com/docker/docker/integration-cli/requirements_test.go index 455be53da..1462ab2a3 100644 --- a/vendor/github.com/docker/docker/integration-cli/requirements_test.go +++ b/vendor/github.com/docker/docker/integration-cli/requirements_test.go @@ -105,14 +105,6 @@ func Apparmor() bool { return err == nil && len(buf) > 1 && buf[0] == 'Y' } -func RegistryHosting() bool { - // for now registry binary is built only if we're running inside - // container through `make test`. Figure that out by testing if - // registry binary is in PATH. - _, err := exec.LookPath(v2binary) - return err == nil -} - func NotaryHosting() bool { // for now notary binary is built only if we're running inside // container through `make test`. Figure that out by testing if diff --git a/vendor/github.com/docker/docker/integration-cli/trust_server_test.go b/vendor/github.com/docker/docker/integration-cli/trust_server_test.go index 648efa6a0..947c51ce5 100644 --- a/vendor/github.com/docker/docker/integration-cli/trust_server_test.go +++ b/vendor/github.com/docker/docker/integration-cli/trust_server_test.go @@ -12,7 +12,8 @@ import ( "time" cliconfig "github.com/docker/docker/cli/config" - "github.com/docker/docker/pkg/integration/checker" + "github.com/docker/docker/integration-cli/checker" + icmd "github.com/docker/docker/pkg/testutil/cmd" "github.com/docker/go-connections/tlsconfig" "github.com/go-check/check" ) @@ -34,6 +35,30 @@ type testNotary struct { const notaryHost = "localhost:4443" const notaryURL = "https://" + notaryHost +var SuccessTagging = icmd.Expected{ + Out: "Tagging", +} + +var SuccessSigningAndPushing = icmd.Expected{ + Out: "Signing and pushing trust metadata", +} + +var SuccessDownloaded = icmd.Expected{ + Out: "Status: Downloaded", +} + +var SuccessTaggingOnStderr = icmd.Expected{ + Err: "Tagging", +} + +var SuccessSigningAndPushingOnStderr = icmd.Expected{ + Err: "Signing and pushing trust metadata", +} + +var SuccessDownloadedOnStderr = icmd.Expected{ + Err: "Status: Downloaded", +} + func newTestNotary(c *check.C) (*testNotary, error) { // generate server config template := `{ @@ -164,28 +189,38 @@ func (t *testNotary) Close() { os.RemoveAll(t.dir) } -func (s *DockerTrustSuite) trustedCmd(cmd *exec.Cmd) { +// Deprecated: used trustedCmd instead +func trustedExecCmd(cmd *exec.Cmd) { pwd := "12345678" - trustCmdEnv(cmd, notaryURL, pwd, pwd) + cmd.Env = append(cmd.Env, trustEnv(notaryURL, pwd, pwd)...) } -func (s *DockerTrustSuite) trustedCmdWithServer(cmd *exec.Cmd, server string) { +func trustedCmd(cmd *icmd.Cmd) { pwd := "12345678" - trustCmdEnv(cmd, server, pwd, pwd) + cmd.Env = append(cmd.Env, trustEnv(notaryURL, pwd, pwd)...) } -func (s *DockerTrustSuite) trustedCmdWithPassphrases(cmd *exec.Cmd, rootPwd, repositoryPwd string) { - trustCmdEnv(cmd, notaryURL, rootPwd, repositoryPwd) +func trustedCmdWithServer(server string) func(*icmd.Cmd) { + return func(cmd *icmd.Cmd) { + pwd := "12345678" + cmd.Env = append(cmd.Env, trustEnv(server, pwd, pwd)...) + } } -func trustCmdEnv(cmd *exec.Cmd, server, rootPwd, repositoryPwd string) { - env := []string{ +func trustedCmdWithPassphrases(rootPwd, repositoryPwd string) func(*icmd.Cmd) { + return func(cmd *icmd.Cmd) { + cmd.Env = append(cmd.Env, trustEnv(notaryURL, rootPwd, repositoryPwd)...) + } +} + +func trustEnv(server, rootPwd, repositoryPwd string) []string { + env := append(os.Environ(), []string{ "DOCKER_CONTENT_TRUST=1", fmt.Sprintf("DOCKER_CONTENT_TRUST_SERVER=%s", server), fmt.Sprintf("DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE=%s", rootPwd), fmt.Sprintf("DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE=%s", repositoryPwd), - } - cmd.Env = append(os.Environ(), env...) + }...) + return env } func (s *DockerTrustSuite) setupTrustedImage(c *check.C, name string) string { @@ -193,16 +228,7 @@ func (s *DockerTrustSuite) setupTrustedImage(c *check.C, name string) string { // tag the image and upload it to the private registry dockerCmd(c, "tag", "busybox", repoName) - pushCmd := exec.Command(dockerBinary, "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - - if err != nil { - c.Fatalf("Error running trusted push: %s\n%s", err, out) - } - if !strings.Contains(string(out), "Signing and pushing trust metadata") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } + icmd.RunCmd(icmd.Command(dockerBinary, "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) if out, status := dockerCmd(c, "rmi", repoName); status != 0 { c.Fatalf("Error removing image %q\n%s", repoName, out) @@ -216,16 +242,7 @@ func (s *DockerTrustSuite) setupTrustedplugin(c *check.C, source, name string) s // tag the image and upload it to the private registry dockerCmd(c, "plugin", "install", "--grant-all-permissions", "--alias", repoName, source) - pushCmd := exec.Command(dockerBinary, "plugin", "push", repoName) - s.trustedCmd(pushCmd) - out, _, err := runCommandWithOutput(pushCmd) - - if err != nil { - c.Fatalf("Error running trusted plugin push: %s\n%s", err, out) - } - if !strings.Contains(string(out), "Signing and pushing trust metadata") { - c.Fatalf("Missing expected output on trusted push:\n%s", out) - } + icmd.RunCmd(icmd.Command(dockerBinary, "plugin", "push", repoName), trustedCmd).Assert(c, SuccessSigningAndPushing) if out, status := dockerCmd(c, "plugin", "rm", "-f", repoName); status != 0 { c.Fatalf("Error removing plugin %q\n%s", repoName, out) diff --git a/vendor/github.com/docker/docker/integration-cli/utils_test.go b/vendor/github.com/docker/docker/integration-cli/utils_test.go index 0b5ae9aaf..82d0b162e 100644 --- a/vendor/github.com/docker/docker/integration-cli/utils_test.go +++ b/vendor/github.com/docker/docker/integration-cli/utils_test.go @@ -1,7 +1,7 @@ package main import ( - "github.com/docker/docker/pkg/integration/cmd" + "github.com/docker/docker/pkg/testutil/cmd" "os/exec" ) @@ -13,6 +13,7 @@ func getPrefixAndSlashFromDaemonPlatform() (prefix, slash string) { } // TODO: update code to call cmd.RunCmd directly, and remove this function +// Deprecated: use pkg/testutil/cmd instead func runCommandWithOutput(execCmd *exec.Cmd) (string, int, error) { result := cmd.RunCmd(transformCmd(execCmd)) return result.Combined(), result.ExitCode, result.Error diff --git a/vendor/github.com/docker/docker/keys/launchpad-ppa-zfs.asc b/vendor/github.com/docker/docker/keys/launchpad-ppa-zfs.asc new file mode 100644 index 000000000..1c5b4deb6 --- /dev/null +++ b/vendor/github.com/docker/docker/keys/launchpad-ppa-zfs.asc @@ -0,0 +1,13 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mI0ETjjRQwEEAN1t7LdXiXEDucAXemaXZphLeDSmUE2gHxj/b+Gqt1wRaCMAE1NU +rLOqTDNq8XPi4ZSp8Rr8R8jVupmKlt446ESGOadUO0AAjFyYe+YwZ65uYa69536k +T+PhcFepWm8YgJL1skn0u+qpHzMJLvLB6iyAP8fP5C19wjiY8TtpSEtLABEBAAG0 +JkxhdW5jaHBhZCBQUEEgZm9yIE5hdGl2ZSBaRlMgZm9yIExpbnV4iLgEEwECACIF +Ak440UMCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEBGWuoH2sPxh32cD +/2uniH9nyAKYI3/6X29pmRXcsuf1J+ZYqEnUIWT41ZBvNJHkbMiSgNC0lUvW4miq +LgHZrft2X3D1fUP6djnueTnFG/Rs/uVRCMU32YjmxW92nZc6StfNt35LT7CUd9xV +/6e3h5klln/xUsimOm9BcHglUXF7n8U39qw9JGV2sheo +=qkiU +-----END PGP PUBLIC KEY BLOCK----- diff --git a/vendor/github.com/docker/docker/layer/empty_test.go b/vendor/github.com/docker/docker/layer/empty_test.go index c22da7665..0d8c80c01 100644 --- a/vendor/github.com/docker/docker/layer/empty_test.go +++ b/vendor/github.com/docker/docker/layer/empty_test.go @@ -4,7 +4,7 @@ import ( "io" "testing" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) func TestEmptyLayer(t *testing.T) { @@ -33,7 +33,7 @@ func TestEmptyLayer(t *testing.T) { t.Fatalf("error streaming tar for empty layer: %v", err) } - digester := digest.Canonical.New() + digester := digest.Canonical.Digester() _, err = io.Copy(digester.Hash(), tarStream) if err != nil { diff --git a/vendor/github.com/docker/docker/layer/filestore.go b/vendor/github.com/docker/docker/layer/filestore.go index 42b45556e..7ea418cd5 100644 --- a/vendor/github.com/docker/docker/layer/filestore.go +++ b/vendor/github.com/docker/docker/layer/filestore.go @@ -15,8 +15,8 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/docker/pkg/ioutils" + "github.com/opencontainers/go-digest" ) var ( @@ -165,7 +165,7 @@ func (fms *fileMetadataStore) GetParent(layer ChainID) (ChainID, error) { return "", err } - dgst, err := digest.ParseDigest(strings.TrimSpace(string(content))) + dgst, err := digest.Parse(strings.TrimSpace(string(content))) if err != nil { return "", err } @@ -179,7 +179,7 @@ func (fms *fileMetadataStore) GetDiffID(layer ChainID) (DiffID, error) { return "", err } - dgst, err := digest.ParseDigest(strings.TrimSpace(string(content))) + dgst, err := digest.Parse(strings.TrimSpace(string(content))) if err != nil { return "", err } @@ -296,7 +296,7 @@ func (fms *fileMetadataStore) GetMountParent(mount string) (ChainID, error) { return "", err } - dgst, err := digest.ParseDigest(strings.TrimSpace(string(content))) + dgst, err := digest.Parse(strings.TrimSpace(string(content))) if err != nil { return "", err } diff --git a/vendor/github.com/docker/docker/layer/filestore_test.go b/vendor/github.com/docker/docker/layer/filestore_test.go index 55e3b2853..2126a20b8 100644 --- a/vendor/github.com/docker/docker/layer/filestore_test.go +++ b/vendor/github.com/docker/docker/layer/filestore_test.go @@ -10,7 +10,7 @@ import ( "syscall" "testing" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) func randomLayerID(seed int64) ChainID { diff --git a/vendor/github.com/docker/docker/layer/layer.go b/vendor/github.com/docker/docker/layer/layer.go index f6b7712a3..7b993ee4a 100644 --- a/vendor/github.com/docker/docker/layer/layer.go +++ b/vendor/github.com/docker/docker/layer/layer.go @@ -15,8 +15,8 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/docker/pkg/archive" + "github.com/opencontainers/go-digest" ) var ( diff --git a/vendor/github.com/docker/docker/layer/layer_store.go b/vendor/github.com/docker/docker/layer/layer_store.go index 4fc323f57..09a55afea 100644 --- a/vendor/github.com/docker/docker/layer/layer_store.go +++ b/vendor/github.com/docker/docker/layer/layer_store.go @@ -9,11 +9,11 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/docker/daemon/graphdriver" "github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/plugingetter" "github.com/docker/docker/pkg/stringid" + "github.com/opencontainers/go-digest" "github.com/vbatts/tar-split/tar/asm" "github.com/vbatts/tar-split/tar/storage" ) @@ -204,7 +204,7 @@ func (ls *layerStore) loadMount(mount string) error { } func (ls *layerStore) applyTar(tx MetadataTransaction, ts io.Reader, parent string, layer *roLayer) error { - digester := digest.Canonical.New() + digester := digest.Canonical.Digester() tr := io.TeeReader(ts, digester.Hash()) tsw, err := tx.TarSplitWriter(true) diff --git a/vendor/github.com/docker/docker/layer/layer_test.go b/vendor/github.com/docker/docker/layer/layer_test.go index d2cc91332..087a0aa78 100644 --- a/vendor/github.com/docker/docker/layer/layer_test.go +++ b/vendor/github.com/docker/docker/layer/layer_test.go @@ -10,12 +10,12 @@ import ( "strings" "testing" - "github.com/docker/distribution/digest" "github.com/docker/docker/daemon/graphdriver" "github.com/docker/docker/daemon/graphdriver/vfs" "github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/idtools" "github.com/docker/docker/pkg/stringid" + "github.com/opencontainers/go-digest" ) func init() { diff --git a/vendor/github.com/docker/docker/layer/layer_windows.go b/vendor/github.com/docker/docker/layer/layer_windows.go index e20311a09..624cbe23c 100644 --- a/vendor/github.com/docker/docker/layer/layer_windows.go +++ b/vendor/github.com/docker/docker/layer/layer_windows.go @@ -2,10 +2,7 @@ package layer import ( "errors" - "fmt" - "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/daemon/graphdriver" ) @@ -35,59 +32,6 @@ func GetLayerPath(s Store, layer ChainID) (string, error) { return path, nil } -func (ls *layerStore) RegisterDiffID(graphID string, size int64) (Layer, error) { - var err error // this is used for cleanup in existingLayer case - diffID := digest.FromBytes([]byte(graphID)) - - // Create new roLayer - layer := &roLayer{ - cacheID: graphID, - diffID: DiffID(diffID), - referenceCount: 1, - layerStore: ls, - references: map[Layer]struct{}{}, - size: size, - } - - tx, err := ls.store.StartTransaction() - if err != nil { - return nil, err - } - defer func() { - if err != nil { - if err := tx.Cancel(); err != nil { - logrus.Errorf("Error canceling metadata transaction %q: %s", tx.String(), err) - } - } - }() - - layer.chainID = createChainIDFromParent("", layer.diffID) - - if !ls.driver.Exists(layer.cacheID) { - return nil, fmt.Errorf("layer %q is unknown to driver", layer.cacheID) - } - if err = storeLayer(tx, layer); err != nil { - return nil, err - } - - ls.layerL.Lock() - defer ls.layerL.Unlock() - - if existingLayer := ls.getWithoutLock(layer.chainID); existingLayer != nil { - // Set error for cleanup, but do not return - err = errors.New("layer already exists") - return existingLayer.getReference(), nil - } - - if err = tx.Commit(layer.chainID); err != nil { - return nil, err - } - - ls.layerMap[layer.chainID] = layer - - return layer.getReference(), nil -} - func (ls *layerStore) mountID(name string) string { // windows has issues if container ID doesn't match mount ID return name diff --git a/vendor/github.com/docker/docker/layer/migration.go b/vendor/github.com/docker/docker/layer/migration.go index b45c31099..4803a1ae5 100644 --- a/vendor/github.com/docker/docker/layer/migration.go +++ b/vendor/github.com/docker/docker/layer/migration.go @@ -8,7 +8,7 @@ import ( "os" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" "github.com/vbatts/tar-split/tar/asm" "github.com/vbatts/tar-split/tar/storage" ) @@ -98,7 +98,7 @@ func (ls *layerStore) ChecksumForGraphID(id, parent, oldTarDataPath, newTarDataP return } - dgst := digest.Canonical.New() + dgst := digest.Canonical.Digester() err = ls.assembleTarTo(id, uncompressed, &size, dgst.Hash()) if err != nil { return diff --git a/vendor/github.com/docker/docker/layer/ro_layer.go b/vendor/github.com/docker/docker/layer/ro_layer.go index ea07b5b9d..c03739005 100644 --- a/vendor/github.com/docker/docker/layer/ro_layer.go +++ b/vendor/github.com/docker/docker/layer/ro_layer.go @@ -5,7 +5,7 @@ import ( "io" "github.com/docker/distribution" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) type roLayer struct { @@ -156,14 +156,10 @@ func storeLayer(tx MetadataTransaction, layer *roLayer) error { } func newVerifiedReadCloser(rc io.ReadCloser, dgst digest.Digest) (io.ReadCloser, error) { - verifier, err := digest.NewDigestVerifier(dgst) - if err != nil { - return nil, err - } return &verifiedReadCloser{ rc: rc, dgst: dgst, - verifier: verifier, + verifier: dgst.Verifier(), }, nil } diff --git a/vendor/github.com/docker/docker/libcontainerd/client.go b/vendor/github.com/docker/docker/libcontainerd/client.go index c14c1c5e4..c9004b813 100644 --- a/vendor/github.com/docker/docker/libcontainerd/client.go +++ b/vendor/github.com/docker/docker/libcontainerd/client.go @@ -12,7 +12,7 @@ type clientCommon struct { backend Backend containers map[string]*container locker *locker.Locker - mapMutex sync.RWMutex // protects read/write oprations from containers map + mapMutex sync.RWMutex // protects read/write operations from containers map } func (clnt *client) lock(containerID string) { diff --git a/vendor/github.com/docker/docker/man/docker-commit.1.md b/vendor/github.com/docker/docker/man/docker-commit.1.md deleted file mode 100644 index d8a4cf838..000000000 --- a/vendor/github.com/docker/docker/man/docker-commit.1.md +++ /dev/null @@ -1,71 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-commit - Create a new image from a container's changes - -# SYNOPSIS -**docker commit** -[**-a**|**--author**[=*AUTHOR*]] -[**-c**|**--change**[=\[*DOCKERFILE INSTRUCTIONS*\]]] -[**--help**] -[**-m**|**--message**[=*MESSAGE*]] -[**-p**|**--pause**[=*true*]] -CONTAINER [REPOSITORY[:TAG]] - -# DESCRIPTION -Create a new image from an existing container specified by name or -container ID. The new image will contain the contents of the -container filesystem, *excluding* any data volumes. Refer to **docker-tag(1)** -for more information about valid image and tag names. - -While the `docker commit` command is a convenient way of extending an -existing image, you should prefer the use of a Dockerfile and `docker -build` for generating images that you intend to share with other -people. - -# OPTIONS -**-a**, **--author**="" - Author (e.g., "John Hannibal Smith ") - -**-c** , **--change**=[] - Apply specified Dockerfile instructions while committing the image - Supported Dockerfile instructions: `CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`LABEL`|`ONBUILD`|`USER`|`VOLUME`|`WORKDIR` - -**--help** - Print usage statement - -**-m**, **--message**="" - Commit message - -**-p**, **--pause**=*true*|*false* - Pause container during commit. The default is *true*. - -# EXAMPLES - -## Creating a new image from an existing container -An existing Fedora based container has had Apache installed while running -in interactive mode with the bash shell. Apache is also running. To -create a new image run `docker ps` to find the container's ID and then run: - - # docker commit -m="Added Apache to Fedora base image" \ - -a="A D Ministrator" 98bd7fc99854 fedora/fedora_httpd:20 - -Note that only a-z0-9-_. are allowed when naming images from an -existing container. - -## Apply specified Dockerfile instructions while committing the image -If an existing container was created without the DEBUG environment -variable set to "true", you can create a new image based on that -container by first getting the container's ID with `docker ps` and -then running: - - # docker commit -c="ENV DEBUG true" 98bd7fc99854 debug-image - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and in -June 2014, updated by Sven Dowideit -July 2014, updated by Sven Dowideit -Oct 2014, updated by Daniel, Dao Quang Minh -June 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-create.1.md b/vendor/github.com/docker/docker/man/docker-create.1.md deleted file mode 100644 index 3f8a07637..000000000 --- a/vendor/github.com/docker/docker/man/docker-create.1.md +++ /dev/null @@ -1,553 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-create - Create a new container - -# SYNOPSIS -**docker create** -[**-a**|**--attach**[=*[]*]] -[**--add-host**[=*[]*]] -[**--blkio-weight**[=*[BLKIO-WEIGHT]*]] -[**--blkio-weight-device**[=*[]*]] -[**--cpu-shares**[=*0*]] -[**--cap-add**[=*[]*]] -[**--cap-drop**[=*[]*]] -[**--cgroup-parent**[=*CGROUP-PATH*]] -[**--cidfile**[=*CIDFILE*]] -[**--cpu-count**[=*0*]] -[**--cpu-percent**[=*0*]] -[**--cpu-period**[=*0*]] -[**--cpu-quota**[=*0*]] -[**--cpu-rt-period**[=*0*]] -[**--cpu-rt-runtime**[=*0*]] -[**--cpus**[=*0.0*]] -[**--cpuset-cpus**[=*CPUSET-CPUS*]] -[**--cpuset-mems**[=*CPUSET-MEMS*]] -[**--device**[=*[]*]] -[**--device-read-bps**[=*[]*]] -[**--device-read-iops**[=*[]*]] -[**--device-write-bps**[=*[]*]] -[**--device-write-iops**[=*[]*]] -[**--dns**[=*[]*]] -[**--dns-search**[=*[]*]] -[**--dns-option**[=*[]*]] -[**-e**|**--env**[=*[]*]] -[**--entrypoint**[=*ENTRYPOINT*]] -[**--env-file**[=*[]*]] -[**--expose**[=*[]*]] -[**--group-add**[=*[]*]] -[**-h**|**--hostname**[=*HOSTNAME*]] -[**--help**] -[**-i**|**--interactive**] -[**--ip**[=*IPv4-ADDRESS*]] -[**--ip6**[=*IPv6-ADDRESS*]] -[**--ipc**[=*IPC*]] -[**--isolation**[=*default*]] -[**--kernel-memory**[=*KERNEL-MEMORY*]] -[**-l**|**--label**[=*[]*]] -[**--label-file**[=*[]*]] -[**--link**[=*[]*]] -[**--link-local-ip**[=*[]*]] -[**--log-driver**[=*[]*]] -[**--log-opt**[=*[]*]] -[**-m**|**--memory**[=*MEMORY*]] -[**--mac-address**[=*MAC-ADDRESS*]] -[**--memory-reservation**[=*MEMORY-RESERVATION*]] -[**--memory-swap**[=*LIMIT*]] -[**--memory-swappiness**[=*MEMORY-SWAPPINESS*]] -[**--name**[=*NAME*]] -[**--network-alias**[=*[]*]] -[**--network**[=*"bridge"*]] -[**--oom-kill-disable**] -[**--oom-score-adj**[=*0*]] -[**-P**|**--publish-all**] -[**-p**|**--publish**[=*[]*]] -[**--pid**[=*[PID]*]] -[**--userns**[=*[]*]] -[**--pids-limit**[=*PIDS_LIMIT*]] -[**--privileged**] -[**--read-only**] -[**--restart**[=*RESTART*]] -[**--rm**] -[**--security-opt**[=*[]*]] -[**--storage-opt**[=*[]*]] -[**--stop-signal**[=*SIGNAL*]] -[**--stop-timeout**[=*TIMEOUT*]] -[**--shm-size**[=*[]*]] -[**--sysctl**[=*[]*]] -[**-t**|**--tty**] -[**--tmpfs**[=*[CONTAINER-DIR[:]*]] -[**-u**|**--user**[=*USER*]] -[**--ulimit**[=*[]*]] -[**--uts**[=*[]*]] -[**-v**|**--volume**[=*[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]*]] -[**--volume-driver**[=*DRIVER*]] -[**--volumes-from**[=*[]*]] -[**-w**|**--workdir**[=*WORKDIR*]] -IMAGE [COMMAND] [ARG...] - -# DESCRIPTION - -Creates a writeable container layer over the specified image and prepares it for -running the specified command. The container ID is then printed to STDOUT. This -is similar to **docker run -d** except the container is never started. You can -then use the **docker start ** command to start the container at -any point. - -The initial status of the container created with **docker create** is 'created'. - -# OPTIONS -**-a**, **--attach**=[] - Attach to STDIN, STDOUT or STDERR. - -**--add-host**=[] - Add a custom host-to-IP mapping (host:ip) - -**--blkio-weight**=*0* - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - -**--blkio-weight-device**=[] - Block IO weight (relative device weight, format: `DEVICE_NAME:WEIGHT`). - -**--cpu-shares**=*0* - CPU shares (relative weight) - -**--cap-add**=[] - Add Linux capabilities - -**--cap-drop**=[] - Drop Linux capabilities - -**--cgroup-parent**="" - Path to cgroups under which the cgroup for the container will be created. If the path is not absolute, the path is considered to be relative to the cgroups path of the init process. Cgroups will be created if they do not already exist. - -**--cidfile**="" - Write the container ID to the file - -**--cpu-count**=*0* - Limit the number of CPUs available for execution by the container. - - On Windows Server containers, this is approximated as a percentage of total CPU usage. - - On Windows Server containers, the processor resource controls are mutually exclusive, the order of precedence is CPUCount first, then CPUShares, and CPUPercent last. - -**--cpu-percent**=*0* - Limit the percentage of CPU available for execution by a container running on a Windows daemon. - - On Windows Server containers, the processor resource controls are mutually exclusive, the order of precedence is CPUCount first, then CPUShares, and CPUPercent last. - -**--cpu-period**=*0* - Limit the CPU CFS (Completely Fair Scheduler) period - - Limit the container's CPU usage. This flag tell the kernel to restrict the container's CPU usage to the period you specify. - -**--cpuset-cpus**="" - CPUs in which to allow execution (0-3, 0,1) - -**--cpuset-mems**="" - Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - - If you have four memory nodes on your system (0-3), use `--cpuset-mems=0,1` -then processes in your Docker container will only use memory from the first -two memory nodes. - -**--cpu-quota**=*0* - Limit the CPU CFS (Completely Fair Scheduler) quota - -**--cpu-rt-period**=0 - Limit the CPU real-time period in microseconds - - Limit the container's Real Time CPU usage. This flag tell the kernel to restrict the container's Real Time CPU usage to the period you specify. - -**--cpu-rt-runtime**=0 - Limit the CPU real-time runtime in microseconds - - Limit the containers Real Time CPU usage. This flag tells the kernel to limit the amount of time in a given CPU period Real Time tasks may consume. Ex: - Period of 1,000,000us and Runtime of 950,000us means that this container could consume 95% of available CPU and leave the remaining 5% to normal priority tasks. - - The sum of all runtimes across containers cannot exceed the amount allotted to the parent cgroup. - -**--cpus**=0.0 - Number of CPUs. The default is *0.0*. - -**--device**=[] - Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm) - -**--device-read-bps**=[] - Limit read rate (bytes per second) from a device (e.g. --device-read-bps=/dev/sda:1mb) - -**--device-read-iops**=[] - Limit read rate (IO per second) from a device (e.g. --device-read-iops=/dev/sda:1000) - -**--device-write-bps**=[] - Limit write rate (bytes per second) to a device (e.g. --device-write-bps=/dev/sda:1mb) - -**--device-write-iops**=[] - Limit write rate (IO per second) to a device (e.g. --device-write-iops=/dev/sda:1000) - -**--dns**=[] - Set custom DNS servers - -**--dns-option**=[] - Set custom DNS options - -**--dns-search**=[] - Set custom DNS search domains (Use --dns-search=. if you don't wish to set the search domain) - -**-e**, **--env**=[] - Set environment variables - -**--entrypoint**="" - Overwrite the default ENTRYPOINT of the image - -**--env-file**=[] - Read in a line-delimited file of environment variables - -**--expose**=[] - Expose a port or a range of ports (e.g. --expose=3300-3310) from the container without publishing it to your host - -**--group-add**=[] - Add additional groups to run as - -**-h**, **--hostname**="" - Container host name - -**--help** - Print usage statement - -**-i**, **--interactive**=*true*|*false* - Keep STDIN open even if not attached. The default is *false*. - -**--ip**="" - Sets the container's interface IPv4 address (e.g. 172.23.0.9) - - It can only be used in conjunction with **--network** for user-defined networks - -**--ip6**="" - Sets the container's interface IPv6 address (e.g. 2001:db8::1b99) - - It can only be used in conjunction with **--network** for user-defined networks - -**--ipc**="" - Default is to create a private IPC namespace (POSIX SysV IPC) for the container - 'container:': reuses another container shared memory, semaphores and message queues - 'host': use the host shared memory,semaphores and message queues inside the container. Note: the host mode gives the container full access to local shared memory and is therefore considered insecure. - -**--isolation**="*default*" - Isolation specifies the type of isolation technology used by containers. Note -that the default on Windows server is `process`, and the default on Windows client -is `hyperv`. Linux only supports `default`. - -**--kernel-memory**="" - Kernel memory limit (format: `[]`, where unit = b, k, m or g) - - Constrains the kernel memory available to a container. If a limit of 0 -is specified (not using `--kernel-memory`), the container's kernel memory -is not limited. If you specify a limit, it may be rounded up to a multiple -of the operating system's page size and the value can be very large, -millions of trillions. - -**-l**, **--label**=[] - Adds metadata to a container (e.g., --label=com.example.key=value) - -**--label-file**=[] - Read labels from a file. Delimit each label with an EOL. - -**--link**=[] - Add link to another container in the form of :alias or just - in which case the alias will match the name. - -**--link-local-ip**=[] - Add one or more link-local IPv4/IPv6 addresses to the container's interface - -**--log-driver**="*json-file*|*syslog*|*journald*|*gelf*|*fluentd*|*awslogs*|*splunk*|*etwlogs*|*gcplogs*|*none*" - Logging driver for the container. Default is defined by daemon `--log-driver` flag. - **Warning**: the `docker logs` command works only for the `json-file` and - `journald` logging drivers. - -**--log-opt**=[] - Logging driver specific options. - -**-m**, **--memory**="" - Memory limit (format: [], where unit = b, k, m or g) - - Allows you to constrain the memory available to a container. If the host -supports swap memory, then the **-m** memory setting can be larger than physical -RAM. If a limit of 0 is specified (not using **-m**), the container's memory is -not limited. The actual limit may be rounded up to a multiple of the operating -system's page size (the value would be very large, that's millions of trillions). - -**--mac-address**="" - Container MAC address (e.g. 92:d0:c6:0a:29:33) - -**--memory-reservation**="" - Memory soft limit (format: [], where unit = b, k, m or g) - - After setting memory reservation, when the system detects memory contention -or low memory, containers are forced to restrict their consumption to their -reservation. So you should always set the value below **--memory**, otherwise the -hard limit will take precedence. By default, memory reservation will be the same -as memory limit. - -**--memory-swap**="LIMIT" - A limit value equal to memory plus swap. Must be used with the **-m** -(**--memory**) flag. The swap `LIMIT` should always be larger than **-m** -(**--memory**) value. - - The format of `LIMIT` is `[]`. Unit can be `b` (bytes), -`k` (kilobytes), `m` (megabytes), or `g` (gigabytes). If you don't specify a -unit, `b` is used. Set LIMIT to `-1` to enable unlimited swap. - -**--memory-swappiness**="" - Tune a container's memory swappiness behavior. Accepts an integer between 0 and 100. - -**--name**="" - Assign a name to the container - -**--network**="*bridge*" - Set the Network mode for the container - 'bridge': create a network stack on the default Docker bridge - 'none': no networking - 'container:': reuse another container's network stack - 'host': use the Docker host network stack. Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure. - '|': connect to a user-defined network - -**--network-alias**=[] - Add network-scoped alias for the container - -**--oom-kill-disable**=*true*|*false* - Whether to disable OOM Killer for the container or not. - -**--oom-score-adj**="" - Tune the host's OOM preferences for containers (accepts -1000 to 1000) - -**-P**, **--publish-all**=*true*|*false* - Publish all exposed ports to random ports on the host interfaces. The default is *false*. - -**-p**, **--publish**=[] - Publish a container's port, or a range of ports, to the host - format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort - Both hostPort and containerPort can be specified as a range of ports. - When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range. (e.g., `-p 1234-1236:1234-1236/tcp`) - (use 'docker port' to see the actual mapping) - -**--pid**="" - Set the PID mode for the container - Default is to create a private PID namespace for the container - 'container:': join another container's PID namespace - 'host': use the host's PID namespace for the container. Note: the host mode gives the container full access to local PID and is therefore considered insecure. - -**--userns**="" - Set the usernamespace mode for the container when `userns-remap` option is enabled. - **host**: use the host usernamespace and enable all privileged options (e.g., `pid=host` or `--privileged`). - -**--pids-limit**="" - Tune the container's pids limit. Set `-1` to have unlimited pids for the container. - -**--privileged**=*true*|*false* - Give extended privileges to this container. The default is *false*. - -**--read-only**=*true*|*false* - Mount the container's root filesystem as read only. - -**--restart**="*no*" - Restart policy to apply when a container exits (no, on-failure[:max-retry], always, unless-stopped). - -**--rm**=*true*|*false* - Automatically remove the container when it exits. The default is *false*. - -**--shm-size**="" - Size of `/dev/shm`. The format is ``. `number` must be greater than `0`. - Unit is optional and can be `b` (bytes), `k` (kilobytes), `m` (megabytes), or `g` (gigabytes). If you omit the unit, the system uses bytes. - If you omit the size entirely, the system uses `64m`. - -**--security-opt**=[] - Security Options - - "label:user:USER" : Set the label user for the container - "label:role:ROLE" : Set the label role for the container - "label:type:TYPE" : Set the label type for the container - "label:level:LEVEL" : Set the label level for the container - "label:disable" : Turn off label confinement for the container - "no-new-privileges" : Disable container processes from gaining additional privileges - "seccomp:unconfined" : Turn off seccomp confinement for the container - "seccomp:profile.json : White listed syscalls seccomp Json file to be used as a seccomp filter - -**--storage-opt**=[] - Storage driver options per container - - $ docker create -it --storage-opt size=120G fedora /bin/bash - - This (size) will allow to set the container rootfs size to 120G at creation time. - This option is only available for the `devicemapper`, `btrfs`, `overlay2` and `zfs` graph drivers. - For the `devicemapper`, `btrfs` and `zfs` storage drivers, user cannot pass a size less than the Default BaseFS Size. - For the `overlay2` storage driver, the size option is only available if the backing fs is `xfs` and mounted with the `pquota` mount option. - Under these conditions, user can pass any size less then the backing fs size. - -**--stop-signal**=*SIGTERM* - Signal to stop a container. Default is SIGTERM. - -**--stop-timeout**=*10* - Timeout (in seconds) to stop a container. Default is 10. - -**--sysctl**=SYSCTL - Configure namespaced kernel parameters at runtime - - IPC Namespace - current sysctls allowed: - - kernel.msgmax, kernel.msgmnb, kernel.msgmni, kernel.sem, kernel.shmall, kernel.shmmax, kernel.shmmni, kernel.shm_rmid_forced - Sysctls beginning with fs.mqueue.* - - Note: if you use --ipc=host using these sysctls will not be allowed. - - Network Namespace - current sysctls allowed: - Sysctls beginning with net.* - - Note: if you use --network=host using these sysctls will not be allowed. - -**-t**, **--tty**=*true*|*false* - Allocate a pseudo-TTY. The default is *false*. - -**--tmpfs**=[] Create a tmpfs mount - - Mount a temporary filesystem (`tmpfs`) mount into a container, for example: - - $ docker run -d --tmpfs /tmp:rw,size=787448k,mode=1777 my_image - - This command mounts a `tmpfs` at `/tmp` within the container. The supported mount -options are the same as the Linux default `mount` flags. If you do not specify -any options, the systems uses the following options: -`rw,noexec,nosuid,nodev,size=65536k`. - -**-u**, **--user**="" - Sets the username or UID used and optionally the groupname or GID for the specified command. - - The followings examples are all valid: - --user [user | user:group | uid | uid:gid | user:gid | uid:group ] - - Without this argument root user will be used in the container by default. - -**--ulimit**=[] - Ulimit options - -**--uts**=*host* - Set the UTS mode for the container - **host**: use the host's UTS namespace inside the container. - Note: the host mode gives the container access to changing the host's hostname and is therefore considered insecure. - -**-v**|**--volume**[=*[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]*] - Create a bind mount. If you specify, ` -v /HOST-DIR:/CONTAINER-DIR`, Docker - bind mounts `/HOST-DIR` in the host to `/CONTAINER-DIR` in the Docker - container. If 'HOST-DIR' is omitted, Docker automatically creates the new - volume on the host. The `OPTIONS` are a comma delimited list and can be: - - * [rw|ro] - * [z|Z] - * [`[r]shared`|`[r]slave`|`[r]private`] - -The `CONTAINER-DIR` must be an absolute path such as `/src/docs`. The `HOST-DIR` -can be an absolute path or a `name` value. A `name` value must start with an -alphanumeric character, followed by `a-z0-9`, `_` (underscore), `.` (period) or -`-` (hyphen). An absolute path starts with a `/` (forward slash). - -If you supply a `HOST-DIR` that is an absolute path, Docker bind-mounts to the -path you specify. If you supply a `name`, Docker creates a named volume by that -`name`. For example, you can specify either `/foo` or `foo` for a `HOST-DIR` -value. If you supply the `/foo` value, Docker creates a bind-mount. If you -supply the `foo` specification, Docker creates a named volume. - -You can specify multiple **-v** options to mount one or more mounts to a -container. To use these same mounts in other containers, specify the -**--volumes-from** option also. - -You can add `:ro` or `:rw` suffix to a volume to mount it read-only or -read-write mode, respectively. By default, the volumes are mounted read-write. -See examples. - -Labeling systems like SELinux require that proper labels are placed on volume -content mounted into a container. Without a label, the security system might -prevent the processes running inside the container from using the content. By -default, Docker does not change the labels set by the OS. - -To change a label in the container context, you can add either of two suffixes -`:z` or `:Z` to the volume mount. These suffixes tell Docker to relabel file -objects on the shared volumes. The `z` option tells Docker that two containers -share the volume content. As a result, Docker labels the content with a shared -content label. Shared volume labels allow all containers to read/write content. -The `Z` option tells Docker to label the content with a private unshared label. -Only the current container can use a private volume. - -By default bind mounted volumes are `private`. That means any mounts done -inside container will not be visible on host and vice-a-versa. One can change -this behavior by specifying a volume mount propagation property. Making a -volume `shared` mounts done under that volume inside container will be -visible on host and vice-a-versa. Making a volume `slave` enables only one -way mount propagation and that is mounts done on host under that volume -will be visible inside container but not the other way around. - -To control mount propagation property of volume one can use `:[r]shared`, -`:[r]slave` or `:[r]private` propagation flag. Propagation property can -be specified only for bind mounted volumes and not for internal volumes or -named volumes. For mount propagation to work source mount point (mount point -where source dir is mounted on) has to have right propagation properties. For -shared volumes, source mount point has to be shared. And for slave volumes, -source mount has to be either shared or slave. - -Use `df ` to figure out the source mount and then use -`findmnt -o TARGET,PROPAGATION ` to figure out propagation -properties of source mount. If `findmnt` utility is not available, then one -can look at mount entry for source mount point in `/proc/self/mountinfo`. Look -at `optional fields` and see if any propagaion properties are specified. -`shared:X` means mount is `shared`, `master:X` means mount is `slave` and if -nothing is there that means mount is `private`. - -To change propagation properties of a mount point use `mount` command. For -example, if one wants to bind mount source directory `/foo` one can do -`mount --bind /foo /foo` and `mount --make-private --make-shared /foo`. This -will convert /foo into a `shared` mount point. Alternatively one can directly -change propagation properties of source mount. Say `/` is source mount for -`/foo`, then use `mount --make-shared /` to convert `/` into a `shared` mount. - -> **Note**: -> When using systemd to manage the Docker daemon's start and stop, in the systemd -> unit file there is an option to control mount propagation for the Docker daemon -> itself, called `MountFlags`. The value of this setting may cause Docker to not -> see mount propagation changes made on the mount point. For example, if this value -> is `slave`, you may not be able to use the `shared` or `rshared` propagation on -> a volume. - - -To disable automatic copying of data from the container path to the volume, use -the `nocopy` flag. The `nocopy` flag can be set on bind mounts and named volumes. - -**--volume-driver**="" - Container's volume driver. This driver creates volumes specified either from - a Dockerfile's `VOLUME` instruction or from the `docker run -v` flag. - See **docker-volume-create(1)** for full details. - -**--volumes-from**=[] - Mount volumes from the specified container(s) - -**-w**, **--workdir**="" - Working directory inside the container - -# EXAMPLES - -## Specify isolation technology for container (--isolation) - -This option is useful in situations where you are running Docker containers on -Windows. The `--isolation=` option sets a container's isolation -technology. On Linux, the only supported is the `default` option which uses -Linux namespaces. On Microsoft Windows, you can specify these values: - -* `default`: Use the value specified by the Docker daemon's `--exec-opt` . If the `daemon` does not specify an isolation technology, Microsoft Windows uses `process` as its default value. -* `process`: Namespace isolation only. -* `hyperv`: Hyper-V hypervisor partition-based isolation. - -Specifying the `--isolation` flag without a value is the same as setting `--isolation="default"`. - -# HISTORY -August 2014, updated by Sven Dowideit -September 2014, updated by Sven Dowideit -November 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-exec.1.md b/vendor/github.com/docker/docker/man/docker-exec.1.md deleted file mode 100644 index fe9c279e7..000000000 --- a/vendor/github.com/docker/docker/man/docker-exec.1.md +++ /dev/null @@ -1,71 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-exec - Run a command in a running container - -# SYNOPSIS -**docker exec** -[**-d**|**--detach**] -[**--detach-keys**[=*[]*]] -[**-e**|**--env**[=*[]*]] -[**--help**] -[**-i**|**--interactive**] -[**--privileged**] -[**-t**|**--tty**] -[**-u**|**--user**[=*USER*]] -CONTAINER COMMAND [ARG...] - -# DESCRIPTION - -Run a process in a running container. - -The command started using `docker exec` will only run while the container's primary -process (`PID 1`) is running, and will not be restarted if the container is restarted. - -If the container is paused, then the `docker exec` command will wait until the -container is unpaused, and then run - -# OPTIONS -**-d**, **--detach**=*true*|*false* - Detached mode: run command in the background. The default is *false*. - -**--detach-keys**="" - Override the key sequence for detaching a container. Format is a single character `[a-Z]` or `ctrl-` where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**-e**, **--env**=[] - Set environment variables - - This option allows you to specify arbitrary environment variables that are -available for the command to be executed. - -**--help** - Print usage statement - -**-i**, **--interactive**=*true*|*false* - Keep STDIN open even if not attached. The default is *false*. - -**--privileged**=*true*|*false* - Give the process extended [Linux capabilities](http://man7.org/linux/man-pages/man7/capabilities.7.html) -when running in a container. The default is *false*. - - Without this flag, the process run by `docker exec` in a running container has -the same capabilities as the container, which may be limited. Set -`--privileged` to give all capabilities to the process. - -**-t**, **--tty**=*true*|*false* - Allocate a pseudo-TTY. The default is *false*. - -**-u**, **--user**="" - Sets the username or UID used and optionally the groupname or GID for the specified command. - - The followings examples are all valid: - --user [user | user:group | uid | uid:gid | user:gid | uid:group ] - - Without this argument the command will be run as root in the container. - -The **-t** option is incompatible with a redirection of the docker client -standard input. - -# HISTORY -November 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-import.1.md b/vendor/github.com/docker/docker/man/docker-import.1.md deleted file mode 100644 index 43d65efe6..000000000 --- a/vendor/github.com/docker/docker/man/docker-import.1.md +++ /dev/null @@ -1,72 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-import - Create an empty filesystem image and import the contents of the tarball (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz) into it, then optionally tag it. - -# SYNOPSIS -**docker import** -[**-c**|**--change**[=*[]*]] -[**-m**|**--message**[=*MESSAGE*]] -[**--help**] -file|URL|**-**[REPOSITORY[:TAG]] - -# OPTIONS -**-c**, **--change**=[] - Apply specified Dockerfile instructions while importing the image - Supported Dockerfile instructions: `CMD`|`ENTRYPOINT`|`ENV`|`EXPOSE`|`ONBUILD`|`USER`|`VOLUME`|`WORKDIR` - -**--help** - Print usage statement - -**-m**, **--message**="" - Set commit message for imported image - -# DESCRIPTION -Create a new filesystem image from the contents of a tarball (`.tar`, -`.tar.gz`, `.tgz`, `.bzip`, `.tar.xz`, `.txz`) into it, then optionally tag it. - - -# EXAMPLES - -## Import from a remote location - - # docker import http://example.com/exampleimage.tgz example/imagerepo - -## Import from a local file - -Import to docker via pipe and stdin: - - # cat exampleimage.tgz | docker import - example/imagelocal - -Import with a commit message. - - # cat exampleimage.tgz | docker import --message "New image imported from tarball" - exampleimagelocal:new - -Import to a Docker image from a local file. - - # docker import /path/to/exampleimage.tgz - - -## Import from a local file and tag - -Import to docker via pipe and stdin: - - # cat exampleimageV2.tgz | docker import - example/imagelocal:V-2.0 - -## Import from a local directory - - # tar -c . | docker import - exampleimagedir - -## Apply specified Dockerfile instructions while importing the image -This example sets the docker image ENV variable DEBUG to true by default. - - # tar -c . | docker import -c="ENV DEBUG true" - exampleimagedir - -# See also -**docker-export(1)** to export the contents of a filesystem as a tar archive to STDOUT. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-kill.1.md b/vendor/github.com/docker/docker/man/docker-kill.1.md deleted file mode 100644 index 36cbdb90e..000000000 --- a/vendor/github.com/docker/docker/man/docker-kill.1.md +++ /dev/null @@ -1,28 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-kill - Kill a running container using SIGKILL or a specified signal - -# SYNOPSIS -**docker kill** -[**--help**] -[**-s**|**--signal**[=*"KILL"*]] -CONTAINER [CONTAINER...] - -# DESCRIPTION - -The main process inside each container specified will be sent SIGKILL, - or any signal specified with option --signal. - -# OPTIONS -**--help** - Print usage statement - -**-s**, **--signal**="*KILL*" - Signal to send to the container - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) - based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-logs.1.md b/vendor/github.com/docker/docker/man/docker-logs.1.md deleted file mode 100644 index e70f796e2..000000000 --- a/vendor/github.com/docker/docker/man/docker-logs.1.md +++ /dev/null @@ -1,71 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-logs - Fetch the logs of a container - -# SYNOPSIS -**docker logs** -[**-f**|**--follow**] -[**--help**] -[**--since**[=*SINCE*]] -[**-t**|**--timestamps**] -[**--tail**[=*"all"*]] -CONTAINER - -# DESCRIPTION -The **docker logs** command batch-retrieves whatever logs are present for -a container at the time of execution. This does not guarantee execution -order when combined with a docker run (i.e., your run may not have generated -any logs at the time you execute docker logs). - -The **docker logs --follow** command combines commands **docker logs** and -**docker attach**. It will first return all logs from the beginning and -then continue streaming new output from the container's stdout and stderr. - -**Warning**: This command works only for the **json-file** or **journald** -logging drivers. - -# OPTIONS -**--help** - Print usage statement - -**--details**=*true*|*false* - Show extra details provided to logs - -**-f**, **--follow**=*true*|*false* - Follow log output. The default is *false*. - -**--since**="" - Show logs since timestamp - -**-t**, **--timestamps**=*true*|*false* - Show timestamps. The default is *false*. - -**--tail**="*all*" - Output the specified number of lines at the end of logs (defaults to all logs) - -The `--since` option can be Unix timestamps, date formatted timestamps, or Go -duration strings (e.g. `10m`, `1h30m`) computed relative to the client machine's -time. Supported formats for date formatted time stamps include RFC3339Nano, -RFC3339, `2006-01-02T15:04:05`, `2006-01-02T15:04:05.999999999`, -`2006-01-02Z07:00`, and `2006-01-02`. The local timezone on the client will be -used if you do not provide either a `Z` or a `+-00:00` timezone offset at the -end of the timestamp. When providing Unix timestamps enter -seconds[.nanoseconds], where seconds is the number of seconds that have elapsed -since January 1, 1970 (midnight UTC/GMT), not counting leap seconds (aka Unix -epoch or Unix time), and the optional .nanoseconds field is a fraction of a -second no more than nine digits long. You can combine the `--since` option with -either or both of the `--follow` or `--tail` options. - -The `docker logs --details` command will add on extra attributes, such as -environment variables and labels, provided to `--log-opt` when creating the -container. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -July 2014, updated by Sven Dowideit -April 2015, updated by Ahmet Alp Balkan -October 2015, updated by Mike Brown diff --git a/vendor/github.com/docker/docker/man/docker-network-disconnect.1.md b/vendor/github.com/docker/docker/man/docker-network-disconnect.1.md deleted file mode 100644 index 09bcac51b..000000000 --- a/vendor/github.com/docker/docker/man/docker-network-disconnect.1.md +++ /dev/null @@ -1,36 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-disconnect - disconnect a container from a network - -# SYNOPSIS -**docker network disconnect** -[**--help**] -[**--force**] -NETWORK CONTAINER - -# DESCRIPTION - -Disconnects a container from a network. - -```bash - $ docker network disconnect multi-host-network container1 -``` - - -# OPTIONS -**NETWORK** - Specify network name - -**CONTAINER** - Specify container name - -**--force** - Force the container to disconnect from a network - -**--help** - Print usage statement - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/docker-pause.1.md b/vendor/github.com/docker/docker/man/docker-pause.1.md deleted file mode 100644 index 11eef5321..000000000 --- a/vendor/github.com/docker/docker/man/docker-pause.1.md +++ /dev/null @@ -1,32 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-pause - Pause all processes within one or more containers - -# SYNOPSIS -**docker pause** -CONTAINER [CONTAINER...] - -# DESCRIPTION - -The `docker pause` command suspends all processes in the specified containers. -On Linux, this uses the cgroups freezer. Traditionally, when suspending a process -the `SIGSTOP` signal is used, which is observable by the process being suspended. -With the cgroups freezer the process is unaware, and unable to capture, -that it is being suspended, and subsequently resumed. On Windows, only Hyper-V -containers can be paused. - -See the [cgroups freezer documentation] -(https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt) for -further details. - -# OPTIONS -**--help** - Print usage statement - -# See also -**docker-unpause(1)** to unpause all processes within one or more containers. - -# HISTORY -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-push.1.md b/vendor/github.com/docker/docker/man/docker-push.1.md deleted file mode 100644 index 847e66d2e..000000000 --- a/vendor/github.com/docker/docker/man/docker-push.1.md +++ /dev/null @@ -1,63 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-push - Push an image or a repository to a registry - -# SYNOPSIS -**docker push** -[**--help**] -NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG] - -# DESCRIPTION - -Use `docker push` to share your images to the [Docker Hub](https://hub.docker.com) -registry or to a self-hosted one. - -Refer to **docker-tag(1)** for more information about valid image and tag names. - -Killing the **docker push** process, for example by pressing **CTRL-c** while it -is running in a terminal, terminates the push operation. - -Registry credentials are managed by **docker-login(1)**. - - -# OPTIONS - -**--disable-content-trust** - Skip image verification (default true) - -**--help** - Print usage statement - -# EXAMPLES - -## Pushing a new image to a registry - -First save the new image by finding the container ID (using **docker ps**) -and then committing it to a new image name. Note that only a-z0-9-_. are -allowed when naming images: - - # docker commit c16378f943fe rhel-httpd - -Now, push the image to the registry using the image ID. In this example the -registry is on host named `registry-host` and listening on port `5000`. To do -this, tag the image with the host name or IP address, and the port of the -registry: - - # docker tag rhel-httpd registry-host:5000/myadmin/rhel-httpd - # docker push registry-host:5000/myadmin/rhel-httpd - -Check that this worked by running: - - # docker images - -You should see both `rhel-httpd` and `registry-host:5000/myadmin/rhel-httpd` -listed. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 -June 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-rename.1.md b/vendor/github.com/docker/docker/man/docker-rename.1.md deleted file mode 100644 index eaeea5c6e..000000000 --- a/vendor/github.com/docker/docker/man/docker-rename.1.md +++ /dev/null @@ -1,15 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCTOBER 2014 -# NAME -docker-rename - Rename a container - -# SYNOPSIS -**docker rename** -CONTAINER NEW_NAME - -# OPTIONS -There are no available options. - -# DESCRIPTION -Rename a container. Container may be running, paused or stopped. diff --git a/vendor/github.com/docker/docker/man/docker-restart.1.md b/vendor/github.com/docker/docker/man/docker-restart.1.md deleted file mode 100644 index 271c4eee1..000000000 --- a/vendor/github.com/docker/docker/man/docker-restart.1.md +++ /dev/null @@ -1,26 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-restart - Restart one or more containers - -# SYNOPSIS -**docker restart** -[**--help**] -[**-t**|**--time**[=*10*]] -CONTAINER [CONTAINER...] - -# DESCRIPTION -Restart each container listed. - -# OPTIONS -**--help** - Print usage statement - -**-t**, **--time**=*10* - Number of seconds to try to stop for before killing the container. Once killed it will then be restarted. Default is 10 seconds. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-rm.1.md b/vendor/github.com/docker/docker/man/docker-rm.1.md deleted file mode 100644 index 2105288d0..000000000 --- a/vendor/github.com/docker/docker/man/docker-rm.1.md +++ /dev/null @@ -1,72 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-rm - Remove one or more containers - -# SYNOPSIS -**docker rm** -[**-f**|**--force**] -[**-l**|**--link**] -[**-v**|**--volumes**] -CONTAINER [CONTAINER...] - -# DESCRIPTION - -**docker rm** will remove one or more containers from the host node. The -container name or ID can be used. This does not remove images. You cannot -remove a running container unless you use the **-f** option. To see all -containers on a host use the **docker ps -a** command. - -# OPTIONS -**--help** - Print usage statement - -**-f**, **--force**=*true*|*false* - Force the removal of a running container (uses SIGKILL). The default is *false*. - -**-l**, **--link**=*true*|*false* - Remove the specified link and not the underlying container. The default is *false*. - -**-v**, **--volumes**=*true*|*false* - Remove the volumes associated with the container. The default is *false*. - -# EXAMPLES - -## Removing a container using its ID - -To remove a container using its ID, find either from a **docker ps -a** -command, or use the ID returned from the **docker run** command, or retrieve -it from a file used to store it using the **docker run --cidfile**: - - docker rm abebf7571666 - -## Removing a container using the container name - -The name of the container can be found using the **docker ps -a** -command. The use that name as follows: - - docker rm hopeful_morse - -## Removing a container and all associated volumes - - $ docker rm -v redis - redis - -This command will remove the container and any volumes associated with it. -Note that if a volume was specified with a name, it will not be removed. - - $ docker create -v awesome:/foo -v /bar --name hello redis - hello - $ docker rm -v hello - -In this example, the volume for `/foo` will remain in tact, but the volume for -`/bar` will be removed. The same behavior holds for volumes inherited with -`--volumes-from`. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -July 2014, updated by Sven Dowideit -August 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-rmi.1.md b/vendor/github.com/docker/docker/man/docker-rmi.1.md deleted file mode 100644 index 35bf8aac6..000000000 --- a/vendor/github.com/docker/docker/man/docker-rmi.1.md +++ /dev/null @@ -1,42 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-rmi - Remove one or more images - -# SYNOPSIS -**docker rmi** -[**-f**|**--force**] -[**--help**] -[**--no-prune**] -IMAGE [IMAGE...] - -# DESCRIPTION - -Removes one or more images from the host node. This does not remove images from -a registry. You cannot remove an image of a running container unless you use the -**-f** option. To see all images on a host use the **docker images** command. - -# OPTIONS -**-f**, **--force**=*true*|*false* - Force removal of the image. The default is *false*. - -**--help** - Print usage statement - -**--no-prune**=*true*|*false* - Do not delete untagged parents. The default is *false*. - -# EXAMPLES - -## Removing an image - -Here is an example of removing an image: - - docker rmi fedora/httpd - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 diff --git a/vendor/github.com/docker/docker/man/docker-run.1.md b/vendor/github.com/docker/docker/man/docker-run.1.md index be3df0be3..fe671e54a 100644 --- a/vendor/github.com/docker/docker/man/docker-run.1.md +++ b/vendor/github.com/docker/docker/man/docker-run.1.md @@ -317,12 +317,12 @@ redirection on the host system. When set to true, keep stdin open even if not attached. The default is false. **--ip**="" - Sets the container's interface IPv4 address (e.g. 172.23.0.9) + Sets the container's interface IPv4 address (e.g., 172.23.0.9) It can only be used in conjunction with **--network** for user-defined networks **--ip6**="" - Sets the container's interface IPv6 address (e.g. 2001:db8::1b99) + Sets the container's interface IPv6 address (e.g., 2001:db8::1b99) It can only be used in conjunction with **--network** for user-defined networks @@ -401,7 +401,7 @@ the value of --memory. unit, `b` is used. Set LIMIT to `-1` to enable unlimited swap. **--mac-address**="" - Container MAC address (e.g. 92:d0:c6:0a:29:33) + Container MAC address (e.g., 92:d0:c6:0a:29:33) Remember that the MAC address in an Ethernet network must be unique. The IPv6 link-local address will be based on the device's MAC address diff --git a/vendor/github.com/docker/docker/man/docker-save.1.md b/vendor/github.com/docker/docker/man/docker-save.1.md deleted file mode 100644 index 1d1de8a1d..000000000 --- a/vendor/github.com/docker/docker/man/docker-save.1.md +++ /dev/null @@ -1,45 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-save - Save one or more images to a tar archive (streamed to STDOUT by default) - -# SYNOPSIS -**docker save** -[**--help**] -[**-o**|**--output**[=*OUTPUT*]] -IMAGE [IMAGE...] - -# DESCRIPTION -Produces a tarred repository to the standard output stream. Contains all -parent layers, and all tags + versions, or specified repo:tag. - -Stream to a file instead of STDOUT by using **-o**. - -# OPTIONS -**--help** - Print usage statement - -**-o**, **--output**="" - Write to a file, instead of STDOUT - -# EXAMPLES - -Save all fedora repository images to a fedora-all.tar and save the latest -fedora image to a fedora-latest.tar: - - $ docker save fedora > fedora-all.tar - $ docker save --output=fedora-latest.tar fedora:latest - $ ls -sh fedora-all.tar - 721M fedora-all.tar - $ ls -sh fedora-latest.tar - 367M fedora-latest.tar - -# See also -**docker-load(1)** to load an image from a tar archive on STDIN. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -November 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-start.1.md b/vendor/github.com/docker/docker/man/docker-start.1.md deleted file mode 100644 index c00b0a166..000000000 --- a/vendor/github.com/docker/docker/man/docker-start.1.md +++ /dev/null @@ -1,39 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-start - Start one or more containers - -# SYNOPSIS -**docker start** -[**-a**|**--attach**] -[**--detach-keys**[=*[]*]] -[**--help**] -[**-i**|**--interactive**] -CONTAINER [CONTAINER...] - -# DESCRIPTION - -Start one or more containers. - -# OPTIONS -**-a**, **--attach**=*true*|*false* - Attach container's STDOUT and STDERR and forward all signals to the - process. The default is *false*. - -**--detach-keys**="" - Override the key sequence for detaching a container. Format is a single character `[a-Z]` or `ctrl-` where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**--help** - Print usage statement - -**-i**, **--interactive**=*true*|*false* - Attach container's STDIN. The default is *false*. - -# See also -**docker-stop(1)** to stop a container. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-stop.1.md b/vendor/github.com/docker/docker/man/docker-stop.1.md deleted file mode 100644 index fa377c92c..000000000 --- a/vendor/github.com/docker/docker/man/docker-stop.1.md +++ /dev/null @@ -1,30 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-stop - Stop a container by sending SIGTERM and then SIGKILL after a grace period - -# SYNOPSIS -**docker stop** -[**--help**] -[**-t**|**--time**[=*10*]] -CONTAINER [CONTAINER...] - -# DESCRIPTION -Stop a container (Send SIGTERM, and then SIGKILL after - grace period) - -# OPTIONS -**--help** - Print usage statement - -**-t**, **--time**=*10* - Number of seconds to wait for the container to stop before killing it. Default is 10 seconds. - -#See also -**docker-start(1)** to restart a stopped container. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-top.1.md b/vendor/github.com/docker/docker/man/docker-top.1.md deleted file mode 100644 index a666f7cd3..000000000 --- a/vendor/github.com/docker/docker/man/docker-top.1.md +++ /dev/null @@ -1,36 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-top - Display the running processes of a container - -# SYNOPSIS -**docker top** -[**--help**] -CONTAINER [ps OPTIONS] - -# DESCRIPTION - -Display the running process of the container. ps-OPTION can be any of the options you would pass to a Linux ps command. - -All displayed information is from host's point of view. - -# OPTIONS -**--help** - Print usage statement - -# EXAMPLES - -Run **docker top** with the ps option of -x: - - $ docker top 8601afda2b -x - PID TTY STAT TIME COMMAND - 16623 ? Ss 0:00 sleep 99999 - - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -June 2015, updated by Ma Shimiao -December 2015, updated by Pavel Pospisil diff --git a/vendor/github.com/docker/docker/man/docker-unpause.1.md b/vendor/github.com/docker/docker/man/docker-unpause.1.md deleted file mode 100644 index e6fd3c4e0..000000000 --- a/vendor/github.com/docker/docker/man/docker-unpause.1.md +++ /dev/null @@ -1,28 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-unpause - Unpause all processes within one or more containers - -# SYNOPSIS -**docker unpause** -CONTAINER [CONTAINER...] - -# DESCRIPTION - -The `docker unpause` command un-suspends all processes in the specified containers. -On Linux, it does this using the cgroups freezer. - -See the [cgroups freezer documentation] -(https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt) for -further details. - -# OPTIONS -**--help** - Print usage statement - -# See also -**docker-pause(1)** to pause all processes within one or more containers. - -# HISTORY -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/docker-update.1.md b/vendor/github.com/docker/docker/man/docker-update.1.md deleted file mode 100644 index 85f3dd07c..000000000 --- a/vendor/github.com/docker/docker/man/docker-update.1.md +++ /dev/null @@ -1,171 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-update - Update configuration of one or more containers - -# SYNOPSIS -**docker update** -[**--blkio-weight**[=*[BLKIO-WEIGHT]*]] -[**--cpu-shares**[=*0*]] -[**--cpu-period**[=*0*]] -[**--cpu-quota**[=*0*]] -[**--cpu-rt-period**[=*0*]] -[**--cpu-rt-runtime**[=*0*]] -[**--cpuset-cpus**[=*CPUSET-CPUS*]] -[**--cpuset-mems**[=*CPUSET-MEMS*]] -[**--help**] -[**--kernel-memory**[=*KERNEL-MEMORY*]] -[**-m**|**--memory**[=*MEMORY*]] -[**--memory-reservation**[=*MEMORY-RESERVATION*]] -[**--memory-swap**[=*MEMORY-SWAP*]] -[**--restart**[=*""*]] -CONTAINER [CONTAINER...] - -# DESCRIPTION - -The **docker update** command dynamically updates container configuration. -You can use this command to prevent containers from consuming too many -resources from their Docker host. With a single command, you can place -limits on a single container or on many. To specify more than one container, -provide space-separated list of container names or IDs. - -With the exception of the **--kernel-memory** option, you can specify these -options on a running or a stopped container. On kernel version older than -4.6, You can only update **--kernel-memory** on a stopped container or on -a running container with kernel memory initialized. - -# OPTIONS - -**--blkio-weight**=0 - Block IO weight (relative weight) accepts a weight value between 10 and 1000. - -**--cpu-shares**=0 - CPU shares (relative weight) - -**--cpu-period**=0 - Limit the CPU CFS (Completely Fair Scheduler) period - - Limit the container's CPU usage. This flag tell the kernel to restrict the container's CPU usage to the period you specify. - -**--cpu-quota**=0 - Limit the CPU CFS (Completely Fair Scheduler) quota - -**--cpu-rt-period**=0 - Limit the CPU real-time period in microseconds - - Limit the container's Real Time CPU usage. This flag tell the kernel to restrict the container's Real Time CPU usage to the period you specify. - -**--cpu-rt-runtime**=0 - Limit the CPU real-time runtime in microseconds - - Limit the containers Real Time CPU usage. This flag tells the kernel to limit the amount of time in a given CPU period Real Time tasks may consume. Ex: - Period of 1,000,000us and Runtime of 950,000us means that this container could consume 95% of available CPU and leave the remaining 5% to normal priority tasks. - - The sum of all runtimes across containers cannot exceed the amount allotted to the parent cgroup. - -**--cpuset-cpus**="" - CPUs in which to allow execution (0-3, 0,1) - -**--cpuset-mems**="" - Memory nodes(MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems. - -**--help** - Print usage statement - -**--kernel-memory**="" - Kernel memory limit (format: `[]`, where unit = b, k, m or g) - - Note that on kernel version older than 4.6, you can not update kernel memory on - a running container if the container is started without kernel memory initialized, - in this case, it can only be updated after it's stopped. The new setting takes - effect when the container is started. - -**-m**, **--memory**="" - Memory limit (format: , where unit = b, k, m or g) - - Note that the memory should be smaller than the already set swap memory limit. - If you want update a memory limit bigger than the already set swap memory limit, - you should update swap memory limit at the same time. If you don't set swap memory - limit on docker create/run but only memory limit, the swap memory is double - the memory limit. - -**--memory-reservation**="" - Memory soft limit (format: [], where unit = b, k, m or g) - -**--memory-swap**="" - Total memory limit (memory + swap) - -**--restart**="" - Restart policy to apply when a container exits (no, on-failure[:max-retry], always, unless-stopped). - -# EXAMPLES - -The following sections illustrate ways to use this command. - -### Update a container's cpu-shares - -To limit a container's cpu-shares to 512, first identify the container -name or ID. You can use **docker ps** to find these values. You can also -use the ID returned from the **docker run** command. Then, do the following: - -```bash -$ docker update --cpu-shares 512 abebf7571666 -``` - -### Update a container with cpu-shares and memory - -To update multiple resource configurations for multiple containers: - -```bash -$ docker update --cpu-shares 512 -m 300M abebf7571666 hopeful_morse -``` - -### Update a container's kernel memory constraints - -You can update a container's kernel memory limit using the **--kernel-memory** -option. On kernel version older than 4.6, this option can be updated on a -running container only if the container was started with **--kernel-memory**. -If the container was started *without* **--kernel-memory** you need to stop -the container before updating kernel memory. - -For example, if you started a container with this command: - -```bash -$ docker run -dit --name test --kernel-memory 50M ubuntu bash -``` - -You can update kernel memory while the container is running: - -```bash -$ docker update --kernel-memory 80M test -``` - -If you started a container *without* kernel memory initialized: - -```bash -$ docker run -dit --name test2 --memory 300M ubuntu bash -``` - -Update kernel memory of running container `test2` will fail. You need to stop -the container before updating the **--kernel-memory** setting. The next time you -start it, the container uses the new value. - -Kernel version newer than (include) 4.6 does not have this limitation, you -can use `--kernel-memory` the same way as other options. - -### Update a container's restart policy - -You can change a container's restart policy on a running container. The new -restart policy takes effect instantly after you run `docker update` on a -container. - -To update restart policy for one or more containers: - -```bash -$ docker update --restart=on-failure:3 abebf7571666 hopeful_morse -``` - -Note that if the container is started with "--rm" flag, you cannot update the restart -policy for it. The `AutoRemove` and `RestartPolicy` are mutually exclusive for the -container. diff --git a/vendor/github.com/docker/docker/man/docker-wait.1.md b/vendor/github.com/docker/docker/man/docker-wait.1.md deleted file mode 100644 index 678800966..000000000 --- a/vendor/github.com/docker/docker/man/docker-wait.1.md +++ /dev/null @@ -1,30 +0,0 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-wait - Block until one or more containers stop, then print their exit codes - -# SYNOPSIS -**docker wait** -[**--help**] -CONTAINER [CONTAINER...] - -# DESCRIPTION - -Block until one or more containers stop, then print their exit codes. - -# OPTIONS -**--help** - Print usage statement - -# EXAMPLES - - $ docker run -d fedora sleep 99 - 079b83f558a2bc52ecad6b2a5de13622d584e6bb1aea058c11b36511e85e7622 - $ docker wait 079b83f558a2bc - 0 - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/generate.go b/vendor/github.com/docker/docker/man/generate.go index f21614d94..1516158f7 100644 --- a/vendor/github.com/docker/docker/man/generate.go +++ b/vendor/github.com/docker/docker/man/generate.go @@ -2,16 +2,22 @@ package main import ( "fmt" + "io/ioutil" + "log" "os" + "path/filepath" "github.com/docker/docker/cli/command" "github.com/docker/docker/cli/command/commands" "github.com/docker/docker/pkg/term" "github.com/spf13/cobra" "github.com/spf13/cobra/doc" + "github.com/spf13/pflag" ) -func generateManPages(path string) error { +const descriptionSourcePath = "man/src/" + +func generateManPages(opts *options) error { header := &doc.GenManHeader{ Title: "DOCKER", Section: "1", @@ -22,22 +28,67 @@ func generateManPages(path string) error { dockerCli := command.NewDockerCli(stdin, stdout, stderr) cmd := &cobra.Command{Use: "docker"} commands.AddCommands(cmd, dockerCli) + source := filepath.Join(opts.source, descriptionSourcePath) + if err := loadLongDescription(cmd, source); err != nil { + return err + } cmd.DisableAutoGenTag = true return doc.GenManTreeFromOpts(cmd, doc.GenManTreeOptions{ Header: header, - Path: path, + Path: opts.target, CommandSeparator: "-", }) } +func loadLongDescription(cmd *cobra.Command, path string) error { + for _, cmd := range cmd.Commands() { + if cmd.Name() == "" { + continue + } + fullpath := filepath.Join(path, cmd.Name()+".md") + + if cmd.HasSubCommands() { + loadLongDescription(cmd, filepath.Join(path, cmd.Name())) + } + + if _, err := os.Stat(fullpath); err != nil { + log.Printf("WARN: %s does not exist, skipping\n", fullpath) + continue + } + + content, err := ioutil.ReadFile(fullpath) + if err != nil { + return err + } + cmd.Long = string(content) + } + return nil +} + +type options struct { + source string + target string +} + +func parseArgs() (*options, error) { + opts := &options{} + cwd, _ := os.Getwd() + flags := pflag.NewFlagSet(os.Args[0], pflag.ContinueOnError) + flags.StringVar(&opts.source, "root", cwd, "Path to project root") + flags.StringVar(&opts.target, "target", "/tmp", "Target path for generated man pages") + err := flags.Parse(os.Args[1:]) + return opts, err +} + func main() { - path := "/tmp" - if len(os.Args) > 1 { - path = os.Args[1] + opts, err := parseArgs() + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) } - fmt.Printf("Generating man pages into %s\n", path) - if err := generateManPages(path); err != nil { + fmt.Printf("Project root: %s\n", opts.source) + fmt.Printf("Generating man pages into %s\n", opts.target) + if err := generateManPages(opts); err != nil { fmt.Fprintf(os.Stderr, "Failed to generate man pages: %s\n", err.Error()) } } diff --git a/vendor/github.com/docker/docker/man/generate.sh b/vendor/github.com/docker/docker/man/generate.sh index e4126ba4a..c97edb440 100755 --- a/vendor/github.com/docker/docker/man/generate.sh +++ b/vendor/github.com/docker/docker/man/generate.sh @@ -9,7 +9,7 @@ mkdir -p ./man/man1 # Generate man pages from cobra commands go build -o /tmp/gen-manpages ./man -/tmp/gen-manpages ./man/man1 +/tmp/gen-manpages --root . --target ./man/man1 # Generate legacy pages from markdown ./man/md2man-all.sh -q diff --git a/vendor/github.com/docker/docker/man/src/attach.md b/vendor/github.com/docker/docker/man/src/attach.md new file mode 100644 index 000000000..ff1102e10 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/attach.md @@ -0,0 +1,2 @@ + +Alias for `docker container attach`. diff --git a/vendor/github.com/docker/docker/man/src/commit.md b/vendor/github.com/docker/docker/man/src/commit.md new file mode 100644 index 000000000..3deb25bb5 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/commit.md @@ -0,0 +1 @@ +Alias for `docker container commit`. diff --git a/vendor/github.com/docker/docker/man/docker-attach.1.md b/vendor/github.com/docker/docker/man/src/container/attach.md similarity index 76% rename from vendor/github.com/docker/docker/man/docker-attach.1.md rename to vendor/github.com/docker/docker/man/src/container/attach.md index c39d1c929..fff713bcf 100644 --- a/vendor/github.com/docker/docker/man/docker-attach.1.md +++ b/vendor/github.com/docker/docker/man/src/container/attach.md @@ -1,18 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-attach - Attach to a running container - -# SYNOPSIS -**docker attach** -[**--detach-keys**[=*[]*]] -[**--help**] -[**--no-stdin**] -[**--sig-proxy**[=*true*]] -CONTAINER - -# DESCRIPTION The **docker attach** command allows you to attach to a running container using the container's ID or name, either to view its ongoing output or to control it interactively. You can attach to the same contained process multiple times @@ -28,19 +13,6 @@ file. See **config-json(5)** for documentation on using a configuration file. It is forbidden to redirect the standard input of a `docker attach` command while attaching to a tty-enabled container (i.e.: launched with `-t`). -# OPTIONS -**--detach-keys**="" - Override the key sequence for detaching a container. Format is a single character `[a-Z]` or `ctrl-` where `` is one of: `a-z`, `@`, `^`, `[`, `,` or `_`. - -**--help** - Print usage statement - -**--no-stdin**=*true*|*false* - Do not attach STDIN. The default is *false*. - -**--sig-proxy**=*true*|*false* - Proxy all received signals to the process (non-TTY mode only). SIGCHLD, SIGKILL, and SIGSTOP are not proxied. The default is *true*. - # Override the detach sequence If you want, you can configure an override the Docker key sequence for detach. @@ -92,8 +64,3 @@ attach** command: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 17208 1144 932 R 0 0.3 0:00.03 top - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/src/container/commit.md b/vendor/github.com/docker/docker/man/src/container/commit.md new file mode 100644 index 000000000..6d619baed --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/commit.md @@ -0,0 +1,30 @@ +Create a new image from an existing container specified by name or +container ID. The new image will contain the contents of the +container filesystem, *excluding* any data volumes. Refer to **docker-tag(1)** +for more information about valid image and tag names. + +While the `docker commit` command is a convenient way of extending an +existing image, you should prefer the use of a Dockerfile and `docker +build` for generating images that you intend to share with other +people. + +# EXAMPLES + +## Creating a new image from an existing container +An existing Fedora based container has had Apache installed while running +in interactive mode with the bash shell. Apache is also running. To +create a new image run `docker ps` to find the container's ID and then run: + + # docker commit -m="Added Apache to Fedora base image" \ + -a="A D Ministrator" 98bd7fc99854 fedora/fedora_httpd:20 + +Note that only a-z0-9-_. are allowed when naming images from an +existing container. + +## Apply specified Dockerfile instructions while committing the image +If an existing container was created without the DEBUG environment +variable set to "true", you can create a new image based on that +container by first getting the container's ID with `docker ps` and +then running: + + # docker container commit -c="ENV DEBUG true" 98bd7fc99854 debug-image diff --git a/vendor/github.com/docker/docker/man/docker-cp.1.md b/vendor/github.com/docker/docker/man/src/container/cp.md similarity index 81% rename from vendor/github.com/docker/docker/man/docker-cp.1.md rename to vendor/github.com/docker/docker/man/src/container/cp.md index 949d60bb8..29b3c0ef2 100644 --- a/vendor/github.com/docker/docker/man/docker-cp.1.md +++ b/vendor/github.com/docker/docker/man/src/container/cp.md @@ -1,42 +1,25 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-cp - Copy files/folders between a container and the local filesystem. - -# SYNOPSIS -**docker cp** -[**--help**] -CONTAINER:SRC_PATH DEST_PATH|- - -**docker cp** -[**--help**] -SRC_PATH|- CONTAINER:DEST_PATH - -# DESCRIPTION - -The `docker cp` utility copies the contents of `SRC_PATH` to the `DEST_PATH`. +The `docker container cp` utility copies the contents of `SRC_PATH` to the `DEST_PATH`. You can copy from the container's file system to the local machine or the reverse, from the local filesystem to the container. If `-` is specified for either the `SRC_PATH` or `DEST_PATH`, you can also stream a tar archive from `STDIN` or to `STDOUT`. The `CONTAINER` can be a running or stopped container. The `SRC_PATH` or `DEST_PATH` can be a file or directory. -The `docker cp` command assumes container paths are relative to the container's +The `docker container cp` command assumes container paths are relative to the container's `/` (root) directory. This means supplying the initial forward slash is optional; The command sees `compassionate_darwin:/tmp/foo/myfile.txt` and `compassionate_darwin:tmp/foo/myfile.txt` as identical. Local machine paths can be an absolute or relative value. The command interprets a local machine's -relative paths as relative to the current working directory where `docker cp` is +relative paths as relative to the current working directory where `docker container cp` is run. The `cp` command behaves like the Unix `cp -a` command in that directories are copied recursively with permissions preserved if possible. Ownership is set to the user and primary group at the destination. For example, files copied to a container are created with `UID:GID` of the root user. Files copied to the local -machine are created with the `UID:GID` of the user which invoked the `docker cp` -command. If you specify the `-L` option, `docker cp` follows any symbolic link -in the `SRC_PATH`. `docker cp` does *not* create parent directories for +machine are created with the `UID:GID` of the user which invoked the `docker container cp` +command. If you specify the `-L` option, `docker container cp` follows any symbolic link +in the `SRC_PATH`. `docker container cp` does *not* create parent directories for `DEST_PATH` if they do not exist. Assuming a path separator of `/`, a first argument of `SRC_PATH` and second @@ -94,13 +77,6 @@ The command extracts the content of the tar to the `DEST_PATH` in container's filesystem. In this case, `DEST_PATH` must specify a directory. Using `-` as the `DEST_PATH` streams the contents of the resource as a tar archive to `STDOUT`. -# OPTIONS -**-L**, **--follow-link**=*true*|*false* - Follow symbol link in SRC_PATH - -**--help** - Print usage statement - # EXAMPLES Suppose a container has finished producing some output as a file it saves @@ -109,28 +85,28 @@ some other computation. You can copy these outputs from the container to a location on your local host. If you want to copy the `/tmp/foo` directory from a container to the -existing `/tmp` directory on your host. If you run `docker cp` in your `~` +existing `/tmp` directory on your host. If you run `docker container cp` in your `~` (home) directory on the local host: - $ docker cp compassionate_darwin:tmp/foo /tmp + $ docker container cp compassionate_darwin:tmp/foo /tmp Docker creates a `/tmp/foo` directory on your host. Alternatively, you can omit the leading slash in the command. If you execute this command from your home directory: - $ docker cp compassionate_darwin:tmp/foo tmp + $ docker container cp compassionate_darwin:tmp/foo tmp If `~/tmp` does not exist, Docker will create it and copy the contents of `/tmp/foo` from the container into this new directory. If `~/tmp` already exists as a directory, then Docker will copy the contents of `/tmp/foo` from the container into a directory at `~/tmp/foo`. -When copying a single file to an existing `LOCALPATH`, the `docker cp` command +When copying a single file to an existing `LOCALPATH`, the `docker container cp` command will either overwrite the contents of `LOCALPATH` if it is a file or place it into `LOCALPATH` if it is a directory, overwriting an existing file of the same name if one exists. For example, this command: - $ docker cp sharp_ptolemy:/tmp/foo/myfile.txt /test + $ docker container cp sharp_ptolemy:/tmp/foo/myfile.txt /test If `/test` does not exist on the local machine, it will be created as a file with the contents of `/tmp/foo/myfile.txt` from the container. If `/test` @@ -147,12 +123,12 @@ If you have a file, `config.yml`, in the current directory on your local host and wish to copy it to an existing directory at `/etc/my-app.d` in a container, this command can be used: - $ docker cp config.yml myappcontainer:/etc/my-app.d + $ docker container cp config.yml myappcontainer:/etc/my-app.d If you have several files in a local directory `/config` which you need to copy to a directory `/etc/my-app.d` in a container: - $ docker cp /config/. myappcontainer:/etc/my-app.d + $ docker container cp /config/. myappcontainer:/etc/my-app.d The above command will copy the contents of the local `/config` directory into the directory `/etc/my-app.d` in the container. @@ -162,14 +138,8 @@ want to copy the linked target and not the link itself. To copy the target, use the `-L` option, for example: $ ln -s /tmp/somefile /tmp/somefile.ln - $ docker cp -L /tmp/somefile.ln myappcontainer:/tmp/ + $ docker container cp -L /tmp/somefile.ln myappcontainer:/tmp/ This command copies content of the local `/tmp/somefile` into the file `/tmp/somefile.ln` in the container. Without `-L` option, the `/tmp/somefile.ln` preserves its symbolic link but not its content. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -May 2015, updated by Josh Hawn diff --git a/vendor/github.com/docker/docker/man/src/container/create.md b/vendor/github.com/docker/docker/man/src/container/create.md new file mode 100644 index 000000000..eeeda373e --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/create.md @@ -0,0 +1,99 @@ +Creates a writeable container layer over the specified image and prepares it for +running the specified command. The container ID is then printed to STDOUT. This +is similar to **docker run -d** except the container is never started. You can +then use the **docker start ** command to start the container at +any point. + +The initial status of the container created with **docker create** is 'created'. + +# OPTIONS + +The `CONTAINER-DIR` must be an absolute path such as `/src/docs`. The `HOST-DIR` +can be an absolute path or a `name` value. A `name` value must start with an +alphanumeric character, followed by `a-z0-9`, `_` (underscore), `.` (period) or +`-` (hyphen). An absolute path starts with a `/` (forward slash). + +If you supply a `HOST-DIR` that is an absolute path, Docker bind-mounts to the +path you specify. If you supply a `name`, Docker creates a named volume by that +`name`. For example, you can specify either `/foo` or `foo` for a `HOST-DIR` +value. If you supply the `/foo` value, Docker creates a bind-mount. If you +supply the `foo` specification, Docker creates a named volume. + +You can specify multiple **-v** options to mount one or more mounts to a +container. To use these same mounts in other containers, specify the +**--volumes-from** option also. + +You can add `:ro` or `:rw` suffix to a volume to mount it read-only or +read-write mode, respectively. By default, the volumes are mounted read-write. +See examples. + +Labeling systems like SELinux require that proper labels are placed on volume +content mounted into a container. Without a label, the security system might +prevent the processes running inside the container from using the content. By +default, Docker does not change the labels set by the OS. + +To change a label in the container context, you can add either of two suffixes +`:z` or `:Z` to the volume mount. These suffixes tell Docker to relabel file +objects on the shared volumes. The `z` option tells Docker that two containers +share the volume content. As a result, Docker labels the content with a shared +content label. Shared volume labels allow all containers to read/write content. +The `Z` option tells Docker to label the content with a private unshared label. +Only the current container can use a private volume. + +By default bind mounted volumes are `private`. That means any mounts done +inside container will not be visible on host and vice-a-versa. One can change +this behavior by specifying a volume mount propagation property. Making a +volume `shared` mounts done under that volume inside container will be +visible on host and vice-a-versa. Making a volume `slave` enables only one +way mount propagation and that is mounts done on host under that volume +will be visible inside container but not the other way around. + +To control mount propagation property of volume one can use `:[r]shared`, +`:[r]slave` or `:[r]private` propagation flag. Propagation property can +be specified only for bind mounted volumes and not for internal volumes or +named volumes. For mount propagation to work source mount point (mount point +where source dir is mounted on) has to have right propagation properties. For +shared volumes, source mount point has to be shared. And for slave volumes, +source mount has to be either shared or slave. + +Use `df ` to figure out the source mount and then use +`findmnt -o TARGET,PROPAGATION ` to figure out propagation +properties of source mount. If `findmnt` utility is not available, then one +can look at mount entry for source mount point in `/proc/self/mountinfo`. Look +at `optional fields` and see if any propagaion properties are specified. +`shared:X` means mount is `shared`, `master:X` means mount is `slave` and if +nothing is there that means mount is `private`. + +To change propagation properties of a mount point use `mount` command. For +example, if one wants to bind mount source directory `/foo` one can do +`mount --bind /foo /foo` and `mount --make-private --make-shared /foo`. This +will convert /foo into a `shared` mount point. Alternatively one can directly +change propagation properties of source mount. Say `/` is source mount for +`/foo`, then use `mount --make-shared /` to convert `/` into a `shared` mount. + +> **Note**: +> When using systemd to manage the Docker daemon's start and stop, in the systemd +> unit file there is an option to control mount propagation for the Docker daemon +> itself, called `MountFlags`. The value of this setting may cause Docker to not +> see mount propagation changes made on the mount point. For example, if this value +> is `slave`, you may not be able to use the `shared` or `rshared` propagation on +> a volume. + + +To disable automatic copying of data from the container path to the volume, use +the `nocopy` flag. The `nocopy` flag can be set on bind mounts and named volumes. + +# EXAMPLES + +## Specify isolation technology for container (--isolation) + +This option is useful in situations where you are running Docker containers on +Windows. The `--isolation=` option sets a container's isolation +technology. On Linux, the only supported is the `default` option which uses +Linux namespaces. On Microsoft Windows, you can specify these values: + +* `default`: Use the value specified by the Docker daemon's `--exec-opt` . If the `daemon` does not specify an isolation technology, Microsoft Windows uses `process` as its default value. +* `process`: Namespace isolation only. +* `hyperv`: Hyper-V hypervisor partition-based isolation. + +Specifying the `--isolation` flag without a value is the same as setting `--isolation="default"`. diff --git a/vendor/github.com/docker/docker/man/docker-diff.1.md b/vendor/github.com/docker/docker/man/src/container/diff.md similarity index 66% rename from vendor/github.com/docker/docker/man/docker-diff.1.md rename to vendor/github.com/docker/docker/man/src/container/diff.md index 3342ad1af..eb485e364 100644 --- a/vendor/github.com/docker/docker/man/docker-diff.1.md +++ b/vendor/github.com/docker/docker/man/src/container/diff.md @@ -1,15 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-diff - Inspect changes to files or directories on a container's filesystem - -# SYNOPSIS -**docker diff** -[**--help**] -CONTAINER - -# DESCRIPTION List the changed files and directories in a container᾿s filesystem since the container was created. Three different types of change are tracked: @@ -22,10 +10,6 @@ container was created. Three different types of change are tracked: You can use the full or shortened container ID or the container name set using **docker run --name** option. -# OPTIONS -**--help** - Print usage statement - # EXAMPLES Inspect the changes to an `nginx` container: @@ -53,9 +37,3 @@ C /var/log/nginx A /var/log/nginx/access.log A /var/log/nginx/error.log ``` - - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/src/container/exec.md b/vendor/github.com/docker/docker/man/src/container/exec.md new file mode 100644 index 000000000..033db426b --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/exec.md @@ -0,0 +1,25 @@ +Run a process in a running container. + +The command started using `docker exec` will only run while the container's primary +process (`PID 1`) is running, and will not be restarted if the container is restarted. + +If the container is paused, then the `docker exec` command will wait until the +container is unpaused, and then run + +# CAPABILITIES + +`privileged` gives the process extended +[Linux capabilities](http://man7.org/linux/man-pages/man7/capabilities.7.html) +when running in a container. + +Without this flag, the process run by `docker exec` in a running container has +the same capabilities as the container, which may be limited. Set +`--privileged` to give all capabilities to the process. + +# USER +`user` sets the username or UID used and optionally the groupname or GID for the specified command. + + The followings examples are all valid: + --user [user | user:group | uid | uid:gid | user:gid | uid:group ] + + Without this argument the command will be run as root in the container. diff --git a/vendor/github.com/docker/docker/man/docker-export.1.md b/vendor/github.com/docker/docker/man/src/container/export.md similarity index 52% rename from vendor/github.com/docker/docker/man/docker-export.1.md rename to vendor/github.com/docker/docker/man/src/container/export.md index 3d59e4788..8c9a95a36 100644 --- a/vendor/github.com/docker/docker/man/docker-export.1.md +++ b/vendor/github.com/docker/docker/man/src/container/export.md @@ -1,29 +1,9 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-export - Export the contents of a container's filesystem as a tar archive - -# SYNOPSIS -**docker export** -[**--help**] -[**-o**|**--output**[=*""*]] -CONTAINER - -# DESCRIPTION Export the contents of a container's filesystem using the full or shortened container ID or container name. The output is exported to STDOUT and can be redirected to a tar file. Stream to a file instead of STDOUT by using **-o**. -# OPTIONS -**--help** - Print usage statement - -**-o**, **--output**="" - Write to a file, instead of STDOUT - # EXAMPLES Export the contents of the container called angry_bell to a tar file called angry_bell.tar: @@ -38,9 +18,3 @@ called angry_bell.tar: # See also **docker-import(1)** to create an empty filesystem image and import the contents of the tarball into it, then optionally tag it. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -January 2015, updated by Joseph Kern (josephakern at gmail dot com) diff --git a/vendor/github.com/docker/docker/man/src/container/kill.md b/vendor/github.com/docker/docker/man/src/container/kill.md new file mode 100644 index 000000000..b8b94e528 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/kill.md @@ -0,0 +1,2 @@ +The main process inside each container specified will be sent SIGKILL, + or any signal specified with option --signal. diff --git a/vendor/github.com/docker/docker/man/src/container/logs.md b/vendor/github.com/docker/docker/man/src/container/logs.md new file mode 100644 index 000000000..c053f8575 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/logs.md @@ -0,0 +1,28 @@ +The **docker container logs** command batch-retrieves whatever logs are present for +a container at the time of execution. This does not guarantee execution +order when combined with a docker run (i.e., your run may not have generated +any logs at the time you execute docker container logs). + +The **docker container logs --follow** command combines commands **docker container logs** and +**docker attach**. It will first return all logs from the beginning and +then continue streaming new output from the container's stdout and stderr. + +**Warning**: This command works only for the **json-file** or **journald** +logging drivers. + +The `--since` option can be Unix timestamps, date formatted timestamps, or Go +duration strings (e.g. `10m`, `1h30m`) computed relative to the client machine's +time. Supported formats for date formatted time stamps include RFC3339Nano, +RFC3339, `2006-01-02T15:04:05`, `2006-01-02T15:04:05.999999999`, +`2006-01-02Z07:00`, and `2006-01-02`. The local timezone on the client will be +used if you do not provide either a `Z` or a `+-00:00` timezone offset at the +end of the timestamp. When providing Unix timestamps enter +seconds[.nanoseconds], where seconds is the number of seconds that have elapsed +since January 1, 1970 (midnight UTC/GMT), not counting leap seconds (aka Unix +epoch or Unix time), and the optional .nanoseconds field is a fraction of a +second no more than nine digits long. You can combine the `--since` option with +either or both of the `--follow` or `--tail` options. + +The `docker container logs --details` command will add on extra attributes, such as +environment variables and labels, provided to `--log-opt` when creating the +container. diff --git a/vendor/github.com/docker/docker/man/docker-ps.1.md b/vendor/github.com/docker/docker/man/src/container/ls.md similarity index 63% rename from vendor/github.com/docker/docker/man/docker-ps.1.md rename to vendor/github.com/docker/docker/man/src/container/ls.md index d9aa39f8f..193ebd96c 100644 --- a/vendor/github.com/docker/docker/man/docker-ps.1.md +++ b/vendor/github.com/docker/docker/man/src/container/ls.md @@ -1,32 +1,9 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% FEBRUARY 2015 -# NAME -docker-ps - List containers - -# SYNOPSIS -**docker ps** -[**-a**|**--all**] -[**-f**|**--filter**[=*[]*]] -[**--format**=*"TEMPLATE"*] -[**--help**] -[**-l**|**--latest**] -[**-n**[=*-1*]] -[**--no-trunc**] -[**-q**|**--quiet**] -[**-s**|**--size**] - -# DESCRIPTION - List the containers in the local repository. By default this shows only the running containers. -# OPTIONS -**-a**, **--all**=*true*|*false* - Show all containers. Only running containers are shown by default. The default is *false*. +## Filters -**-f**, **--filter**=[] - Filter output based on these conditions: +Filter output based on these conditions: - exited= an exit code of - label= or label== - status=(created|restarting|running|paused|exited|dead) @@ -40,7 +17,8 @@ the running containers. - network=(|) - containers connected to the provided network - health=(starting|healthy|unhealthy|none) - filters containers based on healthcheck status -**--format**="*TEMPLATE*" +## Format + Pretty-print containers using a Go template. Valid placeholders: .ID - Container ID @@ -56,28 +34,10 @@ the running containers. .Label - Value of a specific label for this container. For example `{{.Label "com.docker.swarm.cpu"}}` .Mounts - Names of the volumes mounted in this container. -**--help** - Print usage statement - -**-l**, **--latest**=*true*|*false* - Show only the latest created container (includes all states). The default is *false*. - -**-n**=*-1* - Show n last created containers (includes all states). - -**--no-trunc**=*true*|*false* - Don't truncate output. The default is *false*. - -**-q**, **--quiet**=*true*|*false* - Only display numeric IDs. The default is *false*. - -**-s**, **--size**=*true*|*false* - Display total file sizes. The default is *false*. - # EXAMPLES # Display all containers, including non-running - # docker ps -a + # docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a87ecb4f327c fedora:20 /bin/sh -c #(nop) MA 20 minutes ago Exit 0 desperate_brattain 01946d9d34d8 vpavlin/rhel7:latest /bin/sh -c #(nop) MA 33 minutes ago Exit 0 thirsty_bell @@ -86,7 +46,7 @@ the running containers. # Display only IDs of all containers, including non-running - # docker ps -a -q + # docker container ls -a -q a87ecb4f327c 01946d9d34d8 c1d3b0166030 @@ -94,12 +54,12 @@ the running containers. # Display only IDs of all containers that have the name `determined_torvalds` - # docker ps -a -q --filter=name=determined_torvalds + # docker container ls -a -q --filter=name=determined_torvalds c1d3b0166030 # Display containers with their commands - # docker ps --format "{{.ID}}: {{.Command}}" + # docker container ls --format "{{.ID}}: {{.Command}}" a87ecb4f327c: /bin/sh -c #(nop) MA 01946d9d34d8: /bin/sh -c #(nop) MA c1d3b0166030: /bin/sh -c yum -y up @@ -107,7 +67,7 @@ the running containers. # Display containers with their labels in a table - # docker ps --format "table {{.ID}}\t{{.Labels}}" + # docker container ls --format "table {{.ID}}\t{{.Labels}}" CONTAINER ID LABELS a87ecb4f327c com.docker.swarm.node=ubuntu,com.docker.swarm.storage=ssd 01946d9d34d8 @@ -116,7 +76,7 @@ the running containers. # Display containers with their node label in a table - # docker ps --format 'table {{.ID}}\t{{(.Label "com.docker.swarm.node")}}' + # docker container ls --format 'table {{.ID}}\t{{(.Label "com.docker.swarm.node")}}' CONTAINER ID NODE a87ecb4f327c ubuntu 01946d9d34d8 @@ -125,21 +85,12 @@ the running containers. # Display containers with `remote-volume` mounted - $ docker ps --filter volume=remote-volume --format "table {{.ID}}\t{{.Mounts}}" + $ docker container ls --filter volume=remote-volume --format "table {{.ID}}\t{{.Mounts}}" CONTAINER ID MOUNTS 9c3527ed70ce remote-volume # Display containers with a volume mounted in `/data` - $ docker ps --filter volume=/data --format "table {{.ID}}\t{{.Mounts}}" + $ docker container ls --filter volume=/data --format "table {{.ID}}\t{{.Mounts}}" CONTAINER ID MOUNTS 9c3527ed70ce remote-volume - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -August 2014, updated by Sven Dowideit -November 2014, updated by Sven Dowideit -February 2015, updated by André Martins -October 2016, updated by Josh Horwitz diff --git a/vendor/github.com/docker/docker/man/src/container/pause.md b/vendor/github.com/docker/docker/man/src/container/pause.md new file mode 100644 index 000000000..09ea5b93d --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/pause.md @@ -0,0 +1,12 @@ +The `docker container pause` command suspends all processes in the specified containers. +On Linux, this uses the cgroups freezer. Traditionally, when suspending a process +the `SIGSTOP` signal is used, which is observable by the process being suspended. +With the cgroups freezer the process is unaware, and unable to capture, +that it is being suspended, and subsequently resumed. On Windows, only Hyper-V +containers can be paused. + +See the [cgroups freezer documentation] +(https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt) for +further details. + +**docker-container-unpause(1)** to unpause all processes within a container. diff --git a/vendor/github.com/docker/docker/man/docker-port.1.md b/vendor/github.com/docker/docker/man/src/container/port.md similarity index 53% rename from vendor/github.com/docker/docker/man/docker-port.1.md rename to vendor/github.com/docker/docker/man/src/container/port.md index 83e9cf93b..264f43e61 100644 --- a/vendor/github.com/docker/docker/man/docker-port.1.md +++ b/vendor/github.com/docker/docker/man/src/container/port.md @@ -1,21 +1,5 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-port - List port mappings for the CONTAINER, or lookup the public-facing port that is NAT-ed to the PRIVATE_PORT - -# SYNOPSIS -**docker port** -[**--help**] -CONTAINER [PRIVATE_PORT[/PROTO]] - -# DESCRIPTION List port mappings for the CONTAINER, or lookup the public-facing port that is NAT-ed to the PRIVATE_PORT -# OPTIONS -**--help** - Print usage statement - # EXAMPLES # docker ps @@ -24,24 +8,19 @@ List port mappings for the CONTAINER, or lookup the public-facing port that is N ## Find out all the ports mapped - # docker port test + # docker container port test 7890/tcp -> 0.0.0.0:4321 9876/tcp -> 0.0.0.0:1234 ## Find out a specific mapping - # docker port test 7890/tcp + # docker container port test 7890/tcp 0.0.0.0:4321 - # docker port test 7890 + # docker container port test 7890 0.0.0.0:4321 ## An example showing error for non-existent mapping - # docker port test 7890/udp + # docker container port test 7890/udp 2014/06/24 11:53:36 Error: No public port '7890/udp' published for test - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -June 2014, updated by Sven Dowideit -November 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/src/container/rename.md b/vendor/github.com/docker/docker/man/src/container/rename.md new file mode 100644 index 000000000..e6f49a0eb --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/rename.md @@ -0,0 +1 @@ +Rename a container. Container may be running, paused or stopped. diff --git a/vendor/github.com/docker/docker/man/src/container/restart.md b/vendor/github.com/docker/docker/man/src/container/restart.md new file mode 100644 index 000000000..66ef6688e --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/restart.md @@ -0,0 +1 @@ +Restart each container listed. diff --git a/vendor/github.com/docker/docker/man/src/container/rm.md b/vendor/github.com/docker/docker/man/src/container/rm.md new file mode 100644 index 000000000..561f0e913 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/rm.md @@ -0,0 +1,37 @@ +**docker container rm** will remove one or more containers from the host node. The +container name or ID can be used. This does not remove images. You cannot +remove a running container unless you use the **-f** option. To see all +containers on a host use the **docker container ls -a** command. + +# EXAMPLES + +## Removing a container using its ID + +To remove a container using its ID, find either from a **docker ps -a** +command, or use the ID returned from the **docker run** command, or retrieve +it from a file used to store it using the **docker run --cidfile**: + + docker container rm abebf7571666 + +## Removing a container using the container name + +The name of the container can be found using the **docker ps -a** +command. The use that name as follows: + + docker container rm hopeful_morse + +## Removing a container and all associated volumes + + $ docker container rm -v redis + redis + +This command will remove the container and any volumes associated with it. +Note that if a volume was specified with a name, it will not be removed. + + $ docker create -v awesome:/foo -v /bar --name hello redis + hello + $ docker container rm -v hello + +In this example, the volume for `/foo` will remain in tact, but the volume for +`/bar` will be removed. The same behavior holds for volumes inherited with +`--volumes-from`. diff --git a/vendor/github.com/docker/docker/man/src/container/run.md b/vendor/github.com/docker/docker/man/src/container/run.md new file mode 100644 index 000000000..5e20273e6 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/run.md @@ -0,0 +1 @@ +Alias for `docker run`. diff --git a/vendor/github.com/docker/docker/man/src/container/start.md b/vendor/github.com/docker/docker/man/src/container/start.md new file mode 100644 index 000000000..48d8592c6 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/start.md @@ -0,0 +1 @@ +Start one or more containers. diff --git a/vendor/github.com/docker/docker/man/docker-stats.1.md b/vendor/github.com/docker/docker/man/src/container/stats.md similarity index 61% rename from vendor/github.com/docker/docker/man/docker-stats.1.md rename to vendor/github.com/docker/docker/man/src/container/stats.md index 0f022cd41..2904482e8 100644 --- a/vendor/github.com/docker/docker/man/docker-stats.1.md +++ b/vendor/github.com/docker/docker/man/src/container/stats.md @@ -1,32 +1,7 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-stats - Display a live stream of one or more containers' resource usage statistics - -# SYNOPSIS -**docker stats** -[**-a**|**--all**] -[**--help**] -[**--no-stream**] -[**--format[="*TEMPLATE*"]**] -[CONTAINER...] - -# DESCRIPTION - Display a live stream of one or more containers' resource usage statistics -# OPTIONS -**-a**, **--all**=*true*|*false* - Show all containers. Only running containers are shown by default. The default is *false*. - -**--help** - Print usage statement - -**--no-stream**=*true*|*false* - Disable streaming stats and only pull the first result, default setting is false. +# Format -**--format**="*TEMPLATE*" Pretty-print containers statistics using a Go template. Valid placeholders: .Container - Container name or ID. @@ -41,17 +16,17 @@ Display a live stream of one or more containers' resource usage statistics # EXAMPLES -Running `docker stats` on all running containers +Running `docker container stats` on all running containers - $ docker stats + $ docker container stats CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O 1285939c1fd3 0.07% 796 KiB / 64 MiB 1.21% 788 B / 648 B 3.568 MB / 512 KB 9c76f7834ae2 0.07% 2.746 MiB / 64 MiB 4.29% 1.266 KB / 648 B 12.4 MB / 0 B d1ea048f04e4 0.03% 4.583 MiB / 64 MiB 6.30% 2.854 KB / 648 B 27.7 MB / 0 B -Running `docker stats` on multiple containers by name and id. +Running `docker container stats` on multiple containers by name and id. - $ docker stats fervent_panini 5acfcb1b4fd1 + $ docker container stats fervent_panini 5acfcb1b4fd1 CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O 5acfcb1b4fd1 0.00% 115.2 MiB/1.045 GiB 11.03% 1.422 kB/648 B fervent_panini 0.02% 11.08 MiB/1.045 GiB 1.06% 648 B/648 B diff --git a/vendor/github.com/docker/docker/man/src/container/stop.md b/vendor/github.com/docker/docker/man/src/container/stop.md new file mode 100644 index 000000000..e3142481b --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/stop.md @@ -0,0 +1 @@ +Stop a container (Send SIGTERM, and then SIGKILL after grace period) diff --git a/vendor/github.com/docker/docker/man/src/container/top.md b/vendor/github.com/docker/docker/man/src/container/top.md new file mode 100644 index 000000000..5e243569a --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/top.md @@ -0,0 +1,11 @@ +Display the running process of the container. ps-OPTION can be any of the options you would pass to a Linux ps command. + +All displayed information is from host's point of view. + +# EXAMPLES + +Run **docker container top** with the ps option of -x: + + $ docker container top 8601afda2b -x + PID TTY STAT TIME COMMAND + 16623 ? Ss 0:00 sleep 99999 diff --git a/vendor/github.com/docker/docker/man/src/container/unpause.md b/vendor/github.com/docker/docker/man/src/container/unpause.md new file mode 100644 index 000000000..0e77ceed6 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/unpause.md @@ -0,0 +1,6 @@ +The `docker container unpause` command un-suspends all processes in a container. +On Linux, it does this using the cgroups freezer. + +See the [cgroups freezer documentation] +(https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt) for +further details. diff --git a/vendor/github.com/docker/docker/man/src/container/update.md b/vendor/github.com/docker/docker/man/src/container/update.md new file mode 100644 index 000000000..26ee4e321 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/update.md @@ -0,0 +1,102 @@ +The **docker container update** command dynamically updates container configuration. +You can use this command to prevent containers from consuming too many +resources from their Docker host. With a single command, you can place +limits on a single container or on many. To specify more than one container, +provide space-separated list of container names or IDs. + +With the exception of the **--kernel-memory** option, you can specify these +options on a running or a stopped container. On kernel version older than +4.6, You can only update **--kernel-memory** on a stopped container or on +a running container with kernel memory initialized. + +# OPTIONS + +## kernel-memory + +Kernel memory limit (format: `[]`, where unit = b, k, m or g) + +Note that on kernel version older than 4.6, you can not update kernel memory on +a running container if the container is started without kernel memory initialized, +in this case, it can only be updated after it's stopped. The new setting takes +effect when the container is started. + +## memory + +Memory limit (format: , where unit = b, k, m or g) + +Note that the memory should be smaller than the already set swap memory limit. +If you want update a memory limit bigger than the already set swap memory limit, +you should update swap memory limit at the same time. If you don't set swap memory +limit on docker create/run but only memory limit, the swap memory is double +the memory limit. + +# EXAMPLES + +The following sections illustrate ways to use this command. + +### Update a container's cpu-shares + +To limit a container's cpu-shares to 512, first identify the container +name or ID. You can use **docker ps** to find these values. You can also +use the ID returned from the **docker run** command. Then, do the following: + +```bash +$ docker container update --cpu-shares 512 abebf7571666 +``` + +### Update a container with cpu-shares and memory + +To update multiple resource configurations for multiple containers: + +```bash +$ docker container update --cpu-shares 512 -m 300M abebf7571666 hopeful_morse +``` + +### Update a container's kernel memory constraints + +You can update a container's kernel memory limit using the **--kernel-memory** +option. On kernel version older than 4.6, this option can be updated on a +running container only if the container was started with **--kernel-memory**. +If the container was started *without* **--kernel-memory** you need to stop +the container before updating kernel memory. + +For example, if you started a container with this command: + +```bash +$ docker run -dit --name test --kernel-memory 50M ubuntu bash +``` + +You can update kernel memory while the container is running: + +```bash +$ docker container update --kernel-memory 80M test +``` + +If you started a container *without* kernel memory initialized: + +```bash +$ docker run -dit --name test2 --memory 300M ubuntu bash +``` + +Update kernel memory of running container `test2` will fail. You need to stop +the container before updating the **--kernel-memory** setting. The next time you +start it, the container uses the new value. + +Kernel version newer than (include) 4.6 does not have this limitation, you +can use `--kernel-memory` the same way as other options. + +### Update a container's restart policy + +You can change a container's restart policy on a running container. The new +restart policy takes effect instantly after you run `docker container update` on a +container. + +To update restart policy for one or more containers: + +```bash +$ docker container update --restart=on-failure:3 abebf7571666 hopeful_morse +``` + +Note that if the container is started with "--rm" flag, you cannot update the restart +policy for it. The `AutoRemove` and `RestartPolicy` are mutually exclusive for the +container. diff --git a/vendor/github.com/docker/docker/man/src/container/wait.md b/vendor/github.com/docker/docker/man/src/container/wait.md new file mode 100644 index 000000000..63dcc5a48 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/container/wait.md @@ -0,0 +1,8 @@ +Block until a container stops, then print its exit code. + +# EXAMPLES + + $ docker run -d fedora sleep 99 + 079b83f558a2bc52ecad6b2a5de13622d584e6bb1aea058c11b36511e85e7622 + $ docker container wait 079b83f558a2bc + 0 diff --git a/vendor/github.com/docker/docker/man/src/cp.md b/vendor/github.com/docker/docker/man/src/cp.md new file mode 100644 index 000000000..b1898ffc7 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/cp.md @@ -0,0 +1 @@ +Alias for `docker container cp`. diff --git a/vendor/github.com/docker/docker/man/src/create.md b/vendor/github.com/docker/docker/man/src/create.md new file mode 100644 index 000000000..f600d7d53 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/create.md @@ -0,0 +1 @@ +Alias for `docker container create`. diff --git a/vendor/github.com/docker/docker/man/src/diff.md b/vendor/github.com/docker/docker/man/src/diff.md new file mode 100644 index 000000000..29a639efa --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/diff.md @@ -0,0 +1 @@ +Alias for `docker container diff`. diff --git a/vendor/github.com/docker/docker/man/src/events.md b/vendor/github.com/docker/docker/man/src/events.md new file mode 100644 index 000000000..05fa614b7 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/events.md @@ -0,0 +1 @@ +Alias for `docker system events`. diff --git a/vendor/github.com/docker/docker/man/src/exec.md b/vendor/github.com/docker/docker/man/src/exec.md new file mode 100644 index 000000000..21d2ce31e --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/exec.md @@ -0,0 +1 @@ +Alias for `docker container exec`. diff --git a/vendor/github.com/docker/docker/man/src/export.md b/vendor/github.com/docker/docker/man/src/export.md new file mode 100644 index 000000000..1cc979979 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/export.md @@ -0,0 +1 @@ +Alias for `docker container export`. diff --git a/vendor/github.com/docker/docker/man/src/history.md b/vendor/github.com/docker/docker/man/src/history.md new file mode 100644 index 000000000..8b5f3e871 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/history.md @@ -0,0 +1 @@ +Alias for `docker image history`. diff --git a/vendor/github.com/docker/docker/man/src/image/build.md b/vendor/github.com/docker/docker/man/src/image/build.md new file mode 100644 index 000000000..9dc897584 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/image/build.md @@ -0,0 +1 @@ +Alias for `docker build`. diff --git a/vendor/github.com/docker/docker/man/docker-history.1.md b/vendor/github.com/docker/docker/man/src/image/history.md similarity index 63% rename from vendor/github.com/docker/docker/man/docker-history.1.md rename to vendor/github.com/docker/docker/man/src/image/history.md index 91edefe25..da7e5d64a 100644 --- a/vendor/github.com/docker/docker/man/docker-history.1.md +++ b/vendor/github.com/docker/docker/man/src/image/history.md @@ -1,34 +1,5 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-history - Show the history of an image - -# SYNOPSIS -**docker history** -[**--help**] -[**-H**|**--human**[=*true*]] -[**--no-trunc**] -[**-q**|**--quiet**] -IMAGE - -# DESCRIPTION - Show the history of when and how an image was created. -# OPTIONS -**--help** - Print usage statement - -**-H**, **--human**=*true*|*false* - Print sizes and dates in human readable format. The default is *true*. - -**--no-trunc**=*true*|*false* - Don't truncate output. The default is *false*. - -**-q**, **--quiet**=*true*|*false* - Only show numeric IDs. The default is *false*. - # EXAMPLES $ docker history fedora IMAGE CREATED CREATED BY SIZE COMMENT @@ -45,8 +16,3 @@ The `docker commit` command has a **-m** flag for adding comments to the image. 88b42ffd1f7c 5 months ago /bin/sh -c #(nop) ADD file:1fd8d7f9f6557cafc7 373.7 MB c69cab00d6ef 5 months ago /bin/sh -c #(nop) MAINTAINER Lokesh Mandvekar 0 B 511136ea3c5a 19 months ago 0 B Imported from - - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/src/image/import.md b/vendor/github.com/docker/docker/man/src/image/import.md new file mode 100644 index 000000000..2814a71e4 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/image/import.md @@ -0,0 +1,42 @@ +Create a new filesystem image from the contents of a tarball (`.tar`, +`.tar.gz`, `.tgz`, `.bzip`, `.tar.xz`, `.txz`) into it, then optionally tag it. + + +# EXAMPLES + +## Import from a remote location + + # docker image import http://example.com/exampleimage.tgz example/imagerepo + +## Import from a local file + +Import to docker via pipe and stdin: + + # cat exampleimage.tgz | docker image import - example/imagelocal + +Import with a commit message. + + # cat exampleimage.tgz | docker image import --message "New image imported from tarball" - exampleimagelocal:new + +Import to a Docker image from a local file. + + # docker image import /path/to/exampleimage.tgz + + +## Import from a local file and tag + +Import to docker via pipe and stdin: + + # cat exampleimageV2.tgz | docker image import - example/imagelocal:V-2.0 + +## Import from a local directory + + # tar -c . | docker image import - exampleimagedir + +## Apply specified Dockerfile instructions while importing the image +This example sets the docker image ENV variable DEBUG to true by default. + + # tar -c . | docker image import -c="ENV DEBUG true" - exampleimagedir + +# See also +**docker-export(1)** to export the contents of a filesystem as a tar archive to STDOUT. diff --git a/vendor/github.com/docker/docker/man/docker-load.1.md b/vendor/github.com/docker/docker/man/src/image/load.md similarity index 54% rename from vendor/github.com/docker/docker/man/docker-load.1.md rename to vendor/github.com/docker/docker/man/src/image/load.md index b16517304..81f126fdf 100644 --- a/vendor/github.com/docker/docker/man/docker-load.1.md +++ b/vendor/github.com/docker/docker/man/src/image/load.md @@ -1,31 +1,7 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-load - Load an image from a tar archive or STDIN - -# SYNOPSIS -**docker load** -[**--help**] -[**-i**|**--input**[=*INPUT*]] -[**-q**|**--quiet**] - -# DESCRIPTION - Loads a tarred repository from a file or the standard input stream. Restores both images and tags. Write image names or IDs imported it standard output stream. -# OPTIONS -**--help** - Print usage statement - -**-i**, **--input**="" - Read from a tar archive file, instead of STDIN. The tarball may be compressed with gzip, bzip, or xz. - -**-q**, **--quiet** - Suppress the load progress bar but still outputs the imported images. - # EXAMPLES $ docker images @@ -46,11 +22,4 @@ standard output stream. fedora latest 58394af37342 7 weeks ago 385.5 MB # See also -**docker-save(1)** to save one or more images to a tar archive (streamed to STDOUT by default). - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -July 2015 update by Mary Anthony -June 2016 update by Vincent Demeester +**docker-image-save(1)** to save one or more images to a tar archive (streamed to STDOUT by default). diff --git a/vendor/github.com/docker/docker/man/docker-images.1.md b/vendor/github.com/docker/docker/man/src/image/ls.md similarity index 73% rename from vendor/github.com/docker/docker/man/docker-images.1.md rename to vendor/github.com/docker/docker/man/src/image/ls.md index d7958d0dc..9943457be 100644 --- a/vendor/github.com/docker/docker/man/docker-images.1.md +++ b/vendor/github.com/docker/docker/man/src/image/ls.md @@ -1,21 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-images - List images - -# SYNOPSIS -**docker images** -[**--help**] -[**-a**|**--all**] -[**--digests**] -[**-f**|**--filter**[=*[]*]] -[**--format**=*"TEMPLATE"*] -[**--no-trunc**] -[**-q**|**--quiet**] -[REPOSITORY[:TAG]] - -# DESCRIPTION This command lists the images stored in the local Docker repository. By default, intermediate images, used during builds, are not listed. Some of the @@ -31,21 +13,17 @@ repository for all tagged images of the same name. For example consider an image called fedora. It may be tagged with 18, 19, or 20, etc. to manage different versions. -# OPTIONS -**-a**, **--all**=*true*|*false* - Show all images (by default filter out the intermediate image layers). The default is *false*. +## Filters -**--digests**=*true*|*false* - Show image digests. The default is *false*. +Filters the output based on these conditions: -**-f**, **--filter**=[] - Filters the output based on these conditions: - dangling=(true|false) - find unused images - label= or label== - before=([:tag]||) - since=([:tag]||) -**--format**="*TEMPLATE*" +## Format + Pretty-print images using a Go template. Valid placeholders: .ID - Image ID @@ -56,49 +34,40 @@ versions. .CreatedAt - Time when the image was created .Size - Image disk size -**--help** - Print usage statement - -**--no-trunc**=*true*|*false* - Don't truncate output. The default is *false*. - -**-q**, **--quiet**=*true*|*false* - Only show numeric IDs. The default is *false*. - # EXAMPLES ## Listing the images To list the images in a local repository (not the registry) run: - docker images + docker image ls The list will contain the image repository name, a tag for the image, and an image ID, when it was created and its virtual size. Columns: REPOSITORY, TAG, IMAGE ID, CREATED, and SIZE. -The `docker images` command takes an optional `[REPOSITORY[:TAG]]` argument +The `docker image ls` command takes an optional `[REPOSITORY[:TAG]]` argument that restricts the list to images that match the argument. If you specify -`REPOSITORY`but no `TAG`, the `docker images` command lists all images in the +`REPOSITORY`but no `TAG`, the `docker image ls` command lists all images in the given repository. - docker images java + docker image ls java The `[REPOSITORY[:TAG]]` value must be an "exact match". This means that, for example, -`docker images jav` does not match the image `java`. +`docker image ls jav` does not match the image `java`. If both `REPOSITORY` and `TAG` are provided, only images matching that repository and tag are listed. To find all local images in the "java" repository with tag "8" you can use: - docker images java:8 + docker image ls java:8 To get a verbose list of images which contains all the intermediate images used in builds use **-a**: - docker images -a + docker image ls -a -Previously, the docker images command supported the --tree and --dot arguments, +Previously, the docker image ls command supported the --tree and --dot arguments, which displayed different visualizations of the image data. Docker core removed this functionality in the 1.7 version. If you liked this functionality, you can still find it in the third-party dockviz tool: https://github.com/justone/dockviz. @@ -145,9 +114,4 @@ Valid template placeholders are listed above. Listing just the shortened image IDs. This can be useful for some automated tools. - docker images -q - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit + docker image ls -q diff --git a/vendor/github.com/docker/docker/man/docker-pull.1.md b/vendor/github.com/docker/docker/man/src/image/pull.md similarity index 81% rename from vendor/github.com/docker/docker/man/docker-pull.1.md rename to vendor/github.com/docker/docker/man/src/image/pull.md index c61d00530..0286ef150 100644 --- a/vendor/github.com/docker/docker/man/docker-pull.1.md +++ b/vendor/github.com/docker/docker/man/src/image/pull.md @@ -1,17 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-pull - Pull an image or a repository from a registry - -# SYNOPSIS -**docker pull** -[**-a**|**--all-tags**] -[**--help**] -NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG] - -# DESCRIPTION - This command pulls down an image or a repository from a registry. If there is more than one image for a repository (e.g., fedora) then all images for that repository name can be pulled down including any tags @@ -20,22 +6,15 @@ images for that repository name can be pulled down including any tags If you do not specify a `REGISTRY_HOST`, the command uses Docker's public registry located at `registry-1.docker.io` by default. -# OPTIONS -**-a**, **--all-tags**=*true*|*false* - Download all tagged images in the repository. The default is *false*. - -**--help** - Print usage statement - # EXAMPLES ### Pull an image from Docker Hub To download a particular image, or set of images (i.e., a repository), use -`docker pull`. If no tag is provided, Docker Engine uses the `:latest` tag as a +`docker image pull`. If no tag is provided, Docker Engine uses the `:latest` tag as a default. This command pulls the `debian:latest` image: - $ docker pull debian + $ docker image pull debian Using default tag: latest latest: Pulling from library/debian @@ -52,7 +31,7 @@ both layers with `debian:latest`. Pulling the `debian:jessie` image therefore only pulls its metadata, but not its layers, because all layers are already present locally: - $ docker pull debian:jessie + $ docker image pull debian:jessie jessie: Pulling from library/debian fdd5d7827f33: Already exists @@ -84,9 +63,9 @@ in the online documentation. ## Pull an image by digest (immutable identifier) So far, you've pulled images by their name (and "tag"). Using names and tags is -a convenient way to work with images. When using tags, you can `docker pull` an +a convenient way to work with images. When using tags, you can `docker image pull` an image again to make sure you have the most up-to-date version of that image. -For example, `docker pull ubuntu:14.04` pulls the latest version of the Ubuntu +For example, `docker image pull ubuntu:14.04` pulls the latest version of the Ubuntu 14.04 image. In some cases you don't want images to be updated to newer versions, but prefer @@ -98,7 +77,7 @@ and guarantee that the image you're using is always the same. To know the digest of an image, pull the image first. Let's pull the latest `ubuntu:14.04` image from Docker Hub: - $ docker pull ubuntu:14.04 + $ docker image pull ubuntu:14.04 14.04: Pulling from library/ubuntu 5a132a7e7af1: Pull complete @@ -119,7 +98,7 @@ may be useful if you want to pin to a version of the image you just pushed. A digest takes the place of the tag when pulling an image, for example, to pull the above image by digest, run the following command: - $ docker pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 + $ docker image pull ubuntu@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2 sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2: Pulling from library/ubuntu 5a132a7e7af1: Already exists @@ -141,7 +120,7 @@ Digest can also be used in the `FROM` of a Dockerfile, for example: ## Pulling from a different registry -By default, `docker pull` pulls images from Docker Hub. It is also possible to +By default, `docker image pull` pulls images from Docker Hub. It is also possible to manually specify the path of a registry to pull from. For example, if you have set up a local registry, you can specify its path to pull from it. A registry path is similar to a URL, but does not contain a protocol specifier (`https://`). @@ -149,7 +128,7 @@ path is similar to a URL, but does not contain a protocol specifier (`https://`) The following command pulls the `testing/test-image` image from a local registry listening on port 5000 (`myregistry.local:5000`): - $ docker pull myregistry.local:5000/testing/test-image + $ docker image pull myregistry.local:5000/testing/test-image Registry credentials are managed by **docker-login(1)**. @@ -161,13 +140,13 @@ section in the online documentation for more information. ## Pull a repository with multiple images -By default, `docker pull` pulls a *single* image from the registry. A repository +By default, `docker image pull` pulls a *single* image from the registry. A repository can contain multiple images. To pull all images from a repository, provide the -`-a` (or `--all-tags`) option when using `docker pull`. +`-a` (or `--all-tags`) option when using `docker image pull`. This command pulls all images from the `fedora` repository: - $ docker pull --all-tags fedora + $ docker image pull --all-tags fedora Pulling repository fedora ad57ef8d78d7: Download complete @@ -193,10 +172,10 @@ that are present locally: ## Canceling a pull -Killing the `docker pull` process, for example by pressing `CTRL-c` while it is +Killing the `docker image pull` process, for example by pressing `CTRL-c` while it is running in a terminal, will terminate the pull operation. - $ docker pull fedora + $ docker image pull fedora Using default tag: latest latest: Pulling from library/fedora @@ -208,13 +187,3 @@ running in a terminal, will terminate the pull operation. > connection between the Docker Engine daemon and the Docker Engine client > initiating the pull is lost. If the connection with the Engine daemon is > lost for other reasons than a manual interaction, the pull is also aborted. - - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -August 2014, updated by Sven Dowideit -April 2015, updated by John Willis -April 2015, updated by Mary Anthony for v2 -September 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/src/image/push.md b/vendor/github.com/docker/docker/man/src/image/push.md new file mode 100644 index 000000000..8b4334d27 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/image/push.md @@ -0,0 +1,34 @@ +Use `docker image push` to share your images to the [Docker Hub](https://hub.docker.com) +registry or to a self-hosted one. + +Refer to **docker-image-tag(1)** for more information about valid image and tag names. + +Killing the **docker image push** process, for example by pressing **CTRL-c** while it +is running in a terminal, terminates the push operation. + +Registry credentials are managed by **docker-login(1)**. + +# EXAMPLES + +## Pushing a new image to a registry + +First save the new image by finding the container ID (using **docker container ls**) +and then committing it to a new image name. Note that only a-z0-9-_. are +allowed when naming images: + + # docker container commit c16378f943fe rhel-httpd + +Now, push the image to the registry using the image ID. In this example the +registry is on host named `registry-host` and listening on port `5000`. To do +this, tag the image with the host name or IP address, and the port of the +registry: + + # docker image tag rhel-httpd registry-host:5000/myadmin/rhel-httpd + # docker image push registry-host:5000/myadmin/rhel-httpd + +Check that this worked by running: + + # docker image ls + +You should see both `rhel-httpd` and `registry-host:5000/myadmin/rhel-httpd` +listed. diff --git a/vendor/github.com/docker/docker/man/src/image/rm.md b/vendor/github.com/docker/docker/man/src/image/rm.md new file mode 100644 index 000000000..348d45402 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/image/rm.md @@ -0,0 +1,11 @@ +Removes one or more images from the host node. This does not remove images from +a registry. You cannot remove an image of a running container unless you use the +**-f** option. To see all images on a host use the **docker image ls** command. + +# EXAMPLES + +## Removing an image + +Here is an example of removing an image: + + docker image rm fedora/httpd diff --git a/vendor/github.com/docker/docker/man/src/image/save.md b/vendor/github.com/docker/docker/man/src/image/save.md new file mode 100644 index 000000000..19d885ec6 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/image/save.md @@ -0,0 +1,19 @@ +Produces a tarred repository to the standard output stream. Contains all +parent layers, and all tags + versions, or specified repo:tag. + +Stream to a file instead of STDOUT by using **-o**. + +# EXAMPLES + +Save all fedora repository images to a fedora-all.tar and save the latest +fedora image to a fedora-latest.tar: + + $ docker image save fedora > fedora-all.tar + $ docker image save --output=fedora-latest.tar fedora:latest + $ ls -sh fedora-all.tar + 721M fedora-all.tar + $ ls -sh fedora-latest.tar + 367M fedora-latest.tar + +# See also +**docker-image-load(1)** to load an image from a tar archive on STDIN. diff --git a/vendor/github.com/docker/docker/man/docker-tag.1.md b/vendor/github.com/docker/docker/man/src/image/tag.md similarity index 67% rename from vendor/github.com/docker/docker/man/docker-tag.1.md rename to vendor/github.com/docker/docker/man/src/image/tag.md index 7f27e1b0e..25c1f785d 100644 --- a/vendor/github.com/docker/docker/man/docker-tag.1.md +++ b/vendor/github.com/docker/docker/man/src/image/tag.md @@ -1,22 +1,7 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-tag - Create a tag `TARGET_IMAGE` that refers to `SOURCE_IMAGE` - -# SYNOPSIS -**docker tag** -[**--help**] -SOURCE_NAME[:TAG] TARGET_NAME[:TAG] - -# DESCRIPTION Assigns a new alias to an image in a registry. An alias refers to the entire image name including the optional `TAG` after the ':'. -# "OPTIONS" -**--help** - Print usage statement. - +# OPTIONS **NAME** The image name which is made up of slash-separated name components, optionally prefixed by a registry hostname. The hostname must comply with @@ -41,14 +26,14 @@ entire image name including the optional `TAG` after the ':'. To tag a local image with ID "0e5574283393" into the "fedora" repository with "version1.0": - docker tag 0e5574283393 fedora/httpd:version1.0 + docker image tag 0e5574283393 fedora/httpd:version1.0 ## Tagging an image referenced by Name To tag a local image with name "httpd" into the "fedora" repository with "version1.0": - docker tag httpd fedora/httpd:version1.0 + docker image tag httpd fedora/httpd:version1.0 Note that since the tag name is not specified, the alias is created for an existing local version `httpd:latest`. @@ -58,19 +43,11 @@ existing local version `httpd:latest`. To tag a local image with name "httpd" and tag "test" into the "fedora" repository with "version1.0.test": - docker tag httpd:test fedora/httpd:version1.0.test + docker image tag httpd:test fedora/httpd:version1.0.test ## Tagging an image for a private repository To push an image to a private registry and not the central Docker registry you must tag it with the registry hostname and port (if needed). - docker tag 0e5574283393 myregistryhost:5000/fedora/httpd:version1.0 - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -July 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 -June 2015, updated by Sally O'Malley + docker image tag 0e5574283393 myregistryhost:5000/fedora/httpd:version1.0 diff --git a/vendor/github.com/docker/docker/man/src/images.md b/vendor/github.com/docker/docker/man/src/images.md new file mode 100644 index 000000000..ae6a3875e --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/images.md @@ -0,0 +1 @@ +Alias for `docker image ls`. diff --git a/vendor/github.com/docker/docker/man/src/import.md b/vendor/github.com/docker/docker/man/src/import.md new file mode 100644 index 000000000..826c71b1b --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/import.md @@ -0,0 +1 @@ +Alias for `docker image import`. diff --git a/vendor/github.com/docker/docker/man/src/info.md b/vendor/github.com/docker/docker/man/src/info.md new file mode 100644 index 000000000..35e62f86e --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/info.md @@ -0,0 +1 @@ +Alias for `docker system info`. diff --git a/vendor/github.com/docker/docker/man/docker-inspect.1.md b/vendor/github.com/docker/docker/man/src/inspect.md similarity index 89% rename from vendor/github.com/docker/docker/man/docker-inspect.1.md rename to vendor/github.com/docker/docker/man/src/inspect.md index 21d7ba678..d0a2a6837 100644 --- a/vendor/github.com/docker/docker/man/docker-inspect.1.md +++ b/vendor/github.com/docker/docker/man/src/inspect.md @@ -1,39 +1,9 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-inspect - Return low-level information on docker objects - -# SYNOPSIS -**docker inspect** -[**--help**] -[**-f**|**--format**[=*FORMAT*]] -[**-s**|**--size**] -[**--type**=*container*|*image*|*network*|*node*|*service*|*task*|*volume*] -NAME|ID [NAME|ID...] - -# DESCRIPTION - This displays the low-level information on Docker object(s) (e.g. container, image, volume,network, node, service, or task) identified by name or ID. By default, this will render all results in a JSON array. If the container and image have the same name, this will return container JSON for unspecified type. If a format is specified, the given template will be executed for each result. -# OPTIONS -**--help** - Print usage statement - -**-f**, **--format**="" - Format the output using the given Go template - -**-s**, **--size** - Display total file sizes if the type is container - -**--type**=*container*|*image*|*network*|*node*|*service*|*task*|*volume* - Return JSON for specified type, permissible values are "image", "container", - "network", "node", "service", "task", and "volume" - # EXAMPLES Get information about an image when image name conflicts with the container name, @@ -314,10 +284,3 @@ about the image: } } ] - -# HISTORY -April 2014, originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -April 2015, updated by Qiang Huang -October 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/src/kill.md b/vendor/github.com/docker/docker/man/src/kill.md new file mode 100644 index 000000000..50efbcf03 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/kill.md @@ -0,0 +1 @@ +Alias for `docker container kill`. diff --git a/vendor/github.com/docker/docker/man/src/load.md b/vendor/github.com/docker/docker/man/src/load.md new file mode 100644 index 000000000..60e77d7a0 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/load.md @@ -0,0 +1 @@ +Alias for `docker image load`. diff --git a/vendor/github.com/docker/docker/man/docker-login.1.md b/vendor/github.com/docker/docker/man/src/login.md similarity index 58% rename from vendor/github.com/docker/docker/man/docker-login.1.md rename to vendor/github.com/docker/docker/man/src/login.md index c0d4f795d..4d60882f5 100644 --- a/vendor/github.com/docker/docker/man/docker-login.1.md +++ b/vendor/github.com/docker/docker/man/src/login.md @@ -1,17 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-login - Log in to a Docker registry. - -# SYNOPSIS -**docker login** -[**--help**] -[**-p**|**--password**[=*PASSWORD*]] -[**-u**|**--username**[=*USERNAME*]] -[SERVER] - -# DESCRIPTION Log in to a Docker Registry located on the specified `SERVER`. You can specify a URL or a `hostname` for the `SERVER` value. If you do not specify a `SERVER`, the command uses Docker's public registry located at @@ -20,22 +6,12 @@ do not specify a `SERVER`, the command uses Docker's public registry located at `docker login` requires user to use `sudo` or be `root`, except when: 1. connecting to a remote daemon, such as a `docker-machine` provisioned `docker engine`. -2. user is added to the `docker` group. This will impact the security of your system; the `docker` group is `root` equivalent. See [Docker Daemon Attack Surface](https://docs.docker.com/engine/articles/security/#docker-daemon-attack-surface) for details. +2. user is added to the `docker` group. This will impact the security of your system; the `docker` group is `root` equivalent. See [Docker Daemon Attack Surface](https://docs.docker.com/engine/security/security/#/docker-daemon-attack-surface) for details. You can log into any public or private repository for which you have credentials. When you log in, the command stores encoded credentials in `$HOME/.docker/config.json` on Linux or `%USERPROFILE%/.docker/config.json` on Windows. -# OPTIONS -**--help** - Print usage statement - -**-p**, **--password**="" - Password - -**-u**, **--username**="" - Username - # EXAMPLES ## Login to a registry on your localhost @@ -44,10 +20,3 @@ credentials. When you log in, the command stores encoded credentials in # See also **docker-logout(1)** to log out from a Docker registry. - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 -November 2015, updated by Sally O'Malley diff --git a/vendor/github.com/docker/docker/man/docker-logout.1.md b/vendor/github.com/docker/docker/man/src/logout.md similarity index 50% rename from vendor/github.com/docker/docker/man/docker-logout.1.md rename to vendor/github.com/docker/docker/man/src/logout.md index a8a4b7c3c..826201803 100644 --- a/vendor/github.com/docker/docker/man/docker-logout.1.md +++ b/vendor/github.com/docker/docker/man/src/logout.md @@ -1,22 +1,8 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-logout - Log out from a Docker registry. - -# SYNOPSIS -**docker logout** -[SERVER] - -# DESCRIPTION Log out of a Docker Registry located on the specified `SERVER`. You can specify a URL or a `hostname` for the `SERVER` value. If you do not specify a `SERVER`, the command attempts to log you out of Docker's public registry located at `https://registry-1.docker.io/` by default. -# OPTIONS -There are no available options. - # EXAMPLES ## Log out from a registry on your localhost @@ -25,8 +11,3 @@ There are no available options. # See also **docker-login(1)** to log in to a Docker registry server. - -# HISTORY -June 2014, Originally compiled by Daniel, Dao Quang Minh (daniel at nitrous dot io) -July 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 diff --git a/vendor/github.com/docker/docker/man/src/logs.md b/vendor/github.com/docker/docker/man/src/logs.md new file mode 100644 index 000000000..e528150e2 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/logs.md @@ -0,0 +1 @@ +Alias for `docker container logs`. diff --git a/vendor/github.com/docker/docker/man/docker-network-connect.1.md b/vendor/github.com/docker/docker/man/src/network/connect.md similarity index 82% rename from vendor/github.com/docker/docker/man/docker-network-connect.1.md rename to vendor/github.com/docker/docker/man/src/network/connect.md index 096ec77a4..59bcc0302 100644 --- a/vendor/github.com/docker/docker/man/docker-network-connect.1.md +++ b/vendor/github.com/docker/docker/man/src/network/connect.md @@ -1,16 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-connect - connect a container to a network - -# SYNOPSIS -**docker network connect** -[**--help**] -NETWORK CONTAINER - -# DESCRIPTION - Connects a container to a network. You can connect a container by name or by ID. Once connected, the container can communicate with other containers in the same network. @@ -50,17 +37,3 @@ support multi-host connectivity, containers connected to the same multi-host network but launched from different Engines can also communicate in this way. You can connect a container to one or more networks. The networks need not be the same type. For example, you can connect a single container bridge and overlay networks. - - -# OPTIONS -**NETWORK** - Specify network name - -**CONTAINER** - Specify container name - -**--help** - Print usage statement - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/docker-network-create.1.md b/vendor/github.com/docker/docker/man/src/network/create.md similarity index 78% rename from vendor/github.com/docker/docker/man/docker-network-create.1.md rename to vendor/github.com/docker/docker/man/src/network/create.md index 44ce8e15c..115a41846 100644 --- a/vendor/github.com/docker/docker/man/docker-network-create.1.md +++ b/vendor/github.com/docker/docker/man/src/network/create.md @@ -1,28 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-create - create a new network - -# SYNOPSIS -**docker network create** -[**--attachable**] -[**--aux-address**=*map[]*] -[**-d**|**--driver**=*DRIVER*] -[**--gateway**=*[]*] -[**--help**] -[**--internal**] -[**--ip-range**=*[]*] -[**--ipam-driver**=*default*] -[**--ipam-opt**=*map[]*] -[**--ipv6**] -[**--label**[=*[]*]] -[**-o**|**--opt**=*map[]*] -[**--subnet**=*[]*] -NETWORK-NAME - -# DESCRIPTION - Creates a new network. The `DRIVER` accepts `bridge` or `overlay` which are the built-in network drivers. If you have installed a third party or your own custom network driver you can specify that `DRIVER` here also. If you don't specify the @@ -142,46 +117,3 @@ By default, when you connect a container to an `overlay` network, Docker also connects a bridge network to it to provide external connectivity. If you want to create an externally isolated `overlay` network, you can specify the `--internal` option. - -# OPTIONS -**--attachable** - Enable manual container attachment - -**--aux-address**=map[] - Auxiliary IPv4 or IPv6 addresses used by network driver - -**-d**, **--driver**=*DRIVER* - Driver to manage the Network bridge or overlay. The default is bridge. - -**--gateway**=[] - IPv4 or IPv6 Gateway for the master subnet - -**--help** - Print usage - -**--internal** - Restrict external access to the network - -**--ip-range**=[] - Allocate container ip from a sub-range - -**--ipam-driver**=*default* - IP Address Management Driver - -**--ipam-opt**=map[] - Set custom IPAM driver options - -**--ipv6** - Enable IPv6 networking - -**--label**=*label* - Set metadata for a network - -**-o**, **--opt**=map[] - Set custom driver options - -**--subnet**=[] - Subnet in CIDR format that represents a network segment - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/src/network/disconnect.md b/vendor/github.com/docker/docker/man/src/network/disconnect.md new file mode 100644 index 000000000..13943f3f8 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/network/disconnect.md @@ -0,0 +1,5 @@ +Disconnects a container from a network. + +```bash +$ docker network disconnect multi-host-network container1 +``` diff --git a/vendor/github.com/docker/docker/man/docker-network-inspect.1.md b/vendor/github.com/docker/docker/man/src/network/inspect.md similarity index 87% rename from vendor/github.com/docker/docker/man/docker-network-inspect.1.md rename to vendor/github.com/docker/docker/man/src/network/inspect.md index f27c98cb3..89fd0e167 100644 --- a/vendor/github.com/docker/docker/man/docker-network-inspect.1.md +++ b/vendor/github.com/docker/docker/man/src/network/inspect.md @@ -1,17 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-inspect - inspect a network - -# SYNOPSIS -**docker network inspect** -[**-f**|**--format**[=*FORMAT*]] -[**--help**] -NETWORK [NETWORK...] - -# DESCRIPTION - Returns information about one or more networks. By default, this command renders all results in a JSON object. For example, if you connect two containers to the default `bridge` network: ```bash @@ -100,13 +86,3 @@ $ docker network inspect simple-network } ] ``` - -# OPTIONS -**-f**, **--format**="" - Format the output using the given Go template. - -**--help** - Print usage statement - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/docker-network-ls.1.md b/vendor/github.com/docker/docker/man/src/network/ls.md similarity index 81% rename from vendor/github.com/docker/docker/man/docker-network-ls.1.md rename to vendor/github.com/docker/docker/man/src/network/ls.md index f319e6603..c5182e87e 100644 --- a/vendor/github.com/docker/docker/man/docker-network-ls.1.md +++ b/vendor/github.com/docker/docker/man/src/network/ls.md @@ -1,19 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-ls - list networks - -# SYNOPSIS -**docker network ls** -[**-f**|**--filter**[=*[]*]] -[**--format**=*"TEMPLATE"*] -[**--no-trunc**[=*true*|*false*]] -[**-q**|**--quiet**[=*true*|*false*]] -[**--help**] - -# DESCRIPTION - Lists all the networks the Engine `daemon` knows about. This includes the networks that span across multiple hosts in a cluster, for example: @@ -158,31 +142,16 @@ $ docker network rm `docker network ls --filter type=custom -q` A warning will be issued when trying to remove a network that has containers attached. -# OPTIONS - -**-f**, **--filter**=*[]* - filter output based on conditions provided. - -**--format**="*TEMPLATE*" - Pretty-print networks using a Go template. - Valid placeholders: - .ID - Network ID - .Name - Network name - .Driver - Network driver - .Scope - Network scope (local, global) - .IPv6 - Whether IPv6 is enabled on the network or not - .Internal - Whether the network is internal or not - .Labels - All labels assigned to the network - .Label - Value of a specific label for this network. For example `{{.Label "project.version"}}` - -**--no-trunc**=*true*|*false* - Do not truncate the output - -**-q**, **--quiet**=*true*|*false* - Only display network IDs +## Format -**--help** - Print usage statement +Format uses a Go template to print the output. The following variables are +supported: -# HISTORY -OCT 2015, created by Mary Anthony +* .ID - Network ID +* .Name - Network name +* .Driver - Network driver +* .Scope - Network scope (local, global) +* .IPv6 - Whether IPv6 is enabled on the network or not +* .Internal - Whether the network is internal or not +* .Labels - All labels assigned to the network +* .Label - Value of a specific label for this network. For example `{{.Label "project.version"}}` diff --git a/vendor/github.com/docker/docker/man/docker-network-rm.1.md b/vendor/github.com/docker/docker/man/src/network/rm.md similarity index 67% rename from vendor/github.com/docker/docker/man/docker-network-rm.1.md rename to vendor/github.com/docker/docker/man/src/network/rm.md index c094a1528..815b6a487 100644 --- a/vendor/github.com/docker/docker/man/docker-network-rm.1.md +++ b/vendor/github.com/docker/docker/man/src/network/rm.md @@ -1,16 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% OCT 2015 -# NAME -docker-network-rm - remove one or more networks - -# SYNOPSIS -**docker network rm** -[**--help**] -NETWORK [NETWORK...] - -# DESCRIPTION - Removes one or more networks by name or identifier. To remove a network, you must first disconnect any containers connected to it. To remove the network named 'my-network': @@ -31,13 +18,3 @@ When you specify multiple networks, the command attempts to delete each in turn. If the deletion of one network fails, the command continues to the next on the list and tries to delete that. The command reports success or failure for each deletion. - -# OPTIONS -**NETWORK** - Specify network name or id - -**--help** - Print usage statement - -# HISTORY -OCT 2015, created by Mary Anthony diff --git a/vendor/github.com/docker/docker/man/src/pause.md b/vendor/github.com/docker/docker/man/src/pause.md new file mode 100644 index 000000000..8779d0601 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/pause.md @@ -0,0 +1 @@ +Alias for `docker container pause`. diff --git a/vendor/github.com/docker/docker/man/src/port.md b/vendor/github.com/docker/docker/man/src/port.md new file mode 100644 index 000000000..b540ce177 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/port.md @@ -0,0 +1 @@ +Alias for `docker container port`. diff --git a/vendor/github.com/docker/docker/man/src/ps.md b/vendor/github.com/docker/docker/man/src/ps.md new file mode 100644 index 000000000..83f289e88 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/ps.md @@ -0,0 +1 @@ +Alias for `docker container ls`. diff --git a/vendor/github.com/docker/docker/man/src/pull.md b/vendor/github.com/docker/docker/man/src/pull.md new file mode 100644 index 000000000..78b0ab87c --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/pull.md @@ -0,0 +1 @@ +Alias for `docker image pull`. diff --git a/vendor/github.com/docker/docker/man/src/push.md b/vendor/github.com/docker/docker/man/src/push.md new file mode 100644 index 000000000..84f721e0b --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/push.md @@ -0,0 +1 @@ +Alias for `docker image push`. diff --git a/vendor/github.com/docker/docker/man/src/rename.md b/vendor/github.com/docker/docker/man/src/rename.md new file mode 100644 index 000000000..7a237f42f --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/rename.md @@ -0,0 +1 @@ +Alias for `docker container rename`. diff --git a/vendor/github.com/docker/docker/man/src/restart.md b/vendor/github.com/docker/docker/man/src/restart.md new file mode 100644 index 000000000..eddad06b6 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/restart.md @@ -0,0 +1 @@ +Alias for `docker container restart`. diff --git a/vendor/github.com/docker/docker/man/src/rm.md b/vendor/github.com/docker/docker/man/src/rm.md new file mode 100644 index 000000000..8b0cbd658 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/rm.md @@ -0,0 +1 @@ +Alias for `docker container rm`. diff --git a/vendor/github.com/docker/docker/man/src/rmi.md b/vendor/github.com/docker/docker/man/src/rmi.md new file mode 100644 index 000000000..b77750493 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/rmi.md @@ -0,0 +1 @@ +Alias for `docker image rm`. diff --git a/vendor/github.com/docker/docker/man/src/save.md b/vendor/github.com/docker/docker/man/src/save.md new file mode 100644 index 000000000..95127f5a4 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/save.md @@ -0,0 +1 @@ +Alias for `docker image save`. diff --git a/vendor/github.com/docker/docker/man/docker-search.1.md b/vendor/github.com/docker/docker/man/src/search.md similarity index 65% rename from vendor/github.com/docker/docker/man/docker-search.1.md rename to vendor/github.com/docker/docker/man/src/search.md index ad8bbc78b..cf2ac4f1a 100644 --- a/vendor/github.com/docker/docker/man/docker-search.1.md +++ b/vendor/github.com/docker/docker/man/src/search.md @@ -1,42 +1,16 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-search - Search the Docker Hub for images - -# SYNOPSIS -**docker search** -[**-f**|**--filter**[=*[]*]] -[**--help**] -[**--limit**[=*LIMIT*]] -[**--no-trunc**] -TERM - -# DESCRIPTION - Search Docker Hub for images that match the specified `TERM`. The table of images returned displays the name, description (truncated by default), number of stars awarded, whether the image is official, and whether it is automated. *Note* - Search queries will only return up to 25 results -# OPTIONS +## Filter -**-f**, **--filter**=[] Filter output based on these conditions: - stars= - is-automated=(true|false) - is-official=(true|false) -**--help** - Print usage statement - -**--limit**=*LIMIT* - Maximum returned search results. The default is 25. - -**--no-trunc**=*true*|*false* - Don't truncate output. The default is *false*. - # EXAMPLES ## Search Docker Hub for ranked images @@ -60,11 +34,3 @@ ranked 1 or higher: NAME DESCRIPTION STARS OFFICIAL AUTOMATED goldmann/wildfly A WildFly application server running on a ... 3 [OK] tutum/fedora-20 Fedora 20 image with SSH access. For the r... 1 [OK] - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -April 2015, updated by Mary Anthony for v2 -April 2016, updated by Vincent Demeester - diff --git a/vendor/github.com/docker/docker/man/src/start.md b/vendor/github.com/docker/docker/man/src/start.md new file mode 100644 index 000000000..9bab86770 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/start.md @@ -0,0 +1 @@ +Alias for `docker container start`. diff --git a/vendor/github.com/docker/docker/man/src/stats.md b/vendor/github.com/docker/docker/man/src/stats.md new file mode 100644 index 000000000..f709ce4f1 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/stats.md @@ -0,0 +1 @@ +Alias for `docker container stats`. diff --git a/vendor/github.com/docker/docker/man/src/stop.md b/vendor/github.com/docker/docker/man/src/stop.md new file mode 100644 index 000000000..35fd07b62 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/stop.md @@ -0,0 +1 @@ +Alias for `docker container stop`. diff --git a/vendor/github.com/docker/docker/man/docker-events.1.md b/vendor/github.com/docker/docker/man/src/system/events.md similarity index 85% rename from vendor/github.com/docker/docker/man/docker-events.1.md rename to vendor/github.com/docker/docker/man/src/system/events.md index c0909c681..44adc6c39 100644 --- a/vendor/github.com/docker/docker/man/docker-events.1.md +++ b/vendor/github.com/docker/docker/man/src/system/events.md @@ -1,19 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-events - Get real time events from the server - -# SYNOPSIS -**docker events** -[**--help**] -[**-f**|**--filter**[=*[]*]] -[**--since**[=*SINCE*]] -[**--until**[=*UNTIL*]] -[**--format**[=*FORMAT*]] - - -# DESCRIPTION Get event information from the Docker daemon. Information can include historical information and real-time information. @@ -34,29 +18,6 @@ Docker networks report the following events: create, connect, disconnect, destroy # OPTIONS -**--help** - Print usage statement - -**-f**, **--filter**=[] - Filter output based on these conditions - - container (`container=`) - - event (`event=`) - - image (`image=`) - - plugin (experimental) (`plugin=`) - - label (`label=` or `label==`) - - type (`type=`) - - volume (`volume=`) - - network (`network=`) - - daemon (`daemon=`) - -**--since**="" - Show all events created since timestamp - -**--until**="" - Stream events until this timestamp - -**--format**="" - Format the output using the given Go template The `--since` and `--until` parameters can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed @@ -168,13 +129,6 @@ Lines. For information about JSON Lines, please refer to http://jsonlines.org/ . 2015-12-23T21:38:25.119625123Z network connect 8b111217944ba0ba844a65b13efcd57dc494932ee2527577758f939315ba2c5b (name=test-event-network-local, container=b4be644031a3d90b400f88ab3d4bdf4dc23adb250e696b6328b85441abe2c54e, type=bridge) $ docker events --filter 'type=plugin' (experimental) - 2016-07-25T17:30:14.825557616Z plugin pull ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/no-remove:latest) - 2016-07-25T17:30:14.888127370Z plugin enable ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/no-remove:latest) + 2016-07-25T17:30:14.825557616Z plugin pull ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/sample-volume-plugin:latest) + 2016-07-25T17:30:14.888127370Z plugin enable ec7b87f2ce84330fe076e666f17dfc049d2d7ae0b8190763de94e1f2d105993f (name=tiborvass/sample-volume-plugin:latest) - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit -June 2015, updated by Brian Goff -October 2015, updated by Mike Brown diff --git a/vendor/github.com/docker/docker/man/docker-info.1.md b/vendor/github.com/docker/docker/man/src/system/info.md similarity index 91% rename from vendor/github.com/docker/docker/man/docker-info.1.md rename to vendor/github.com/docker/docker/man/src/system/info.md index bb7a8fb4c..9a87e985e 100644 --- a/vendor/github.com/docker/docker/man/docker-info.1.md +++ b/vendor/github.com/docker/docker/man/src/system/info.md @@ -1,15 +1,3 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2014 -# NAME -docker-info - Display system-wide information - -# SYNOPSIS -**docker info** -[**--help**] -[**-f**|**--format**[=*FORMAT*]] - -# DESCRIPTION This command displays system wide information regarding the Docker installation. Information displayed includes the kernel version, number of containers and images. The number of images shown is the number of unique images. The same image tagged @@ -28,13 +16,6 @@ meta data regarding those images are stored. When run for the first time Docker allocates a certain amount of data space and meta data space from the space available on the volume where `/var/lib/docker` is mounted. -# OPTIONS -**--help** - Print usage statement - -**-f**, **--format**="" - Format the output using the given Go template - # EXAMPLES ## Display Docker system information @@ -180,8 +161,3 @@ You can also specify the output format: $ docker info --format '{{json .}}' {"ID":"I54V:OLXT:HVMM:TPKO:JPHQ:CQCD:JNLC:O3BZ:4ZVJ:43XJ:PFHZ:6N2S","Containers":14, ...} - -# HISTORY -April 2014, Originally compiled by William Henry (whenry at redhat dot com) -based on docker.com source material and internal work. -June 2014, updated by Sven Dowideit diff --git a/vendor/github.com/docker/docker/man/src/tag.md b/vendor/github.com/docker/docker/man/src/tag.md new file mode 100644 index 000000000..55c4ef1a7 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/tag.md @@ -0,0 +1 @@ +Alias for `docker image tag`. diff --git a/vendor/github.com/docker/docker/man/src/top.md b/vendor/github.com/docker/docker/man/src/top.md new file mode 100644 index 000000000..ac0f0845f --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/top.md @@ -0,0 +1 @@ +Alias for `docker container top`. diff --git a/vendor/github.com/docker/docker/man/src/unpause.md b/vendor/github.com/docker/docker/man/src/unpause.md new file mode 100644 index 000000000..df538e135 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/unpause.md @@ -0,0 +1 @@ +Alias for `docker container unpause`. diff --git a/vendor/github.com/docker/docker/man/src/update.md b/vendor/github.com/docker/docker/man/src/update.md new file mode 100644 index 000000000..162022ab2 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/update.md @@ -0,0 +1 @@ +Alias for `docker container update`. diff --git a/vendor/github.com/docker/docker/man/docker-version.1.md b/vendor/github.com/docker/docker/man/src/version.md similarity index 67% rename from vendor/github.com/docker/docker/man/docker-version.1.md rename to vendor/github.com/docker/docker/man/src/version.md index 1838f8205..5dea4a297 100644 --- a/vendor/github.com/docker/docker/man/docker-version.1.md +++ b/vendor/github.com/docker/docker/man/src/version.md @@ -1,25 +1,6 @@ -% DOCKER(1) Docker User Manuals -% Docker Community -% JUNE 2015 -# NAME -docker-version - Show the Docker version information. - -# SYNOPSIS -**docker version** -[**--help**] -[**-f**|**--format**[=*FORMAT*]] - -# DESCRIPTION This command displays version information for both the Docker client and daemon. -# OPTIONS -**--help** - Print usage statement - -**-f**, **--format**="" - Format the output using the given Go template. - # EXAMPLES ## Display Docker version information @@ -54,9 +35,3 @@ To view all available fields, you can use the format `{{json .}}`. $ docker version --format '{{json .}}' {"Client":{"Version":"1.8.0","ApiVersion":"1.20","GitCommit":"f5bae0a","GoVersion":"go1.4.2","Os":"linux","Arch":"amd64","BuildTime":"Tue Jun 23 17:56:00 UTC 2015"},"ServerOK":true,"Server":{"Version":"1.8.0","ApiVersion":"1.20","GitCommit":"f5bae0a","GoVersion":"go1.4.2","Os":"linux","Arch":"amd64","KernelVersion":"3.13.2-gentoo","BuildTime":"Tue Jun 23 17:56:00 UTC 2015"}} - - -# HISTORY -June 2014, updated by Sven Dowideit -June 2015, updated by John Howard -June 2015, updated by Patrick Hemmer diff --git a/vendor/github.com/docker/docker/man/src/volume.md b/vendor/github.com/docker/docker/man/src/volume.md new file mode 100644 index 000000000..0a09a41da --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/volume.md @@ -0,0 +1,14 @@ +The `docker volume` command has subcommands for managing data volumes. A data +volume is a specially-designated directory that by-passes storage driver +management. + +Data volumes persist data independent of a container's life cycle. When you +delete a container, the Docker daemon does not delete any data volumes. You can +share volumes across multiple containers. Moreover, you can share data volumes +with other computing resources in your system. + +To see help for a subcommand, use: + + docker volume COMMAND --help + +For full details on using docker volume visit Docker's online documentation. diff --git a/vendor/github.com/docker/docker/man/src/volume/create.md b/vendor/github.com/docker/docker/man/src/volume/create.md new file mode 100644 index 000000000..408079d62 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/volume/create.md @@ -0,0 +1,35 @@ +Creates a new volume that containers can consume and store data in. If a name +is not specified, Docker generates a random name. You create a volume and then +configure the container to use it, for example: + + $ docker volume create hello + hello + $ docker run -d -v hello:/world busybox ls /world + +The mount is created inside the container's `/src` directory. Docker doesn't +not support relative paths for mount points inside the container. + +Multiple containers can use the same volume in the same time period. This is +useful if two containers need access to shared data. For example, if one +container writes and the other reads the data. + +## Driver specific options + +Some volume drivers may take options to customize the volume creation. Use the +`-o` or `--opt` flags to pass driver options: + + $ docker volume create --driver fake --opt tardis=blue --opt timey=wimey + +These options are passed directly to the volume driver. Options for different +volume drivers may do different things (or nothing at all). + +The built-in `local` driver on Windows does not support any options. + +The built-in `local` driver on Linux accepts options similar to the linux +`mount` command: + + $ docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m,uid=1000 + +Another example: + + $ docker volume create --driver local --opt type=btrfs --opt device=/dev/sda2 diff --git a/vendor/github.com/docker/docker/man/src/volume/inspect.md b/vendor/github.com/docker/docker/man/src/volume/inspect.md new file mode 100644 index 000000000..0885caab6 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/volume/inspect.md @@ -0,0 +1,4 @@ +Returns information about one or more volumes. By default, this command renders +all results in a JSON array. You can specify an alternate format to execute a +given template is executed for each result. Go's https://golang.org/pkg/text/template/ +package describes all the details of the format. diff --git a/vendor/github.com/docker/docker/man/src/volume/ls.md b/vendor/github.com/docker/docker/man/src/volume/ls.md new file mode 100644 index 000000000..597884278 --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/volume/ls.md @@ -0,0 +1,11 @@ +Lists all the volumes Docker manages. You can filter using the `-f` or +`--filter` flag. The filtering format is a `key=value` pair. To specify +more than one filter, pass multiple flags (for example, +`--filter "foo=bar" --filter "bif=baz"`) + +The currently supported filters are: + +* `dangling` (boolean - `true` or `false`, `1` or `0`) +* `driver` (a volume driver's name) +* `label` (`label=` or `label==`) +* `name` (a volume's name) diff --git a/vendor/github.com/docker/docker/man/src/wait.md b/vendor/github.com/docker/docker/man/src/wait.md new file mode 100644 index 000000000..8700848ec --- /dev/null +++ b/vendor/github.com/docker/docker/man/src/wait.md @@ -0,0 +1 @@ +Alias for `docker container wait`. diff --git a/vendor/github.com/docker/docker/migrate/v1/migratev1.go b/vendor/github.com/docker/docker/migrate/v1/migratev1.go index 54c1817e8..c9d8108a2 100644 --- a/vendor/github.com/docker/docker/migrate/v1/migratev1.go +++ b/vendor/github.com/docker/docker/migrate/v1/migratev1.go @@ -14,13 +14,13 @@ import ( "encoding/json" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/distribution/metadata" "github.com/docker/docker/image" imagev1 "github.com/docker/docker/image/v1" "github.com/docker/docker/layer" "github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/reference" + "github.com/opencontainers/go-digest" ) type graphIDRegistrar interface { @@ -327,7 +327,7 @@ func migrateRefs(root, driverName string, rs refAdder, mappings map[string]image logrus.Errorf("migrate tags: invalid name %q, %q", name, err) continue } - if dgst, err := digest.ParseDigest(tag); err == nil { + if dgst, err := digest.Parse(tag); err == nil { canonical, err := reference.WithDigest(reference.TrimNamed(ref), dgst) if err != nil { logrus.Errorf("migrate tags: invalid digest %q, %q", dgst, err) @@ -425,7 +425,7 @@ func migrateImage(id, root string, ls graphIDRegistrar, is image.Store, ms metad if err != nil { return err } - diffID, err := digest.ParseDigest(string(diffIDData)) + diffID, err := digest.Parse(string(diffIDData)) if err != nil { return err } @@ -477,7 +477,7 @@ func migrateImage(id, root string, ls graphIDRegistrar, is image.Store, ms metad checksum, err := ioutil.ReadFile(filepath.Join(root, graphDirName, id, "checksum")) if err == nil { // best effort - dgst, err := digest.ParseDigest(string(checksum)) + dgst, err := digest.Parse(string(checksum)) if err == nil { V2MetadataService := metadata.NewV2MetadataService(ms) V2MetadataService.Add(layer.DiffID(), metadata.V2Metadata{Digest: dgst}) diff --git a/vendor/github.com/docker/docker/migrate/v1/migratev1_test.go b/vendor/github.com/docker/docker/migrate/v1/migratev1_test.go index be82fdc75..796c07814 100644 --- a/vendor/github.com/docker/docker/migrate/v1/migratev1_test.go +++ b/vendor/github.com/docker/docker/migrate/v1/migratev1_test.go @@ -13,11 +13,11 @@ import ( "runtime" "testing" - "github.com/docker/distribution/digest" "github.com/docker/docker/distribution/metadata" "github.com/docker/docker/image" "github.com/docker/docker/layer" "github.com/docker/docker/reference" + "github.com/opencontainers/go-digest" ) func TestMigrateRefs(t *testing.T) { diff --git a/vendor/github.com/docker/docker/opts/hosts.go b/vendor/github.com/docker/docker/opts/hosts.go index 7a948fb55..594cccf2f 100644 --- a/vendor/github.com/docker/docker/opts/hosts.go +++ b/vendor/github.com/docker/docker/opts/hosts.go @@ -9,7 +9,7 @@ import ( ) var ( - // DefaultHTTPPort Default HTTP Port used if only the protocol is provided to -H flag e.g. docker daemon -H tcp:// + // DefaultHTTPPort Default HTTP Port used if only the protocol is provided to -H flag e.g. dockerd -H tcp:// // These are the IANA registered port numbers for use with Docker // see http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=docker DefaultHTTPPort = 2375 // Default HTTP Port diff --git a/vendor/github.com/docker/docker/opts/opts_unix.go b/vendor/github.com/docker/docker/opts/opts_unix.go index f1ce844a8..2766a43a0 100644 --- a/vendor/github.com/docker/docker/opts/opts_unix.go +++ b/vendor/github.com/docker/docker/opts/opts_unix.go @@ -2,5 +2,5 @@ package opts -// DefaultHTTPHost Default HTTP Host used if only port is provided to -H flag e.g. docker daemon -H tcp://:8080 +// DefaultHTTPHost Default HTTP Host used if only port is provided to -H flag e.g. dockerd -H tcp://:8080 const DefaultHTTPHost = "localhost" diff --git a/vendor/github.com/docker/docker/opts/opts_windows.go b/vendor/github.com/docker/docker/opts/opts_windows.go index ebe40c969..98b7251a9 100644 --- a/vendor/github.com/docker/docker/opts/opts_windows.go +++ b/vendor/github.com/docker/docker/opts/opts_windows.go @@ -52,5 +52,5 @@ package opts // to the delay if a user were to do 'docker run -H=tcp://localhost:2375...' // explicitly. -// DefaultHTTPHost Default HTTP Host used if only port is provided to -H flag e.g. docker daemon -H tcp://:8080 +// DefaultHTTPHost Default HTTP Host used if only port is provided to -H flag e.g. dockerd -H tcp://:8080 const DefaultHTTPHost = "127.0.0.1" diff --git a/vendor/github.com/docker/docker/opts/quotedstring.go b/vendor/github.com/docker/docker/opts/quotedstring.go new file mode 100644 index 000000000..fb1e5374b --- /dev/null +++ b/vendor/github.com/docker/docker/opts/quotedstring.go @@ -0,0 +1,37 @@ +package opts + +// QuotedString is a string that may have extra quotes around the value. The +// quotes are stripped from the value. +type QuotedString struct { + value *string +} + +// Set sets a new value +func (s *QuotedString) Set(val string) error { + *s.value = trimQuotes(val) + return nil +} + +// Type returns the type of the value +func (s *QuotedString) Type() string { + return "string" +} + +func (s *QuotedString) String() string { + return string(*s.value) +} + +func trimQuotes(value string) string { + lastIndex := len(value) - 1 + for _, char := range []byte{'\'', '"'} { + if value[0] == char && value[lastIndex] == char { + return value[1:lastIndex] + } + } + return value +} + +// NewQuotedString returns a new quoted string option +func NewQuotedString(value *string) *QuotedString { + return &QuotedString{value: value} +} diff --git a/vendor/github.com/docker/docker/opts/quotedstring_test.go b/vendor/github.com/docker/docker/opts/quotedstring_test.go new file mode 100644 index 000000000..0ebf04bbe --- /dev/null +++ b/vendor/github.com/docker/docker/opts/quotedstring_test.go @@ -0,0 +1,28 @@ +package opts + +import ( + "github.com/docker/docker/pkg/testutil/assert" + "testing" +) + +func TestQuotedStringSetWithQuotes(t *testing.T) { + value := "" + qs := NewQuotedString(&value) + assert.NilError(t, qs.Set("\"something\"")) + assert.Equal(t, qs.String(), "something") + assert.Equal(t, value, "something") +} + +func TestQuotedStringSetWithMismatchedQuotes(t *testing.T) { + value := "" + qs := NewQuotedString(&value) + assert.NilError(t, qs.Set("\"something'")) + assert.Equal(t, qs.String(), "\"something'") +} + +func TestQuotedStringSetWithNoQuotes(t *testing.T) { + value := "" + qs := NewQuotedString(&value) + assert.NilError(t, qs.Set("something")) + assert.Equal(t, qs.String(), "something") +} diff --git a/vendor/github.com/docker/docker/opts/throttledevice.go b/vendor/github.com/docker/docker/opts/throttledevice.go index 502432429..65dd3ebf6 100644 --- a/vendor/github.com/docker/docker/opts/throttledevice.go +++ b/vendor/github.com/docker/docker/opts/throttledevice.go @@ -107,5 +107,5 @@ func (opt *ThrottledeviceOpt) GetList() []*blkiodev.ThrottleDevice { // Type returns the option type func (opt *ThrottledeviceOpt) Type() string { - return "throttled-device" + return "list" } diff --git a/vendor/github.com/docker/docker/opts/weightdevice.go b/vendor/github.com/docker/docker/opts/weightdevice.go index 2a5da6da0..7e3d064f2 100644 --- a/vendor/github.com/docker/docker/opts/weightdevice.go +++ b/vendor/github.com/docker/docker/opts/weightdevice.go @@ -85,5 +85,5 @@ func (opt *WeightdeviceOpt) GetList() []*blkiodev.WeightDevice { // Type returns the option type func (opt *WeightdeviceOpt) Type() string { - return "weighted-device" + return "list" } diff --git a/vendor/github.com/docker/docker/pkg/authorization/plugin.go b/vendor/github.com/docker/docker/pkg/authorization/plugin.go index 4b1c71bd4..1491a09d2 100644 --- a/vendor/github.com/docker/docker/pkg/authorization/plugin.go +++ b/vendor/github.com/docker/docker/pkg/authorization/plugin.go @@ -97,7 +97,7 @@ func (a *authorizationPlugin) initPlugin() error { var e error if pg := GetPluginGetter(); pg != nil { - plugin, e = pg.Get(a.name, AuthZApiImplements, plugingetter.LOOKUP) + plugin, e = pg.Get(a.name, AuthZApiImplements, plugingetter.Lookup) } else { plugin, e = plugins.Get(a.name, AuthZApiImplements) } diff --git a/vendor/github.com/docker/docker/pkg/discovery/README.md b/vendor/github.com/docker/docker/pkg/discovery/README.md index 39777c217..d8ed9ce71 100644 --- a/vendor/github.com/docker/docker/pkg/discovery/README.md +++ b/vendor/github.com/docker/docker/pkg/discovery/README.md @@ -17,7 +17,7 @@ the address Docker uses to advertise the node using the `--cluster-advertise` flag. ```bash -$ docker daemon -H= --cluster-advertise= --cluster-store etcd://,/ +$ dockerd -H= --cluster-advertise= --cluster-store etcd://,/ ``` ### Using consul @@ -27,7 +27,7 @@ the address Docker uses to advertise the node using the `--cluster-advertise` flag. ```bash -$ docker daemon -H= --cluster-advertise= --cluster-store consul:/// +$ dockerd -H= --cluster-advertise= --cluster-store consul:/// ``` ### Using zookeeper @@ -37,5 +37,5 @@ the address Docker uses to advertise the node using the `--cluster-advertise` flag. ```bash -$ docker daemon -H= --cluster-advertise= --cluster-store zk://,/ +$ dockerd -H= --cluster-advertise= --cluster-store zk://,/ ``` diff --git a/vendor/github.com/docker/docker/pkg/httputils/mimetype.go b/vendor/github.com/docker/docker/pkg/httputils/mimetype.go index d5cf34e4f..abef9e9e8 100644 --- a/vendor/github.com/docker/docker/pkg/httputils/mimetype.go +++ b/vendor/github.com/docker/docker/pkg/httputils/mimetype.go @@ -8,9 +8,8 @@ import ( // MimeTypes stores the MIME content type. var MimeTypes = struct { TextPlain string - Tar string OctetStream string -}{"text/plain", "application/tar", "application/octet-stream"} +}{"text/plain", "application/octet-stream"} // DetectContentType returns a best guess representation of the MIME // content type for the bytes at c. The value detected by diff --git a/vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader_test.go b/vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader_test.go index 239760c6d..81cafae57 100644 --- a/vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader_test.go +++ b/vendor/github.com/docker/docker/pkg/httputils/resumablerequestreader_test.go @@ -195,10 +195,11 @@ func TestResumableRequestReaderWithServerDoesntSupportByteRanges(t *testing.T) { } defer resreq.Close() + expectedError := "the server doesn't support byte ranges" buf := make([]byte, 2) _, err = resreq.Read(buf) - if err == nil || err.Error() != "the server doesn't support byte ranges" { - t.Fatalf("Expected an error 'the server doesn't support byte ranges', got %v", err) + if err == nil || err.Error() != expectedError { + t.Fatalf("Expected an error '%s', got %v", expectedError, err) } } diff --git a/vendor/github.com/docker/docker/pkg/plugingetter/getter.go b/vendor/github.com/docker/docker/pkg/plugingetter/getter.go index 6c2c82c67..b04b7bc82 100644 --- a/vendor/github.com/docker/docker/pkg/plugingetter/getter.go +++ b/vendor/github.com/docker/docker/pkg/plugingetter/getter.go @@ -3,12 +3,12 @@ package plugingetter import "github.com/docker/docker/pkg/plugins" const ( - // LOOKUP doesn't update RefCount - LOOKUP = 0 - // ACQUIRE increments RefCount - ACQUIRE = 1 - // RELEASE decrements RefCount - RELEASE = -1 + // Lookup doesn't update RefCount + Lookup = 0 + // Acquire increments RefCount + Acquire = 1 + // Release decrements RefCount + Release = -1 ) // CompatPlugin is an abstraction to handle both v2(new) and v1(legacy) plugins. diff --git a/vendor/github.com/docker/docker/pkg/plugins/plugin_test.go b/vendor/github.com/docker/docker/pkg/plugins/plugin_test.go new file mode 100644 index 000000000..ac810565f --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/plugins/plugin_test.go @@ -0,0 +1,37 @@ +package plugins + +import ( + "path/filepath" + "runtime" + "sync" + "testing" + "time" +) + +// regression test for deadlock in handlers +func TestPluginAddHandler(t *testing.T) { + // make a plugin which is pre-activated + p := &Plugin{activateWait: sync.NewCond(&sync.Mutex{})} + p.Manifest = &Manifest{Implements: []string{"bananas"}} + storage.plugins["qwerty"] = p + + testActive(t, p) + Handle("bananas", func(_ string, _ *Client) {}) + testActive(t, p) +} + +func testActive(t *testing.T, p *Plugin) { + done := make(chan struct{}) + go func() { + p.waitActive() + close(done) + }() + + select { + case <-time.After(100 * time.Millisecond): + _, f, l, _ := runtime.Caller(1) + t.Fatalf("%s:%d: deadlock in waitActive", filepath.Base(f), l) + case <-done: + } + +} diff --git a/vendor/github.com/docker/docker/pkg/plugins/plugins.go b/vendor/github.com/docker/docker/pkg/plugins/plugins.go index acfb20999..861daa320 100644 --- a/vendor/github.com/docker/docker/pkg/plugins/plugins.go +++ b/vendor/github.com/docker/docker/pkg/plugins/plugins.go @@ -70,12 +70,12 @@ type Plugin struct { // Manifest of the plugin (see above) Manifest *Manifest `json:"-"` - // error produced by activation - activateErr error - // specifies if the activation sequence is completed (not if it is successful or not) - activated bool // wait for activation to finish activateWait *sync.Cond + // error produced by activation + activateErr error + // keeps track of callback handlers run against this plugin + handlersRun bool } // BasePath returns the path to which all paths returned by the plugin are relative to. @@ -112,19 +112,51 @@ func NewLocalPlugin(name, addr string) *Plugin { func (p *Plugin) activate() error { p.activateWait.L.Lock() - if p.activated { + + if p.activated() { + p.runHandlers() p.activateWait.L.Unlock() return p.activateErr } p.activateErr = p.activateWithLock() - p.activated = true + p.runHandlers() p.activateWait.L.Unlock() p.activateWait.Broadcast() return p.activateErr } +// runHandlers runs the registered handlers for the implemented plugin types +// This should only be run after activation, and while the activation lock is held. +func (p *Plugin) runHandlers() { + if !p.activated() { + return + } + + handlers.RLock() + if !p.handlersRun { + for _, iface := range p.Manifest.Implements { + hdlrs, handled := handlers.extpointHandlers[iface] + if !handled { + continue + } + for _, handler := range hdlrs { + handler(p.name, p.client) + } + } + p.handlersRun = true + } + handlers.RUnlock() + +} + +// activated returns if the plugin has already been activated. +// This should only be called with the activation lock held +func (p *Plugin) activated() bool { + return p.Manifest != nil +} + func (p *Plugin) activateWithLock() error { c, err := NewClient(p.Addr, p.TLSConfig) if err != nil { @@ -138,24 +170,12 @@ func (p *Plugin) activateWithLock() error { } p.Manifest = m - - handlers.RLock() - for _, iface := range m.Implements { - hdlrs, handled := handlers.extpointHandlers[iface] - if !handled { - continue - } - for _, handler := range hdlrs { - handler(p.name, p.client) - } - } - handlers.RUnlock() return nil } func (p *Plugin) waitActive() error { p.activateWait.L.Lock() - for !p.activated { + for !p.activated() { p.activateWait.Wait() } p.activateWait.L.Unlock() @@ -163,7 +183,7 @@ func (p *Plugin) waitActive() error { } func (p *Plugin) implements(kind string) bool { - if err := p.waitActive(); err != nil { + if p.Manifest == nil { return false } for _, driver := range p.Manifest.Implements { @@ -201,6 +221,10 @@ func loadWithRetry(name string, retry bool) (*Plugin, error) { } storage.Lock() + if pl, exists := storage.plugins[name]; exists { + storage.Unlock() + return pl, pl.activate() + } storage.plugins[name] = pl storage.Unlock() @@ -232,7 +256,7 @@ func Get(name, imp string) (*Plugin, error) { if err != nil { return nil, err } - if pl.implements(imp) { + if err := pl.waitActive(); err == nil && pl.implements(imp) { logrus.Debugf("%s implements: %s", name, imp) return pl, nil } @@ -249,9 +273,17 @@ func Handle(iface string, fn func(string, *Client)) { hdlrs = append(hdlrs, fn) handlers.extpointHandlers[iface] = hdlrs + + storage.Lock() for _, p := range storage.plugins { - p.activated = false + p.activateWait.L.Lock() + if p.activated() && p.implements(iface) { + p.handlersRun = false + } + p.activateWait.L.Unlock() } + storage.Unlock() + handlers.Unlock() } @@ -270,7 +302,10 @@ func GetAll(imp string) ([]*Plugin, error) { chPl := make(chan *plLoad, len(pluginNames)) var wg sync.WaitGroup for _, name := range pluginNames { - if pl, ok := storage.plugins[name]; ok { + storage.Lock() + pl, ok := storage.plugins[name] + storage.Unlock() + if ok { chPl <- &plLoad{pl, nil} continue } @@ -292,7 +327,7 @@ func GetAll(imp string) ([]*Plugin, error) { logrus.Error(pl.err) continue } - if pl.pl.implements(imp) { + if err := pl.pl.waitActive(); err == nil && pl.pl.implements(imp) { out = append(out, pl.pl) } } diff --git a/vendor/github.com/docker/docker/pkg/testutil/assert/assert.go b/vendor/github.com/docker/docker/pkg/testutil/assert/assert.go index 6da8518a5..86736d7c7 100644 --- a/vendor/github.com/docker/docker/pkg/testutil/assert/assert.go +++ b/vendor/github.com/docker/docker/pkg/testutil/assert/assert.go @@ -7,6 +7,7 @@ import ( "reflect" "runtime" "strings" + "unicode" "github.com/davecgh/go-spew/spew" ) @@ -25,6 +26,25 @@ func Equal(t TestingT, actual, expected interface{}) { } } +// EqualNormalizedString compare the actual value to the expected value after applying the specified +// transform function. It fails the test if these two transformed string are not equal. +// For example `EqualNormalizedString(t, RemoveSpace, "foo\n", "foo")` wouldn't fail the test as +// spaces (and thus '\n') are removed before comparing the string. +func EqualNormalizedString(t TestingT, transformFun func(rune) rune, actual, expected string) { + if strings.Map(transformFun, actual) != strings.Map(transformFun, expected) { + fatal(t, "Expected '%v' got '%v'", expected, expected, actual, actual) + } +} + +// RemoveSpace returns -1 if the specified runes is considered as a space (unicode) +// and the rune itself otherwise. +func RemoveSpace(r rune) rune { + if unicode.IsSpace(r) { + return -1 + } + return r +} + //EqualStringSlice compares two slices and fails the test if they do not contain // the same items. func EqualStringSlice(t TestingT, actual, expected []string) { diff --git a/vendor/github.com/docker/docker/pkg/integration/cmd/command.go b/vendor/github.com/docker/docker/pkg/testutil/cmd/command.go similarity index 95% rename from vendor/github.com/docker/docker/pkg/integration/cmd/command.go rename to vendor/github.com/docker/docker/pkg/testutil/cmd/command.go index 2a886ab54..3086574f4 100644 --- a/vendor/github.com/docker/docker/pkg/integration/cmd/command.go +++ b/vendor/github.com/docker/docker/pkg/testutil/cmd/command.go @@ -215,8 +215,16 @@ type Cmd struct { Env []string } +// Command create a simple Cmd with the specified command and arguments +func Command(command string, args ...string) Cmd { + return Cmd{Command: append([]string{command}, args...)} +} + // RunCmd runs a command and returns a Result -func RunCmd(cmd Cmd) *Result { +func RunCmd(cmd Cmd, cmdOperators ...func(*Cmd)) *Result { + for _, op := range cmdOperators { + op(&cmd) + } result := StartCmd(cmd) if result.Error != nil { return result @@ -226,7 +234,7 @@ func RunCmd(cmd Cmd) *Result { // RunCommand parses a command line and runs it, returning a result func RunCommand(command string, args ...string) *Result { - return RunCmd(Cmd{Command: append([]string{command}, args...)}) + return RunCmd(Command(command, args...)) } // StartCmd starts a command, but doesn't wait for it to finish diff --git a/vendor/github.com/docker/docker/pkg/integration/cmd/command_test.go b/vendor/github.com/docker/docker/pkg/testutil/cmd/command_test.go similarity index 100% rename from vendor/github.com/docker/docker/pkg/integration/cmd/command_test.go rename to vendor/github.com/docker/docker/pkg/testutil/cmd/command_test.go diff --git a/vendor/github.com/docker/docker/pkg/testutil/golden/golden.go b/vendor/github.com/docker/docker/pkg/testutil/golden/golden.go new file mode 100644 index 000000000..8f725da7b --- /dev/null +++ b/vendor/github.com/docker/docker/pkg/testutil/golden/golden.go @@ -0,0 +1,28 @@ +// Package golden provides function and helpers to use golden file for +// testing purpose. +package golden + +import ( + "flag" + "io/ioutil" + "path/filepath" + "testing" +) + +var update = flag.Bool("test.update", false, "update golden file") + +// Get returns the golden file content. If the `test.update` is specified, it updates the +// file with the current output and returns it. +func Get(t *testing.T, actual []byte, filename string) []byte { + golden := filepath.Join("testdata", filename) + if *update { + if err := ioutil.WriteFile(golden, actual, 0644); err != nil { + t.Fatal(err) + } + } + expected, err := ioutil.ReadFile(golden) + if err != nil { + t.Fatal(err) + } + return expected +} diff --git a/vendor/github.com/docker/docker/pkg/integration/utils.go b/vendor/github.com/docker/docker/pkg/testutil/utils.go similarity index 98% rename from vendor/github.com/docker/docker/pkg/integration/utils.go rename to vendor/github.com/docker/docker/pkg/testutil/utils.go index af3aa1a91..d0924f896 100644 --- a/vendor/github.com/docker/docker/pkg/integration/utils.go +++ b/vendor/github.com/docker/docker/pkg/testutil/utils.go @@ -1,4 +1,4 @@ -package integration +package testutil import ( "archive/tar" @@ -14,9 +14,9 @@ import ( "syscall" "time" - icmd "github.com/docker/docker/pkg/integration/cmd" "github.com/docker/docker/pkg/stringutils" "github.com/docker/docker/pkg/system" + icmd "github.com/docker/docker/pkg/testutil/cmd" ) // IsKilled process the specified error and returns whether the process was killed or not. diff --git a/vendor/github.com/docker/docker/pkg/integration/utils_test.go b/vendor/github.com/docker/docker/pkg/testutil/utils_test.go similarity index 99% rename from vendor/github.com/docker/docker/pkg/integration/utils_test.go rename to vendor/github.com/docker/docker/pkg/testutil/utils_test.go index 8e8798d42..d1dddaffa 100644 --- a/vendor/github.com/docker/docker/pkg/integration/utils_test.go +++ b/vendor/github.com/docker/docker/pkg/testutil/utils_test.go @@ -1,4 +1,4 @@ -package integration +package testutil import ( "io" diff --git a/vendor/github.com/docker/docker/pkg/truncindex/truncindex.go b/vendor/github.com/docker/docker/pkg/truncindex/truncindex.go index 54a0bf353..74776e65e 100644 --- a/vendor/github.com/docker/docker/pkg/truncindex/truncindex.go +++ b/vendor/github.com/docker/docker/pkg/truncindex/truncindex.go @@ -125,8 +125,13 @@ func (idx *TruncIndex) Get(s string) (string, error) { return "", ErrNotExist } -// Iterate iterates over all stored IDs, and passes each of them to the given handler. +// Iterate iterates over all stored IDs and passes each of them to the given +// handler. Take care that the handler method does not call any public +// method on truncindex as the internal locking is not reentrant/recursive +// and will result in deadlock. func (idx *TruncIndex) Iterate(handler func(id string)) { + idx.Lock() + defer idx.Unlock() idx.trie.Visit(func(prefix patricia.Prefix, item patricia.Item) error { handler(string(prefix)) return nil diff --git a/vendor/github.com/docker/docker/pkg/truncindex/truncindex_test.go b/vendor/github.com/docker/docker/pkg/truncindex/truncindex_test.go index 8197baf7d..89658cabb 100644 --- a/vendor/github.com/docker/docker/pkg/truncindex/truncindex_test.go +++ b/vendor/github.com/docker/docker/pkg/truncindex/truncindex_test.go @@ -3,6 +3,7 @@ package truncindex import ( "math/rand" "testing" + "time" "github.com/docker/docker/pkg/stringid" ) @@ -98,6 +99,7 @@ func TestTruncIndex(t *testing.T) { assertIndexGet(t, index, id, id, false) assertIndexIterate(t) + assertIndexIterateDoNotPanic(t) } func assertIndexIterate(t *testing.T) { @@ -121,6 +123,28 @@ func assertIndexIterate(t *testing.T) { }) } +func assertIndexIterateDoNotPanic(t *testing.T) { + ids := []string{ + "19b36c2c326ccc11e726eee6ee78a0baf166ef96", + "28b36c2c326ccc11e726eee6ee78a0baf166ef96", + } + + index := NewTruncIndex(ids) + iterationStarted := make(chan bool, 1) + + go func() { + <-iterationStarted + index.Delete("19b36c2c326ccc11e726eee6ee78a0baf166ef96") + }() + + index.Iterate(func(targetId string) { + if targetId == "19b36c2c326ccc11e726eee6ee78a0baf166ef96" { + iterationStarted <- true + time.Sleep(100 * time.Millisecond) + } + }) +} + func assertIndexGet(t *testing.T, index *TruncIndex, input, expectedResult string, expectError bool) { if result, err := index.Get(input); err != nil && !expectError { t.Fatalf("Unexpected error getting '%s': %s", input, err) diff --git a/vendor/github.com/docker/docker/plugin/backend_linux.go b/vendor/github.com/docker/docker/plugin/backend_linux.go index 26614cd7d..91406d5a3 100644 --- a/vendor/github.com/docker/docker/plugin/backend_linux.go +++ b/vendor/github.com/docker/docker/plugin/backend_linux.go @@ -16,7 +16,6 @@ import ( "strings" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest/schema2" "github.com/docker/docker/api/types" "github.com/docker/docker/distribution" @@ -29,6 +28,7 @@ import ( "github.com/docker/docker/pkg/progress" "github.com/docker/docker/plugin/v2" "github.com/docker/docker/reference" + "github.com/opencontainers/go-digest" "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -123,7 +123,7 @@ func (s *tempConfigStore) Put(c []byte) (digest.Digest, error) { func (s *tempConfigStore) Get(d digest.Digest) ([]byte, error) { if d != s.configDigest { - return nil, digest.ErrDigestNotFound + return nil, fmt.Errorf("digest not found") } return s.config, nil } @@ -159,10 +159,10 @@ func computePrivileges(c types.PluginConfig) (types.PluginPrivileges, error) { }) } } - if c.Linux.DeviceCreation { + if c.Linux.AllowAllDevices { privileges = append(privileges, types.PluginPrivilege{ - Name: "device-creation", - Description: "allow creating devices inside plugin", + Name: "allow-all-devices", + Description: "allow 'rwm' access to all devices", Value: []string{"true"}, }) } @@ -556,7 +556,7 @@ func (pm *Manager) CreateFromContext(ctx context.Context, tarCtx io.ReadCloser, } defer rootFSBlob.Close() gzw := gzip.NewWriter(rootFSBlob) - layerDigester := digest.Canonical.New() + layerDigester := digest.Canonical.Digester() rootFSReader := io.TeeReader(rootFS, io.MultiWriter(gzw, layerDigester.Hash())) if err := chrootarchive.Untar(rootFSReader, tmpRootFSDir, nil); err != nil { diff --git a/vendor/github.com/docker/docker/plugin/blobstore.go b/vendor/github.com/docker/docker/plugin/blobstore.go index dc9e598e0..b407884cc 100644 --- a/vendor/github.com/docker/docker/plugin/blobstore.go +++ b/vendor/github.com/docker/docker/plugin/blobstore.go @@ -1,18 +1,19 @@ package plugin import ( + "fmt" "io" "io/ioutil" "os" "path/filepath" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/distribution/xfer" "github.com/docker/docker/image" "github.com/docker/docker/layer" "github.com/docker/docker/pkg/archive" "github.com/docker/docker/pkg/progress" + "github.com/opencontainers/go-digest" "github.com/pkg/errors" "golang.org/x/net/context" ) @@ -86,7 +87,7 @@ type insertion struct { } func newInsertion(tempFile *os.File) *insertion { - digester := digest.Canonical.New() + digester := digest.Canonical.Digester() return &insertion{f: tempFile, digester: digester, Writer: io.MultiWriter(tempFile, digester.Hash())} } @@ -141,7 +142,7 @@ func (dm *downloadManager) Download(ctx context.Context, initialRootFS image.Roo if err != nil { return initialRootFS, nil, err } - digester := digest.Canonical.New() + digester := digest.Canonical.Digester() if _, err := archive.ApplyLayer(dm.tmpDir, io.TeeReader(inflatedLayerData, digester.Hash())); err != nil { return initialRootFS, nil, err } @@ -174,7 +175,7 @@ func (dm *downloadManager) Put(dt []byte) (digest.Digest, error) { } func (dm *downloadManager) Get(d digest.Digest) ([]byte, error) { - return nil, digest.ErrDigestNotFound + return nil, fmt.Errorf("digest not found") } func (dm *downloadManager) RootFSFromConfig(c []byte) (*image.RootFS, error) { return configToRootFS(c) diff --git a/vendor/github.com/docker/docker/plugin/manager.go b/vendor/github.com/docker/docker/plugin/manager.go index 1954784fb..a81c3edb4 100644 --- a/vendor/github.com/docker/docker/plugin/manager.go +++ b/vendor/github.com/docker/docker/plugin/manager.go @@ -12,7 +12,6 @@ import ( "sync" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types" "github.com/docker/docker/image" "github.com/docker/docker/layer" @@ -22,6 +21,7 @@ import ( "github.com/docker/docker/plugin/v2" "github.com/docker/docker/reference" "github.com/docker/docker/registry" + "github.com/opencontainers/go-digest" "github.com/pkg/errors" ) diff --git a/vendor/github.com/docker/docker/plugin/manager_linux.go b/vendor/github.com/docker/docker/plugin/manager_linux.go index a5083154d..ef91ce312 100644 --- a/vendor/github.com/docker/docker/plugin/manager_linux.go +++ b/vendor/github.com/docker/docker/plugin/manager_linux.go @@ -11,7 +11,6 @@ import ( "time" "github.com/Sirupsen/logrus" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types" "github.com/docker/docker/daemon/initlayer" "github.com/docker/docker/libcontainerd" @@ -19,6 +18,7 @@ import ( "github.com/docker/docker/pkg/plugins" "github.com/docker/docker/pkg/stringid" "github.com/docker/docker/plugin/v2" + "github.com/opencontainers/go-digest" specs "github.com/opencontainers/runtime-spec/specs-go" "github.com/pkg/errors" ) diff --git a/vendor/github.com/docker/docker/plugin/store.go b/vendor/github.com/docker/docker/plugin/store.go index 3c780ab93..ab60bff54 100644 --- a/vendor/github.com/docker/docker/plugin/store.go +++ b/vendor/github.com/docker/docker/plugin/store.go @@ -36,7 +36,7 @@ func (name ErrAmbiguous) Error() string { return fmt.Sprintf("multiple plugins found for %q", string(name)) } -// GetV2Plugin retreives a plugin by name, id or partial ID. +// GetV2Plugin retrieves a plugin by name, id or partial ID. func (ps *Store) GetV2Plugin(refOrID string) (*v2.Plugin, error) { ps.RLock() defer ps.RUnlock() @@ -58,13 +58,13 @@ func (ps *Store) GetV2Plugin(refOrID string) (*v2.Plugin, error) { func (ps *Store) validateName(name string) error { for _, p := range ps.plugins { if p.Name() == name { - return errors.Errorf("%v already exists", name) + return errors.Errorf("plugin %q already exists", name) } } return nil } -// GetAll retreives all plugins. +// GetAll retrieves all plugins. func (ps *Store) GetAll() map[string]*v2.Plugin { ps.RLock() defer ps.RUnlock() diff --git a/vendor/github.com/docker/docker/plugin/v2/plugin.go b/vendor/github.com/docker/docker/plugin/v2/plugin.go index 93b489a14..74ff64080 100644 --- a/vendor/github.com/docker/docker/plugin/v2/plugin.go +++ b/vendor/github.com/docker/docker/plugin/v2/plugin.go @@ -5,10 +5,10 @@ import ( "strings" "sync" - "github.com/docker/distribution/digest" "github.com/docker/docker/api/types" "github.com/docker/docker/pkg/plugingetter" "github.com/docker/docker/pkg/plugins" + "github.com/opencontainers/go-digest" ) // Plugin represents an individual plugin. @@ -233,12 +233,12 @@ func (p *Plugin) AddRefCount(count int) { // Acquire increments the plugin's reference count // This should be followed up by `Release()` when the plugin is no longer in use. func (p *Plugin) Acquire() { - p.AddRefCount(plugingetter.ACQUIRE) + p.AddRefCount(plugingetter.Acquire) } // Release decrements the plugin's reference count // This should only be called when the plugin is no longer in use, e.g. with -// via `Acquire()` or getter.Get("name", "type", plugingetter.ACQUIRE) +// via `Acquire()` or getter.Get("name", "type", plugingetter.Acquire) func (p *Plugin) Release() { - p.AddRefCount(plugingetter.RELEASE) + p.AddRefCount(plugingetter.Release) } diff --git a/vendor/github.com/docker/docker/plugin/v2/plugin_linux.go b/vendor/github.com/docker/docker/plugin/v2/plugin_linux.go index 0f4cb2984..f1c2da0bc 100644 --- a/vendor/github.com/docker/docker/plugin/v2/plugin_linux.go +++ b/vendor/github.com/docker/docker/plugin/v2/plugin_linux.go @@ -87,7 +87,7 @@ func (p *Plugin) InitSpec(execRoot string) (*specs.Spec, error) { s.Linux.RootfsPropagation = "rshared" } - if p.PluginObj.Config.Linux.DeviceCreation { + if p.PluginObj.Config.Linux.AllowAllDevices { rwm := "rwm" s.Linux.Resources.Devices = []specs.DeviceCgroup{{Allow: true, Access: &rwm}} } diff --git a/vendor/github.com/docker/docker/project/PACKAGERS.md b/vendor/github.com/docker/docker/project/PACKAGERS.md index 46ea8e7b2..a5b0018b5 100644 --- a/vendor/github.com/docker/docker/project/PACKAGERS.md +++ b/vendor/github.com/docker/docker/project/PACKAGERS.md @@ -292,7 +292,7 @@ appropriate for your distro's init script to live there too!). In general, Docker should be run as root, similar to the following: ```bash -docker daemon +dockerd ``` Generally, a `DOCKER_OPTS` variable of some kind is available for adding more diff --git a/vendor/github.com/docker/docker/reference/reference.go b/vendor/github.com/docker/docker/reference/reference.go index 15854e5a5..620ee0934 100644 --- a/vendor/github.com/docker/docker/reference/reference.go +++ b/vendor/github.com/docker/docker/reference/reference.go @@ -5,9 +5,9 @@ import ( "fmt" "strings" - "github.com/docker/distribution/digest" distreference "github.com/docker/distribution/reference" "github.com/docker/docker/pkg/stringid" + "github.com/opencontainers/go-digest" ) const ( @@ -166,7 +166,7 @@ func ParseIDOrReference(idOrRef string) (digest.Digest, Named, error) { if err := stringid.ValidateID(idOrRef); err == nil { idOrRef = "sha256:" + idOrRef } - if dgst, err := digest.ParseDigest(idOrRef); err == nil { + if dgst, err := digest.Parse(idOrRef); err == nil { return dgst, nil, nil } ref, err := ParseNamed(idOrRef) diff --git a/vendor/github.com/docker/docker/reference/reference_test.go b/vendor/github.com/docker/docker/reference/reference_test.go index a1822b784..481a2dd97 100644 --- a/vendor/github.com/docker/docker/reference/reference_test.go +++ b/vendor/github.com/docker/docker/reference/reference_test.go @@ -3,7 +3,7 @@ package reference import ( "testing" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) func TestValidateReferenceName(t *testing.T) { diff --git a/vendor/github.com/docker/docker/reference/store.go b/vendor/github.com/docker/docker/reference/store.go index 71ca236c9..35ae33660 100644 --- a/vendor/github.com/docker/docker/reference/store.go +++ b/vendor/github.com/docker/docker/reference/store.go @@ -9,8 +9,8 @@ import ( "sort" "sync" - "github.com/docker/distribution/digest" "github.com/docker/docker/pkg/ioutils" + "github.com/opencontainers/go-digest" ) var ( diff --git a/vendor/github.com/docker/docker/reference/store_test.go b/vendor/github.com/docker/docker/reference/store_test.go index c2c9c97d9..0d96e6b69 100644 --- a/vendor/github.com/docker/docker/reference/store_test.go +++ b/vendor/github.com/docker/docker/reference/store_test.go @@ -8,7 +8,7 @@ import ( "strings" "testing" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) var ( diff --git a/vendor/github.com/docker/docker/registry/config.go b/vendor/github.com/docker/docker/registry/config.go index 9a4f6a925..c839d87cf 100644 --- a/vendor/github.com/docker/docker/registry/config.go +++ b/vendor/github.com/docker/docker/registry/config.go @@ -84,16 +84,46 @@ func newServiceConfig(options ServiceOptions) *serviceConfig { IndexConfigs: make(map[string]*registrytypes.IndexInfo, 0), // Hack: Bypass setting the mirrors to IndexConfigs since they are going away // and Mirrors are only for the official registry anyways. - Mirrors: options.Mirrors, }, V2Only: options.V2Only, } + config.LoadMirrors(options.Mirrors) config.LoadInsecureRegistries(options.InsecureRegistries) return config } +// LoadMirrors loads mirrors to config, after removing duplicates. +// Returns an error if mirrors contains an invalid mirror. +func (config *serviceConfig) LoadMirrors(mirrors []string) error { + mMap := map[string]struct{}{} + unique := []string{} + + for _, mirror := range mirrors { + m, err := ValidateMirror(mirror) + if err != nil { + return err + } + if _, exist := mMap[m]; !exist { + mMap[m] = struct{}{} + unique = append(unique, m) + } + } + + config.Mirrors = unique + + // Configure public registry since mirrors may have changed. + config.IndexConfigs[IndexName] = ®istrytypes.IndexInfo{ + Name: IndexName, + Mirrors: config.Mirrors, + Secure: true, + Official: true, + } + + return nil +} + // LoadInsecureRegistries loads insecure registries to config func (config *serviceConfig) LoadInsecureRegistries(registries []string) error { // Localhost is by default considered as an insecure registry @@ -208,18 +238,20 @@ func isSecureIndex(config *serviceConfig, indexName string) bool { func ValidateMirror(val string) (string, error) { uri, err := url.Parse(val) if err != nil { - return "", fmt.Errorf("%s is not a valid URI", val) + return "", fmt.Errorf("invalid mirror: %q is not a valid URI", val) } - if uri.Scheme != "http" && uri.Scheme != "https" { - return "", fmt.Errorf("Unsupported scheme %s", uri.Scheme) + return "", fmt.Errorf("invalid mirror: unsupported scheme %q in %q", uri.Scheme, uri) } - - if uri.Path != "" || uri.RawQuery != "" || uri.Fragment != "" { - return "", fmt.Errorf("Unsupported path/query/fragment at end of the URI") + if (uri.Path != "" && uri.Path != "/") || uri.RawQuery != "" || uri.Fragment != "" { + return "", fmt.Errorf("invalid mirror: path, query, or fragment at end of the URI %q", uri) } - - return fmt.Sprintf("%s://%s/", uri.Scheme, uri.Host), nil + if uri.User != nil { + // strip password from output + uri.User = url.UserPassword(uri.User.Username(), "xxxxx") + return "", fmt.Errorf("invalid mirror: username/password not allowed in URI %q", uri) + } + return strings.TrimSuffix(val, "/") + "/", nil } // ValidateIndexName validates an index name. diff --git a/vendor/github.com/docker/docker/registry/config_test.go b/vendor/github.com/docker/docker/registry/config_test.go index 25578a7f2..038253077 100644 --- a/vendor/github.com/docker/docker/registry/config_test.go +++ b/vendor/github.com/docker/docker/registry/config_test.go @@ -7,7 +7,9 @@ import ( func TestValidateMirror(t *testing.T) { valid := []string{ "http://mirror-1.com", + "http://mirror-1.com/", "https://mirror-1.com", + "https://mirror-1.com/", "http://localhost", "https://localhost", "http://localhost:5000", @@ -21,15 +23,14 @@ func TestValidateMirror(t *testing.T) { invalid := []string{ "!invalid!://%as%", "ftp://mirror-1.com", - "http://mirror-1.com/", "http://mirror-1.com/?q=foo", "http://mirror-1.com/v1/", "http://mirror-1.com/v1/?q=foo", "http://mirror-1.com/v1/?q=foo#frag", "http://mirror-1.com?q=foo", "https://mirror-1.com#frag", - "https://mirror-1.com/", "https://mirror-1.com/#frag", + "http://foo:bar@mirror-1.com/", "https://mirror-1.com/v1/", "https://mirror-1.com/v1/#", "https://mirror-1.com?q", diff --git a/vendor/github.com/docker/docker/registry/registry_test.go b/vendor/github.com/docker/docker/registry/registry_test.go index 786dfbed4..a4e531214 100644 --- a/vendor/github.com/docker/docker/registry/registry_test.go +++ b/vendor/github.com/docker/docker/registry/registry_test.go @@ -663,7 +663,7 @@ func TestMirrorEndpointLookup(t *testing.T) { } return false } - s := DefaultService{config: makeServiceConfig([]string{"my.mirror"}, nil)} + s := DefaultService{config: makeServiceConfig([]string{"https://my.mirror"}, nil)} imageName, err := reference.WithName(IndexName + "/test/image") if err != nil { diff --git a/vendor/github.com/docker/docker/registry/service.go b/vendor/github.com/docker/docker/registry/service.go index 596a9c7e5..af74cbad2 100644 --- a/vendor/github.com/docker/docker/registry/service.go +++ b/vendor/github.com/docker/docker/registry/service.go @@ -31,6 +31,7 @@ type Service interface { Search(ctx context.Context, term string, limit int, authConfig *types.AuthConfig, userAgent string, headers map[string][]string) (*registrytypes.SearchResults, error) ServiceConfig() *registrytypes.ServiceConfig TLSConfig(hostname string) (*tls.Config, error) + LoadMirrors([]string) error LoadInsecureRegistries([]string) error } @@ -73,6 +74,14 @@ func (s *DefaultService) ServiceConfig() *registrytypes.ServiceConfig { return &servConfig } +// LoadMirrors loads registry mirrors for Service +func (s *DefaultService) LoadMirrors(mirrors []string) error { + s.mu.Lock() + defer s.mu.Unlock() + + return s.config.LoadMirrors(mirrors) +} + // LoadInsecureRegistries loads insecure registries for Service func (s *DefaultService) LoadInsecureRegistries(registries []string) error { s.mu.Lock() diff --git a/vendor/github.com/docker/docker/runconfig/opts/envfile_test.go b/vendor/github.com/docker/docker/runconfig/opts/envfile_test.go index 5dd7078bc..f3faabe3c 100644 --- a/vendor/github.com/docker/docker/runconfig/opts/envfile_test.go +++ b/vendor/github.com/docker/docker/runconfig/opts/envfile_test.go @@ -54,7 +54,7 @@ and_underscore=working too } if !reflect.DeepEqual(lines, expectedLines) { - t.Fatal("lines not equal to expected_lines") + t.Fatal("lines not equal to expectedLines") } } @@ -128,12 +128,11 @@ another invalid line` defer os.Remove(tmpFile) _, err := ParseEnvFile(tmpFile) - if err == nil { t.Fatalf("Expected an ErrBadEnvVariable, got nothing") } if _, ok := err.(ErrBadEnvVariable); !ok { - t.Fatalf("Expected an ErrBadEnvvariable, got [%v]", err) + t.Fatalf("Expected an ErrBadEnvVariable, got [%v]", err) } expectedMessage := "poorly formatted environment: variable 'first line' has white spaces" if err.Error() != expectedMessage { diff --git a/vendor/github.com/docker/docker/vendor.conf b/vendor/github.com/docker/docker/vendor.conf index a49dbddab..f5ab87bae 100644 --- a/vendor/github.com/docker/docker/vendor.conf +++ b/vendor/github.com/docker/docker/vendor.conf @@ -2,7 +2,7 @@ github.com/Azure/go-ansiterm 388960b655244e76e24c75f48631564eaefade62 github.com/Microsoft/hcsshim v0.5.9 github.com/Microsoft/go-winio v0.3.7 -github.com/Sirupsen/logrus f76d643702a30fbffecdfe50831e11881c96ceb3 https://github.com/aaronlehmann/logrus +github.com/Sirupsen/logrus v0.11.0 github.com/davecgh/go-spew 6d212800a42e8ab5c146b8ace3490ee17e5225f9 github.com/docker/libtrust 9cbd2a1374f46905c68a4eb3694a130610adc62a github.com/go-check/check 4ed411733c5785b40214c70bce814c3a3a689609 https://github.com/cpuguy83/check.git @@ -16,14 +16,14 @@ github.com/vdemeester/shakers 24d7f1d6a71aa5d9cbe7390e4afb66b7eef9e1b3 # forked golang.org/x/net package includes a patch for lazy loading trace templates golang.org/x/net 2beffdc2e92c8a3027590f898fe88f69af48a3f8 https://github.com/tonistiigi/net.git golang.org/x/sys 8f0908ab3b2457e2e15403d3697c9ef5cb4b57a9 -github.com/docker/go-units 8a7beacffa3009a9ac66bad506b18ffdd110cf97 +github.com/docker/go-units e30f1e79f3cd72542f2026ceec18d3bd67ab859c github.com/docker/go-connections 4ccf312bf1d35e5dbda654e57a9be4c3f3cd0366 github.com/RackSec/srslog 456df3a81436d29ba874f3590eeeee25d666f8a5 github.com/imdario/mergo 0.2.1 #get libnetwork packages -github.com/docker/libnetwork b908488a139e81cb8c4091cd836745aeb4d813a4 +github.com/docker/libnetwork e8431956af5df6816e232d68376c012c2617edbd github.com/docker/go-events 18b43f1bc85d9cdd42c05a6cd2d444c7a200a894 github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80 github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec @@ -44,8 +44,9 @@ github.com/boltdb/bolt fff57c100f4dea1905678da7e90d92429dff2904 github.com/miekg/dns 75e6e86cc601825c5dbcd4e0c209eab180997cd7 # get graph and distribution packages -github.com/docker/distribution 28602af35aceda2f8d571bad7ca37a54cf0250bc +github.com/docker/distribution 7dba427612198a11b161a27f9d40bb2dca1ccd20 github.com/vbatts/tar-split v0.10.1 +github.com/opencontainers/go-digest a6d0ee40d4207ea02364bd3b9e8e77b9159ba1eb # get go-zfs packages github.com/mistifyio/go-zfs 22c9b32c84eb0d0c6f4043b6e90fc94073de92fa @@ -102,7 +103,7 @@ github.com/docker/containerd 03e5862ec0d8d3b3f750e19fca3ee367e13c090e github.com/tonistiigi/fifo 1405643975692217d6720f8b54aeee1bf2cd5cf4 # cluster -github.com/docker/swarmkit 9e4bd71a1690cd27400714fcd98c329b752b5c4c +github.com/docker/swarmkit 62d835f478b2e4fd2768deb88fb3b32e334faaee github.com/golang/mock bd3c8e81be01eef76d4b503f5e687d2d1354d2d9 github.com/gogo/protobuf v0.3 github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a @@ -110,7 +111,7 @@ github.com/google/certificate-transparency d90e65c3a07988180c5b1ece71791c0b65068 golang.org/x/crypto 3fbbcd23f1cb824e69491a5930cfeff09b12f4d2 golang.org/x/time a4bde12657593d5e90d0533a3e4fd95e635124cb github.com/mreiferson/go-httpclient 63fe23f7434723dc904c901043af07931f293c47 -github.com/hashicorp/go-memdb 608dda3b1410a73eaf3ac8b517c9ae7ebab6aa87 https://github.com/floridoo/go-memdb +github.com/hashicorp/go-memdb 608dda3b1410a73eaf3ac8b517c9ae7ebab6aa87 github.com/hashicorp/go-immutable-radix 8e8ed81f8f0bf1bdd829593fdd5c29922c1ea990 github.com/hashicorp/golang-lru a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4 github.com/coreos/pkg fa29b1d70f0beaddd4c7021607cc3c3be8ce94b8 diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/blobs.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/blobs.go index 1f91ae21e..79c5fb33b 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/blobs.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/blobs.go @@ -8,8 +8,8 @@ import ( "time" "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" "github.com/docker/distribution/reference" + "github.com/opencontainers/go-digest" ) var ( diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/set.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digestset/set.go similarity index 90% rename from vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/set.go rename to vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digestset/set.go index 4b9313c1a..71327dca7 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/set.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digestset/set.go @@ -1,10 +1,12 @@ -package digest +package digestset import ( "errors" "sort" "strings" "sync" + + digest "github.com/opencontainers/go-digest" ) var ( @@ -44,7 +46,7 @@ func NewSet() *Set { // values or short values. This function does not test equality, // rather whether the second value could match against the first // value. -func checkShortMatch(alg Algorithm, hex, shortAlg, shortHex string) bool { +func checkShortMatch(alg digest.Algorithm, hex, shortAlg, shortHex string) bool { if len(hex) == len(shortHex) { if hex != shortHex { return false @@ -64,7 +66,7 @@ func checkShortMatch(alg Algorithm, hex, shortAlg, shortHex string) bool { // If no digests could be found ErrDigestNotFound will be returned // with an empty digest value. If multiple matches are found // ErrDigestAmbiguous will be returned with an empty digest value. -func (dst *Set) Lookup(d string) (Digest, error) { +func (dst *Set) Lookup(d string) (digest.Digest, error) { dst.mutex.RLock() defer dst.mutex.RUnlock() if len(dst.entries) == 0 { @@ -72,11 +74,11 @@ func (dst *Set) Lookup(d string) (Digest, error) { } var ( searchFunc func(int) bool - alg Algorithm + alg digest.Algorithm hex string ) - dgst, err := ParseDigest(d) - if err == ErrDigestInvalidFormat { + dgst, err := digest.Parse(d) + if err == digest.ErrDigestInvalidFormat { hex = d searchFunc = func(i int) bool { return dst.entries[i].val >= d @@ -108,7 +110,7 @@ func (dst *Set) Lookup(d string) (Digest, error) { // Add adds the given digest to the set. An error will be returned // if the given digest is invalid. If the digest already exists in the // set, this operation will be a no-op. -func (dst *Set) Add(d Digest) error { +func (dst *Set) Add(d digest.Digest) error { if err := d.Validate(); err != nil { return err } @@ -139,7 +141,7 @@ func (dst *Set) Add(d Digest) error { // Remove removes the given digest from the set. An err will be // returned if the given digest is invalid. If the digest does // not exist in the set, this operation will be a no-op. -func (dst *Set) Remove(d Digest) error { +func (dst *Set) Remove(d digest.Digest) error { if err := d.Validate(); err != nil { return err } @@ -167,10 +169,10 @@ func (dst *Set) Remove(d Digest) error { } // All returns all the digests in the set -func (dst *Set) All() []Digest { +func (dst *Set) All() []digest.Digest { dst.mutex.RLock() defer dst.mutex.RUnlock() - retValues := make([]Digest, len(dst.entries)) + retValues := make([]digest.Digest, len(dst.entries)) for i := range dst.entries { retValues[i] = dst.entries[i].digest } @@ -183,10 +185,10 @@ func (dst *Set) All() []Digest { // entire value of digest if uniqueness cannot be achieved without the // full value. This function will attempt to make short codes as short // as possible to be unique. -func ShortCodeTable(dst *Set, length int) map[Digest]string { +func ShortCodeTable(dst *Set, length int) map[digest.Digest]string { dst.mutex.RLock() defer dst.mutex.RUnlock() - m := make(map[Digest]string, len(dst.entries)) + m := make(map[digest.Digest]string, len(dst.entries)) l := length resetIdx := 0 for i := 0; i < len(dst.entries); i++ { @@ -222,9 +224,9 @@ func ShortCodeTable(dst *Set, length int) map[Digest]string { } type digestEntry struct { - alg Algorithm + alg digest.Algorithm val string - digest Digest + digest digest.Digest } type digestEntries []*digestEntry diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/errors.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/errors.go index c20f28113..2062a06fb 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/errors.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/errors.go @@ -5,7 +5,7 @@ import ( "fmt" "strings" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) // ErrAccessDenied is returned when an access to a requested resource is diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go index a2082ec02..7a8cabbdb 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/manifestlist/manifestlist.go @@ -6,8 +6,8 @@ import ( "fmt" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest" + "github.com/opencontainers/go-digest" ) // MediaTypeManifestList specifies the mediaType for manifest lists. diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/config_builder.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/config_builder.go index 7e30eedea..9d222566c 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/config_builder.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/config_builder.go @@ -9,10 +9,10 @@ import ( "github.com/docker/distribution" "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest" "github.com/docker/distribution/reference" "github.com/docker/libtrust" + "github.com/opencontainers/go-digest" ) type diffID digest.Digest diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/manifest.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/manifest.go index bff47bde0..65042a75f 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/manifest.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/manifest.go @@ -5,9 +5,9 @@ import ( "fmt" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest" "github.com/docker/libtrust" + "github.com/opencontainers/go-digest" ) const ( diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/reference_builder.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/reference_builder.go index fc1045f9e..ae4014781 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/reference_builder.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema1/reference_builder.go @@ -6,10 +6,10 @@ import ( "errors" "github.com/docker/distribution" "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest" "github.com/docker/distribution/reference" "github.com/docker/libtrust" + "github.com/opencontainers/go-digest" ) // referenceManifestBuilder is a type for constructing manifests from schema1 diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema2/builder.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema2/builder.go index 8fffc80d5..4b6ba5628 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema2/builder.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema2/builder.go @@ -3,7 +3,7 @@ package schema2 import ( "github.com/docker/distribution" "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) // builder is a type for constructing manifests. diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema2/manifest.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema2/manifest.go index 8bff24eb5..a2708c750 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema2/manifest.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifest/schema2/manifest.go @@ -6,8 +6,8 @@ import ( "fmt" "github.com/docker/distribution" - "github.com/docker/distribution/digest" "github.com/docker/distribution/manifest" + "github.com/opencontainers/go-digest" ) const ( diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifests.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifests.go index c4fb63450..d68e71db7 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifests.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/manifests.go @@ -5,7 +5,7 @@ import ( "mime" "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) // Manifest represents a registry object specifying a set of diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/reference/reference.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/reference/reference.go index 02786628e..52da52370 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/reference/reference.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/reference/reference.go @@ -27,7 +27,7 @@ import ( "path" "strings" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" ) const ( @@ -170,7 +170,7 @@ func Parse(s string) (Reference, error) { } if matches[3] != "" { var err error - ref.digest, err = digest.ParseDigest(matches[3]) + ref.digest, err = digest.Parse(matches[3]) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go index 9979abae6..a9616c58a 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/api/v2/descriptors.go @@ -4,9 +4,9 @@ import ( "net/http" "regexp" - "github.com/docker/distribution/digest" "github.com/docker/distribution/reference" "github.com/docker/distribution/registry/api/errcode" + "github.com/opencontainers/go-digest" ) var ( diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/client/repository.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/client/repository.go index 1ebd0b183..b82a968e2 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/client/repository.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/client/repository.go @@ -15,12 +15,12 @@ import ( "github.com/docker/distribution" "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" "github.com/docker/distribution/reference" "github.com/docker/distribution/registry/api/v2" "github.com/docker/distribution/registry/client/transport" "github.com/docker/distribution/registry/storage/cache" "github.com/docker/distribution/registry/storage/cache/memory" + "github.com/opencontainers/go-digest" ) // Registry provides an interface for calling Repositories, which returns a catalog of repositories. @@ -268,7 +268,7 @@ func descriptorFromResponse(response *http.Response) (distribution.Descriptor, e return desc, nil } - dgst, err := digest.ParseDigest(digestHeader) + dgst, err := digest.Parse(digestHeader) if err != nil { return distribution.Descriptor{}, err } @@ -475,7 +475,7 @@ func (ms *manifests) Get(ctx context.Context, dgst digest.Digest, options ...dis return nil, distribution.ErrManifestNotModified } else if SuccessStatus(resp.StatusCode) { if contentDgst != nil { - dgst, err := digest.ParseDigest(resp.Header.Get("Docker-Content-Digest")) + dgst, err := digest.Parse(resp.Header.Get("Docker-Content-Digest")) if err == nil { *contentDgst = dgst } @@ -553,7 +553,7 @@ func (ms *manifests) Put(ctx context.Context, m distribution.Manifest, options . if SuccessStatus(resp.StatusCode) { dgstHeader := resp.Header.Get("Docker-Content-Digest") - dgst, err := digest.ParseDigest(dgstHeader) + dgst, err := digest.Parse(dgstHeader) if err != nil { return "", err } @@ -661,7 +661,7 @@ func (bs *blobs) Put(ctx context.Context, mediaType string, p []byte) (distribut if err != nil { return distribution.Descriptor{}, err } - dgstr := digest.Canonical.New() + dgstr := digest.Canonical.Digester() n, err := io.Copy(writer, io.TeeReader(bytes.NewReader(p), dgstr.Hash())) if err != nil { return distribution.Descriptor{}, err diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/storage/cache/cachedblobdescriptorstore.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/storage/cache/cachedblobdescriptorstore.go index 94ca8a90c..f647616bc 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/storage/cache/cachedblobdescriptorstore.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/storage/cache/cachedblobdescriptorstore.go @@ -2,7 +2,7 @@ package cache import ( "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" + "github.com/opencontainers/go-digest" "github.com/docker/distribution" ) diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/storage/cache/memory/memory.go b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/storage/cache/memory/memory.go index cf125e187..a0be5ea02 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/storage/cache/memory/memory.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/registry/storage/cache/memory/memory.go @@ -5,9 +5,9 @@ import ( "github.com/docker/distribution" "github.com/docker/distribution/context" - "github.com/docker/distribution/digest" "github.com/docker/distribution/reference" "github.com/docker/distribution/registry/storage/cache" + "github.com/opencontainers/go-digest" ) type inMemoryBlobDescriptorCacheProvider struct { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/go-units/duration.go b/vendor/github.com/docker/docker/vendor/github.com/docker/go-units/duration.go index 544b5dd3e..ba02af26d 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/go-units/duration.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/go-units/duration.go @@ -18,9 +18,9 @@ func HumanDuration(d time.Duration) string { return fmt.Sprintf("%d seconds", seconds) } else if minutes := int(d.Minutes()); minutes == 1 { return "About a minute" - } else if minutes < 60 { + } else if minutes < 46 { return fmt.Sprintf("%d minutes", minutes) - } else if hours := int(d.Hours()); hours == 1 { + } else if hours := int(d.Hours() + 0.5); hours == 1 { return "About an hour" } else if hours < 48 { return fmt.Sprintf("%d hours", hours) diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/bitseq/sequence.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/bitseq/sequence.go index a67999313..86cf69b34 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/bitseq/sequence.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/bitseq/sequence.go @@ -6,6 +6,7 @@ package bitseq import ( "encoding/binary" "encoding/json" + "errors" "fmt" "sync" @@ -26,9 +27,9 @@ const ( var ( // ErrNoBitAvailable is returned when no more bits are available to set - ErrNoBitAvailable = fmt.Errorf("no bit available") + ErrNoBitAvailable = errors.New("no bit available") // ErrBitAllocated is returned when the specific bit requested is already set - ErrBitAllocated = fmt.Errorf("requested bit is already allocated") + ErrBitAllocated = errors.New("requested bit is already allocated") ) // Handle contains the sequece representing the bitmask and its identifier @@ -373,7 +374,7 @@ func (h *Handle) validateOrdinal(ordinal uint64) error { h.Lock() defer h.Unlock() if ordinal >= h.bits { - return fmt.Errorf("bit does not belong to the sequence") + return errors.New("bit does not belong to the sequence") } return nil } @@ -418,7 +419,7 @@ func (h *Handle) ToByteArray() ([]byte, error) { // FromByteArray reads his handle's data from a byte array func (h *Handle) FromByteArray(ba []byte) error { if ba == nil { - return fmt.Errorf("nil byte array") + return errors.New("nil byte array") } nh := &sequence{} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/controller.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/controller.go index b551230ba..24d71e432 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/controller.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/controller.go @@ -79,6 +79,9 @@ type NetworkController interface { // BuiltinDrivers returns list of builtin drivers BuiltinDrivers() []string + // BuiltinIPAMDrivers returns list of builtin ipam drivers + BuiltinIPAMDrivers() []string + // Config method returns the bootup configuration for the controller Config() config.Config @@ -270,7 +273,7 @@ func (c *controller) SetKeys(keys []*types.EncryptionKey) error { } for s, count := range subsysKeys { if count != keyringSize { - return fmt.Errorf("incorrect number of keys for susbsystem %v", s) + return fmt.Errorf("incorrect number of keys for subsystem %v", s) } } @@ -476,12 +479,23 @@ func (c *controller) ID() string { func (c *controller) BuiltinDrivers() []string { drivers := []string{} - for _, i := range getInitializers(c.cfg.Daemon.Experimental) { - if i.ntype == "remote" { - continue + c.drvRegistry.WalkDrivers(func(name string, driver driverapi.Driver, capability driverapi.Capability) bool { + if driver.IsBuiltIn() { + drivers = append(drivers, name) } - drivers = append(drivers, i.ntype) - } + return false + }) + return drivers +} + +func (c *controller) BuiltinIPAMDrivers() []string { + drivers := []string{} + c.drvRegistry.WalkIPAMs(func(name string, driver ipamapi.Ipam, cap *ipamapi.Capability) bool { + if driver.IsBuiltIn() { + drivers = append(drivers, name) + } + return false + }) return drivers } @@ -568,7 +582,7 @@ func (c *controller) pushNodeDiscovery(d driverapi.Driver, cap driverapi.Capabil err = d.DiscoverDelete(discoverapi.NodeDiscovery, nodeData) } if err != nil { - logrus.Debugf("discovery notification error : %v", err) + logrus.Debugf("discovery notification error: %v", err) } } } @@ -918,6 +932,7 @@ func (c *controller) NewSandbox(containerID string, options ...SandboxOption) (s populatedEndpoints: map[string]struct{}{}, config: containerConfig{}, controller: c, + extDNS: []extDNSEntry{}, } } sBox = sb @@ -983,7 +998,7 @@ func (c *controller) NewSandbox(containerID string, options ...SandboxOption) (s err = sb.storeUpdate() if err != nil { - return nil, fmt.Errorf("updating the store state of sandbox failed: %v", err) + return nil, fmt.Errorf("failed to update the store state of sandbox: %v", err) } return sb, nil @@ -1073,7 +1088,7 @@ func (c *controller) loadDriver(networkType string) error { var err error if pg := c.GetPluginGetter(); pg != nil { - _, err = pg.Get(networkType, driverapi.NetworkPluginEndpointType, plugingetter.LOOKUP) + _, err = pg.Get(networkType, driverapi.NetworkPluginEndpointType, plugingetter.Lookup) } else { _, err = plugins.Get(networkType, driverapi.NetworkPluginEndpointType) } @@ -1092,7 +1107,7 @@ func (c *controller) loadIPAMDriver(name string) error { var err error if pg := c.GetPluginGetter(); pg != nil { - _, err = pg.Get(name, ipamapi.PluginEndpointType, plugingetter.LOOKUP) + _, err = pg.Get(name, ipamapi.PluginEndpointType, plugingetter.Lookup) } else { _, err = plugins.Get(name, ipamapi.PluginEndpointType) } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/datastore/cache.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/datastore/cache.go index 97b600911..49839ae8f 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/datastore/cache.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/datastore/cache.go @@ -1,6 +1,7 @@ package datastore import ( + "errors" "fmt" "sync" @@ -36,7 +37,7 @@ func (c *cache) kmap(kvObject KVObject) (kvMap, error) { // Bail out right away if the kvObject does not implement KVConstructor ctor, ok := kvObject.(KVConstructor) if !ok { - return nil, fmt.Errorf("error while populating kmap, object does not implement KVConstructor interface") + return nil, errors.New("error while populating kmap, object does not implement KVConstructor interface") } kvList, err := c.ds.store.List(keyPrefix) @@ -153,7 +154,7 @@ func (c *cache) get(key string, kvObject KVObject) error { ctor, ok := o.(KVConstructor) if !ok { - return fmt.Errorf("kvobject does not implement KVConstructor interface. could not get object") + return errors.New("kvobject does not implement KVConstructor interface. could not get object") } return ctor.CopyTo(kvObject) diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/driverapi/driverapi.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/driverapi/driverapi.go index 98bc60ac9..7fe6f611a 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/driverapi/driverapi.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/driverapi/driverapi.go @@ -62,7 +62,7 @@ type Driver interface { // programming to allow the external connectivity dictated by the passed options ProgramExternalConnectivity(nid, eid string, options map[string]interface{}) error - // RevokeExternalConnectivity aks the driver to remove any external connectivity + // RevokeExternalConnectivity asks the driver to remove any external connectivity // programming that was done so far RevokeExternalConnectivity(nid, eid string) error @@ -72,8 +72,11 @@ type Driver interface { // only invoked for the global scope driver. EventNotify(event EventType, nid string, tableName string, key string, value []byte) - // Type returns the the type of this driver, the network type this driver manages + // Type returns the type of this driver, the network type this driver manages Type() string + + // IsBuiltIn returns true if it is a built-in driver + IsBuiltIn() bool } // NetworkInfo provides a go interface for drivers to provide network diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/bridge.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/bridge.go index f6cbe0778..fa051bde5 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/bridge.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/bridge.go @@ -186,24 +186,24 @@ func (c *networkConfiguration) Validate() error { // Conflicts check if two NetworkConfiguration objects overlap func (c *networkConfiguration) Conflicts(o *networkConfiguration) error { if o == nil { - return fmt.Errorf("same configuration") + return errors.New("same configuration") } // Also empty, because only one network with empty name is allowed if c.BridgeName == o.BridgeName { - return fmt.Errorf("networks have same bridge name") + return errors.New("networks have same bridge name") } // They must be in different subnets if (c.AddressIPv4 != nil && o.AddressIPv4 != nil) && (c.AddressIPv4.Contains(o.AddressIPv4.IP) || o.AddressIPv4.Contains(c.AddressIPv4.IP)) { - return fmt.Errorf("networks have overlapping IPv4") + return errors.New("networks have overlapping IPv4") } // They must be in different v6 subnets if (c.AddressIPv6 != nil && o.AddressIPv6 != nil) && (c.AddressIPv6.Contains(o.AddressIPv6.IP) || o.AddressIPv6.Contains(c.AddressIPv6.IP)) { - return fmt.Errorf("networks have overlapping IPv6") + return errors.New("networks have overlapping IPv6") } return nil @@ -1424,6 +1424,10 @@ func (d *driver) Type() string { return networkType } +func (d *driver) IsBuiltIn() bool { + return true +} + // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error { return nil diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_bridgenetfiltering.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_bridgenetfiltering.go index aa6c8eba4..884c7115e 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_bridgenetfiltering.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_bridgenetfiltering.go @@ -1,6 +1,7 @@ package bridge import ( + "errors" "fmt" "io/ioutil" "os" @@ -37,7 +38,7 @@ func setupBridgeNetFiltering(config *networkConfiguration, i *bridgeInterface) e logrus.Warnf("running inside docker container, ignoring missing kernel params: %v", err) err = nil } else { - err = fmt.Errorf("please ensure that br_netfilter kernel module is loaded") + err = errors.New("please ensure that br_netfilter kernel module is loaded") } } } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_ip_tables.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_ip_tables.go index 9df4cdc6c..0d4d54900 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_ip_tables.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_ip_tables.go @@ -1,6 +1,7 @@ package bridge import ( + "errors" "fmt" "net" @@ -17,7 +18,7 @@ const ( func setupIPChains(config *configuration) (*iptables.ChainInfo, *iptables.ChainInfo, *iptables.ChainInfo, error) { // Sanity check. if config.EnableIPTables == false { - return nil, nil, nil, fmt.Errorf("cannot create new chains, EnableIPTable is disabled") + return nil, nil, nil, errors.New("cannot create new chains, EnableIPTable is disabled") } hairpinMode := !config.EnableUserlandProxy @@ -68,7 +69,7 @@ func (n *bridgeNetwork) setupIPTables(config *networkConfiguration, i *bridgeInt // Sanity check. if driverConfig.EnableIPTables == false { - return fmt.Errorf("Cannot program chains, EnableIPTable is disabled") + return errors.New("Cannot program chains, EnableIPTable is disabled") } // Pickup this configuration option from driver diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_ipv4.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_ipv4.go index 772b40eed..7f8707266 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_ipv4.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/bridge/setup_ipv4.go @@ -1,6 +1,7 @@ package bridge import ( + "errors" "fmt" "io/ioutil" "net" @@ -13,7 +14,7 @@ import ( func selectIPv4Address(addresses []netlink.Addr, selector *net.IPNet) (netlink.Addr, error) { if len(addresses) == 0 { - return netlink.Addr{}, fmt.Errorf("unable to select an address as the address pool is empty") + return netlink.Addr{}, errors.New("unable to select an address as the address pool is empty") } if selector != nil { for _, addr := range addresses { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/host/host.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/host/host.go index bec64465a..3bc909976 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/host/host.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/host/host.go @@ -86,6 +86,10 @@ func (d *driver) Type() string { return networkType } +func (d *driver) IsBuiltIn() bool { + return true +} + // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error { return nil diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/ipvlan/ipvlan.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/ipvlan/ipvlan.go index aacea3df8..cd0c830f7 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/ipvlan/ipvlan.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/ipvlan/ipvlan.go @@ -84,6 +84,10 @@ func (d *driver) Type() string { return ipvlanType } +func (d *driver) IsBuiltIn() bool { + return true +} + func (d *driver) ProgramExternalConnectivity(nid, eid string, options map[string]interface{}) error { return nil } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/macvlan/macvlan.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/macvlan/macvlan.go index b89b4b784..23fa850ed 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/macvlan/macvlan.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/macvlan/macvlan.go @@ -86,6 +86,10 @@ func (d *driver) Type() string { return macvlanType } +func (d *driver) IsBuiltIn() bool { + return true +} + func (d *driver) ProgramExternalConnectivity(nid, eid string, options map[string]interface{}) error { return nil } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/null/null.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/null/null.go index a137b000f..03f977704 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/null/null.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/null/null.go @@ -86,6 +86,10 @@ func (d *driver) Type() string { return networkType } +func (d *driver) IsBuiltIn() bool { + return true +} + // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error { return nil diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/ov_network.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/ov_network.go index 703d13f9a..122c3f6b1 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/ov_network.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/ov_network.go @@ -402,7 +402,7 @@ func (n *network) getBridgeNamePrefix(s *subnet) string { return "ov-" + fmt.Sprintf("%06x", n.vxlanID(s)) } -func isOverlap(nw *net.IPNet) bool { +func checkOverlap(nw *net.IPNet) error { var nameservers []string if rc, err := resolvconf.Get(); err == nil { @@ -410,14 +410,14 @@ func isOverlap(nw *net.IPNet) bool { } if err := netutils.CheckNameserverOverlaps(nameservers, nw); err != nil { - return true + return fmt.Errorf("overlay subnet %s failed check with nameserver: %v: %v", nw.String(), nameservers, err) } if err := netutils.CheckRouteOverlaps(nw); err != nil { - return true + return fmt.Errorf("overlay subnet %s failed check with host route table: %v", nw.String(), err) } - return false + return nil } func (n *network) restoreSubnetSandbox(s *subnet, brName, vxlanName string) error { @@ -456,8 +456,8 @@ func (n *network) setupSubnetSandbox(s *subnet, brName, vxlanName string) error // Try to delete the vxlan interface by vni if already present deleteVxlanByVNI("", n.vxlanID(s)) - if isOverlap(s.subnetIP) { - return fmt.Errorf("overlay subnet %s has conflicts in the host while running in host mode", s.subnetIP.String()) + if err := checkOverlap(s.subnetIP); err != nil { + return err } } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/overlay.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/overlay.go index e3c1f7b89..7f20840db 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/overlay.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/overlay.go @@ -211,6 +211,10 @@ func (d *driver) Type() string { return networkType } +func (d *driver) IsBuiltIn() bool { + return true +} + func validateSelf(node string) error { advIP := net.ParseIP(node) if advIP == nil { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/ovmanager/ovmanager.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/ovmanager/ovmanager.go index aaf94e586..2c4c771e5 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/ovmanager/ovmanager.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/overlay/ovmanager/ovmanager.go @@ -229,6 +229,10 @@ func (d *driver) Type() string { return networkType } +func (d *driver) IsBuiltIn() bool { + return true +} + // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error { return types.NotImplementedErrorf("not implemented") diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/remote/driver.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/remote/driver.go index 04be60124..12dbc121c 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/remote/driver.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/remote/driver.go @@ -1,6 +1,7 @@ package remote import ( + "errors" "fmt" "net" @@ -29,12 +30,7 @@ func newDriver(name string, client *plugins.Client) driverapi.Driver { // Init makes sure a remote driver is registered when a network driver // plugin is activated. func Init(dc driverapi.DriverCallback, config map[string]interface{}) error { - // Unit test code is unaware of a true PluginStore. So we fall back to v1 plugins. - handleFunc := plugins.Handle - if pg := dc.GetPluginGetter(); pg != nil { - handleFunc = pg.Handle - } - handleFunc(driverapi.NetworkPluginEndpointType, func(name string, client *plugins.Client) { + newPluginHandler := func(name string, client *plugins.Client) { // negotiate driver capability with client d := newDriver(name, client) c, err := d.(*driver).getCapabilities() @@ -45,7 +41,19 @@ func Init(dc driverapi.DriverCallback, config map[string]interface{}) error { if err = dc.RegisterDriver(name, d, *c); err != nil { logrus.Errorf("error registering driver for %s due to %v", name, err) } - }) + } + + // Unit test code is unaware of a true PluginStore. So we fall back to v1 plugins. + handleFunc := plugins.Handle + if pg := dc.GetPluginGetter(); pg != nil { + handleFunc = pg.Handle + activePlugins := pg.GetAllManagedPluginsByCap(driverapi.NetworkPluginEndpointType) + for _, ap := range activePlugins { + newPluginHandler(ap.Name(), ap.Client()) + } + } + handleFunc(driverapi.NetworkPluginEndpointType, newPluginHandler) + return nil } @@ -125,7 +133,7 @@ func (d *driver) DeleteNetwork(nid string) error { func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]interface{}) error { if ifInfo == nil { - return fmt.Errorf("must not be called with nil InterfaceInfo") + return errors.New("must not be called with nil InterfaceInfo") } reqIface := &api.EndpointInterface{} @@ -305,6 +313,10 @@ func (d *driver) Type() string { return d.networkType } +func (d *driver) IsBuiltIn() bool { + return false +} + // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error { if dType != discoverapi.NodeDiscovery { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/solaris/bridge/bridge.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/solaris/bridge/bridge.go index 97180fbbd..53092efee 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/solaris/bridge/bridge.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/solaris/bridge/bridge.go @@ -916,6 +916,10 @@ func (d *driver) Type() string { return networkType } +func (d *driver) IsBuiltIn() bool { + return true +} + // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error { return nil diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/solaris/overlay/overlay.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/solaris/overlay/overlay.go index b48cfe7e7..b001f58af 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/solaris/overlay/overlay.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/solaris/overlay/overlay.go @@ -200,6 +200,10 @@ func (d *driver) Type() string { return networkType } +func (d *driver) IsBuiltIn() bool { + return true +} + func validateSelf(node string) error { advIP := net.ParseIP(node) if advIP == nil { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/overlay/overlay_windows.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/overlay/overlay_windows.go index 7ebc16eeb..c3028d763 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/overlay/overlay_windows.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/overlay/overlay_windows.go @@ -176,6 +176,10 @@ func (d *driver) Type() string { return networkType } +func (d *driver) IsBuiltIn() bool { + return true +} + func validateSelf(node string) error { advIP := net.ParseIP(node) if advIP == nil { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/overlay/peerdb_windows.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/overlay/peerdb_windows.go index 47f4bfbcc..20f190f86 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/overlay/peerdb_windows.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/overlay/peerdb_windows.go @@ -81,7 +81,7 @@ func (d *driver) peerAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask, return err } - // Temp: We have to create a endpoint object to keep track of the HNS ID for + // Temp: We have to create an endpoint object to keep track of the HNS ID for // this endpoint so that we can retrieve it later when the endpoint is deleted. // This seems unnecessary when we already have dockers EID. See if we can pass // the global EID to HNS to use as it's ID, rather than having each HNS assign diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/windows.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/windows.go index 7ce7fa8f8..b054898af 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/windows.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drivers/windows/windows.go @@ -698,6 +698,10 @@ func (d *driver) Type() string { return d.name } +func (d *driver) IsBuiltIn() bool { + return true +} + // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error { return nil diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drvregistry/drvregistry.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drvregistry/drvregistry.go index a9a736802..b3fe9bafc 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drvregistry/drvregistry.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/drvregistry/drvregistry.go @@ -1,6 +1,7 @@ package drvregistry import ( + "errors" "fmt" "strings" "sync" @@ -160,14 +161,14 @@ func (r *DrvRegistry) GetPluginGetter() plugingetter.PluginGetter { // RegisterDriver registers the network driver when it gets discovered. func (r *DrvRegistry) RegisterDriver(ntype string, driver driverapi.Driver, capability driverapi.Capability) error { if strings.TrimSpace(ntype) == "" { - return fmt.Errorf("network type string cannot be empty") + return errors.New("network type string cannot be empty") } r.Lock() - _, ok := r.drivers[ntype] + dd, ok := r.drivers[ntype] r.Unlock() - if ok { + if ok && dd.driver.IsBuiltIn() { return driverapi.ErrActiveRegistration(ntype) } @@ -188,13 +189,13 @@ func (r *DrvRegistry) RegisterDriver(ntype string, driver driverapi.Driver, capa func (r *DrvRegistry) registerIpamDriver(name string, driver ipamapi.Ipam, caps *ipamapi.Capability) error { if strings.TrimSpace(name) == "" { - return fmt.Errorf("ipam driver name string cannot be empty") + return errors.New("ipam driver name string cannot be empty") } r.Lock() - _, ok := r.ipamDrivers[name] + dd, ok := r.ipamDrivers[name] r.Unlock() - if ok { + if ok && dd.driver.IsBuiltIn() { return types.ForbiddenErrorf("ipam driver %q already registered", name) } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/idm/idm.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/idm/idm.go index 20be113c8..7e449a0dc 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/idm/idm.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/idm/idm.go @@ -2,6 +2,7 @@ package idm import ( + "errors" "fmt" "github.com/docker/libnetwork/bitseq" @@ -18,7 +19,7 @@ type Idm struct { // New returns an instance of id manager for a [start,end] set of numerical ids func New(ds datastore.DataStore, id string, start, end uint64) (*Idm, error) { if id == "" { - return nil, fmt.Errorf("Invalid id") + return nil, errors.New("Invalid id") } if end <= start { return nil, fmt.Errorf("Invalid set range: [%d, %d]", start, end) @@ -35,7 +36,7 @@ func New(ds datastore.DataStore, id string, start, end uint64) (*Idm, error) { // GetID returns the first available id in the set func (i *Idm) GetID() (uint64, error) { if i.handle == nil { - return 0, fmt.Errorf("ID set is not initialized") + return 0, errors.New("ID set is not initialized") } ordinal, err := i.handle.SetAny() return i.start + ordinal, err @@ -44,11 +45,11 @@ func (i *Idm) GetID() (uint64, error) { // GetSpecificID tries to reserve the specified id func (i *Idm) GetSpecificID(id uint64) error { if i.handle == nil { - return fmt.Errorf("ID set is not initialized") + return errors.New("ID set is not initialized") } if id < i.start || id > i.end { - return fmt.Errorf("Requested id does not belong to the set") + return errors.New("Requested id does not belong to the set") } return i.handle.Set(id - i.start) @@ -57,11 +58,11 @@ func (i *Idm) GetSpecificID(id uint64) error { // GetIDInRange returns the first available id in the set within a [start,end] range func (i *Idm) GetIDInRange(start, end uint64) (uint64, error) { if i.handle == nil { - return 0, fmt.Errorf("ID set is not initialized") + return 0, errors.New("ID set is not initialized") } if start < i.start || end > i.end { - return 0, fmt.Errorf("Requested range does not belong to the set") + return 0, errors.New("Requested range does not belong to the set") } ordinal, err := i.handle.SetAnyInRange(start-i.start, end-i.start) diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipam/allocator.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipam/allocator.go index bd00a1470..4243d57a7 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipam/allocator.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipam/allocator.go @@ -594,3 +594,8 @@ func (a *Allocator) DumpDatabase() string { return s } + +// IsBuiltIn returns true for builtin drivers +func (a *Allocator) IsBuiltIn() bool { + return true +} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipamapi/contract.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipamapi/contract.go index 090205e11..7f967863d 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipamapi/contract.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipamapi/contract.go @@ -80,6 +80,9 @@ type Ipam interface { RequestAddress(string, net.IP, map[string]string) (*net.IPNet, map[string]string, error) // Release the address from the specified pool ID ReleaseAddress(string, net.IP) error + + //IsBuiltIn returns true if it is a built-in driver. + IsBuiltIn() bool } // Capability represents the requirements and capabilities of the IPAM driver diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go index 5baf51553..321448a34 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_unix.go @@ -3,7 +3,7 @@ package builtin import ( - "fmt" + "errors" "github.com/docker/libnetwork/datastore" "github.com/docker/libnetwork/ipam" @@ -20,13 +20,13 @@ func Init(ic ipamapi.Callback, l, g interface{}) error { if l != nil { if localDs, ok = l.(datastore.DataStore); !ok { - return fmt.Errorf("incorrect local datastore passed to built-in ipam init") + return errors.New("incorrect local datastore passed to built-in ipam init") } } if g != nil { if globalDs, ok = g.(datastore.DataStore); !ok { - return fmt.Errorf("incorrect global datastore passed to built-in ipam init") + return errors.New("incorrect global datastore passed to built-in ipam init") } } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_windows.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_windows.go index 155c04687..7805e6a1d 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_windows.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/builtin/builtin_windows.go @@ -3,7 +3,7 @@ package builtin import ( - "fmt" + "errors" "github.com/docker/libnetwork/datastore" "github.com/docker/libnetwork/ipam" @@ -22,13 +22,13 @@ func InitDockerDefault(ic ipamapi.Callback, l, g interface{}) error { if l != nil { if localDs, ok = l.(datastore.DataStore); !ok { - return fmt.Errorf("incorrect local datastore passed to built-in ipam init") + return errors.New("incorrect local datastore passed to built-in ipam init") } } if g != nil { if globalDs, ok = g.(datastore.DataStore); !ok { - return fmt.Errorf("incorrect global datastore passed to built-in ipam init") + return errors.New("incorrect global datastore passed to built-in ipam init") } } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/null/null.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/null/null.go index 60119a36a..339b5308d 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/null/null.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/null/null.go @@ -65,6 +65,10 @@ func (a *allocator) DiscoverDelete(dType discoverapi.DiscoveryType, data interfa return nil } +func (a *allocator) IsBuiltIn() bool { + return true +} + // Init registers a remote ipam when its plugin is activated func Init(ic ipamapi.Callback, l, g interface{}) error { return ic.RegisterIpamDriver(ipamapi.NullIPAM, &allocator{}) diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/remote/remote.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/remote/remote.go index b23c52a6d..d2e2b4f3c 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/remote/remote.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/remote/remote.go @@ -31,12 +31,7 @@ func newAllocator(name string, client *plugins.Client) ipamapi.Ipam { // Init registers a remote ipam when its plugin is activated func Init(cb ipamapi.Callback, l, g interface{}) error { - // Unit test code is unaware of a true PluginStore. So we fall back to v1 plugins. - handleFunc := plugins.Handle - if pg := cb.GetPluginGetter(); pg != nil { - handleFunc = pg.Handle - } - handleFunc(ipamapi.PluginEndpointType, func(name string, client *plugins.Client) { + newPluginHandler := func(name string, client *plugins.Client) { a := newAllocator(name, client) if cps, err := a.(*allocator).getCapabilities(); err == nil { if err := cb.RegisterIpamDriverWithCapabilities(name, a, cps); err != nil { @@ -49,7 +44,18 @@ func Init(cb ipamapi.Callback, l, g interface{}) error { logrus.Errorf("error registering remote ipam driver %s due to %v", name, err) } } - }) + } + + // Unit test code is unaware of a true PluginStore. So we fall back to v1 plugins. + handleFunc := plugins.Handle + if pg := cb.GetPluginGetter(); pg != nil { + handleFunc = pg.Handle + activePlugins := pg.GetAllManagedPluginsByCap(ipamapi.PluginEndpointType) + for _, ap := range activePlugins { + newPluginHandler(ap.Name(), ap.Client()) + } + } + handleFunc(ipamapi.PluginEndpointType, newPluginHandler) return nil } @@ -143,3 +149,7 @@ func (a *allocator) DiscoverNew(dType discoverapi.DiscoveryType, data interface{ func (a *allocator) DiscoverDelete(dType discoverapi.DiscoveryType, data interface{}) error { return nil } + +func (a *allocator) IsBuiltIn() bool { + return false +} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/windowsipam/windowsipam.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/windowsipam/windowsipam.go index 1b9cd5a98..6b124d40d 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/windowsipam/windowsipam.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/ipams/windowsipam/windowsipam.go @@ -101,3 +101,7 @@ func (a *allocator) DiscoverNew(dType discoverapi.DiscoveryType, data interface{ func (a *allocator) DiscoverDelete(dType discoverapi.DiscoveryType, data interface{}) error { return nil } + +func (a *allocator) IsBuiltIn() bool { + return true +} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/iptables/iptables.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/iptables/iptables.go index e3a41b556..d4f4aa23d 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/iptables/iptables.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/iptables/iptables.go @@ -131,7 +131,7 @@ func NewChain(name string, table Table, hairpinMode bool) (*ChainInfo, error) { // ProgramChain is used to add rules to a chain func ProgramChain(c *ChainInfo, bridgeName string, hairpinMode, enable bool) error { if c.Name == "" { - return fmt.Errorf("Could not program chain, missing chain name") + return errors.New("Could not program chain, missing chain name") } switch c.Table { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/netutils/utils.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/netutils/utils.go index 65449d3de..7de98f6b0 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/netutils/utils.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/netutils/utils.go @@ -173,7 +173,7 @@ func ReverseIP(IP string) string { // ParseAlias parses and validates the specified string as an alias format (name:alias) func ParseAlias(val string) (string, string, error) { if val == "" { - return "", "", fmt.Errorf("empty string specified for alias") + return "", "", errors.New("empty string specified for alias") } arr := strings.Split(val, ":") if len(arr) > 2 { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/network.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/network.go index 79e7e49a9..1b387fca5 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/network.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/network.go @@ -80,10 +80,18 @@ type NetworkInfo interface { // When the function returns true, the walk will stop. type EndpointWalker func(ep Endpoint) bool +// ipInfo is the reverse mapping from IP to service name to serve the PTR query. +// extResolver is set if an externl server resolves a service name to this IP. +// Its an indication to defer PTR queries also to that external server. +type ipInfo struct { + name string + extResolver bool +} + type svcInfo struct { svcMap map[string][]net.IP svcIPv6Map map[string][]net.IP - ipMap map[string]string + ipMap map[string]*ipInfo service map[string][]servicePorts } @@ -877,7 +885,7 @@ func (n *network) CreateEndpoint(name string, options ...EndpointOption) (Endpoi } if _, err = n.EndpointByName(name); err == nil { - return nil, types.ForbiddenErrorf("service endpoint with name %s already exists", name) + return nil, types.ForbiddenErrorf("endpoint with name %s already exists in network %s", name, n.Name()) } ep := &endpoint{name: name, generic: make(map[string]interface{}), iface: &endpointInterface{}} @@ -1070,10 +1078,12 @@ func (n *network) updateSvcRecord(ep *endpoint, localEps []*endpoint, isAdd bool } } -func addIPToName(ipMap map[string]string, name string, ip net.IP) { +func addIPToName(ipMap map[string]*ipInfo, name string, ip net.IP) { reverseIP := netutils.ReverseIP(ip.String()) if _, ok := ipMap[reverseIP]; !ok { - ipMap[reverseIP] = name + ipMap[reverseIP] = &ipInfo{ + name: name, + } } } @@ -1117,7 +1127,7 @@ func (n *network) addSvcRecords(name string, epIP net.IP, epIPv6 net.IP, ipMapUp sr = svcInfo{ svcMap: make(map[string][]net.IP), svcIPv6Map: make(map[string][]net.IP), - ipMap: make(map[string]string), + ipMap: make(map[string]*ipInfo), } c.svcRecords[n.ID()] = sr } @@ -1612,8 +1622,8 @@ func (n *network) ResolveName(req string, ipType int) ([]net.IP, bool) { c := n.getController() c.Lock() + defer c.Unlock() sr, ok := c.svcRecords[n.ID()] - c.Unlock() if !ok { return nil, false @@ -1621,7 +1631,6 @@ func (n *network) ResolveName(req string, ipType int) ([]net.IP, bool) { req = strings.TrimSuffix(req, ".") var ip []net.IP - n.Lock() ip, ok = sr.svcMap[req] if ipType == types.IPv6 { @@ -1634,22 +1643,38 @@ func (n *network) ResolveName(req string, ipType int) ([]net.IP, bool) { } ip = sr.svcIPv6Map[req] } - n.Unlock() if ip != nil { - return ip, false + ipLocal := make([]net.IP, len(ip)) + copy(ipLocal, ip) + return ipLocal, false } return nil, ipv6Miss } -func (n *network) ResolveIP(ip string) string { - var svc string +func (n *network) HandleQueryResp(name string, ip net.IP) { + c := n.getController() + c.Lock() + defer c.Unlock() + sr, ok := c.svcRecords[n.ID()] + if !ok { + return + } + + ipStr := netutils.ReverseIP(ip.String()) + + if ipInfo, ok := sr.ipMap[ipStr]; ok { + ipInfo.extResolver = true + } +} + +func (n *network) ResolveIP(ip string) string { c := n.getController() c.Lock() + defer c.Unlock() sr, ok := c.svcRecords[n.ID()] - c.Unlock() if !ok { return "" @@ -1657,15 +1682,13 @@ func (n *network) ResolveIP(ip string) string { nwName := n.Name() - n.Lock() - defer n.Unlock() - svc, ok = sr.ipMap[ip] + ipInfo, ok := sr.ipMap[ip] - if ok { - return svc + "." + nwName + if !ok || ipInfo.extResolver { + return "" } - return svc + return ipInfo.name + "." + nwName } func (n *network) ResolveService(name string) ([]*net.SRV, []net.IP) { @@ -1689,8 +1712,8 @@ func (n *network) ResolveService(name string) ([]*net.SRV, []net.IP) { svcName := strings.Join(parts[2:], ".") c.Lock() + defer c.Unlock() sr, ok := c.svcRecords[n.ID()] - c.Unlock() if !ok { return nil, nil diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/networkdb/broadcast.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/networkdb/broadcast.go index faaf64294..a9330cb3a 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/networkdb/broadcast.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/networkdb/broadcast.go @@ -1,7 +1,7 @@ package networkdb import ( - "fmt" + "errors" "time" "github.com/hashicorp/memberlist" @@ -90,7 +90,7 @@ func (nDB *NetworkDB) sendNodeEvent(event NodeEvent_Type) error { select { case <-notifyCh: case <-time.After(broadcastTimeout): - return fmt.Errorf("timed out broadcasting node event") + return errors.New("timed out broadcasting node event") } return nil diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/osl/interface_linux.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/osl/interface_linux.go index 2be99d72e..d76966200 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/osl/interface_linux.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/osl/interface_linux.go @@ -179,6 +179,8 @@ func (i *nwIface) Remove() error { } n.Unlock() + n.checkLoV6() + return nil } @@ -318,6 +320,8 @@ func (n *networkNamespace) AddInterface(srcName, dstPrefix string, options ...If n.iFaces = append(n.iFaces, i) n.Unlock() + n.checkLoV6() + return nil } @@ -378,6 +382,9 @@ func setInterfaceIPv6(nlh *netlink.Handle, iface netlink.Link, i *nwIface) error if err := checkRouteConflict(nlh, i.AddressIPv6(), netlink.FAMILY_V6); err != nil { return err } + if err := setIPv6(i.ns.path, i.DstName(), true); err != nil { + return fmt.Errorf("failed to enable ipv6: %v", err) + } ipAddr := &netlink.Addr{IPNet: i.AddressIPv6(), Label: "", Flags: syscall.IFA_F_NODAD} return nlh.AddrAdd(iface, ipAddr) } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/osl/namespace_linux.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/osl/namespace_linux.go index fe8065a31..b714ccf9f 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/osl/namespace_linux.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/osl/namespace_linux.go @@ -24,6 +24,10 @@ import ( const defaultPrefix = "/var/run/docker" +func init() { + reexec.Register("set-ipv6", reexecSetIPv6) +} + var ( once sync.Once garbagePathMap = make(map[string]bool) @@ -47,6 +51,7 @@ type networkNamespace struct { nextIfIndex int isDefault bool nlHandle *netlink.Handle + loV6Enabled bool sync.Mutex } @@ -216,6 +221,12 @@ func NewSandbox(key string, osCreate, isRestore bool) (Sandbox, error) { logrus.Warnf("Failed to set the timeout on the sandbox netlink handle sockets: %v", err) } + // As starting point, disable IPv6 on all interfaces + err = setIPv6(n.path, "all", false) + if err != nil { + logrus.Warnf("Failed to disable IPv6 on all interfaces on network namespace %q: %v", n.path, err) + } + if err = n.loopbackUp(); err != nil { n.nlHandle.Delete() return nil, err @@ -263,6 +274,12 @@ func GetSandboxForExternalKey(basePath string, key string) (Sandbox, error) { logrus.Warnf("Failed to set the timeout on the sandbox netlink handle sockets: %v", err) } + // As starting point, disable IPv6 on all interfaces + err = setIPv6(n.path, "all", false) + if err != nil { + logrus.Warnf("Failed to disable IPv6 on all interfaces on network namespace %q: %v", n.path, err) + } + if err = n.loopbackUp(); err != nil { n.nlHandle.Delete() return nil, err @@ -508,3 +525,84 @@ func (n *networkNamespace) Restore(ifsopt map[string][]IfaceOption, routes []*ty return nil } + +// Checks whether IPv6 needs to be enabled/disabled on the loopback interface +func (n *networkNamespace) checkLoV6() { + var ( + enable = false + action = "disable" + ) + + n.Lock() + for _, iface := range n.iFaces { + if iface.AddressIPv6() != nil { + enable = true + action = "enable" + break + } + } + n.Unlock() + + if n.loV6Enabled == enable { + return + } + + if err := setIPv6(n.path, "lo", enable); err != nil { + logrus.Warnf("Failed to %s IPv6 on loopback interface on network namespace %q: %v", action, n.path, err) + } + + n.loV6Enabled = enable +} + +func reexecSetIPv6() { + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + if len(os.Args) < 3 { + logrus.Errorf("invalid number of arguments for %s", os.Args[0]) + os.Exit(1) + } + + ns, err := netns.GetFromPath(os.Args[1]) + if err != nil { + logrus.Errorf("failed get network namespace %q: %v", os.Args[1], err) + os.Exit(2) + } + defer ns.Close() + + if err = netns.Set(ns); err != nil { + logrus.Errorf("setting into container netns %q failed: %v", os.Args[1], err) + os.Exit(3) + } + + var ( + action = "disable" + value = byte('1') + path = fmt.Sprintf("/proc/sys/net/ipv6/conf/%s/disable_ipv6", os.Args[2]) + ) + + if os.Args[3] == "true" { + action = "enable" + value = byte('0') + } + + if err = ioutil.WriteFile(path, []byte{value, '\n'}, 0644); err != nil { + logrus.Errorf("failed to %s IPv6 forwarding for container's interface %s: %v", action, os.Args[2], err) + os.Exit(4) + } + + os.Exit(0) +} + +func setIPv6(path, iface string, enable bool) error { + cmd := &exec.Cmd{ + Path: reexec.Self(), + Args: append([]string{"set-ipv6"}, path, iface, strconv.FormatBool(enable)), + Stdout: os.Stdout, + Stderr: os.Stderr, + } + if err := cmd.Run(); err != nil { + return fmt.Errorf("reexec to set IPv6 failed: %v", err) + } + return nil +} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/resolvconf/dns/resolvconf.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/resolvconf/dns/resolvconf.go index 6c6dac589..e348bc57f 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/resolvconf/dns/resolvconf.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/resolvconf/dns/resolvconf.go @@ -4,10 +4,14 @@ import ( "regexp" ) -// IPLocalhost is a regex patter for localhost IP address range. +// IPLocalhost is a regex pattern for IPv4 or IPv6 loopback range. const IPLocalhost = `((127\.([0-9]{1,3}\.){2}[0-9]{1,3})|(::1)$)` +// IPv4Localhost is a regex pattern for IPv4 localhost address range. +const IPv4Localhost = `(127\.([0-9]{1,3}\.){2}[0-9]{1,3})` + var localhostIPRegexp = regexp.MustCompile(IPLocalhost) +var localhostIPv4Regexp = regexp.MustCompile(IPv4Localhost) // IsLocalhost returns true if ip matches the localhost IP regular expression. // Used for determining if nameserver settings are being passed which are @@ -15,3 +19,8 @@ var localhostIPRegexp = regexp.MustCompile(IPLocalhost) func IsLocalhost(ip string) bool { return localhostIPRegexp.MatchString(ip) } + +// IsIPv4Localhost returns true if ip matches the IPv4 localhost regular expression. +func IsIPv4Localhost(ip string) bool { + return localhostIPv4Regexp.MatchString(ip) +} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/resolver.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/resolver.go index ca3850c58..c11aa58ed 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/resolver.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/resolver.go @@ -29,7 +29,7 @@ type Resolver interface { NameServer() string // SetExtServers configures the external nameservers the resolver // should use to forward queries - SetExtServers([]string) + SetExtServers([]extDNSEntry) // ResolverOptions returns resolv.conf options that should be set ResolverOptions() []string } @@ -54,6 +54,9 @@ type DNSBackend interface { ExecFunc(f func()) error //NdotsSet queries the backends ndots dns option settings NdotsSet() bool + // HandleQueryResp passes the name & IP from a response to the backend. backend + // can use it to maintain any required state about the resolution + HandleQueryResp(name string, ip net.IP) } const ( @@ -69,7 +72,8 @@ const ( ) type extDNSEntry struct { - ipStr string + ipStr string + hostLoopback bool } // resolver implements the Resolver interface @@ -182,13 +186,13 @@ func (r *resolver) Stop() { r.queryLock = sync.Mutex{} } -func (r *resolver) SetExtServers(dns []string) { - l := len(dns) +func (r *resolver) SetExtServers(extDNS []extDNSEntry) { + l := len(extDNS) if l > maxExtDNS { l = maxExtDNS } for i := 0; i < l; i++ { - r.extDNSList[i].ipStr = dns[i] + r.extDNSList[i] = extDNS[i] } } @@ -417,10 +421,14 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) { extConn, err = net.DialTimeout(proto, addr, extIOTimeout) } - execErr := r.backend.ExecFunc(extConnect) - if execErr != nil { - logrus.Warn(execErr) - continue + if extDNS.hostLoopback { + extConnect() + } else { + execErr := r.backend.ExecFunc(extConnect) + if execErr != nil { + logrus.Warn(execErr) + continue + } } if err != nil { logrus.Warnf("Connect failed: %s", err) @@ -462,9 +470,20 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) { logrus.Debugf("Read from DNS server failed, %s", err) continue } - r.forwardQueryEnd() - + if resp != nil { + for _, rr := range resp.Answer { + h := rr.Header() + switch h.Rrtype { + case dns.TypeA: + ip := rr.(*dns.A).A + r.backend.HandleQueryResp(h.Name, ip) + case dns.TypeAAAA: + ip := rr.(*dns.AAAA).AAAA + r.backend.HandleQueryResp(h.Name, ip) + } + } + } resp.Compress = true break } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox.go index 1fd585cd2..a2811af62 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox.go @@ -45,7 +45,7 @@ type Sandbox interface { // EnableService makes a managed container's service available by adding the // endpoint to the service load balancer and service discovery EnableService() error - // DisableService removes a managed contianer's endpoints from the load balancer + // DisableService removes a managed container's endpoints from the load balancer // and service discovery DisableService() error } @@ -69,7 +69,7 @@ type sandbox struct { id string containerID string config containerConfig - extDNS []string + extDNS []extDNSEntry osSbox osl.Sandbox controller *controller resolver Resolver @@ -411,6 +411,13 @@ func (sb *sandbox) updateGateway(ep *endpoint) error { return nil } +func (sb *sandbox) HandleQueryResp(name string, ip net.IP) { + for _, ep := range sb.getConnectedEndpoints() { + n := ep.getNetwork() + n.HandleQueryResp(name, ip) + } +} + func (sb *sandbox) ResolveIP(ip string) string { var svc string logrus.Debugf("IP To resolve %v", ip) @@ -1167,6 +1174,17 @@ func (eh epHeap) Less(i, j int) bool { return true } + if epi.joinInfo != nil && epj.joinInfo != nil { + if (epi.joinInfo.gw != nil && epi.joinInfo.gw6 != nil) && + (epj.joinInfo.gw == nil || epj.joinInfo.gw6 == nil) { + return true + } + if (epj.joinInfo.gw != nil && epj.joinInfo.gw6 != nil) && + (epi.joinInfo.gw == nil || epi.joinInfo.gw6 == nil) { + return false + } + } + if ci != nil { cip, ok = ci.epPriority[eh[i].ID()] if !ok { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox_dns_unix.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox_dns_unix.go index f4d1fad60..464793d71 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox_dns_unix.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox_dns_unix.go @@ -14,6 +14,7 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/libnetwork/etchosts" "github.com/docker/libnetwork/resolvconf" + "github.com/docker/libnetwork/resolvconf/dns" "github.com/docker/libnetwork/types" ) @@ -100,8 +101,6 @@ func (sb *sandbox) buildHostsFile() error { } func (sb *sandbox) updateHostsFile(ifaceIP string) error { - var mhost string - if ifaceIP == "" { return nil } @@ -110,11 +109,17 @@ func (sb *sandbox) updateHostsFile(ifaceIP string) error { return nil } + // User might have provided a FQDN in hostname or split it across hostname + // and domainname. We want the FQDN and the bare hostname. + fqdn := sb.config.hostName + mhost := sb.config.hostName if sb.config.domainName != "" { - mhost = fmt.Sprintf("%s.%s %s", sb.config.hostName, sb.config.domainName, - sb.config.hostName) - } else { - mhost = sb.config.hostName + fqdn = fmt.Sprintf("%s.%s", fqdn, sb.config.domainName) + } + + parts := strings.SplitN(fqdn, ".", 2) + if len(parts) == 2 { + mhost = fmt.Sprintf("%s %s", fqdn, parts[0]) } extraContent := []etchosts.Record{{Hosts: mhost, IP: ifaceIP}} @@ -161,6 +166,20 @@ func (sb *sandbox) restorePath() { } } +func (sb *sandbox) setExternalResolvers(content []byte, addrType int, checkLoopback bool) { + servers := resolvconf.GetNameservers(content, addrType) + for _, ip := range servers { + hostLoopback := false + if checkLoopback { + hostLoopback = dns.IsIPv4Localhost(ip) + } + sb.extDNS = append(sb.extDNS, extDNSEntry{ + ipStr: ip, + hostLoopback: hostLoopback, + }) + } +} + func (sb *sandbox) setupDNS() error { var newRC *resolvconf.File @@ -208,7 +227,17 @@ func (sb *sandbox) setupDNS() error { if err != nil { return err } + // After building the resolv.conf from the user config save the + // external resolvers in the sandbox. Note that --dns 127.0.0.x + // config refers to the loopback in the container namespace + sb.setExternalResolvers(newRC.Content, types.IPv4, false) } else { + // If the host resolv.conf file has 127.0.0.x container should + // use the host restolver for queries. This is supported by the + // docker embedded DNS server. Hence save the external resolvers + // before filtering it out. + sb.setExternalResolvers(currRC.Content, types.IPv4, true) + // Replace any localhost/127.* (at this point we have no info about ipv6, pass it as true) if newRC, err = resolvconf.FilterResolvDNS(currRC.Content, true); err != nil { return err @@ -297,7 +326,6 @@ func (sb *sandbox) updateDNS(ipv6Enabled bool) error { // Embedded DNS server has to be enabled for this sandbox. Rebuild the container's // resolv.conf by doing the following -// - Save the external name servers in resolv.conf in the sandbox // - Add only the embedded server's IP to container's resolv.conf // - If the embedded server needs any resolv.conf options add it to the current list func (sb *sandbox) rebuildDNS() error { @@ -306,10 +334,9 @@ func (sb *sandbox) rebuildDNS() error { return err } - // localhost entries have already been filtered out from the list - // retain only the v4 servers in sb for forwarding the DNS queries - sb.extDNS = resolvconf.GetNameservers(currRC.Content, types.IPv4) - + if len(sb.extDNS) == 0 { + sb.setExternalResolvers(currRC.Content, types.IPv4, false) + } var ( dnsList = []string{sb.resolver.NameServer()} dnsOptionsList = resolvconf.GetOptions(currRC.Content) diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox_store.go b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox_store.go index 8b36d688a..d50163ded 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox_store.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/libnetwork/sandbox_store.go @@ -27,7 +27,7 @@ type sbState struct { dbExists bool Eps []epState EpPriority map[string]int - ExtDNS []string + ExtDNS []extDNSEntry } func (sbs *sbState) Key() []string { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/agent.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/agent.go index 915a2e5ce..d8cc59547 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/agent.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/agent.go @@ -37,6 +37,8 @@ type Agent struct { started chan struct{} startOnce sync.Once // start only once ready chan struct{} + leaving chan struct{} + leaveOnce sync.Once stopped chan struct{} // requests shutdown stopOnce sync.Once // only allow stop to be called once closed chan struct{} // only closed in run @@ -53,6 +55,7 @@ func New(config *Config) (*Agent, error) { config: config, sessionq: make(chan sessionOperation), started: make(chan struct{}), + leaving: make(chan struct{}), stopped: make(chan struct{}), closed: make(chan struct{}), ready: make(chan struct{}), @@ -78,6 +81,37 @@ func (a *Agent) Start(ctx context.Context) error { return err } +// Leave instructs the agent to leave the cluster. This method will shutdown +// assignment processing and remove all assignments from the node. +// Leave blocks until worker has finished closing all task managers or agent +// is closed. +func (a *Agent) Leave(ctx context.Context) error { + select { + case <-a.started: + default: + return errAgentNotStarted + } + + a.leaveOnce.Do(func() { + close(a.leaving) + }) + + // agent could be closed while Leave is in progress + var err error + ch := make(chan struct{}) + go func() { + err = a.worker.Wait(ctx) + close(ch) + }() + + select { + case <-ch: + return err + case <-a.closed: + return ErrClosed + } +} + // Stop shuts down the agent, blocking until full shutdown. If the agent is not // started, Stop will block until the agent has fully shutdown. func (a *Agent) Stop(ctx context.Context) error { @@ -151,6 +185,7 @@ func (a *Agent) run(ctx context.Context) { registered = session.registered ready = a.ready // first session ready sessionq chan sessionOperation + leaving = a.leaving subscriptions = map[string]context.CancelFunc{} ) @@ -171,7 +206,21 @@ func (a *Agent) run(ctx context.Context) { select { case operation := <-sessionq: operation.response <- operation.fn(session) + case <-leaving: + leaving = nil + + // TODO(stevvooe): Signal to the manager that the node is leaving. + + // when leaving we remove all assignments. + if err := a.worker.Assign(ctx, nil); err != nil { + log.G(ctx).WithError(err).Error("failed removing all assignments") + } case msg := <-session.assignments: + // if we have left, accept no more assignments + if leaving == nil { + continue + } + switch msg.Type { case api.AssignmentsMessage_COMPLETE: // Need to assign secrets before tasks, because tasks might depend on new secrets @@ -287,12 +336,10 @@ func (a *Agent) handleSessionMessage(ctx context.Context, message *api.SessionMe seen := map[api.Peer]struct{}{} for _, manager := range message.Managers { if manager.Peer.Addr == "" { - log.G(ctx).WithField("manager.addr", manager.Peer.Addr). - Warnf("skipping bad manager address") continue } - a.config.Managers.Observe(*manager.Peer, int(manager.Weight)) + a.config.ConnBroker.Remotes().Observe(*manager.Peer, int(manager.Weight)) seen[*manager.Peer] = struct{}{} } @@ -309,9 +356,9 @@ func (a *Agent) handleSessionMessage(ctx context.Context, message *api.SessionMe } // prune managers not in list. - for peer := range a.config.Managers.Weights() { + for peer := range a.config.ConnBroker.Remotes().Weights() { if _, ok := seen[peer]; !ok { - a.config.Managers.Remove(peer) + a.config.ConnBroker.Remotes().Remove(peer) } } @@ -419,7 +466,7 @@ func (a *Agent) Publisher(ctx context.Context, subscriptionID string) (exec.LogP ) err = a.withSession(ctx, func(session *session) error { - publisher, err = api.NewLogBrokerClient(session.conn).PublishLogs(ctx) + publisher, err = api.NewLogBrokerClient(session.conn.ClientConn).PublishLogs(ctx) return err }) if err != nil { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/config.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/config.go index d62e15c8d..de9359842 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/config.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/config.go @@ -4,7 +4,7 @@ import ( "github.com/boltdb/bolt" "github.com/docker/swarmkit/agent/exec" "github.com/docker/swarmkit/api" - "github.com/docker/swarmkit/remotes" + "github.com/docker/swarmkit/connectionbroker" "github.com/pkg/errors" "google.golang.org/grpc/credentials" ) @@ -14,9 +14,9 @@ type Config struct { // Hostname the name of host for agent instance. Hostname string - // Managers provides the manager backend used by the agent. It will be - // updated with managers weights as observed by the agent. - Managers remotes.Remotes + // ConnBroker provides a connection broker for retrieving gRPC + // connections to managers. + ConnBroker *connectionbroker.Broker // Executor specifies the executor to use for the agent. Executor exec.Executor diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/reporter.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/reporter.go index eac4b3267..73e6ab3fd 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/reporter.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/reporter.go @@ -115,7 +115,7 @@ func (sr *statusReporter) run(ctx context.Context) { } if err != nil { - log.G(ctx).WithError(err).Error("failed reporting status to agent") + log.G(ctx).WithError(err).Error("status reporter failed to report status to agent") // place it back in the map, if not there, allowing us to pick // the value if a new one came in when we were sending the last diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/resource.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/resource.go index eca7564aa..8e88d2cd6 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/resource.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/resource.go @@ -30,7 +30,7 @@ type ResourceAllocator interface { func (r *resourceAllocator) AttachNetwork(ctx context.Context, id, target string, addresses []string) (string, error) { var taskID string if err := r.agent.withSession(ctx, func(session *session) error { - client := api.NewResourceAllocatorClient(session.conn) + client := api.NewResourceAllocatorClient(session.conn.ClientConn) r, err := client.AttachNetwork(ctx, &api.AttachNetworkRequest{ Config: &api.NetworkAttachmentConfig{ Target: target, @@ -53,7 +53,7 @@ func (r *resourceAllocator) AttachNetwork(ctx context.Context, id, target string // DetachNetwork deletes a network attachment. func (r *resourceAllocator) DetachNetwork(ctx context.Context, aID string) error { return r.agent.withSession(ctx, func(session *session) error { - client := api.NewResourceAllocatorClient(session.conn) + client := api.NewResourceAllocatorClient(session.conn.ClientConn) _, err := client.DetachNetwork(ctx, &api.DetachNetworkRequest{ AttachmentID: aID, }) diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/session.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/session.go index a8f657ffa..fc1dca0db 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/session.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/session.go @@ -7,9 +7,9 @@ import ( "github.com/Sirupsen/logrus" "github.com/docker/swarmkit/api" + "github.com/docker/swarmkit/connectionbroker" "github.com/docker/swarmkit/log" "github.com/docker/swarmkit/protobuf/ptypes" - "github.com/docker/swarmkit/remotes" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -30,8 +30,7 @@ var ( // flow into the agent, such as task assignment, are called back into the // agent through errs, messages and tasks. type session struct { - conn *grpc.ClientConn - addr string + conn *connectionbroker.Conn agent *Agent sessionID string @@ -61,12 +60,7 @@ func newSession(ctx context.Context, agent *Agent, delay time.Duration, sessionI // TODO(stevvooe): Need to move connection management up a level or create // independent connection for log broker client. - peer, err := agent.config.Managers.Select() - if err != nil { - s.errs <- err - return s - } - cc, err := grpc.Dial(peer.Addr, + cc, err := agent.config.ConnBroker.Select( grpc.WithTransportCredentials(agent.config.Credentials), grpc.WithTimeout(dispatcherRPCTimeout), ) @@ -74,7 +68,6 @@ func newSession(ctx context.Context, agent *Agent, delay time.Duration, sessionI s.errs <- err return s } - s.addr = peer.Addr s.conn = cc go s.run(ctx, delay, description) @@ -127,7 +120,7 @@ func (s *session) start(ctx context.Context, description *api.NodeDescription) e // Need to run Session in a goroutine since there's no way to set a // timeout for an individual Recv call in a stream. go func() { - client := api.NewDispatcherClient(s.conn) + client := api.NewDispatcherClient(s.conn.ClientConn) stream, err = client.Session(sessionCtx, &api.SessionRequest{ Description: description, @@ -160,7 +153,7 @@ func (s *session) start(ctx context.Context, description *api.NodeDescription) e func (s *session) heartbeat(ctx context.Context) error { log.G(ctx).Debugf("(*session).heartbeat") - client := api.NewDispatcherClient(s.conn) + client := api.NewDispatcherClient(s.conn.ClientConn) heartbeat := time.NewTimer(1) // send out a heartbeat right away defer heartbeat.Stop() @@ -224,7 +217,7 @@ func (s *session) logSubscriptions(ctx context.Context) error { log := log.G(ctx).WithFields(logrus.Fields{"method": "(*session).logSubscriptions"}) log.Debugf("") - client := api.NewLogBrokerClient(s.conn) + client := api.NewLogBrokerClient(s.conn.ClientConn) subscriptions, err := client.ListenSubscriptions(ctx, &api.ListenSubscriptionsRequest{}) if err != nil { return err @@ -269,7 +262,7 @@ func (s *session) watch(ctx context.Context) error { err error ) - client := api.NewDispatcherClient(s.conn) + client := api.NewDispatcherClient(s.conn.ClientConn) for { // If this is the first time we're running the loop, or there was a reference mismatch // attempt to get the assignmentWatch @@ -344,7 +337,7 @@ func (s *session) watch(ctx context.Context) error { // sendTaskStatus uses the current session to send the status of a single task. func (s *session) sendTaskStatus(ctx context.Context, taskID string, status *api.TaskStatus) error { - client := api.NewDispatcherClient(s.conn) + client := api.NewDispatcherClient(s.conn.ClientConn) if _, err := client.UpdateTaskStatus(ctx, &api.UpdateTaskStatusRequest{ SessionID: s.sessionID, Updates: []*api.UpdateTaskStatusRequest_TaskStatusUpdate{ @@ -385,7 +378,7 @@ func (s *session) sendTaskStatuses(ctx context.Context, updates ...*api.UpdateTa return updates, ctx.Err() } - client := api.NewDispatcherClient(s.conn) + client := api.NewDispatcherClient(s.conn.ClientConn) n := batchSize if len(updates) < n { @@ -416,8 +409,7 @@ func (s *session) sendError(err error) { func (s *session) close() error { s.closeOnce.Do(func() { if s.conn != nil { - s.agent.config.Managers.ObserveIfExists(api.Peer{Addr: s.addr}, -remotes.DefaultObservationWeight) - s.conn.Close() + s.conn.Close(false) } close(s.closed) diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/task.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/task.go index 91f282b65..95fe93179 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/task.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/task.go @@ -1,6 +1,7 @@ package agent import ( + "sync" "time" "github.com/docker/swarmkit/agent/exec" @@ -19,8 +20,10 @@ type taskManager struct { updateq chan *api.Task - shutdown chan struct{} - closed chan struct{} + shutdown chan struct{} + shutdownOnce sync.Once + closed chan struct{} + closeOnce sync.Once } func newTaskManager(ctx context.Context, task *api.Task, ctlr exec.Controller, reporter StatusReporter) *taskManager { @@ -48,20 +51,15 @@ func (tm *taskManager) Update(ctx context.Context, task *api.Task) error { } } -// Close shuts down the task manager, blocking until it is stopped. +// Close shuts down the task manager, blocking until it is closed. func (tm *taskManager) Close() error { - select { - case <-tm.closed: - return nil - case <-tm.shutdown: - default: + tm.shutdownOnce.Do(func() { close(tm.shutdown) - } + }) - select { - case <-tm.closed: - return nil - } + <-tm.closed + + return nil } func (tm *taskManager) Logs(ctx context.Context, options api.LogSubscriptionOptions, publisher exec.LogPublisher) { @@ -106,7 +104,8 @@ func (tm *taskManager) run(ctx context.Context) { // always check for shutdown before running. select { case <-tm.shutdown: - continue // ignore run request and handle shutdown + shutdown = tm.shutdown // a little questionable + continue // ignore run request and handle shutdown case <-tm.closed: continue default: @@ -143,7 +142,7 @@ func (tm *taskManager) run(ctx context.Context) { } if err := tm.reporter.UpdateTaskStatus(ctx, running.ID, status); err != nil { - log.G(ctx).WithError(err).Error("failed reporting status to agent") + log.G(ctx).WithError(err).Error("task manager failed to report status to agent") } } @@ -230,25 +229,19 @@ func (tm *taskManager) run(ctx context.Context) { continue // wait until operation actually exits. } - // TODO(stevvooe): This should be left for the repear. - - // make an attempt at removing. this is best effort. any errors will be - // retried by the reaper later. - if err := tm.ctlr.Remove(ctx); err != nil { - log.G(ctx).WithError(err).WithField("task.id", tm.task.ID).Error("remove task failed") - } - - if err := tm.ctlr.Close(); err != nil { - log.G(ctx).WithError(err).Error("error closing controller") - } // disable everything, and prepare for closing. statusq = nil errs = nil shutdown = nil - close(tm.closed) + tm.closeOnce.Do(func() { + close(tm.closed) + }) case <-tm.closed: return case <-ctx.Done(): + tm.closeOnce.Do(func() { + close(tm.closed) + }) return } } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/worker.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/worker.go index c3684f496..d67513b2f 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/worker.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/agent/worker.go @@ -40,6 +40,9 @@ type Worker interface { // Subscribe to log messages matching the subscription. Subscribe(ctx context.Context, subscription *api.SubscriptionMessage) error + + // Wait blocks until all task managers have closed + Wait(ctx context.Context) error } // statusReporterKey protects removal map from panic. @@ -57,6 +60,9 @@ type worker struct { taskManagers map[string]*taskManager mu sync.RWMutex + + closed bool + closers sync.WaitGroup // keeps track of active closers } func newWorker(db *bolt.DB, executor exec.Executor, publisherProvider exec.LogPublisherProvider) *worker { @@ -106,6 +112,10 @@ func (w *worker) Init(ctx context.Context) error { // Close performs worker cleanup when no longer needed. func (w *worker) Close() { + w.mu.Lock() + w.closed = true + w.mu.Unlock() + w.taskevents.Close() } @@ -118,6 +128,10 @@ func (w *worker) Assign(ctx context.Context, assignments []*api.AssignmentChange w.mu.Lock() defer w.mu.Unlock() + if w.closed { + return ErrClosed + } + log.G(ctx).WithFields(logrus.Fields{ "len(assignments)": len(assignments), }).Debug("(*worker).Assign") @@ -140,6 +154,10 @@ func (w *worker) Update(ctx context.Context, assignments []*api.AssignmentChange w.mu.Lock() defer w.mu.Unlock() + if w.closed { + return ErrClosed + } + log.G(ctx).WithFields(logrus.Fields{ "len(assignments)": len(assignments), }).Debug("(*worker).Update") @@ -222,10 +240,22 @@ func reconcileTaskState(ctx context.Context, w *worker, assignments []*api.Assig } closeManager := func(tm *taskManager) { - // when a task is no longer assigned, we shutdown the task manager for - // it and leave cleanup to the sweeper. - if err := tm.Close(); err != nil { - log.G(ctx).WithError(err).Error("error closing task manager") + go func(tm *taskManager) { + defer w.closers.Done() + // when a task is no longer assigned, we shutdown the task manager + if err := tm.Close(); err != nil { + log.G(ctx).WithError(err).Error("error closing task manager") + } + }(tm) + + // make an attempt at removing. this is best effort. any errors will be + // retried by the reaper later. + if err := tm.ctlr.Remove(ctx); err != nil { + log.G(ctx).WithError(err).WithField("task.id", tm.task.ID).Error("remove task failed") + } + + if err := tm.ctlr.Close(); err != nil { + log.G(ctx).WithError(err).Error("error closing controller") } } @@ -272,15 +302,6 @@ func reconcileTaskState(ctx context.Context, w *worker, assignments []*api.Assig } func reconcileSecrets(ctx context.Context, w *worker, assignments []*api.AssignmentChange, fullSnapshot bool) error { - var secrets exec.SecretsManager - provider, ok := w.executor.(exec.SecretsProvider) - if !ok { - log.G(ctx).Warn("secrets update ignored; executor does not support secrets") - return nil - } - - secrets = provider.Secrets() - var ( updatedSecrets []api.Secret removedSecrets []string @@ -297,6 +318,16 @@ func reconcileSecrets(ctx context.Context, w *worker, assignments []*api.Assignm } } + provider, ok := w.executor.(exec.SecretsProvider) + if !ok { + if len(updatedSecrets) != 0 || len(removedSecrets) != 0 { + log.G(ctx).Warn("secrets update ignored; executor does not support secrets") + } + return nil + } + + secrets := provider.Secrets() + log.G(ctx).WithFields(logrus.Fields{ "len(updatedSecrets)": len(updatedSecrets), "len(removedSecrets)": len(removedSecrets), @@ -359,6 +390,8 @@ func (w *worker) taskManager(ctx context.Context, tx *bolt.Tx, task *api.Task) ( return nil, err } w.taskManagers[task.ID] = tm + // keep track of active tasks + w.closers.Add(1) return tm, nil } @@ -484,3 +517,18 @@ func (w *worker) Subscribe(ctx context.Context, subscription *api.SubscriptionMe } } } + +func (w *worker) Wait(ctx context.Context) error { + ch := make(chan struct{}) + go func() { + w.closers.Wait() + close(ch) + }() + + select { + case <-ch: + return nil + case <-ctx.Done(): + return ctx.Err() + } +} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/ca.pb.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/ca.pb.go index 619421b3b..343a182e7 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/ca.pb.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/ca.pb.go @@ -836,12 +836,12 @@ func encodeVarintCa(data []byte, offset int, v uint64) int { } type raftProxyCAServer struct { - local CAServer - connSelector raftselector.ConnProvider - ctxMods []func(context.Context) (context.Context, error) + local CAServer + connSelector raftselector.ConnProvider + localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error) } -func NewRaftProxyCAServer(local CAServer, connSelector raftselector.ConnProvider, ctxMod func(context.Context) (context.Context, error)) CAServer { +func NewRaftProxyCAServer(local CAServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) CAServer { redirectChecker := func(ctx context.Context) (context.Context, error) { s, ok := transport.StreamFromContext(ctx) if !ok { @@ -858,18 +858,24 @@ func NewRaftProxyCAServer(local CAServer, connSelector raftselector.ConnProvider md["redirect"] = append(md["redirect"], addr) return metadata.NewContext(ctx, md), nil } - mods := []func(context.Context) (context.Context, error){redirectChecker} - mods = append(mods, ctxMod) + remoteMods := []func(context.Context) (context.Context, error){redirectChecker} + remoteMods = append(remoteMods, remoteCtxMod) + + var localMods []func(context.Context) (context.Context, error) + if localCtxMod != nil { + localMods = []func(context.Context) (context.Context, error){localCtxMod} + } return &raftProxyCAServer{ - local: local, - connSelector: connSelector, - ctxMods: mods, + local: local, + connSelector: connSelector, + localCtxMods: localMods, + remoteCtxMods: remoteMods, } } -func (p *raftProxyCAServer) runCtxMods(ctx context.Context) (context.Context, error) { +func (p *raftProxyCAServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) { var err error - for _, mod := range p.ctxMods { + for _, mod := range ctxMods { ctx, err = mod(ctx) if err != nil { return ctx, err @@ -906,11 +912,15 @@ func (p *raftProxyCAServer) GetRootCACertificate(ctx context.Context, r *GetRoot conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.GetRootCACertificate(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -937,11 +947,15 @@ func (p *raftProxyCAServer) GetUnlockKey(ctx context.Context, r *GetUnlockKeyReq conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.GetUnlockKey(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -964,12 +978,12 @@ func (p *raftProxyCAServer) GetUnlockKey(ctx context.Context, r *GetUnlockKeyReq } type raftProxyNodeCAServer struct { - local NodeCAServer - connSelector raftselector.ConnProvider - ctxMods []func(context.Context) (context.Context, error) + local NodeCAServer + connSelector raftselector.ConnProvider + localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error) } -func NewRaftProxyNodeCAServer(local NodeCAServer, connSelector raftselector.ConnProvider, ctxMod func(context.Context) (context.Context, error)) NodeCAServer { +func NewRaftProxyNodeCAServer(local NodeCAServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) NodeCAServer { redirectChecker := func(ctx context.Context) (context.Context, error) { s, ok := transport.StreamFromContext(ctx) if !ok { @@ -986,18 +1000,24 @@ func NewRaftProxyNodeCAServer(local NodeCAServer, connSelector raftselector.Conn md["redirect"] = append(md["redirect"], addr) return metadata.NewContext(ctx, md), nil } - mods := []func(context.Context) (context.Context, error){redirectChecker} - mods = append(mods, ctxMod) + remoteMods := []func(context.Context) (context.Context, error){redirectChecker} + remoteMods = append(remoteMods, remoteCtxMod) + + var localMods []func(context.Context) (context.Context, error) + if localCtxMod != nil { + localMods = []func(context.Context) (context.Context, error){localCtxMod} + } return &raftProxyNodeCAServer{ - local: local, - connSelector: connSelector, - ctxMods: mods, + local: local, + connSelector: connSelector, + localCtxMods: localMods, + remoteCtxMods: remoteMods, } } -func (p *raftProxyNodeCAServer) runCtxMods(ctx context.Context) (context.Context, error) { +func (p *raftProxyNodeCAServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) { var err error - for _, mod := range p.ctxMods { + for _, mod := range ctxMods { ctx, err = mod(ctx) if err != nil { return ctx, err @@ -1034,11 +1054,15 @@ func (p *raftProxyNodeCAServer) IssueNodeCertificate(ctx context.Context, r *Iss conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.IssueNodeCertificate(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -1065,11 +1089,15 @@ func (p *raftProxyNodeCAServer) NodeCertificateStatus(ctx context.Context, r *No conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.NodeCertificateStatus(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/control.pb.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/control.pb.go index 6f36208c2..17b4f4113 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/control.pb.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/control.pb.go @@ -5256,12 +5256,12 @@ func encodeVarintControl(data []byte, offset int, v uint64) int { } type raftProxyControlServer struct { - local ControlServer - connSelector raftselector.ConnProvider - ctxMods []func(context.Context) (context.Context, error) + local ControlServer + connSelector raftselector.ConnProvider + localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error) } -func NewRaftProxyControlServer(local ControlServer, connSelector raftselector.ConnProvider, ctxMod func(context.Context) (context.Context, error)) ControlServer { +func NewRaftProxyControlServer(local ControlServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) ControlServer { redirectChecker := func(ctx context.Context) (context.Context, error) { s, ok := transport.StreamFromContext(ctx) if !ok { @@ -5278,18 +5278,24 @@ func NewRaftProxyControlServer(local ControlServer, connSelector raftselector.Co md["redirect"] = append(md["redirect"], addr) return metadata.NewContext(ctx, md), nil } - mods := []func(context.Context) (context.Context, error){redirectChecker} - mods = append(mods, ctxMod) + remoteMods := []func(context.Context) (context.Context, error){redirectChecker} + remoteMods = append(remoteMods, remoteCtxMod) + + var localMods []func(context.Context) (context.Context, error) + if localCtxMod != nil { + localMods = []func(context.Context) (context.Context, error){localCtxMod} + } return &raftProxyControlServer{ - local: local, - connSelector: connSelector, - ctxMods: mods, + local: local, + connSelector: connSelector, + localCtxMods: localMods, + remoteCtxMods: remoteMods, } } -func (p *raftProxyControlServer) runCtxMods(ctx context.Context) (context.Context, error) { +func (p *raftProxyControlServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) { var err error - for _, mod := range p.ctxMods { + for _, mod := range ctxMods { ctx, err = mod(ctx) if err != nil { return ctx, err @@ -5326,11 +5332,15 @@ func (p *raftProxyControlServer) GetNode(ctx context.Context, r *GetNodeRequest) conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.GetNode(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5357,11 +5367,15 @@ func (p *raftProxyControlServer) ListNodes(ctx context.Context, r *ListNodesRequ conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.ListNodes(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5388,11 +5402,15 @@ func (p *raftProxyControlServer) UpdateNode(ctx context.Context, r *UpdateNodeRe conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.UpdateNode(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5419,11 +5437,15 @@ func (p *raftProxyControlServer) RemoveNode(ctx context.Context, r *RemoveNodeRe conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.RemoveNode(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5450,11 +5472,15 @@ func (p *raftProxyControlServer) GetTask(ctx context.Context, r *GetTaskRequest) conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.GetTask(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5481,11 +5507,15 @@ func (p *raftProxyControlServer) ListTasks(ctx context.Context, r *ListTasksRequ conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.ListTasks(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5512,11 +5542,15 @@ func (p *raftProxyControlServer) RemoveTask(ctx context.Context, r *RemoveTaskRe conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.RemoveTask(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5543,11 +5577,15 @@ func (p *raftProxyControlServer) GetService(ctx context.Context, r *GetServiceRe conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.GetService(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5574,11 +5612,15 @@ func (p *raftProxyControlServer) ListServices(ctx context.Context, r *ListServic conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.ListServices(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5605,11 +5647,15 @@ func (p *raftProxyControlServer) CreateService(ctx context.Context, r *CreateSer conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.CreateService(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5636,11 +5682,15 @@ func (p *raftProxyControlServer) UpdateService(ctx context.Context, r *UpdateSer conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.UpdateService(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5667,11 +5717,15 @@ func (p *raftProxyControlServer) RemoveService(ctx context.Context, r *RemoveSer conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.RemoveService(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5698,11 +5752,15 @@ func (p *raftProxyControlServer) GetNetwork(ctx context.Context, r *GetNetworkRe conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.GetNetwork(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5729,11 +5787,15 @@ func (p *raftProxyControlServer) ListNetworks(ctx context.Context, r *ListNetwor conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.ListNetworks(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5760,11 +5822,15 @@ func (p *raftProxyControlServer) CreateNetwork(ctx context.Context, r *CreateNet conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.CreateNetwork(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5791,11 +5857,15 @@ func (p *raftProxyControlServer) RemoveNetwork(ctx context.Context, r *RemoveNet conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.RemoveNetwork(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5822,11 +5892,15 @@ func (p *raftProxyControlServer) GetCluster(ctx context.Context, r *GetClusterRe conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.GetCluster(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5853,11 +5927,15 @@ func (p *raftProxyControlServer) ListClusters(ctx context.Context, r *ListCluste conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.ListClusters(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5884,11 +5962,15 @@ func (p *raftProxyControlServer) UpdateCluster(ctx context.Context, r *UpdateClu conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.UpdateCluster(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5915,11 +5997,15 @@ func (p *raftProxyControlServer) GetSecret(ctx context.Context, r *GetSecretRequ conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.GetSecret(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5946,11 +6032,15 @@ func (p *raftProxyControlServer) UpdateSecret(ctx context.Context, r *UpdateSecr conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.UpdateSecret(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -5977,11 +6067,15 @@ func (p *raftProxyControlServer) ListSecrets(ctx context.Context, r *ListSecrets conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.ListSecrets(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -6008,11 +6102,15 @@ func (p *raftProxyControlServer) CreateSecret(ctx context.Context, r *CreateSecr conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.CreateSecret(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -6039,11 +6137,15 @@ func (p *raftProxyControlServer) RemoveSecret(ctx context.Context, r *RemoveSecr conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.RemoveSecret(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/dispatcher.pb.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/dispatcher.pb.go index 751c48d37..7c5c70b5e 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/dispatcher.pb.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/dispatcher.pb.go @@ -1670,12 +1670,12 @@ func encodeVarintDispatcher(data []byte, offset int, v uint64) int { } type raftProxyDispatcherServer struct { - local DispatcherServer - connSelector raftselector.ConnProvider - ctxMods []func(context.Context) (context.Context, error) + local DispatcherServer + connSelector raftselector.ConnProvider + localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error) } -func NewRaftProxyDispatcherServer(local DispatcherServer, connSelector raftselector.ConnProvider, ctxMod func(context.Context) (context.Context, error)) DispatcherServer { +func NewRaftProxyDispatcherServer(local DispatcherServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) DispatcherServer { redirectChecker := func(ctx context.Context) (context.Context, error) { s, ok := transport.StreamFromContext(ctx) if !ok { @@ -1692,18 +1692,24 @@ func NewRaftProxyDispatcherServer(local DispatcherServer, connSelector raftselec md["redirect"] = append(md["redirect"], addr) return metadata.NewContext(ctx, md), nil } - mods := []func(context.Context) (context.Context, error){redirectChecker} - mods = append(mods, ctxMod) + remoteMods := []func(context.Context) (context.Context, error){redirectChecker} + remoteMods = append(remoteMods, remoteCtxMod) + + var localMods []func(context.Context) (context.Context, error) + if localCtxMod != nil { + localMods = []func(context.Context) (context.Context, error){localCtxMod} + } return &raftProxyDispatcherServer{ - local: local, - connSelector: connSelector, - ctxMods: mods, + local: local, + connSelector: connSelector, + localCtxMods: localMods, + remoteCtxMods: remoteMods, } } -func (p *raftProxyDispatcherServer) runCtxMods(ctx context.Context) (context.Context, error) { +func (p *raftProxyDispatcherServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) { var err error - for _, mod := range p.ctxMods { + for _, mod := range ctxMods { ctx, err = mod(ctx) if err != nil { return ctx, err @@ -1735,17 +1741,33 @@ func (p *raftProxyDispatcherServer) pollNewLeaderConn(ctx context.Context) (*grp } } -func (p *raftProxyDispatcherServer) Session(r *SessionRequest, stream Dispatcher_SessionServer) error { +type Dispatcher_SessionServerWrapper struct { + Dispatcher_SessionServer + ctx context.Context +} +func (s Dispatcher_SessionServerWrapper) Context() context.Context { + return s.ctx +} + +func (p *raftProxyDispatcherServer) Session(r *SessionRequest, stream Dispatcher_SessionServer) error { ctx := stream.Context() conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { - return p.local.Session(r, stream) + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return err + } + streamWrapper := Dispatcher_SessionServerWrapper{ + Dispatcher_SessionServer: stream, + ctx: ctx, + } + return p.local.Session(r, streamWrapper) } return err } - ctx, err = p.runCtxMods(ctx) + ctx, err = p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return err } @@ -1775,11 +1797,15 @@ func (p *raftProxyDispatcherServer) Heartbeat(ctx context.Context, r *HeartbeatR conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.Heartbeat(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -1806,11 +1832,15 @@ func (p *raftProxyDispatcherServer) UpdateTaskStatus(ctx context.Context, r *Upd conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.UpdateTaskStatus(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -1832,17 +1862,33 @@ func (p *raftProxyDispatcherServer) UpdateTaskStatus(ctx context.Context, r *Upd return resp, err } -func (p *raftProxyDispatcherServer) Tasks(r *TasksRequest, stream Dispatcher_TasksServer) error { +type Dispatcher_TasksServerWrapper struct { + Dispatcher_TasksServer + ctx context.Context +} + +func (s Dispatcher_TasksServerWrapper) Context() context.Context { + return s.ctx +} +func (p *raftProxyDispatcherServer) Tasks(r *TasksRequest, stream Dispatcher_TasksServer) error { ctx := stream.Context() conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { - return p.local.Tasks(r, stream) + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return err + } + streamWrapper := Dispatcher_TasksServerWrapper{ + Dispatcher_TasksServer: stream, + ctx: ctx, + } + return p.local.Tasks(r, streamWrapper) } return err } - ctx, err = p.runCtxMods(ctx) + ctx, err = p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return err } @@ -1867,17 +1913,33 @@ func (p *raftProxyDispatcherServer) Tasks(r *TasksRequest, stream Dispatcher_Tas return nil } -func (p *raftProxyDispatcherServer) Assignments(r *AssignmentsRequest, stream Dispatcher_AssignmentsServer) error { +type Dispatcher_AssignmentsServerWrapper struct { + Dispatcher_AssignmentsServer + ctx context.Context +} + +func (s Dispatcher_AssignmentsServerWrapper) Context() context.Context { + return s.ctx +} +func (p *raftProxyDispatcherServer) Assignments(r *AssignmentsRequest, stream Dispatcher_AssignmentsServer) error { ctx := stream.Context() conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { - return p.local.Assignments(r, stream) + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return err + } + streamWrapper := Dispatcher_AssignmentsServerWrapper{ + Dispatcher_AssignmentsServer: stream, + ctx: ctx, + } + return p.local.Assignments(r, streamWrapper) } return err } - ctx, err = p.runCtxMods(ctx) + ctx, err = p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return err } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/health.pb.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/health.pb.go index 13c40143d..5e53c97bd 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/health.pb.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/health.pb.go @@ -321,12 +321,12 @@ func encodeVarintHealth(data []byte, offset int, v uint64) int { } type raftProxyHealthServer struct { - local HealthServer - connSelector raftselector.ConnProvider - ctxMods []func(context.Context) (context.Context, error) + local HealthServer + connSelector raftselector.ConnProvider + localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error) } -func NewRaftProxyHealthServer(local HealthServer, connSelector raftselector.ConnProvider, ctxMod func(context.Context) (context.Context, error)) HealthServer { +func NewRaftProxyHealthServer(local HealthServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) HealthServer { redirectChecker := func(ctx context.Context) (context.Context, error) { s, ok := transport.StreamFromContext(ctx) if !ok { @@ -343,18 +343,24 @@ func NewRaftProxyHealthServer(local HealthServer, connSelector raftselector.Conn md["redirect"] = append(md["redirect"], addr) return metadata.NewContext(ctx, md), nil } - mods := []func(context.Context) (context.Context, error){redirectChecker} - mods = append(mods, ctxMod) + remoteMods := []func(context.Context) (context.Context, error){redirectChecker} + remoteMods = append(remoteMods, remoteCtxMod) + + var localMods []func(context.Context) (context.Context, error) + if localCtxMod != nil { + localMods = []func(context.Context) (context.Context, error){localCtxMod} + } return &raftProxyHealthServer{ - local: local, - connSelector: connSelector, - ctxMods: mods, + local: local, + connSelector: connSelector, + localCtxMods: localMods, + remoteCtxMods: remoteMods, } } -func (p *raftProxyHealthServer) runCtxMods(ctx context.Context) (context.Context, error) { +func (p *raftProxyHealthServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) { var err error - for _, mod := range p.ctxMods { + for _, mod := range ctxMods { ctx, err = mod(ctx) if err != nil { return ctx, err @@ -391,11 +397,15 @@ func (p *raftProxyHealthServer) Check(ctx context.Context, r *HealthCheckRequest conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.Check(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/logbroker.pb.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/logbroker.pb.go index a066add9e..b3dc176c9 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/logbroker.pb.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/logbroker.pb.go @@ -1279,12 +1279,12 @@ func encodeVarintLogbroker(data []byte, offset int, v uint64) int { } type raftProxyLogsServer struct { - local LogsServer - connSelector raftselector.ConnProvider - ctxMods []func(context.Context) (context.Context, error) + local LogsServer + connSelector raftselector.ConnProvider + localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error) } -func NewRaftProxyLogsServer(local LogsServer, connSelector raftselector.ConnProvider, ctxMod func(context.Context) (context.Context, error)) LogsServer { +func NewRaftProxyLogsServer(local LogsServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) LogsServer { redirectChecker := func(ctx context.Context) (context.Context, error) { s, ok := transport.StreamFromContext(ctx) if !ok { @@ -1301,18 +1301,24 @@ func NewRaftProxyLogsServer(local LogsServer, connSelector raftselector.ConnProv md["redirect"] = append(md["redirect"], addr) return metadata.NewContext(ctx, md), nil } - mods := []func(context.Context) (context.Context, error){redirectChecker} - mods = append(mods, ctxMod) + remoteMods := []func(context.Context) (context.Context, error){redirectChecker} + remoteMods = append(remoteMods, remoteCtxMod) + + var localMods []func(context.Context) (context.Context, error) + if localCtxMod != nil { + localMods = []func(context.Context) (context.Context, error){localCtxMod} + } return &raftProxyLogsServer{ - local: local, - connSelector: connSelector, - ctxMods: mods, + local: local, + connSelector: connSelector, + localCtxMods: localMods, + remoteCtxMods: remoteMods, } } -func (p *raftProxyLogsServer) runCtxMods(ctx context.Context) (context.Context, error) { +func (p *raftProxyLogsServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) { var err error - for _, mod := range p.ctxMods { + for _, mod := range ctxMods { ctx, err = mod(ctx) if err != nil { return ctx, err @@ -1344,17 +1350,33 @@ func (p *raftProxyLogsServer) pollNewLeaderConn(ctx context.Context) (*grpc.Clie } } -func (p *raftProxyLogsServer) SubscribeLogs(r *SubscribeLogsRequest, stream Logs_SubscribeLogsServer) error { +type Logs_SubscribeLogsServerWrapper struct { + Logs_SubscribeLogsServer + ctx context.Context +} +func (s Logs_SubscribeLogsServerWrapper) Context() context.Context { + return s.ctx +} + +func (p *raftProxyLogsServer) SubscribeLogs(r *SubscribeLogsRequest, stream Logs_SubscribeLogsServer) error { ctx := stream.Context() conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { - return p.local.SubscribeLogs(r, stream) + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return err + } + streamWrapper := Logs_SubscribeLogsServerWrapper{ + Logs_SubscribeLogsServer: stream, + ctx: ctx, + } + return p.local.SubscribeLogs(r, streamWrapper) } return err } - ctx, err = p.runCtxMods(ctx) + ctx, err = p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return err } @@ -1380,12 +1402,12 @@ func (p *raftProxyLogsServer) SubscribeLogs(r *SubscribeLogsRequest, stream Logs } type raftProxyLogBrokerServer struct { - local LogBrokerServer - connSelector raftselector.ConnProvider - ctxMods []func(context.Context) (context.Context, error) + local LogBrokerServer + connSelector raftselector.ConnProvider + localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error) } -func NewRaftProxyLogBrokerServer(local LogBrokerServer, connSelector raftselector.ConnProvider, ctxMod func(context.Context) (context.Context, error)) LogBrokerServer { +func NewRaftProxyLogBrokerServer(local LogBrokerServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) LogBrokerServer { redirectChecker := func(ctx context.Context) (context.Context, error) { s, ok := transport.StreamFromContext(ctx) if !ok { @@ -1402,18 +1424,24 @@ func NewRaftProxyLogBrokerServer(local LogBrokerServer, connSelector raftselecto md["redirect"] = append(md["redirect"], addr) return metadata.NewContext(ctx, md), nil } - mods := []func(context.Context) (context.Context, error){redirectChecker} - mods = append(mods, ctxMod) + remoteMods := []func(context.Context) (context.Context, error){redirectChecker} + remoteMods = append(remoteMods, remoteCtxMod) + + var localMods []func(context.Context) (context.Context, error) + if localCtxMod != nil { + localMods = []func(context.Context) (context.Context, error){localCtxMod} + } return &raftProxyLogBrokerServer{ - local: local, - connSelector: connSelector, - ctxMods: mods, + local: local, + connSelector: connSelector, + localCtxMods: localMods, + remoteCtxMods: remoteMods, } } -func (p *raftProxyLogBrokerServer) runCtxMods(ctx context.Context) (context.Context, error) { +func (p *raftProxyLogBrokerServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) { var err error - for _, mod := range p.ctxMods { + for _, mod := range ctxMods { ctx, err = mod(ctx) if err != nil { return ctx, err @@ -1445,17 +1473,33 @@ func (p *raftProxyLogBrokerServer) pollNewLeaderConn(ctx context.Context) (*grpc } } -func (p *raftProxyLogBrokerServer) ListenSubscriptions(r *ListenSubscriptionsRequest, stream LogBroker_ListenSubscriptionsServer) error { +type LogBroker_ListenSubscriptionsServerWrapper struct { + LogBroker_ListenSubscriptionsServer + ctx context.Context +} +func (s LogBroker_ListenSubscriptionsServerWrapper) Context() context.Context { + return s.ctx +} + +func (p *raftProxyLogBrokerServer) ListenSubscriptions(r *ListenSubscriptionsRequest, stream LogBroker_ListenSubscriptionsServer) error { ctx := stream.Context() conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { - return p.local.ListenSubscriptions(r, stream) + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return err + } + streamWrapper := LogBroker_ListenSubscriptionsServerWrapper{ + LogBroker_ListenSubscriptionsServer: stream, + ctx: ctx, + } + return p.local.ListenSubscriptions(r, streamWrapper) } return err } - ctx, err = p.runCtxMods(ctx) + ctx, err = p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return err } @@ -1480,17 +1524,33 @@ func (p *raftProxyLogBrokerServer) ListenSubscriptions(r *ListenSubscriptionsReq return nil } -func (p *raftProxyLogBrokerServer) PublishLogs(stream LogBroker_PublishLogsServer) error { +type LogBroker_PublishLogsServerWrapper struct { + LogBroker_PublishLogsServer + ctx context.Context +} +func (s LogBroker_PublishLogsServerWrapper) Context() context.Context { + return s.ctx +} + +func (p *raftProxyLogBrokerServer) PublishLogs(stream LogBroker_PublishLogsServer) error { ctx := stream.Context() conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { - return p.local.PublishLogs(stream) + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return err + } + streamWrapper := LogBroker_PublishLogsServerWrapper{ + LogBroker_PublishLogsServer: stream, + ctx: ctx, + } + return p.local.PublishLogs(streamWrapper) } return err } - ctx, err = p.runCtxMods(ctx) + ctx, err = p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return err } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/objects.pb.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/objects.pb.go index 5e9528e08..8a09af9b5 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/objects.pb.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/objects.pb.go @@ -57,6 +57,16 @@ type Node struct { Attachment *NetworkAttachment `protobuf:"bytes,7,opt,name=attachment" json:"attachment,omitempty"` // Certificate is the TLS certificate issued for the node, if any. Certificate Certificate `protobuf:"bytes,8,opt,name=certificate" json:"certificate"` + // Role is the *observed* role for this node. It differs from the + // desired role set in Node.Spec.Role because the role here is only + // updated after the Raft member list has been reconciled with the + // desired role from the spec. + // + // This field represents the current reconciled state. If an action is + // to be performed, first verify the role in the cert. This field only + // shows the privilege level that the CA would currently grant when + // issuing or renewing the node's certificate. + Role NodeRole `protobuf:"varint,9,opt,name=role,proto3,enum=docker.swarmkit.v1.NodeRole" json:"role,omitempty"` } func (m *Node) Reset() { *m = Node{} } @@ -303,6 +313,7 @@ func (m *Node) Copy() *Node { ManagerStatus: m.ManagerStatus.Copy(), Attachment: m.Attachment.Copy(), Certificate: *m.Certificate.Copy(), + Role: m.Role, } return o @@ -504,7 +515,7 @@ func (this *Node) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 12) + s := make([]string, 0, 13) s = append(s, "&api.Node{") s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n") s = append(s, "Meta: "+strings.Replace(this.Meta.GoString(), `&`, ``, 1)+",\n") @@ -520,6 +531,7 @@ func (this *Node) GoString() string { s = append(s, "Attachment: "+fmt.Sprintf("%#v", this.Attachment)+",\n") } s = append(s, "Certificate: "+strings.Replace(this.Certificate.GoString(), `&`, ``, 1)+",\n") + s = append(s, "Role: "+fmt.Sprintf("%#v", this.Role)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -834,6 +846,11 @@ func (m *Node) MarshalTo(data []byte) (int, error) { return 0, err } i += n10 + if m.Role != 0 { + data[i] = 0x48 + i++ + i = encodeVarintObjects(data, i, uint64(m.Role)) + } return i, nil } @@ -1451,6 +1468,9 @@ func (m *Node) Size() (n int) { } l = m.Certificate.Size() n += 1 + l + sovObjects(uint64(l)) + if m.Role != 0 { + n += 1 + sovObjects(uint64(m.Role)) + } return n } @@ -1707,6 +1727,7 @@ func (this *Node) String() string { `ManagerStatus:` + strings.Replace(fmt.Sprintf("%v", this.ManagerStatus), "ManagerStatus", "ManagerStatus", 1) + `,`, `Attachment:` + strings.Replace(fmt.Sprintf("%v", this.Attachment), "NetworkAttachment", "NetworkAttachment", 1) + `,`, `Certificate:` + strings.Replace(strings.Replace(this.Certificate.String(), "Certificate", "Certificate", 1), `&`, ``, 1) + `,`, + `Role:` + fmt.Sprintf("%v", this.Role) + `,`, `}`, }, "") return s @@ -2268,6 +2289,25 @@ func (m *Node) Unmarshal(data []byte) error { return err } iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + } + m.Role = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowObjects + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + m.Role |= (NodeRole(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipObjects(data[iNdEx:]) @@ -4186,78 +4226,79 @@ var ( func init() { proto.RegisterFile("objects.proto", fileDescriptorObjects) } var fileDescriptorObjects = []byte{ - // 1161 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xbc, 0x57, 0x4d, 0x8f, 0x1b, 0x35, - 0x18, 0xee, 0x24, 0xb3, 0xf9, 0x78, 0xb3, 0x59, 0x81, 0xa9, 0xca, 0x34, 0x2c, 0xc9, 0x92, 0x0a, - 0x54, 0xa1, 0x2a, 0x15, 0xa5, 0xa0, 0x2d, 0xb4, 0x82, 0x7c, 0x09, 0xa2, 0x52, 0xa8, 0xdc, 0xb2, - 0x3d, 0x46, 0xde, 0x19, 0x37, 0x0c, 0x99, 0x8c, 0x47, 0xb6, 0x93, 0x2a, 0x37, 0xc4, 0x0f, 0xe0, - 0x27, 0x20, 0xce, 0xfc, 0x09, 0xae, 0x7b, 0xe0, 0xc0, 0x0d, 0x4e, 0x11, 0x9b, 0x1b, 0x37, 0x7e, - 0x02, 0xb2, 0xc7, 0x93, 0xcc, 0x2a, 0x93, 0x65, 0x2b, 0x55, 0x7b, 0xb3, 0xe3, 0xe7, 0x79, 0xde, - 0xd7, 0xaf, 0x1f, 0xbf, 0xe3, 0x40, 0x95, 0x1d, 0x7f, 0x4f, 0x5d, 0x29, 0x5a, 0x11, 0x67, 0x92, - 0x21, 0xe4, 0x31, 0x77, 0x4c, 0x79, 0x4b, 0xbc, 0x20, 0x7c, 0x32, 0xf6, 0x65, 0x6b, 0xf6, 0x41, - 0xad, 0x22, 0xe7, 0x11, 0x35, 0x80, 0x5a, 0x45, 0x44, 0xd4, 0x4d, 0x26, 0xd7, 0xa5, 0x3f, 0xa1, - 0x42, 0x92, 0x49, 0x74, 0x7b, 0x35, 0x32, 0x4b, 0x57, 0x47, 0x6c, 0xc4, 0xf4, 0xf0, 0xb6, 0x1a, - 0xc5, 0xbf, 0x36, 0x7f, 0xb3, 0xc0, 0x7e, 0x44, 0x25, 0x41, 0x9f, 0x42, 0x71, 0x46, 0xb9, 0xf0, - 0x59, 0xe8, 0x58, 0x07, 0xd6, 0xcd, 0xca, 0x9d, 0xb7, 0x5a, 0x9b, 0x91, 0x5b, 0x47, 0x31, 0xa4, - 0x63, 0x9f, 0x2c, 0x1a, 0x57, 0x70, 0xc2, 0x40, 0xf7, 0x01, 0x5c, 0x4e, 0x89, 0xa4, 0xde, 0x90, - 0x48, 0x27, 0xa7, 0xf9, 0x6f, 0x67, 0xf1, 0x9f, 0x26, 0x49, 0xe1, 0xb2, 0x21, 0xb4, 0xa5, 0x62, - 0x4f, 0x23, 0x2f, 0x61, 0xe7, 0x2f, 0xc4, 0x36, 0x84, 0xb6, 0x6c, 0xfe, 0x93, 0x07, 0xfb, 0x6b, - 0xe6, 0x51, 0x74, 0x0d, 0x72, 0xbe, 0xa7, 0x93, 0x2f, 0x77, 0x0a, 0xcb, 0x45, 0x23, 0x37, 0xe8, - 0xe1, 0x9c, 0xef, 0xa1, 0x3b, 0x60, 0x4f, 0xa8, 0x24, 0x26, 0x2d, 0x27, 0x4b, 0x58, 0x55, 0xc0, - 0xec, 0x49, 0x63, 0xd1, 0xc7, 0x60, 0xab, 0xb2, 0x9a, 0x64, 0xf6, 0xb3, 0x38, 0x2a, 0xe6, 0x93, - 0x88, 0xba, 0x09, 0x4f, 0xe1, 0x51, 0x1f, 0x2a, 0x1e, 0x15, 0x2e, 0xf7, 0x23, 0xa9, 0x2a, 0x69, - 0x6b, 0xfa, 0x8d, 0x6d, 0xf4, 0xde, 0x1a, 0x8a, 0xd3, 0x3c, 0x74, 0x1f, 0x0a, 0x42, 0x12, 0x39, - 0x15, 0xce, 0x8e, 0x56, 0xa8, 0x6f, 0x4d, 0x40, 0xa3, 0x4c, 0x0a, 0x86, 0x83, 0xbe, 0x84, 0xbd, - 0x09, 0x09, 0xc9, 0x88, 0xf2, 0xa1, 0x51, 0x29, 0x68, 0x95, 0x77, 0x32, 0xb7, 0x1e, 0x23, 0x63, - 0x21, 0x5c, 0x9d, 0xa4, 0xa7, 0xa8, 0x0f, 0x40, 0xa4, 0x24, 0xee, 0x77, 0x13, 0x1a, 0x4a, 0xa7, - 0xa8, 0x55, 0xde, 0xcd, 0xcc, 0x85, 0xca, 0x17, 0x8c, 0x8f, 0xdb, 0x2b, 0x30, 0x4e, 0x11, 0xd1, - 0x17, 0x50, 0x71, 0x29, 0x97, 0xfe, 0x73, 0xdf, 0x25, 0x92, 0x3a, 0x25, 0xad, 0xd3, 0xc8, 0xd2, - 0xe9, 0xae, 0x61, 0x66, 0x53, 0x69, 0x66, 0xf3, 0xcf, 0x1c, 0x14, 0x9f, 0x50, 0x3e, 0xf3, 0xdd, - 0x57, 0x7b, 0xdc, 0xf7, 0xce, 0x1c, 0x77, 0x66, 0x66, 0x26, 0xec, 0xc6, 0x89, 0x1f, 0x42, 0x89, - 0x86, 0x5e, 0xc4, 0xfc, 0x50, 0x9a, 0xe3, 0xce, 0x74, 0x4b, 0xdf, 0x60, 0xf0, 0x0a, 0x8d, 0xfa, - 0x50, 0x8d, 0x5d, 0x3c, 0x3c, 0x73, 0xd6, 0x07, 0x59, 0xf4, 0x6f, 0x35, 0xd0, 0x1c, 0xd2, 0xee, - 0x34, 0x35, 0x43, 0x3d, 0xa8, 0x46, 0x9c, 0xce, 0x7c, 0x36, 0x15, 0x43, 0xbd, 0x89, 0xc2, 0x85, - 0x36, 0x81, 0x77, 0x13, 0x96, 0x9a, 0x35, 0x7f, 0xce, 0x41, 0x29, 0xc9, 0x11, 0xdd, 0x35, 0xe5, - 0xb0, 0xb6, 0x27, 0x94, 0x60, 0xb5, 0x54, 0x5c, 0x89, 0xbb, 0xb0, 0x13, 0x31, 0x2e, 0x85, 0x93, - 0x3b, 0xc8, 0x6f, 0xf3, 0xec, 0x63, 0xc6, 0x65, 0x97, 0x85, 0xcf, 0xfd, 0x11, 0x8e, 0xc1, 0xe8, - 0x19, 0x54, 0x66, 0x3e, 0x97, 0x53, 0x12, 0x0c, 0xfd, 0x48, 0x38, 0x79, 0xcd, 0x7d, 0xef, 0xbc, - 0x90, 0xad, 0xa3, 0x18, 0x3f, 0x78, 0xdc, 0xd9, 0x5b, 0x2e, 0x1a, 0xb0, 0x9a, 0x0a, 0x0c, 0x46, - 0x6a, 0x10, 0x89, 0xda, 0x23, 0x28, 0xaf, 0x56, 0xd0, 0x2d, 0x80, 0x30, 0xb6, 0xe8, 0x70, 0x65, - 0x9a, 0xea, 0x72, 0xd1, 0x28, 0x1b, 0xe3, 0x0e, 0x7a, 0xb8, 0x6c, 0x00, 0x03, 0x0f, 0x21, 0xb0, - 0x89, 0xe7, 0x71, 0x6d, 0xa1, 0x32, 0xd6, 0xe3, 0xe6, 0xef, 0x3b, 0x60, 0x3f, 0x25, 0x62, 0x7c, - 0xd9, 0x6d, 0x46, 0xc5, 0xdc, 0x30, 0xdd, 0x2d, 0x00, 0x11, 0x1f, 0xa5, 0xda, 0x8e, 0xbd, 0xde, - 0x8e, 0x39, 0x60, 0xb5, 0x1d, 0x03, 0x88, 0xb7, 0x23, 0x02, 0x26, 0xb5, 0xbf, 0x6c, 0xac, 0xc7, - 0xe8, 0x06, 0x14, 0x43, 0xe6, 0x69, 0x7a, 0x41, 0xd3, 0x61, 0xb9, 0x68, 0x14, 0x54, 0x4b, 0x19, - 0xf4, 0x70, 0x41, 0x2d, 0x0d, 0x3c, 0x75, 0x6f, 0x49, 0x18, 0x32, 0x49, 0x54, 0x53, 0x12, 0xe6, - 0xfe, 0x67, 0x1a, 0xab, 0xbd, 0x86, 0x25, 0xf7, 0x36, 0xc5, 0x44, 0x47, 0xf0, 0x46, 0x92, 0x6f, - 0x5a, 0xb0, 0xf4, 0x32, 0x82, 0xc8, 0x28, 0xa4, 0x56, 0x52, 0x7d, 0xb2, 0xbc, 0xbd, 0x4f, 0xea, - 0x0a, 0x66, 0xf5, 0xc9, 0x0e, 0x54, 0x3d, 0x2a, 0x7c, 0x4e, 0x3d, 0x7d, 0x03, 0xa9, 0x03, 0x07, - 0xd6, 0xcd, 0xbd, 0x2d, 0x9f, 0x1e, 0x23, 0x42, 0xf1, 0xae, 0xe1, 0xe8, 0x19, 0x6a, 0x43, 0xc9, - 0xf8, 0x46, 0x38, 0x15, 0xed, 0xdd, 0x0b, 0xf6, 0xc7, 0x15, 0xed, 0x4c, 0x07, 0xd9, 0x7d, 0xa9, - 0x0e, 0x72, 0x0f, 0x20, 0x60, 0xa3, 0xa1, 0xc7, 0xfd, 0x19, 0xe5, 0x4e, 0x55, 0x73, 0x6b, 0x59, - 0xdc, 0x9e, 0x46, 0xe0, 0x72, 0xc0, 0x46, 0xf1, 0xb0, 0xf9, 0xa3, 0x05, 0xaf, 0x6f, 0x24, 0x85, - 0x3e, 0x82, 0xa2, 0x49, 0xeb, 0xbc, 0x47, 0x80, 0xe1, 0xe1, 0x04, 0x8b, 0xf6, 0xa1, 0xac, 0xee, - 0x08, 0x15, 0x82, 0xc6, 0xb7, 0xbf, 0x8c, 0xd7, 0x3f, 0x20, 0x07, 0x8a, 0x24, 0xf0, 0x89, 0x5a, - 0xcb, 0xeb, 0xb5, 0x64, 0xda, 0xfc, 0x29, 0x07, 0x45, 0x23, 0x76, 0xd9, 0xed, 0xdc, 0x84, 0xdd, - 0xb8, 0x59, 0x0f, 0x60, 0x37, 0x2e, 0xa7, 0xb1, 0x84, 0xfd, 0xbf, 0x45, 0xad, 0xc4, 0xf8, 0xd8, - 0x0e, 0x0f, 0xc0, 0xf6, 0x23, 0x32, 0x31, 0xad, 0x3c, 0x33, 0xf2, 0xe0, 0x71, 0xfb, 0xd1, 0x37, - 0x51, 0xec, 0xec, 0xd2, 0x72, 0xd1, 0xb0, 0xd5, 0x0f, 0x58, 0xd3, 0x9a, 0xbf, 0xec, 0x40, 0xb1, - 0x1b, 0x4c, 0x85, 0xa4, 0xfc, 0xb2, 0x0b, 0x62, 0xc2, 0x6e, 0x14, 0xa4, 0x0b, 0x45, 0xce, 0x98, - 0x1c, 0xba, 0xe4, 0xbc, 0x5a, 0x60, 0xc6, 0x64, 0xb7, 0xdd, 0xd9, 0x53, 0x44, 0xd5, 0x48, 0xe2, - 0x39, 0x2e, 0x28, 0x6a, 0x97, 0xa0, 0x67, 0x70, 0x2d, 0x69, 0xbf, 0xc7, 0x8c, 0x49, 0x21, 0x39, - 0x89, 0x86, 0x63, 0x3a, 0x57, 0xdf, 0xbc, 0xfc, 0xb6, 0x97, 0x49, 0x3f, 0x74, 0xf9, 0x5c, 0x17, - 0xea, 0x21, 0x9d, 0xe3, 0xab, 0x46, 0xa0, 0x93, 0xf0, 0x1f, 0xd2, 0xb9, 0x40, 0x9f, 0xc1, 0x3e, - 0x5d, 0xc1, 0x94, 0xe2, 0x30, 0x20, 0x13, 0xf5, 0x61, 0x19, 0xba, 0x01, 0x73, 0xc7, 0xba, 0xb7, - 0xd9, 0xf8, 0x3a, 0x4d, 0x4b, 0x7d, 0x15, 0x23, 0xba, 0x0a, 0x80, 0x04, 0x38, 0xc7, 0x01, 0x71, - 0xc7, 0x81, 0x2f, 0xd4, 0xfb, 0x33, 0xf5, 0xd8, 0x50, 0xed, 0x49, 0xe5, 0x76, 0x78, 0x4e, 0xb5, - 0x5a, 0x9d, 0x35, 0x37, 0xf5, 0x74, 0x11, 0xfd, 0x50, 0xf2, 0x39, 0x7e, 0xf3, 0x38, 0x7b, 0x15, - 0x75, 0xa0, 0x32, 0x0d, 0x55, 0xf8, 0xb8, 0x06, 0xe5, 0x8b, 0xd6, 0x00, 0x62, 0x96, 0xda, 0x79, - 0x6d, 0x06, 0xfb, 0xe7, 0x05, 0x47, 0xaf, 0x41, 0x7e, 0x4c, 0xe7, 0xb1, 0x7f, 0xb0, 0x1a, 0xa2, - 0xcf, 0x61, 0x67, 0x46, 0x82, 0x29, 0x35, 0xce, 0x79, 0x3f, 0x2b, 0x5e, 0xb6, 0x24, 0x8e, 0x89, - 0x9f, 0xe4, 0x0e, 0xad, 0xe6, 0xaf, 0x16, 0x14, 0x9e, 0x50, 0x97, 0x53, 0xf9, 0x4a, 0x1d, 0x7a, - 0x78, 0xc6, 0xa1, 0xf5, 0xec, 0xc7, 0x8b, 0x8a, 0xba, 0x61, 0xd0, 0x1a, 0x94, 0xfc, 0x50, 0x52, - 0x1e, 0x92, 0x40, 0x3b, 0xb4, 0x84, 0x57, 0xf3, 0xce, 0xfe, 0xc9, 0x69, 0xfd, 0xca, 0x5f, 0xa7, - 0xf5, 0x2b, 0xff, 0x9e, 0xd6, 0xad, 0x1f, 0x96, 0x75, 0xeb, 0x64, 0x59, 0xb7, 0xfe, 0x58, 0xd6, - 0xad, 0xbf, 0x97, 0x75, 0xeb, 0xb8, 0xa0, 0xff, 0x02, 0x7d, 0xf8, 0x5f, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x38, 0xf8, 0x23, 0xac, 0x72, 0x0d, 0x00, 0x00, + // 1176 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xbc, 0x57, 0xcf, 0x8e, 0x1b, 0x35, + 0x1c, 0xee, 0x64, 0x67, 0x93, 0xcc, 0x2f, 0x9b, 0x15, 0x98, 0xaa, 0x4c, 0x97, 0x6d, 0xb2, 0xa4, + 0x02, 0x55, 0xa8, 0x4a, 0xa1, 0x14, 0xb4, 0x85, 0x56, 0x90, 0x7f, 0x82, 0xa8, 0x14, 0x2a, 0xb7, + 0xb4, 0xc7, 0xc8, 0x3b, 0xe3, 0x86, 0x21, 0x93, 0xf1, 0xc8, 0x76, 0x52, 0xe5, 0x86, 0x78, 0x00, + 0x5e, 0x00, 0x09, 0x71, 0xe6, 0x25, 0xb8, 0xf6, 0xc0, 0x81, 0x1b, 0x9c, 0x22, 0x9a, 0x27, 0xe0, + 0x11, 0x90, 0x3d, 0x9e, 0x64, 0x56, 0x99, 0x84, 0xad, 0x54, 0xed, 0xcd, 0x8e, 0xbf, 0xef, 0xfb, + 0xfd, 0x99, 0xcf, 0xbf, 0xf5, 0x42, 0x95, 0x9d, 0x7c, 0x4f, 0x3d, 0x29, 0x9a, 0x31, 0x67, 0x92, + 0x21, 0xe4, 0x33, 0x6f, 0x44, 0x79, 0x53, 0x3c, 0x23, 0x7c, 0x3c, 0x0a, 0x64, 0x73, 0xfa, 0xc1, + 0x41, 0x45, 0xce, 0x62, 0x6a, 0x00, 0x07, 0x15, 0x11, 0x53, 0x2f, 0xdd, 0x5c, 0x96, 0xc1, 0x98, + 0x0a, 0x49, 0xc6, 0xf1, 0x8d, 0xe5, 0xca, 0x1c, 0x5d, 0x1c, 0xb2, 0x21, 0xd3, 0xcb, 0x1b, 0x6a, + 0x95, 0xfc, 0xda, 0xf8, 0xdd, 0x02, 0xfb, 0x3e, 0x95, 0x04, 0x7d, 0x0a, 0xa5, 0x29, 0xe5, 0x22, + 0x60, 0x91, 0x6b, 0x1d, 0x59, 0xd7, 0x2a, 0x37, 0xdf, 0x6a, 0xae, 0x47, 0x6e, 0x3e, 0x4e, 0x20, + 0x6d, 0xfb, 0xf9, 0xbc, 0x7e, 0x01, 0xa7, 0x0c, 0x74, 0x07, 0xc0, 0xe3, 0x94, 0x48, 0xea, 0x0f, + 0x88, 0x74, 0x0b, 0x9a, 0x7f, 0x25, 0x8f, 0xff, 0x28, 0x4d, 0x0a, 0x3b, 0x86, 0xd0, 0x92, 0x8a, + 0x3d, 0x89, 0xfd, 0x94, 0xbd, 0x73, 0x26, 0xb6, 0x21, 0xb4, 0x64, 0xe3, 0x67, 0x1b, 0xec, 0xaf, + 0x99, 0x4f, 0xd1, 0x25, 0x28, 0x04, 0xbe, 0x4e, 0xde, 0x69, 0x17, 0x17, 0xf3, 0x7a, 0xa1, 0xdf, + 0xc5, 0x85, 0xc0, 0x47, 0x37, 0xc1, 0x1e, 0x53, 0x49, 0x4c, 0x5a, 0x6e, 0x9e, 0xb0, 0xea, 0x80, + 0xa9, 0x49, 0x63, 0xd1, 0xc7, 0x60, 0xab, 0xb6, 0x9a, 0x64, 0x0e, 0xf3, 0x38, 0x2a, 0xe6, 0xc3, + 0x98, 0x7a, 0x29, 0x4f, 0xe1, 0x51, 0x0f, 0x2a, 0x3e, 0x15, 0x1e, 0x0f, 0x62, 0xa9, 0x3a, 0x69, + 0x6b, 0xfa, 0xd5, 0x4d, 0xf4, 0xee, 0x0a, 0x8a, 0xb3, 0x3c, 0x74, 0x07, 0x8a, 0x42, 0x12, 0x39, + 0x11, 0xee, 0xae, 0x56, 0xa8, 0x6d, 0x4c, 0x40, 0xa3, 0x4c, 0x0a, 0x86, 0x83, 0xbe, 0x84, 0xfd, + 0x31, 0x89, 0xc8, 0x90, 0xf2, 0x81, 0x51, 0x29, 0x6a, 0x95, 0xb7, 0x73, 0x4b, 0x4f, 0x90, 0x89, + 0x10, 0xae, 0x8e, 0xb3, 0x5b, 0xd4, 0x03, 0x20, 0x52, 0x12, 0xef, 0xbb, 0x31, 0x8d, 0xa4, 0x5b, + 0xd2, 0x2a, 0xef, 0xe4, 0xe6, 0x42, 0xe5, 0x33, 0xc6, 0x47, 0xad, 0x25, 0x18, 0x67, 0x88, 0xe8, + 0x0b, 0xa8, 0x78, 0x94, 0xcb, 0xe0, 0x69, 0xe0, 0x11, 0x49, 0xdd, 0xb2, 0xd6, 0xa9, 0xe7, 0xe9, + 0x74, 0x56, 0x30, 0x53, 0x54, 0x96, 0x89, 0xde, 0x07, 0x9b, 0xb3, 0x90, 0xba, 0xce, 0x91, 0x75, + 0x6d, 0x7f, 0xf3, 0x67, 0xc1, 0x2c, 0xa4, 0x58, 0x23, 0x1b, 0x7f, 0x15, 0xa0, 0xf4, 0x90, 0xf2, + 0x69, 0xe0, 0xbd, 0x5a, 0x83, 0xdc, 0x3e, 0x65, 0x90, 0xdc, 0x5a, 0x4c, 0xd8, 0x35, 0x8f, 0x1c, + 0x43, 0x99, 0x46, 0x7e, 0xcc, 0x82, 0x48, 0x1a, 0x83, 0xe4, 0x16, 0xd2, 0x33, 0x18, 0xbc, 0x44, + 0xa3, 0x1e, 0x54, 0x13, 0xdf, 0x0f, 0x4e, 0xb9, 0xe3, 0x28, 0x8f, 0xfe, 0xad, 0x06, 0x9a, 0xcf, + 0xba, 0x37, 0xc9, 0xec, 0x50, 0x17, 0xaa, 0x31, 0xa7, 0xd3, 0x80, 0x4d, 0xc4, 0x40, 0x17, 0x51, + 0x3c, 0x53, 0x11, 0x78, 0x2f, 0x65, 0xa9, 0x5d, 0xe3, 0x97, 0x02, 0x94, 0xd3, 0x1c, 0xd1, 0x2d, + 0xd3, 0x0e, 0x6b, 0x73, 0x42, 0x29, 0x56, 0x4b, 0x25, 0x9d, 0xb8, 0x05, 0xbb, 0x31, 0xe3, 0x52, + 0xb8, 0x85, 0xa3, 0x9d, 0x4d, 0x2e, 0x7f, 0xc0, 0xb8, 0xec, 0xb0, 0xe8, 0x69, 0x30, 0xc4, 0x09, + 0x18, 0x3d, 0x81, 0xca, 0x34, 0xe0, 0x72, 0x42, 0xc2, 0x41, 0x10, 0x0b, 0x77, 0x47, 0x73, 0xdf, + 0xdd, 0x16, 0xb2, 0xf9, 0x38, 0xc1, 0xf7, 0x1f, 0xb4, 0xf7, 0x17, 0xf3, 0x3a, 0x2c, 0xb7, 0x02, + 0x83, 0x91, 0xea, 0xc7, 0xe2, 0xe0, 0x3e, 0x38, 0xcb, 0x13, 0x74, 0x1d, 0x20, 0x4a, 0x4c, 0x3d, + 0x58, 0x9a, 0xa6, 0xba, 0x98, 0xd7, 0x1d, 0x63, 0xf5, 0x7e, 0x17, 0x3b, 0x06, 0xd0, 0xf7, 0x11, + 0x02, 0x9b, 0xf8, 0x3e, 0xd7, 0x16, 0x72, 0xb0, 0x5e, 0x37, 0xfe, 0xd8, 0x05, 0xfb, 0x11, 0x11, + 0xa3, 0xf3, 0x1e, 0x4c, 0x2a, 0xe6, 0x9a, 0xe9, 0xae, 0x03, 0x88, 0xe4, 0x53, 0xaa, 0x72, 0xec, + 0x55, 0x39, 0xe6, 0x03, 0xab, 0x72, 0x0c, 0x20, 0x29, 0x47, 0x84, 0x4c, 0x6a, 0x7f, 0xd9, 0x58, + 0xaf, 0xd1, 0x55, 0x28, 0x45, 0xcc, 0xd7, 0xf4, 0xa2, 0xa6, 0xc3, 0x62, 0x5e, 0x2f, 0xaa, 0xeb, + 0xd6, 0xef, 0xe2, 0xa2, 0x3a, 0xea, 0xfb, 0xea, 0xa6, 0x93, 0x28, 0x62, 0x92, 0xa8, 0x31, 0x26, + 0xcc, 0xc4, 0xc8, 0x35, 0x56, 0x6b, 0x05, 0x4b, 0x6f, 0x7a, 0x86, 0x89, 0x1e, 0xc3, 0x1b, 0x69, + 0xbe, 0x59, 0xc1, 0xf2, 0xcb, 0x08, 0x22, 0xa3, 0x90, 0x39, 0xc9, 0x4c, 0x56, 0x67, 0xf3, 0x64, + 0xd5, 0x1d, 0xcc, 0x9b, 0xac, 0x6d, 0xa8, 0xfa, 0x54, 0x04, 0x9c, 0xfa, 0xfa, 0x06, 0x52, 0x17, + 0xf4, 0x20, 0xba, 0xb2, 0x4d, 0x84, 0xe2, 0x3d, 0xc3, 0xd1, 0x3b, 0xd4, 0x82, 0xb2, 0xf1, 0x8d, + 0x70, 0x2b, 0xda, 0xbb, 0x67, 0x9c, 0xa8, 0x4b, 0xda, 0xa9, 0x09, 0xb2, 0xf7, 0x52, 0x13, 0xe4, + 0x36, 0x40, 0xc8, 0x86, 0x03, 0x9f, 0x07, 0x53, 0xca, 0xdd, 0xaa, 0xe6, 0x1e, 0xe4, 0x71, 0xbb, + 0x1a, 0x81, 0x9d, 0x90, 0x0d, 0x93, 0x65, 0xe3, 0x47, 0x0b, 0x5e, 0x5f, 0x4b, 0x0a, 0x7d, 0x04, + 0x25, 0x93, 0xd6, 0xb6, 0x67, 0x83, 0xe1, 0xe1, 0x14, 0x8b, 0x0e, 0xc1, 0x51, 0x77, 0x84, 0x0a, + 0x41, 0x93, 0xdb, 0xef, 0xe0, 0xd5, 0x0f, 0xc8, 0x85, 0x12, 0x09, 0x03, 0xa2, 0xce, 0x76, 0xf4, + 0x59, 0xba, 0x6d, 0xfc, 0x54, 0x80, 0x92, 0x11, 0x3b, 0xef, 0x71, 0x6e, 0xc2, 0xae, 0xdd, 0xac, + 0xbb, 0xb0, 0x97, 0xb4, 0xd3, 0x58, 0xc2, 0xfe, 0xdf, 0xa6, 0x56, 0x12, 0x7c, 0x62, 0x87, 0xbb, + 0x60, 0x07, 0x31, 0x19, 0x9b, 0x51, 0x9e, 0x1b, 0xb9, 0xff, 0xa0, 0x75, 0xff, 0x9b, 0x38, 0x71, + 0x76, 0x79, 0x31, 0xaf, 0xdb, 0xea, 0x07, 0xac, 0x69, 0x8d, 0x5f, 0x77, 0xa1, 0xd4, 0x09, 0x27, + 0x42, 0x52, 0x7e, 0xde, 0x0d, 0x31, 0x61, 0xd7, 0x1a, 0xd2, 0x81, 0x12, 0x67, 0x4c, 0x0e, 0x3c, + 0xb2, 0xad, 0x17, 0x98, 0x31, 0xd9, 0x69, 0xb5, 0xf7, 0x15, 0x51, 0x0d, 0x92, 0x64, 0x8f, 0x8b, + 0x8a, 0xda, 0x21, 0xe8, 0x09, 0x5c, 0x4a, 0xc7, 0xef, 0x09, 0x63, 0x52, 0x48, 0x4e, 0xe2, 0xc1, + 0x88, 0xce, 0xd4, 0xdf, 0xbc, 0x9d, 0x4d, 0x6f, 0x99, 0x5e, 0xe4, 0xf1, 0x99, 0x6e, 0xd4, 0x3d, + 0x3a, 0xc3, 0x17, 0x8d, 0x40, 0x3b, 0xe5, 0xdf, 0xa3, 0x33, 0x81, 0x3e, 0x83, 0x43, 0xba, 0x84, + 0x29, 0xc5, 0x41, 0x48, 0xc6, 0xea, 0x0f, 0xcb, 0xc0, 0x0b, 0x99, 0x37, 0xd2, 0xb3, 0xcd, 0xc6, + 0x97, 0x69, 0x56, 0xea, 0xab, 0x04, 0xd1, 0x51, 0x00, 0x24, 0xc0, 0x3d, 0x09, 0x89, 0x37, 0x0a, + 0x03, 0xa1, 0x5e, 0xac, 0x99, 0xe7, 0x89, 0x1a, 0x4f, 0x2a, 0xb7, 0xe3, 0x2d, 0xdd, 0x6a, 0xb6, + 0x57, 0xdc, 0xcc, 0x63, 0x47, 0xf4, 0x22, 0xc9, 0x67, 0xf8, 0xcd, 0x93, 0xfc, 0x53, 0xd4, 0x86, + 0xca, 0x24, 0x52, 0xe1, 0x93, 0x1e, 0x38, 0x67, 0xed, 0x01, 0x24, 0x2c, 0x55, 0xf9, 0xc1, 0x14, + 0x0e, 0xb7, 0x05, 0x47, 0xaf, 0xc1, 0xce, 0x88, 0xce, 0x12, 0xff, 0x60, 0xb5, 0x44, 0x9f, 0xc3, + 0xee, 0x94, 0x84, 0x13, 0x6a, 0x9c, 0xf3, 0x5e, 0x5e, 0xbc, 0x7c, 0x49, 0x9c, 0x10, 0x3f, 0x29, + 0x1c, 0x5b, 0x8d, 0xdf, 0x2c, 0x28, 0x3e, 0xa4, 0x1e, 0xa7, 0xf2, 0x95, 0x3a, 0xf4, 0xf8, 0x94, + 0x43, 0x6b, 0xf9, 0x8f, 0x17, 0x15, 0x75, 0xcd, 0xa0, 0x07, 0x50, 0x0e, 0x22, 0x49, 0x79, 0x44, + 0x42, 0xed, 0xd0, 0x32, 0x5e, 0xee, 0xdb, 0x87, 0xcf, 0x5f, 0xd4, 0x2e, 0xfc, 0xfd, 0xa2, 0x76, + 0xe1, 0xdf, 0x17, 0x35, 0xeb, 0x87, 0x45, 0xcd, 0x7a, 0xbe, 0xa8, 0x59, 0x7f, 0x2e, 0x6a, 0xd6, + 0x3f, 0x8b, 0x9a, 0x75, 0x52, 0xd4, 0xff, 0x34, 0x7d, 0xf8, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x9f, 0x52, 0xfb, 0x4a, 0xa4, 0x0d, 0x00, 0x00, } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/objects.proto b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/objects.proto index fb1528547..528d97b04 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/objects.proto +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/objects.proto @@ -48,6 +48,17 @@ message Node { // Certificate is the TLS certificate issued for the node, if any. Certificate certificate = 8 [(gogoproto.nullable) = false]; + + // Role is the *observed* role for this node. It differs from the + // desired role set in Node.Spec.Role because the role here is only + // updated after the Raft member list has been reconciled with the + // desired role from the spec. + // + // This field represents the current reconciled state. If an action is + // to be performed, first verify the role in the cert. This field only + // shows the privilege level that the CA would currently grant when + // issuing or renewing the node's certificate. + NodeRole role = 9; } message Service { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/raft.pb.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/raft.pb.go index e824d66a9..8a96952f7 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/raft.pb.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/raft.pb.go @@ -1498,12 +1498,12 @@ func encodeVarintRaft(data []byte, offset int, v uint64) int { } type raftProxyRaftServer struct { - local RaftServer - connSelector raftselector.ConnProvider - ctxMods []func(context.Context) (context.Context, error) + local RaftServer + connSelector raftselector.ConnProvider + localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error) } -func NewRaftProxyRaftServer(local RaftServer, connSelector raftselector.ConnProvider, ctxMod func(context.Context) (context.Context, error)) RaftServer { +func NewRaftProxyRaftServer(local RaftServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) RaftServer { redirectChecker := func(ctx context.Context) (context.Context, error) { s, ok := transport.StreamFromContext(ctx) if !ok { @@ -1520,18 +1520,24 @@ func NewRaftProxyRaftServer(local RaftServer, connSelector raftselector.ConnProv md["redirect"] = append(md["redirect"], addr) return metadata.NewContext(ctx, md), nil } - mods := []func(context.Context) (context.Context, error){redirectChecker} - mods = append(mods, ctxMod) + remoteMods := []func(context.Context) (context.Context, error){redirectChecker} + remoteMods = append(remoteMods, remoteCtxMod) + + var localMods []func(context.Context) (context.Context, error) + if localCtxMod != nil { + localMods = []func(context.Context) (context.Context, error){localCtxMod} + } return &raftProxyRaftServer{ - local: local, - connSelector: connSelector, - ctxMods: mods, + local: local, + connSelector: connSelector, + localCtxMods: localMods, + remoteCtxMods: remoteMods, } } -func (p *raftProxyRaftServer) runCtxMods(ctx context.Context) (context.Context, error) { +func (p *raftProxyRaftServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) { var err error - for _, mod := range p.ctxMods { + for _, mod := range ctxMods { ctx, err = mod(ctx) if err != nil { return ctx, err @@ -1568,11 +1574,15 @@ func (p *raftProxyRaftServer) ProcessRaftMessage(ctx context.Context, r *Process conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.ProcessRaftMessage(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -1599,11 +1609,15 @@ func (p *raftProxyRaftServer) ResolveAddress(ctx context.Context, r *ResolveAddr conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.ResolveAddress(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -1626,12 +1640,12 @@ func (p *raftProxyRaftServer) ResolveAddress(ctx context.Context, r *ResolveAddr } type raftProxyRaftMembershipServer struct { - local RaftMembershipServer - connSelector raftselector.ConnProvider - ctxMods []func(context.Context) (context.Context, error) + local RaftMembershipServer + connSelector raftselector.ConnProvider + localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error) } -func NewRaftProxyRaftMembershipServer(local RaftMembershipServer, connSelector raftselector.ConnProvider, ctxMod func(context.Context) (context.Context, error)) RaftMembershipServer { +func NewRaftProxyRaftMembershipServer(local RaftMembershipServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) RaftMembershipServer { redirectChecker := func(ctx context.Context) (context.Context, error) { s, ok := transport.StreamFromContext(ctx) if !ok { @@ -1648,18 +1662,24 @@ func NewRaftProxyRaftMembershipServer(local RaftMembershipServer, connSelector r md["redirect"] = append(md["redirect"], addr) return metadata.NewContext(ctx, md), nil } - mods := []func(context.Context) (context.Context, error){redirectChecker} - mods = append(mods, ctxMod) + remoteMods := []func(context.Context) (context.Context, error){redirectChecker} + remoteMods = append(remoteMods, remoteCtxMod) + + var localMods []func(context.Context) (context.Context, error) + if localCtxMod != nil { + localMods = []func(context.Context) (context.Context, error){localCtxMod} + } return &raftProxyRaftMembershipServer{ - local: local, - connSelector: connSelector, - ctxMods: mods, + local: local, + connSelector: connSelector, + localCtxMods: localMods, + remoteCtxMods: remoteMods, } } -func (p *raftProxyRaftMembershipServer) runCtxMods(ctx context.Context) (context.Context, error) { +func (p *raftProxyRaftMembershipServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) { var err error - for _, mod := range p.ctxMods { + for _, mod := range ctxMods { ctx, err = mod(ctx) if err != nil { return ctx, err @@ -1696,11 +1716,15 @@ func (p *raftProxyRaftMembershipServer) Join(ctx context.Context, r *JoinRequest conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.Join(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -1727,11 +1751,15 @@ func (p *raftProxyRaftMembershipServer) Leave(ctx context.Context, r *LeaveReque conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.Leave(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/resource.pb.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/resource.pb.go index 52d1e4e4a..a764a6cce 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/resource.pb.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/resource.pb.go @@ -451,12 +451,12 @@ func encodeVarintResource(data []byte, offset int, v uint64) int { } type raftProxyResourceAllocatorServer struct { - local ResourceAllocatorServer - connSelector raftselector.ConnProvider - ctxMods []func(context.Context) (context.Context, error) + local ResourceAllocatorServer + connSelector raftselector.ConnProvider + localCtxMods, remoteCtxMods []func(context.Context) (context.Context, error) } -func NewRaftProxyResourceAllocatorServer(local ResourceAllocatorServer, connSelector raftselector.ConnProvider, ctxMod func(context.Context) (context.Context, error)) ResourceAllocatorServer { +func NewRaftProxyResourceAllocatorServer(local ResourceAllocatorServer, connSelector raftselector.ConnProvider, localCtxMod, remoteCtxMod func(context.Context) (context.Context, error)) ResourceAllocatorServer { redirectChecker := func(ctx context.Context) (context.Context, error) { s, ok := transport.StreamFromContext(ctx) if !ok { @@ -473,18 +473,24 @@ func NewRaftProxyResourceAllocatorServer(local ResourceAllocatorServer, connSele md["redirect"] = append(md["redirect"], addr) return metadata.NewContext(ctx, md), nil } - mods := []func(context.Context) (context.Context, error){redirectChecker} - mods = append(mods, ctxMod) + remoteMods := []func(context.Context) (context.Context, error){redirectChecker} + remoteMods = append(remoteMods, remoteCtxMod) + + var localMods []func(context.Context) (context.Context, error) + if localCtxMod != nil { + localMods = []func(context.Context) (context.Context, error){localCtxMod} + } return &raftProxyResourceAllocatorServer{ - local: local, - connSelector: connSelector, - ctxMods: mods, + local: local, + connSelector: connSelector, + localCtxMods: localMods, + remoteCtxMods: remoteMods, } } -func (p *raftProxyResourceAllocatorServer) runCtxMods(ctx context.Context) (context.Context, error) { +func (p *raftProxyResourceAllocatorServer) runCtxMods(ctx context.Context, ctxMods []func(context.Context) (context.Context, error)) (context.Context, error) { var err error - for _, mod := range p.ctxMods { + for _, mod := range ctxMods { ctx, err = mod(ctx) if err != nil { return ctx, err @@ -521,11 +527,15 @@ func (p *raftProxyResourceAllocatorServer) AttachNetwork(ctx context.Context, r conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.AttachNetwork(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } @@ -552,11 +562,15 @@ func (p *raftProxyResourceAllocatorServer) DetachNetwork(ctx context.Context, r conn, err := p.connSelector.LeaderConn(ctx) if err != nil { if err == raftselector.ErrIsLeader { + ctx, err = p.runCtxMods(ctx, p.localCtxMods) + if err != nil { + return nil, err + } return p.local.DetachNetwork(ctx, r) } return nil, err } - modCtx, err := p.runCtxMods(ctx) + modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/specs.pb.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/specs.pb.go index 3ad85df73..efe7d1a14 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/specs.pb.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/specs.pb.go @@ -112,8 +112,8 @@ func (EndpointSpec_ResolutionMode) EnumDescriptor() ([]byte, []int) { type NodeSpec struct { Annotations Annotations `protobuf:"bytes,1,opt,name=annotations" json:"annotations"` - // Role defines the role the node should have. - Role NodeRole `protobuf:"varint,2,opt,name=role,proto3,enum=docker.swarmkit.v1.NodeRole" json:"role,omitempty"` + // DesiredRole defines the role the node should have. + DesiredRole NodeRole `protobuf:"varint,2,opt,name=desired_role,json=desiredRole,proto3,enum=docker.swarmkit.v1.NodeRole" json:"desired_role,omitempty"` // Membership controls the admission of the node into the cluster. Membership NodeSpec_Membership `protobuf:"varint,3,opt,name=membership,proto3,enum=docker.swarmkit.v1.NodeSpec_Membership" json:"membership,omitempty"` // Availability allows a user to control the current scheduling status of a @@ -645,7 +645,7 @@ func (m *NodeSpec) Copy() *NodeSpec { o := &NodeSpec{ Annotations: *m.Annotations.Copy(), - Role: m.Role, + DesiredRole: m.DesiredRole, Membership: m.Membership, Availability: m.Availability, } @@ -941,7 +941,7 @@ func (this *NodeSpec) GoString() string { s := make([]string, 0, 8) s = append(s, "&api.NodeSpec{") s = append(s, "Annotations: "+strings.Replace(this.Annotations.GoString(), `&`, ``, 1)+",\n") - s = append(s, "Role: "+fmt.Sprintf("%#v", this.Role)+",\n") + s = append(s, "DesiredRole: "+fmt.Sprintf("%#v", this.DesiredRole)+",\n") s = append(s, "Membership: "+fmt.Sprintf("%#v", this.Membership)+",\n") s = append(s, "Availability: "+fmt.Sprintf("%#v", this.Availability)+",\n") s = append(s, "}") @@ -1241,10 +1241,10 @@ func (m *NodeSpec) MarshalTo(data []byte) (int, error) { return 0, err } i += n1 - if m.Role != 0 { + if m.DesiredRole != 0 { data[i] = 0x10 i++ - i = encodeVarintSpecs(data, i, uint64(m.Role)) + i = encodeVarintSpecs(data, i, uint64(m.DesiredRole)) } if m.Membership != 0 { data[i] = 0x18 @@ -2106,8 +2106,8 @@ func (m *NodeSpec) Size() (n int) { _ = l l = m.Annotations.Size() n += 1 + l + sovSpecs(uint64(l)) - if m.Role != 0 { - n += 1 + sovSpecs(uint64(m.Role)) + if m.DesiredRole != 0 { + n += 1 + sovSpecs(uint64(m.DesiredRole)) } if m.Membership != 0 { n += 1 + sovSpecs(uint64(m.Membership)) @@ -2461,7 +2461,7 @@ func (this *NodeSpec) String() string { } s := strings.Join([]string{`&NodeSpec{`, `Annotations:` + strings.Replace(strings.Replace(this.Annotations.String(), "Annotations", "Annotations", 1), `&`, ``, 1) + `,`, - `Role:` + fmt.Sprintf("%v", this.Role) + `,`, + `DesiredRole:` + fmt.Sprintf("%v", this.DesiredRole) + `,`, `Membership:` + fmt.Sprintf("%v", this.Membership) + `,`, `Availability:` + fmt.Sprintf("%v", this.Availability) + `,`, `}`, @@ -2750,9 +2750,9 @@ func (m *NodeSpec) Unmarshal(data []byte) error { iNdEx = postIndex case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Role", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DesiredRole", wireType) } - m.Role = 0 + m.DesiredRole = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowSpecs @@ -2762,7 +2762,7 @@ func (m *NodeSpec) Unmarshal(data []byte) error { } b := data[iNdEx] iNdEx++ - m.Role |= (NodeRole(b) & 0x7F) << shift + m.DesiredRole |= (NodeRole(b) & 0x7F) << shift if b < 0x80 { break } @@ -5283,108 +5283,108 @@ var ( func init() { proto.RegisterFile("specs.proto", fileDescriptorSpecs) } var fileDescriptorSpecs = []byte{ - // 1640 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x57, 0xdd, 0x72, 0xdb, 0xc6, - 0x15, 0x26, 0x24, 0x8a, 0x3f, 0x07, 0x94, 0x4d, 0xed, 0xe4, 0x07, 0x66, 0x12, 0x8a, 0x66, 0xdc, - 0x54, 0x69, 0xa6, 0x72, 0xab, 0x76, 0x52, 0xa7, 0x6e, 0xa6, 0x25, 0x45, 0x56, 0x56, 0x55, 0x29, - 0x9c, 0x95, 0xe2, 0x8e, 0xaf, 0x38, 0x2b, 0x60, 0x45, 0x62, 0x04, 0x62, 0xd1, 0xdd, 0x05, 0x33, - 0xbc, 0xeb, 0x65, 0xc6, 0x17, 0x7d, 0x03, 0x5f, 0xf5, 0x19, 0xfa, 0x0e, 0xbe, 0xec, 0x65, 0x7b, - 0xa3, 0xa9, 0xf9, 0x04, 0x9d, 0xe9, 0x03, 0xb4, 0xb3, 0x8b, 0x05, 0x08, 0x26, 0x50, 0x9c, 0x99, - 0xf8, 0x6e, 0xf7, 0xe0, 0xfb, 0x0e, 0xce, 0x9e, 0xfd, 0x70, 0xce, 0x01, 0xd8, 0x22, 0xa2, 0xae, - 0xd8, 0x8f, 0x38, 0x93, 0x0c, 0x21, 0x8f, 0xb9, 0xd7, 0x94, 0xef, 0x8b, 0xaf, 0x08, 0x9f, 0x5d, - 0xfb, 0x72, 0x7f, 0xfe, 0xf3, 0x96, 0x2d, 0x17, 0x11, 0x35, 0x80, 0xd6, 0x5b, 0x13, 0x36, 0x61, - 0x7a, 0xf9, 0x50, 0xad, 0x8c, 0xf5, 0x5d, 0x2f, 0xe6, 0x44, 0xfa, 0x2c, 0x7c, 0x98, 0x2e, 0x92, - 0x07, 0xdd, 0xbf, 0x96, 0xa1, 0x76, 0xc6, 0x3c, 0x7a, 0x1e, 0x51, 0x17, 0x1d, 0x81, 0x4d, 0xc2, - 0x90, 0x49, 0x0d, 0x10, 0x8e, 0xd5, 0xb1, 0xf6, 0xec, 0x83, 0xdd, 0xfd, 0x6f, 0xbf, 0x72, 0xbf, - 0xb7, 0x82, 0xf5, 0xcb, 0x2f, 0x6f, 0x76, 0x4b, 0x38, 0xcf, 0x44, 0x3f, 0x83, 0x32, 0x67, 0x01, - 0x75, 0x36, 0x3a, 0xd6, 0xde, 0x9d, 0x83, 0xf7, 0x8b, 0x3c, 0xa8, 0x97, 0x62, 0x16, 0x50, 0xac, - 0x91, 0xe8, 0x08, 0x60, 0x46, 0x67, 0x97, 0x94, 0x8b, 0xa9, 0x1f, 0x39, 0x9b, 0x9a, 0xf7, 0xe3, - 0xdb, 0x78, 0x2a, 0xd8, 0xfd, 0xd3, 0x0c, 0x8e, 0x73, 0x54, 0x74, 0x0a, 0x0d, 0x32, 0x27, 0x7e, - 0x40, 0x2e, 0xfd, 0xc0, 0x97, 0x0b, 0xa7, 0xac, 0x5d, 0x7d, 0xfc, 0x9d, 0xae, 0x7a, 0x39, 0x02, - 0x5e, 0xa3, 0x77, 0x3d, 0x80, 0xd5, 0x8b, 0xd0, 0x47, 0x50, 0x1d, 0x0d, 0xcf, 0x06, 0xc7, 0x67, - 0x47, 0xcd, 0x52, 0xeb, 0xde, 0xf3, 0x17, 0x9d, 0xb7, 0x95, 0x8f, 0x15, 0x60, 0x44, 0x43, 0xcf, - 0x0f, 0x27, 0x68, 0x0f, 0x6a, 0xbd, 0xc3, 0xc3, 0xe1, 0xe8, 0x62, 0x38, 0x68, 0x5a, 0xad, 0xd6, - 0xf3, 0x17, 0x9d, 0x77, 0xd6, 0x81, 0x3d, 0xd7, 0xa5, 0x91, 0xa4, 0x5e, 0xab, 0xfc, 0xf5, 0xdf, - 0xda, 0xa5, 0xee, 0xd7, 0x16, 0x34, 0xf2, 0x41, 0xa0, 0x8f, 0xa0, 0xd2, 0x3b, 0xbc, 0x38, 0x7e, - 0x3a, 0x6c, 0x96, 0x56, 0xf4, 0x3c, 0xa2, 0xe7, 0x4a, 0x7f, 0x4e, 0xd1, 0x03, 0xd8, 0x1a, 0xf5, - 0xbe, 0x3c, 0x1f, 0x36, 0xad, 0x55, 0x38, 0x79, 0xd8, 0x88, 0xc4, 0x42, 0xa3, 0x06, 0xb8, 0x77, - 0x7c, 0xd6, 0xdc, 0x28, 0x46, 0x0d, 0x38, 0xf1, 0x43, 0x13, 0xca, 0xab, 0x4d, 0xb0, 0xcf, 0x29, - 0x9f, 0xfb, 0xee, 0x1b, 0xd6, 0xc4, 0xa7, 0x50, 0x96, 0x44, 0x5c, 0x6b, 0x4d, 0xd8, 0xc5, 0x9a, - 0xb8, 0x20, 0xe2, 0x5a, 0xbd, 0xd4, 0xd0, 0x35, 0x5e, 0x29, 0x83, 0xd3, 0x28, 0xf0, 0x5d, 0x22, - 0xa9, 0xa7, 0x95, 0x61, 0x1f, 0xfc, 0xa8, 0x88, 0x8d, 0x33, 0x94, 0x89, 0xff, 0x49, 0x09, 0xe7, - 0xa8, 0xe8, 0x31, 0x54, 0x26, 0x01, 0xbb, 0x24, 0x81, 0xd6, 0x84, 0x7d, 0x70, 0xbf, 0xc8, 0xc9, - 0x91, 0x46, 0xac, 0x1c, 0x18, 0x0a, 0x7a, 0x04, 0x95, 0x38, 0xf2, 0x88, 0xa4, 0x4e, 0x45, 0x93, - 0x3b, 0x45, 0xe4, 0x2f, 0x35, 0xe2, 0x90, 0x85, 0x57, 0xfe, 0x04, 0x1b, 0x3c, 0x3a, 0x81, 0x5a, - 0x48, 0xe5, 0x57, 0x8c, 0x5f, 0x0b, 0xa7, 0xda, 0xd9, 0xdc, 0xb3, 0x0f, 0x3e, 0x29, 0x14, 0x63, - 0x82, 0xe9, 0x49, 0x49, 0xdc, 0xe9, 0x8c, 0x86, 0x32, 0x71, 0xd3, 0xdf, 0x70, 0x2c, 0x9c, 0x39, - 0x40, 0xbf, 0x81, 0x1a, 0x0d, 0xbd, 0x88, 0xf9, 0xa1, 0x74, 0x6a, 0xb7, 0x07, 0x32, 0x34, 0x18, - 0x95, 0x4c, 0x9c, 0x31, 0xfa, 0x15, 0x28, 0xcf, 0x98, 0x47, 0xbb, 0x0f, 0x61, 0xe7, 0x5b, 0xc9, - 0x42, 0x2d, 0xa8, 0x99, 0x64, 0x25, 0xb7, 0x5c, 0xc6, 0xd9, 0xbe, 0x7b, 0x17, 0xb6, 0xd7, 0x12, - 0xa3, 0xcb, 0x46, 0x7a, 0x5b, 0xa8, 0x07, 0x75, 0x97, 0x85, 0x92, 0xf8, 0x21, 0xe5, 0x46, 0x20, - 0x85, 0xb9, 0x3d, 0x4c, 0x41, 0x8a, 0xf5, 0xa4, 0x84, 0x57, 0x2c, 0xf4, 0x7b, 0xa8, 0x73, 0x2a, - 0x58, 0xcc, 0x5d, 0x2a, 0x8c, 0x42, 0xf6, 0x8a, 0xef, 0x38, 0x01, 0x61, 0xfa, 0xe7, 0xd8, 0xe7, - 0x54, 0xe5, 0x49, 0xe0, 0x15, 0x15, 0x3d, 0x86, 0x2a, 0xa7, 0x42, 0x12, 0x2e, 0xbf, 0xeb, 0x92, - 0x71, 0x02, 0x19, 0xb1, 0xc0, 0x77, 0x17, 0x38, 0x65, 0xa0, 0xc7, 0x50, 0x8f, 0x02, 0xe2, 0x6a, - 0xaf, 0xce, 0x96, 0xa6, 0x7f, 0x50, 0x44, 0x1f, 0xa5, 0x20, 0xbc, 0xc2, 0xa3, 0xcf, 0x00, 0x02, - 0x36, 0x19, 0x7b, 0xdc, 0x9f, 0x53, 0x6e, 0x44, 0xd2, 0x2a, 0x62, 0x0f, 0x34, 0x02, 0xd7, 0x03, - 0x36, 0x49, 0x96, 0xe8, 0xe8, 0x07, 0x29, 0x24, 0xa7, 0x8e, 0x13, 0x00, 0x92, 0x3d, 0x35, 0xfa, - 0xf8, 0xf8, 0x7b, 0xb9, 0x32, 0x37, 0x92, 0xa3, 0xa3, 0xfb, 0xd0, 0xb8, 0x62, 0xdc, 0xa5, 0x63, - 0xa3, 0xfb, 0xba, 0xd6, 0x84, 0xad, 0x6d, 0x89, 0xd0, 0xfb, 0x75, 0xa8, 0xf2, 0x38, 0x94, 0xfe, - 0x8c, 0x76, 0x4f, 0xe0, 0xed, 0x42, 0xa7, 0xe8, 0x00, 0x1a, 0xd9, 0x35, 0x8f, 0x7d, 0x4f, 0xeb, - 0xa3, 0xde, 0xbf, 0xbb, 0xbc, 0xd9, 0xb5, 0x33, 0x3d, 0x1c, 0x0f, 0xb0, 0x9d, 0x81, 0x8e, 0xbd, - 0xee, 0xbf, 0xaa, 0xb0, 0xbd, 0x26, 0x16, 0xf4, 0x16, 0x6c, 0xf9, 0x33, 0x32, 0xa1, 0x09, 0x1d, - 0x27, 0x1b, 0x34, 0x84, 0x4a, 0x40, 0x2e, 0x69, 0xa0, 0x24, 0xa3, 0xd2, 0xf6, 0xd3, 0xd7, 0xaa, - 0x6e, 0xff, 0x8f, 0x1a, 0x3f, 0x0c, 0x25, 0x5f, 0x60, 0x43, 0x46, 0x0e, 0x54, 0x5d, 0x36, 0x9b, - 0x91, 0x50, 0x95, 0x97, 0xcd, 0xbd, 0x3a, 0x4e, 0xb7, 0x08, 0x41, 0x99, 0xf0, 0x89, 0x70, 0xca, - 0xda, 0xac, 0xd7, 0xa8, 0x09, 0x9b, 0x34, 0x9c, 0x3b, 0x5b, 0xda, 0xa4, 0x96, 0xca, 0xe2, 0xf9, - 0xc9, 0x9d, 0xd7, 0xb1, 0x5a, 0x2a, 0x5e, 0x2c, 0x28, 0x77, 0xaa, 0xda, 0xa4, 0xd7, 0xe8, 0x57, - 0x50, 0x99, 0xb1, 0x38, 0x94, 0xc2, 0xa9, 0xe9, 0x60, 0xef, 0x15, 0x05, 0x7b, 0xaa, 0x10, 0xa6, - 0xfc, 0x19, 0x38, 0x7a, 0x02, 0x3b, 0x42, 0xb2, 0x68, 0x3c, 0xe1, 0xc4, 0xa5, 0xe3, 0x88, 0x72, - 0x9f, 0x79, 0xfa, 0x36, 0x6e, 0xa9, 0xa2, 0x03, 0xd3, 0xe1, 0xf1, 0x5d, 0x45, 0x3b, 0x52, 0xac, - 0x91, 0x26, 0xa1, 0x11, 0x34, 0xa2, 0x38, 0x08, 0xc6, 0x2c, 0x4a, 0x8a, 0x39, 0x68, 0x27, 0xdf, - 0x23, 0x6b, 0xa3, 0x38, 0x08, 0xbe, 0x48, 0x48, 0xd8, 0x8e, 0x56, 0x1b, 0xf4, 0x0e, 0x54, 0x26, - 0x9c, 0xc5, 0x91, 0x70, 0x6c, 0x9d, 0x0f, 0xb3, 0x43, 0x9f, 0x43, 0x55, 0x50, 0x97, 0x53, 0x29, - 0x9c, 0x86, 0x3e, 0xed, 0x87, 0x45, 0x2f, 0x39, 0xd7, 0x10, 0x4c, 0xaf, 0x28, 0xa7, 0xa1, 0x4b, - 0x71, 0xca, 0x41, 0xf7, 0x60, 0x53, 0xca, 0x85, 0xb3, 0xdd, 0xb1, 0xf6, 0x6a, 0xfd, 0xea, 0xf2, - 0x66, 0x77, 0xf3, 0xe2, 0xe2, 0x19, 0x56, 0x36, 0x55, 0xa6, 0xa6, 0x4c, 0xc8, 0x90, 0xcc, 0xa8, - 0x73, 0x47, 0xa7, 0x37, 0xdb, 0xa3, 0x67, 0x00, 0x5e, 0x28, 0xc6, 0xae, 0xfe, 0x2e, 0x9c, 0xbb, - 0xfa, 0x74, 0x9f, 0xbc, 0xfe, 0x74, 0x83, 0xb3, 0x73, 0x53, 0x6c, 0xb7, 0x97, 0x37, 0xbb, 0xf5, - 0x6c, 0x8b, 0xeb, 0x5e, 0x28, 0x92, 0x25, 0xea, 0x83, 0x3d, 0xa5, 0x24, 0x90, 0x53, 0x77, 0x4a, - 0xdd, 0x6b, 0xa7, 0x79, 0x7b, 0xed, 0x7d, 0xa2, 0x61, 0xc6, 0x43, 0x9e, 0xa4, 0x44, 0xac, 0x42, - 0x15, 0xce, 0x8e, 0xce, 0x55, 0xb2, 0x41, 0x1f, 0x00, 0xb0, 0x88, 0x86, 0x63, 0x21, 0x3d, 0x3f, - 0x74, 0x90, 0x3a, 0x32, 0xae, 0x2b, 0xcb, 0xb9, 0x32, 0xb4, 0x3e, 0x03, 0x3b, 0xa7, 0x59, 0xa5, - 0xb5, 0x6b, 0xba, 0x30, 0x9f, 0x81, 0x5a, 0x2a, 0xaf, 0x73, 0x12, 0xc4, 0xc9, 0xb0, 0x55, 0xc7, - 0xc9, 0xe6, 0xd7, 0x1b, 0x8f, 0xac, 0xd6, 0x01, 0xd8, 0xb9, 0x8b, 0x43, 0x1f, 0xc2, 0x36, 0xa7, - 0x13, 0x5f, 0x48, 0xbe, 0x18, 0x93, 0x58, 0x4e, 0x9d, 0xdf, 0x69, 0x42, 0x23, 0x35, 0xf6, 0x62, - 0x39, 0x6d, 0x8d, 0x61, 0x75, 0x7e, 0xd4, 0x01, 0x5b, 0xe5, 0x55, 0x50, 0x3e, 0xa7, 0x5c, 0x75, - 0x05, 0x15, 0x76, 0xde, 0xa4, 0xee, 0x5f, 0x50, 0xc2, 0xdd, 0xa9, 0xfe, 0x02, 0xeb, 0xd8, 0xec, - 0xd4, 0x27, 0x95, 0x8a, 0xcc, 0x7c, 0x52, 0x66, 0xdb, 0xfd, 0xaf, 0x05, 0x8d, 0x7c, 0x7b, 0x42, - 0x87, 0x49, 0x53, 0xd2, 0x47, 0xba, 0x73, 0xf0, 0xf0, 0x75, 0xed, 0x4c, 0xb7, 0x80, 0x20, 0x56, - 0xce, 0x4e, 0xd5, 0x08, 0xa9, 0xc9, 0xe8, 0x97, 0xb0, 0x15, 0x31, 0x2e, 0xd3, 0x42, 0xd0, 0x2e, - 0x2c, 0xdb, 0x8c, 0xa7, 0x25, 0x33, 0x01, 0x77, 0xa7, 0x70, 0x67, 0xdd, 0x1b, 0x7a, 0x00, 0x9b, - 0x4f, 0x8f, 0x47, 0xcd, 0x52, 0xeb, 0xbd, 0xe7, 0x2f, 0x3a, 0xef, 0xae, 0x3f, 0x7c, 0xea, 0x73, - 0x19, 0x93, 0xe0, 0x78, 0x84, 0x7e, 0x02, 0x5b, 0x83, 0xb3, 0x73, 0x8c, 0x9b, 0x56, 0x6b, 0xf7, - 0xf9, 0x8b, 0xce, 0x7b, 0xeb, 0x38, 0xf5, 0x88, 0xc5, 0xa1, 0x87, 0xd9, 0x65, 0x36, 0x55, 0xfd, - 0x7d, 0x03, 0x6c, 0x53, 0x1f, 0xdf, 0xec, 0x54, 0xf5, 0x5b, 0xd8, 0x4e, 0x5a, 0x4e, 0xaa, 0xfa, - 0x8d, 0xd7, 0x76, 0x9e, 0x46, 0x42, 0x30, 0x77, 0x7c, 0x1f, 0x1a, 0x7e, 0x34, 0xff, 0x74, 0x4c, - 0x43, 0x72, 0x19, 0x98, 0x01, 0xab, 0x86, 0x6d, 0x65, 0x1b, 0x26, 0x26, 0xf5, 0xc9, 0xf9, 0xa1, - 0xa4, 0x3c, 0x34, 0xa3, 0x53, 0x0d, 0x67, 0x7b, 0xf4, 0x39, 0x94, 0xfd, 0x88, 0xcc, 0x4c, 0xbb, - 0x2c, 0x3c, 0xc1, 0xf1, 0xa8, 0x77, 0x6a, 0x34, 0xd8, 0xaf, 0x2d, 0x6f, 0x76, 0xcb, 0xca, 0x80, - 0x35, 0x0d, 0xb5, 0xd3, 0x8e, 0xa5, 0xde, 0xa4, 0x2b, 0x68, 0x0d, 0xe7, 0x2c, 0xdd, 0xff, 0x95, - 0xc1, 0x3e, 0x0c, 0x62, 0x21, 0x4d, 0x1f, 0x78, 0x63, 0x79, 0x7b, 0x06, 0x3b, 0x44, 0xcf, 0xe0, - 0x24, 0x54, 0x45, 0x55, 0x4f, 0x02, 0x26, 0x77, 0x0f, 0x0a, 0xdd, 0x65, 0xe0, 0x64, 0x6a, 0xe8, - 0x57, 0x94, 0x4f, 0xc7, 0xc2, 0x4d, 0xf2, 0x8d, 0x27, 0xe8, 0x1c, 0xb6, 0x19, 0x77, 0xa7, 0x54, - 0xc8, 0xa4, 0x0e, 0x9b, 0x99, 0xb5, 0xf0, 0x6f, 0xe6, 0x8b, 0x3c, 0xd0, 0x14, 0xa1, 0x24, 0xda, - 0x75, 0x1f, 0xe8, 0x11, 0x94, 0x39, 0xb9, 0x4a, 0xa7, 0x9a, 0x42, 0x7d, 0x63, 0x72, 0x25, 0xd7, - 0x5c, 0x68, 0x06, 0xfa, 0x03, 0x80, 0xe7, 0x8b, 0x88, 0x48, 0x77, 0x4a, 0xb9, 0xb9, 0xa7, 0xc2, - 0x23, 0x0e, 0x32, 0xd4, 0x9a, 0x97, 0x1c, 0x1b, 0x9d, 0x40, 0xdd, 0x25, 0xa9, 0xd2, 0x2a, 0xb7, - 0xb7, 0xa0, 0xc3, 0x9e, 0x71, 0xd1, 0x54, 0x2e, 0x96, 0x37, 0xbb, 0xb5, 0xd4, 0x82, 0x6b, 0x2e, - 0x31, 0xca, 0x3b, 0x81, 0x6d, 0x35, 0xe0, 0x8f, 0x3d, 0x7a, 0x45, 0xe2, 0x40, 0x0a, 0xdd, 0x2d, - 0x6f, 0x29, 0xaa, 0x6a, 0xd6, 0x1c, 0x18, 0x9c, 0x89, 0xab, 0x21, 0x73, 0x36, 0xf4, 0x27, 0xd8, - 0xa1, 0xa1, 0xcb, 0x17, 0x5a, 0x67, 0x69, 0x84, 0xb5, 0xdb, 0x0f, 0x3b, 0xcc, 0xc0, 0x6b, 0x87, - 0x6d, 0xd2, 0x6f, 0xd8, 0xbb, 0x3e, 0x40, 0xd2, 0xa6, 0xde, 0xac, 0xfe, 0x10, 0x94, 0x3d, 0x22, - 0x89, 0x96, 0x5c, 0x03, 0xeb, 0x75, 0xff, 0xfd, 0x97, 0xaf, 0xda, 0xa5, 0x7f, 0xbe, 0x6a, 0x97, - 0xfe, 0xf3, 0xaa, 0x6d, 0xfd, 0x65, 0xd9, 0xb6, 0x5e, 0x2e, 0xdb, 0xd6, 0x3f, 0x96, 0x6d, 0xeb, - 0xdf, 0xcb, 0xb6, 0x75, 0x59, 0xd1, 0x3f, 0xec, 0xbf, 0xf8, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xab, 0x02, 0x96, 0x72, 0x0f, 0x10, 0x00, 0x00, + // 1647 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x57, 0xdd, 0x6e, 0xe3, 0xc6, + 0x15, 0x16, 0x6d, 0x59, 0x3f, 0x87, 0xf2, 0xae, 0x3c, 0xc8, 0x0f, 0x57, 0x49, 0x64, 0xad, 0xb2, + 0x4d, 0x9d, 0x06, 0xf5, 0xa2, 0x6e, 0x91, 0x6e, 0xba, 0x0d, 0x5a, 0xc9, 0x52, 0xbd, 0xae, 0x6b, + 0x47, 0x18, 0x3b, 0x5b, 0xec, 0x95, 0x30, 0x26, 0xc7, 0x12, 0x61, 0x8a, 0xc3, 0xce, 0x0c, 0x15, + 0xf8, 0xae, 0x97, 0xc1, 0x5e, 0xf4, 0x0d, 0x7c, 0xd5, 0x67, 0xe8, 0x3b, 0xec, 0x65, 0x2f, 0xdb, + 0x1b, 0xa3, 0xab, 0x27, 0x28, 0xd0, 0x07, 0x68, 0x31, 0xc3, 0x21, 0x45, 0x25, 0x74, 0x76, 0x81, + 0xfa, 0x6e, 0xe6, 0xf0, 0xfb, 0x0e, 0xcf, 0x9c, 0xf9, 0x78, 0xce, 0x21, 0xd8, 0x22, 0xa2, 0xae, + 0xd8, 0x8d, 0x38, 0x93, 0x0c, 0x21, 0x8f, 0xb9, 0x97, 0x94, 0xef, 0x8a, 0x6f, 0x08, 0x9f, 0x5d, + 0xfa, 0x72, 0x77, 0xfe, 0xb3, 0x96, 0x2d, 0xaf, 0x22, 0x6a, 0x00, 0xad, 0x77, 0x26, 0x6c, 0xc2, + 0xf4, 0xf2, 0xb1, 0x5a, 0x19, 0xeb, 0xfb, 0x5e, 0xcc, 0x89, 0xf4, 0x59, 0xf8, 0x38, 0x5d, 0x24, + 0x0f, 0xba, 0xd7, 0x65, 0xa8, 0x9d, 0x30, 0x8f, 0x9e, 0x46, 0xd4, 0x45, 0x07, 0x60, 0x93, 0x30, + 0x64, 0x52, 0x03, 0x84, 0x63, 0x75, 0xac, 0x1d, 0x7b, 0x6f, 0x7b, 0xf7, 0xfb, 0xaf, 0xdc, 0xed, + 0x2d, 0x61, 0xfd, 0xf2, 0xab, 0x9b, 0xed, 0x12, 0xce, 0x33, 0xd1, 0x6f, 0xa0, 0xe1, 0x51, 0xe1, + 0x73, 0xea, 0x8d, 0x39, 0x0b, 0xa8, 0xb3, 0xd6, 0xb1, 0x76, 0xee, 0xed, 0x7d, 0x58, 0xe4, 0x49, + 0xbd, 0x1c, 0xb3, 0x80, 0x62, 0xdb, 0x30, 0xd4, 0x06, 0x1d, 0x00, 0xcc, 0xe8, 0xec, 0x9c, 0x72, + 0x31, 0xf5, 0x23, 0x67, 0x5d, 0xd3, 0x7f, 0x7c, 0x1b, 0x5d, 0xc5, 0xbe, 0x7b, 0x9c, 0xc1, 0x71, + 0x8e, 0x8a, 0x8e, 0xa1, 0x41, 0xe6, 0xc4, 0x0f, 0xc8, 0xb9, 0x1f, 0xf8, 0xf2, 0xca, 0x29, 0x6b, + 0x57, 0x9f, 0xfe, 0xa0, 0xab, 0x5e, 0x8e, 0x80, 0x57, 0xe8, 0x5d, 0x0f, 0x60, 0xf9, 0x22, 0xf4, + 0x09, 0x54, 0x47, 0xc3, 0x93, 0xc1, 0xe1, 0xc9, 0x41, 0xb3, 0xd4, 0x7a, 0xf0, 0xf2, 0xba, 0xf3, + 0xae, 0xf2, 0xb1, 0x04, 0x8c, 0x68, 0xe8, 0xf9, 0xe1, 0x04, 0xed, 0x40, 0xad, 0xb7, 0xbf, 0x3f, + 0x1c, 0x9d, 0x0d, 0x07, 0x4d, 0xab, 0xd5, 0x7a, 0x79, 0xdd, 0x79, 0x6f, 0x15, 0xd8, 0x73, 0x5d, + 0x1a, 0x49, 0xea, 0xb5, 0xca, 0xdf, 0xfe, 0xb5, 0x5d, 0xea, 0x7e, 0x6b, 0x41, 0x23, 0x1f, 0x04, + 0xfa, 0x04, 0x2a, 0xbd, 0xfd, 0xb3, 0xc3, 0xe7, 0xc3, 0x66, 0x69, 0x49, 0xcf, 0x23, 0x7a, 0xae, + 0xf4, 0xe7, 0x14, 0x3d, 0x82, 0x8d, 0x51, 0xef, 0xeb, 0xd3, 0x61, 0xd3, 0x5a, 0x86, 0x93, 0x87, + 0x8d, 0x48, 0x2c, 0x34, 0x6a, 0x80, 0x7b, 0x87, 0x27, 0xcd, 0xb5, 0x62, 0xd4, 0x80, 0x13, 0x3f, + 0x34, 0xa1, 0xbc, 0x5e, 0x07, 0xfb, 0x94, 0xf2, 0xb9, 0xef, 0xde, 0xb1, 0x44, 0x3e, 0x87, 0xb2, + 0x24, 0xe2, 0x52, 0x4b, 0xc3, 0x2e, 0x96, 0xc6, 0x19, 0x11, 0x97, 0xea, 0xa5, 0x86, 0xae, 0xf1, + 0x4a, 0x19, 0x9c, 0x46, 0x81, 0xef, 0x12, 0x49, 0x3d, 0xad, 0x0c, 0x7b, 0xef, 0x47, 0x45, 0x6c, + 0x9c, 0xa1, 0x4c, 0xfc, 0xcf, 0x4a, 0x38, 0x47, 0x45, 0x4f, 0xa1, 0x32, 0x09, 0xd8, 0x39, 0x09, + 0xb4, 0x26, 0xec, 0xbd, 0x87, 0x45, 0x4e, 0x0e, 0x34, 0x62, 0xe9, 0xc0, 0x50, 0xd0, 0x13, 0xa8, + 0xc4, 0x91, 0x47, 0x24, 0x75, 0x2a, 0x9a, 0xdc, 0x29, 0x22, 0x7f, 0xad, 0x11, 0xfb, 0x2c, 0xbc, + 0xf0, 0x27, 0xd8, 0xe0, 0xd1, 0x11, 0xd4, 0x42, 0x2a, 0xbf, 0x61, 0xfc, 0x52, 0x38, 0xd5, 0xce, + 0xfa, 0x8e, 0xbd, 0xf7, 0x59, 0xa1, 0x18, 0x13, 0x4c, 0x4f, 0x4a, 0xe2, 0x4e, 0x67, 0x34, 0x94, + 0x89, 0x9b, 0xfe, 0x9a, 0x63, 0xe1, 0xcc, 0x01, 0xfa, 0x35, 0xd4, 0x68, 0xe8, 0x45, 0xcc, 0x0f, + 0xa5, 0x53, 0xbb, 0x3d, 0x90, 0xa1, 0xc1, 0xa8, 0x64, 0xe2, 0x8c, 0xd1, 0xaf, 0x40, 0x79, 0xc6, + 0x3c, 0xda, 0x7d, 0x0c, 0x5b, 0xdf, 0x4b, 0x16, 0x6a, 0x41, 0xcd, 0x24, 0x2b, 0xb9, 0xe5, 0x32, + 0xce, 0xf6, 0xdd, 0xfb, 0xb0, 0xb9, 0x92, 0x98, 0xee, 0x5f, 0xca, 0x50, 0x4b, 0x6f, 0x0b, 0xf5, + 0xa0, 0xee, 0xb2, 0x50, 0x12, 0x3f, 0xa4, 0xdc, 0x08, 0xa4, 0x30, 0xb7, 0xfb, 0x29, 0x48, 0xb1, + 0x9e, 0x95, 0xf0, 0x92, 0x85, 0x7e, 0x07, 0x75, 0x4e, 0x05, 0x8b, 0xb9, 0x4b, 0x85, 0x51, 0xc8, + 0x4e, 0xf1, 0x1d, 0x27, 0x20, 0x4c, 0xff, 0x14, 0xfb, 0x9c, 0xaa, 0x3c, 0x09, 0xbc, 0xa4, 0xa2, + 0xa7, 0x50, 0xe5, 0x54, 0x48, 0xc2, 0xe5, 0x0f, 0x5d, 0x32, 0x4e, 0x20, 0x23, 0x16, 0xf8, 0xee, + 0x15, 0x4e, 0x19, 0xe8, 0x29, 0xd4, 0xa3, 0x80, 0xb8, 0xda, 0xab, 0xb3, 0xa1, 0xe9, 0x1f, 0x15, + 0xd1, 0x47, 0x29, 0x08, 0x2f, 0xf1, 0xe8, 0x0b, 0x80, 0x80, 0x4d, 0xc6, 0x1e, 0xf7, 0xe7, 0x94, + 0x1b, 0x91, 0xb4, 0x8a, 0xd8, 0x03, 0x8d, 0xc0, 0xf5, 0x80, 0x4d, 0x92, 0x25, 0x3a, 0xf8, 0xbf, + 0x14, 0x92, 0x53, 0xc7, 0x11, 0x00, 0xc9, 0x9e, 0x1a, 0x7d, 0x7c, 0xfa, 0x56, 0xae, 0xcc, 0x8d, + 0xe4, 0xe8, 0xe8, 0x21, 0x34, 0x2e, 0x18, 0x77, 0xe9, 0xd8, 0xe8, 0xbe, 0xae, 0x35, 0x61, 0x6b, + 0x5b, 0x22, 0xf4, 0x7e, 0x1d, 0xaa, 0x3c, 0x0e, 0xa5, 0x3f, 0xa3, 0xdd, 0x23, 0x78, 0xb7, 0xd0, + 0x29, 0xda, 0x83, 0x46, 0x76, 0xcd, 0x63, 0xdf, 0xd3, 0xfa, 0xa8, 0xf7, 0xef, 0x2f, 0x6e, 0xb6, + 0xed, 0x4c, 0x0f, 0x87, 0x03, 0x6c, 0x67, 0xa0, 0x43, 0xaf, 0xfb, 0xcf, 0x2a, 0x6c, 0xae, 0x88, + 0x05, 0xbd, 0x03, 0x1b, 0xfe, 0x8c, 0x4c, 0x68, 0x42, 0xc7, 0xc9, 0x06, 0x0d, 0xa1, 0x12, 0x90, + 0x73, 0x1a, 0x28, 0xc9, 0xa8, 0xb4, 0xfd, 0xf4, 0x8d, 0xaa, 0xdb, 0xfd, 0x83, 0xc6, 0x0f, 0x43, + 0xc9, 0xaf, 0xb0, 0x21, 0x23, 0x07, 0xaa, 0x2e, 0x9b, 0xcd, 0x48, 0xa8, 0xca, 0xcb, 0xfa, 0x4e, + 0x1d, 0xa7, 0x5b, 0x84, 0xa0, 0x4c, 0xf8, 0x44, 0x38, 0x65, 0x6d, 0xd6, 0x6b, 0xd4, 0x84, 0x75, + 0x1a, 0xce, 0x9d, 0x0d, 0x6d, 0x52, 0x4b, 0x65, 0xf1, 0xfc, 0xe4, 0xce, 0xeb, 0x58, 0x2d, 0x15, + 0x2f, 0x16, 0x94, 0x3b, 0x55, 0x6d, 0xd2, 0x6b, 0xf4, 0x4b, 0xa8, 0xcc, 0x58, 0x1c, 0x4a, 0xe1, + 0xd4, 0x74, 0xb0, 0x0f, 0x8a, 0x82, 0x3d, 0x56, 0x08, 0x53, 0xfe, 0x0c, 0x1c, 0x3d, 0x83, 0x2d, + 0x21, 0x59, 0x34, 0x9e, 0x70, 0xe2, 0xd2, 0x71, 0x44, 0xb9, 0xcf, 0x3c, 0x7d, 0x1b, 0xb7, 0x54, + 0xd1, 0x81, 0x69, 0xf8, 0xf8, 0xbe, 0xa2, 0x1d, 0x28, 0xd6, 0x48, 0x93, 0xd0, 0x08, 0x1a, 0x51, + 0x1c, 0x04, 0x63, 0x16, 0x25, 0xc5, 0x1c, 0xb4, 0x93, 0xb7, 0xc8, 0xda, 0x28, 0x0e, 0x82, 0xaf, + 0x12, 0x12, 0xb6, 0xa3, 0xe5, 0x06, 0xbd, 0x07, 0x95, 0x09, 0x67, 0x71, 0x24, 0x1c, 0x5b, 0xe7, + 0xc3, 0xec, 0xd0, 0x97, 0x50, 0x15, 0xd4, 0xe5, 0x54, 0x0a, 0xa7, 0xa1, 0x4f, 0xfb, 0x71, 0xd1, + 0x4b, 0x4e, 0x35, 0x04, 0xd3, 0x0b, 0xca, 0x69, 0xe8, 0x52, 0x9c, 0x72, 0xd0, 0x03, 0x58, 0x97, + 0xf2, 0xca, 0xd9, 0xec, 0x58, 0x3b, 0xb5, 0x7e, 0x75, 0x71, 0xb3, 0xbd, 0x7e, 0x76, 0xf6, 0x02, + 0x2b, 0x9b, 0x2a, 0x53, 0x53, 0x26, 0x64, 0x48, 0x66, 0xd4, 0xb9, 0xa7, 0xd3, 0x9b, 0xed, 0xd1, + 0x0b, 0x00, 0x2f, 0x14, 0x63, 0x57, 0x7f, 0x17, 0xce, 0x7d, 0x7d, 0xba, 0xcf, 0xde, 0x7c, 0xba, + 0xc1, 0xc9, 0xa9, 0x29, 0xb6, 0x9b, 0x8b, 0x9b, 0xed, 0x7a, 0xb6, 0xc5, 0x75, 0x2f, 0x14, 0xc9, + 0x12, 0xf5, 0xc1, 0x9e, 0x52, 0x12, 0xc8, 0xa9, 0x3b, 0xa5, 0xee, 0xa5, 0xd3, 0xbc, 0xbd, 0xf6, + 0x3e, 0xd3, 0x30, 0xe3, 0x21, 0x4f, 0x52, 0x22, 0x56, 0xa1, 0x0a, 0x67, 0x4b, 0xe7, 0x2a, 0xd9, + 0xa0, 0x8f, 0x00, 0x58, 0x44, 0xc3, 0xb1, 0x90, 0x9e, 0x1f, 0x3a, 0x48, 0x1d, 0x19, 0xd7, 0x95, + 0xe5, 0x54, 0x19, 0x5a, 0x5f, 0x80, 0x9d, 0xd3, 0xac, 0xd2, 0xda, 0x25, 0xbd, 0x32, 0x9f, 0x81, + 0x5a, 0x2a, 0xaf, 0x73, 0x12, 0xc4, 0xc9, 0xcc, 0x55, 0xc7, 0xc9, 0xe6, 0x57, 0x6b, 0x4f, 0xac, + 0xd6, 0x1e, 0xd8, 0xb9, 0x8b, 0x43, 0x1f, 0xc3, 0x26, 0xa7, 0x13, 0x5f, 0x48, 0x7e, 0x35, 0x26, + 0xb1, 0x9c, 0x3a, 0xbf, 0xd5, 0x84, 0x46, 0x6a, 0xec, 0xc5, 0x72, 0xda, 0x1a, 0xc3, 0xf2, 0xfc, + 0xa8, 0x03, 0xb6, 0xca, 0xab, 0xa0, 0x7c, 0x4e, 0xb9, 0xea, 0x0a, 0x2a, 0xec, 0xbc, 0x49, 0xdd, + 0xbf, 0xa0, 0x84, 0xbb, 0x53, 0xfd, 0x05, 0xd6, 0xb1, 0xd9, 0xa9, 0x4f, 0x2a, 0x15, 0x99, 0xf9, + 0xa4, 0xcc, 0xb6, 0xfb, 0x1f, 0x0b, 0x1a, 0xf9, 0xf6, 0x84, 0xf6, 0x93, 0xa6, 0xa4, 0x8f, 0x74, + 0x6f, 0xef, 0xf1, 0x9b, 0xda, 0x99, 0x6e, 0x01, 0x41, 0xac, 0x9c, 0x1d, 0xab, 0x49, 0x52, 0x93, + 0xd1, 0x2f, 0x60, 0x23, 0x62, 0x5c, 0xa6, 0x85, 0xa0, 0x5d, 0x58, 0xb6, 0x19, 0x4f, 0x4b, 0x66, + 0x02, 0xee, 0x4e, 0xe1, 0xde, 0xaa, 0x37, 0xf4, 0x08, 0xd6, 0x9f, 0x1f, 0x8e, 0x9a, 0xa5, 0xd6, + 0x07, 0x2f, 0xaf, 0x3b, 0xef, 0xaf, 0x3e, 0x7c, 0xee, 0x73, 0x19, 0x93, 0xe0, 0x70, 0x84, 0x7e, + 0x02, 0x1b, 0x83, 0x93, 0x53, 0x8c, 0x9b, 0x56, 0x6b, 0xfb, 0xe5, 0x75, 0xe7, 0x83, 0x55, 0x9c, + 0x7a, 0xc4, 0xe2, 0xd0, 0xc3, 0xec, 0x3c, 0x9b, 0xaa, 0xfe, 0xb6, 0x06, 0xb6, 0xa9, 0x8f, 0x77, + 0x3d, 0x78, 0x6f, 0x26, 0x2d, 0x27, 0x55, 0xfd, 0xda, 0x1b, 0x3b, 0x4f, 0x23, 0x21, 0x98, 0x3b, + 0x7e, 0x08, 0x0d, 0x3f, 0x9a, 0x7f, 0x3e, 0xa6, 0x21, 0x39, 0x0f, 0xcc, 0x80, 0x55, 0xc3, 0xb6, + 0xb2, 0x0d, 0x13, 0x93, 0xfa, 0xe4, 0xfc, 0x50, 0x52, 0x1e, 0x9a, 0xd1, 0xa9, 0x86, 0xb3, 0x3d, + 0xfa, 0x12, 0xca, 0x7e, 0x44, 0x66, 0xa6, 0x5d, 0x16, 0x9e, 0xe0, 0x70, 0xd4, 0x3b, 0x36, 0x1a, + 0xec, 0xd7, 0x16, 0x37, 0xdb, 0x65, 0x65, 0xc0, 0x9a, 0x86, 0xda, 0x69, 0xc7, 0x52, 0x6f, 0xd2, + 0x15, 0xb4, 0x86, 0x73, 0x96, 0xee, 0x7f, 0xcb, 0x60, 0xef, 0x07, 0xb1, 0x90, 0xa6, 0x0f, 0xdc, + 0x59, 0xde, 0x5e, 0xc0, 0x16, 0xd1, 0x33, 0x38, 0x09, 0x55, 0x51, 0xd5, 0x93, 0x80, 0xc9, 0xdd, + 0xa3, 0x42, 0x77, 0x19, 0x38, 0x99, 0x1a, 0xfa, 0x15, 0xe5, 0xd3, 0xb1, 0x70, 0x93, 0x7c, 0xe7, + 0x09, 0x3a, 0x85, 0x4d, 0xc6, 0xdd, 0x29, 0x15, 0x32, 0xa9, 0xc3, 0x66, 0x66, 0x2d, 0xfc, 0x9b, + 0xf9, 0x2a, 0x0f, 0x34, 0x45, 0x28, 0x89, 0x76, 0xd5, 0x07, 0x7a, 0x02, 0x65, 0x4e, 0x2e, 0xd2, + 0xa9, 0xa6, 0x50, 0xdf, 0x98, 0x5c, 0xc8, 0x15, 0x17, 0x9a, 0x81, 0x7e, 0x0f, 0xe0, 0xf9, 0x22, + 0x22, 0xd2, 0x9d, 0x52, 0x6e, 0xee, 0xa9, 0xf0, 0x88, 0x83, 0x0c, 0xb5, 0xe2, 0x25, 0xc7, 0x46, + 0x47, 0x50, 0x77, 0x49, 0xaa, 0xb4, 0xca, 0xed, 0x2d, 0x68, 0xbf, 0x67, 0x5c, 0x34, 0x95, 0x8b, + 0xc5, 0xcd, 0x76, 0x2d, 0xb5, 0xe0, 0x9a, 0x4b, 0x8c, 0xf2, 0x8e, 0x60, 0x53, 0x0d, 0xf8, 0x63, + 0x8f, 0x5e, 0x90, 0x38, 0x90, 0x42, 0x77, 0xcb, 0x5b, 0x8a, 0xaa, 0x9a, 0x35, 0x07, 0x06, 0x67, + 0xe2, 0x6a, 0xc8, 0x9c, 0x0d, 0xfd, 0x11, 0xb6, 0x68, 0xe8, 0xf2, 0x2b, 0xad, 0xb3, 0x34, 0xc2, + 0xda, 0xed, 0x87, 0x1d, 0x66, 0xe0, 0x95, 0xc3, 0x36, 0xe9, 0x77, 0xec, 0x5d, 0x1f, 0x20, 0x69, + 0x53, 0x77, 0xab, 0x3f, 0x04, 0x65, 0x8f, 0x48, 0xa2, 0x25, 0xd7, 0xc0, 0x7a, 0xdd, 0xff, 0xf0, + 0xd5, 0xeb, 0x76, 0xe9, 0x1f, 0xaf, 0xdb, 0xa5, 0x7f, 0xbf, 0x6e, 0x5b, 0x7f, 0x5e, 0xb4, 0xad, + 0x57, 0x8b, 0xb6, 0xf5, 0xf7, 0x45, 0xdb, 0xfa, 0xd7, 0xa2, 0x6d, 0x9d, 0x57, 0xf4, 0xff, 0xfb, + 0xcf, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0x66, 0xb4, 0xcd, 0xfe, 0x1e, 0x10, 0x00, 0x00, } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/specs.proto b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/specs.proto index c3be5f4b1..4b9139559 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/specs.proto +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/api/specs.proto @@ -41,8 +41,8 @@ message NodeSpec { DRAIN = 2 [(gogoproto.enumvalue_customname) = "NodeAvailabilityDrain"]; } - // Role defines the role the node should have. - NodeRole role = 2; + // DesiredRole defines the role the node should have. + NodeRole desired_role = 2; // Membership controls the admission of the node into the cluster. Membership membership = 3; diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/auth.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/auth.go index d81b543da..bc7c629a5 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/auth.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/auth.go @@ -16,6 +16,13 @@ import ( "google.golang.org/grpc/peer" ) +type localRequestKeyType struct{} + +// LocalRequestKey is a context key to mark a request that originating on the +// local node. The assocated value is a RemoteNodeInfo structure describing the +// local node. +var LocalRequestKey = localRequestKeyType{} + // LogTLSState logs information about the TLS connection and remote peers func LogTLSState(ctx context.Context, tlsState *tls.ConnectionState) { if tlsState == nil { @@ -189,6 +196,17 @@ type RemoteNodeInfo struct { // well as the forwarder's ID. This function does not do authorization checks - // it only looks up the node ID. func RemoteNode(ctx context.Context) (RemoteNodeInfo, error) { + // If we have a value on the context that marks this as a local + // request, we return the node info from the context. + localNodeInfo := ctx.Value(LocalRequestKey) + + if localNodeInfo != nil { + nodeInfo, ok := localNodeInfo.(RemoteNodeInfo) + if ok { + return nodeInfo, nil + } + } + certSubj, err := certSubjectFromContext(ctx) if err != nil { return RemoteNodeInfo{}, err diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/certificates.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/certificates.go index 6eb6e4dd7..52537c89e 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/certificates.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/certificates.go @@ -20,11 +20,11 @@ import ( cflog "github.com/cloudflare/cfssl/log" cfsigner "github.com/cloudflare/cfssl/signer" "github.com/cloudflare/cfssl/signer/local" - "github.com/docker/distribution/digest" "github.com/docker/go-events" "github.com/docker/swarmkit/api" + "github.com/docker/swarmkit/connectionbroker" "github.com/docker/swarmkit/ioutils" - "github.com/docker/swarmkit/remotes" + "github.com/opencontainers/go-digest" "github.com/pkg/errors" "golang.org/x/net/context" "google.golang.org/grpc" @@ -69,7 +69,7 @@ const ( MinNodeCertExpiration = 1 * time.Hour ) -// A recoverableErr is an non-fatal error encountered signing a certificate, +// A recoverableErr is a non-fatal error encountered signing a certificate, // which means that the certificate issuance may be retried at a later time. type recoverableErr struct { err error @@ -169,6 +169,15 @@ func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWrit if err == nil { break } + + // If the first attempt fails, we should try a remote + // connection. The local node may be a manager that was + // demoted, so the local connection (which is preferred) may + // not work. If we are successful in renewing the certificate, + // the local connection will not be returned by the connection + // broker anymore. + config.ForceRemote = true + } if err != nil { return nil, err @@ -202,7 +211,7 @@ func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWrit var kekUpdate *KEKData for i := 0; i < 5; i++ { - kekUpdate, err = rca.getKEKUpdate(ctx, X509Cert, tlsKeyPair, config.Remotes) + kekUpdate, err = rca.getKEKUpdate(ctx, X509Cert, tlsKeyPair, config.ConnBroker) if err == nil { break } @@ -218,7 +227,7 @@ func (rca *RootCA) RequestAndSaveNewCertificates(ctx context.Context, kw KeyWrit return &tlsKeyPair, nil } -func (rca *RootCA) getKEKUpdate(ctx context.Context, cert *x509.Certificate, keypair tls.Certificate, r remotes.Remotes) (*KEKData, error) { +func (rca *RootCA) getKEKUpdate(ctx context.Context, cert *x509.Certificate, keypair tls.Certificate, connBroker *connectionbroker.Broker) (*KEKData, error) { var managerRole bool for _, ou := range cert.Subject.OrganizationalUnit { if ou == ManagerRole { @@ -229,25 +238,25 @@ func (rca *RootCA) getKEKUpdate(ctx context.Context, cert *x509.Certificate, key if managerRole { mtlsCreds := credentials.NewTLS(&tls.Config{ServerName: CARole, RootCAs: rca.Pool, Certificates: []tls.Certificate{keypair}}) - conn, peer, err := getGRPCConnection(mtlsCreds, r) + conn, err := getGRPCConnection(mtlsCreds, connBroker, false) if err != nil { return nil, err } - defer conn.Close() - client := api.NewCAClient(conn) + client := api.NewCAClient(conn.ClientConn) ctx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() response, err := client.GetUnlockKey(ctx, &api.GetUnlockKeyRequest{}) if err != nil { if grpc.Code(err) == codes.Unimplemented { // if the server does not support keks, return as if no encryption key was specified + conn.Close(true) return &KEKData{}, nil } - r.Observe(peer, -remotes.DefaultObservationWeight) + conn.Close(false) return nil, err } - r.Observe(peer, remotes.DefaultObservationWeight) + conn.Close(true) return &KEKData{KEK: response.UnlockKey, Version: response.Version.Index}, nil } @@ -440,45 +449,33 @@ func GetLocalRootCA(paths CertPaths) (RootCA, error) { return NewRootCA(cert, key, DefaultNodeCertExpiration) } -func getGRPCConnection(creds credentials.TransportCredentials, r remotes.Remotes) (*grpc.ClientConn, api.Peer, error) { - peer, err := r.Select() - if err != nil { - return nil, api.Peer{}, err - } - - opts := []grpc.DialOption{ +func getGRPCConnection(creds credentials.TransportCredentials, connBroker *connectionbroker.Broker, forceRemote bool) (*connectionbroker.Conn, error) { + dialOpts := []grpc.DialOption{ grpc.WithTransportCredentials(creds), grpc.WithTimeout(5 * time.Second), grpc.WithBackoffMaxDelay(5 * time.Second), } - - conn, err := grpc.Dial(peer.Addr, opts...) - if err != nil { - return nil, api.Peer{}, err + if forceRemote { + return connBroker.SelectRemote(dialOpts...) } - return conn, peer, nil + return connBroker.Select(dialOpts...) } // GetRemoteCA returns the remote endpoint's CA certificate -func GetRemoteCA(ctx context.Context, d digest.Digest, r remotes.Remotes) (RootCA, error) { +func GetRemoteCA(ctx context.Context, d digest.Digest, connBroker *connectionbroker.Broker) (RootCA, error) { // This TLS Config is intentionally using InsecureSkipVerify. We use the // digest instead to check the integrity of the CA certificate. insecureCreds := credentials.NewTLS(&tls.Config{InsecureSkipVerify: true}) - conn, peer, err := getGRPCConnection(insecureCreds, r) + conn, err := getGRPCConnection(insecureCreds, connBroker, false) if err != nil { return RootCA{}, err } - defer conn.Close() - client := api.NewCAClient(conn) + client := api.NewCAClient(conn.ClientConn) ctx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() defer func() { - if err != nil { - r.Observe(peer, -remotes.DefaultObservationWeight) - return - } - r.Observe(peer, remotes.DefaultObservationWeight) + conn.Close(err == nil) }() response, err := client.GetRootCACertificate(ctx, &api.GetRootCACertificateRequest{}) if err != nil { @@ -486,7 +483,7 @@ func GetRemoteCA(ctx context.Context, d digest.Digest, r remotes.Remotes) (RootC } if d != "" { - verifier, err := digest.NewDigestVerifier(d) + verifier := d.Verifier() if err != nil { return RootCA{}, errors.Wrap(err, "unexpected error getting digest verifier") } @@ -558,20 +555,22 @@ func GetRemoteSignedCertificate(ctx context.Context, csr []byte, rootCAPool *x50 creds = credentials.NewTLS(&tls.Config{ServerName: CARole, RootCAs: rootCAPool}) } - conn, peer, err := getGRPCConnection(creds, config.Remotes) + conn, err := getGRPCConnection(creds, config.ConnBroker, config.ForceRemote) if err != nil { return nil, err } - defer conn.Close() // Create a CAClient to retrieve a new Certificate - caClient := api.NewNodeCAClient(conn) + caClient := api.NewNodeCAClient(conn.ClientConn) + + issueCtx, issueCancel := context.WithTimeout(ctx, 5*time.Second) + defer issueCancel() // Send the Request and retrieve the request token issueRequest := &api.IssueNodeCertificateRequest{CSR: csr, Token: config.Token, Availability: config.Availability} - issueResponse, err := caClient.IssueNodeCertificate(ctx, issueRequest) + issueResponse, err := caClient.IssueNodeCertificate(issueCtx, issueRequest) if err != nil { - config.Remotes.Observe(peer, -remotes.DefaultObservationWeight) + conn.Close(false) return nil, err } @@ -589,13 +588,14 @@ func GetRemoteSignedCertificate(ctx context.Context, csr []byte, rootCAPool *x50 defer cancel() statusResponse, err := caClient.NodeCertificateStatus(ctx, statusRequest) if err != nil { - config.Remotes.Observe(peer, -remotes.DefaultObservationWeight) + conn.Close(false) return nil, err } // If the certificate was issued, return if statusResponse.Status.State == api.IssuanceStateIssued { if statusResponse.Certificate == nil { + conn.Close(false) return nil, errors.New("no certificate in CertificateStatus response") } @@ -605,7 +605,7 @@ func GetRemoteSignedCertificate(ctx context.Context, csr []byte, rootCAPool *x50 // retry until the certificate gets updated per our // current request. if bytes.Equal(statusResponse.Certificate.CSR, csr) { - config.Remotes.Observe(peer, remotes.DefaultObservationWeight) + conn.Close(true) return statusResponse.Certificate.Certificate, nil } } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/config.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/config.go index e15454b5b..d2664bd63 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/config.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/config.go @@ -15,11 +15,11 @@ import ( "github.com/Sirupsen/logrus" cfconfig "github.com/cloudflare/cfssl/config" - "github.com/docker/distribution/digest" "github.com/docker/swarmkit/api" + "github.com/docker/swarmkit/connectionbroker" "github.com/docker/swarmkit/identity" "github.com/docker/swarmkit/log" - "github.com/docker/swarmkit/remotes" + "github.com/opencontainers/go-digest" "github.com/pkg/errors" "google.golang.org/grpc/credentials" @@ -196,11 +196,11 @@ func getCAHashFromToken(token string) (digest.Digest, error) { var digestInt big.Int digestInt.SetString(split[2], joinTokenBase) - return digest.ParseDigest(fmt.Sprintf("sha256:%0[1]*s", 64, digestInt.Text(16))) + return digest.Parse(fmt.Sprintf("sha256:%0[1]*s", 64, digestInt.Text(16))) } // DownloadRootCA tries to retrieve a remote root CA and matches the digest against the provided token. -func DownloadRootCA(ctx context.Context, paths CertPaths, token string, r remotes.Remotes) (RootCA, error) { +func DownloadRootCA(ctx context.Context, paths CertPaths, token string, connBroker *connectionbroker.Broker) (RootCA, error) { var rootCA RootCA // Get a digest for the optional CA hash string that we've been provided // If we were provided a non-empty string, and it is an invalid hash, return @@ -221,7 +221,7 @@ func DownloadRootCA(ctx context.Context, paths CertPaths, token string, r remote // just been demoted, for example). for i := 0; i != 5; i++ { - rootCA, err = GetRemoteCA(ctx, d, r) + rootCA, err = GetRemoteCA(ctx, d, connBroker) if err == nil { break } @@ -313,11 +313,16 @@ type CertificateRequestConfig struct { Token string // Availability allows a user to control the current scheduling status of a node Availability api.NodeSpec_Availability - // Remotes is the set of remote CAs. - Remotes remotes.Remotes + // ConnBroker provides connections to CAs. + ConnBroker *connectionbroker.Broker // Credentials provides transport credentials for communicating with the // remote server. Credentials credentials.TransportCredentials + // ForceRemote specifies that only a remote (TCP) connection should + // be used to request the certificate. This may be necessary in cases + // where the local node is running a manager, but is in the process of + // being demoted. + ForceRemote bool } // CreateSecurityConfig creates a new key and cert for this node, either locally @@ -380,7 +385,7 @@ func (rootCA RootCA) CreateSecurityConfig(ctx context.Context, krw *KeyReadWrite // RenewTLSConfigNow gets a new TLS cert and key, and updates the security config if provided. This is similar to // RenewTLSConfig, except while that monitors for expiry, and periodically renews, this renews once and is blocking -func RenewTLSConfigNow(ctx context.Context, s *SecurityConfig, r remotes.Remotes) error { +func RenewTLSConfigNow(ctx context.Context, s *SecurityConfig, connBroker *connectionbroker.Broker) error { s.renewalMu.Lock() defer s.renewalMu.Unlock() @@ -395,7 +400,7 @@ func RenewTLSConfigNow(ctx context.Context, s *SecurityConfig, r remotes.Remotes tlsKeyPair, err := rootCA.RequestAndSaveNewCertificates(ctx, s.KeyWriter(), CertificateRequestConfig{ - Remotes: r, + ConnBroker: connBroker, Credentials: s.ClientTLSCreds, }) if err != nil { @@ -437,7 +442,7 @@ func RenewTLSConfigNow(ctx context.Context, s *SecurityConfig, r remotes.Remotes // RenewTLSConfig will continuously monitor for the necessity of renewing the local certificates, either by // issuing them locally if key-material is available, or requesting them from a remote CA. -func RenewTLSConfig(ctx context.Context, s *SecurityConfig, remotes remotes.Remotes, renew <-chan struct{}) <-chan CertificateUpdate { +func RenewTLSConfig(ctx context.Context, s *SecurityConfig, connBroker *connectionbroker.Broker, renew <-chan struct{}) <-chan CertificateUpdate { updates := make(chan CertificateUpdate) go func() { @@ -459,13 +464,26 @@ func RenewTLSConfig(ctx context.Context, s *SecurityConfig, remotes remotes.Remo if err != nil { // We failed to read the expiration, let's stick with the starting default log.Errorf("failed to read the expiration of the TLS certificate in: %s", s.KeyReader().Target()) - updates <- CertificateUpdate{Err: errors.New("failed to read certificate expiration")} + + select { + case updates <- CertificateUpdate{Err: errors.New("failed to read certificate expiration")}: + case <-ctx.Done(): + log.Info("shutting down certificate renewal routine") + return + } } else { // If we have an expired certificate, we let's stick with the starting default in // the hope that this is a temporary clock skew. if validUntil.Before(time.Now()) { log.WithError(err).Errorf("failed to create a new client TLS config") - updates <- CertificateUpdate{Err: errors.New("TLS certificate is expired")} + + select { + case updates <- CertificateUpdate{Err: errors.New("TLS certificate is expired")}: + case <-ctx.Done(): + log.Info("shutting down certificate renewal routine") + return + } + } else { // Random retry time between 50% and 80% of the total time to expiration retry = calculateRandomExpiry(validFrom, validUntil) @@ -478,19 +496,27 @@ func RenewTLSConfig(ctx context.Context, s *SecurityConfig, remotes remotes.Remo select { case <-time.After(retry): - log.Infof("renewing certificate") + log.Info("renewing certificate") case <-renew: - log.Infof("forced certificate renewal") + log.Info("forced certificate renewal") case <-ctx.Done(): - log.Infof("shuting down certificate renewal routine") + log.Info("shutting down certificate renewal routine") return } - // ignore errors - it will just try again laster - if err := RenewTLSConfigNow(ctx, s, remotes); err != nil { - updates <- CertificateUpdate{Err: err} + // ignore errors - it will just try again later + var certUpdate CertificateUpdate + if err := RenewTLSConfigNow(ctx, s, connBroker); err != nil { + certUpdate.Err = err } else { - updates <- CertificateUpdate{Role: s.ClientTLSCreds.Role()} + certUpdate.Role = s.ClientTLSCreds.Role() + } + + select { + case updates <- certUpdate: + case <-ctx.Done(): + log.Info("shutting down certificate renewal routine") + return } } }() diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/server.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/server.go index fa55d3853..a7097f86a 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/server.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/ca/server.go @@ -211,6 +211,15 @@ func (s *Server) IssueNodeCertificate(ctx context.Context, request *api.IssueNod blacklistedCerts = clusters[0].BlacklistedCertificates } + // Renewing the cert with a local (unix socket) is always valid. + localNodeInfo := ctx.Value(LocalRequestKey) + if localNodeInfo != nil { + nodeInfo, ok := localNodeInfo.(RemoteNodeInfo) + if ok && nodeInfo.NodeID != "" { + return s.issueRenewCertificate(ctx, nodeInfo.NodeID, request.CSR) + } + } + // If the remote node is a worker (either forwarded by a manager, or calling directly), // issue a renew worker certificate entry with the correct ID nodeID, err := AuthorizeForwardedRoleAndOrg(ctx, []string{WorkerRole}, []string{ManagerRole}, s.securityConfig.ClientTLSCreds.Organization(), blacklistedCerts) @@ -250,7 +259,8 @@ func (s *Server) IssueNodeCertificate(ctx context.Context, request *api.IssueNod // Create a new node err := s.store.Update(func(tx store.Tx) error { node := &api.Node{ - ID: nodeID, + Role: role, + ID: nodeID, Certificate: api.Certificate{ CSR: request.CSR, CN: nodeID, @@ -260,7 +270,7 @@ func (s *Server) IssueNodeCertificate(ctx context.Context, request *api.IssueNod }, }, Spec: api.NodeSpec{ - Role: role, + DesiredRole: role, Membership: api.NodeMembershipAccepted, Availability: request.Availability, }, @@ -318,7 +328,7 @@ func (s *Server) issueRenewCertificate(ctx context.Context, nodeID string, csr [ cert = api.Certificate{ CSR: csr, CN: node.ID, - Role: node.Spec.Role, + Role: node.Role, Status: api.IssuanceStatus{ State: api.IssuanceStateRenew, }, diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/connectionbroker/broker.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/connectionbroker/broker.go new file mode 100644 index 000000000..f22726f2b --- /dev/null +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/connectionbroker/broker.go @@ -0,0 +1,105 @@ +// Package connectionbroker is a layer on top of remotes that returns +// a gRPC connection to a manager. The connection may be a local connection +// using a local socket such as a UNIX socket. +package connectionbroker + +import ( + "sync" + + "github.com/docker/swarmkit/api" + "github.com/docker/swarmkit/remotes" + "google.golang.org/grpc" +) + +// Broker is a simple connection broker. It can either return a fresh +// connection to a remote manager selected with weighted randomization, or a +// local gRPC connection to the local manager. +type Broker struct { + mu sync.Mutex + remotes remotes.Remotes + localConn *grpc.ClientConn +} + +// New creates a new connection broker. +func New(remotes remotes.Remotes) *Broker { + return &Broker{ + remotes: remotes, + } +} + +// SetLocalConn changes the local gRPC connection used by the connection broker. +func (b *Broker) SetLocalConn(localConn *grpc.ClientConn) { + b.mu.Lock() + defer b.mu.Unlock() + + b.localConn = localConn +} + +// Select a manager from the set of available managers, and return a connection. +func (b *Broker) Select(dialOpts ...grpc.DialOption) (*Conn, error) { + b.mu.Lock() + localConn := b.localConn + b.mu.Unlock() + + if localConn != nil { + return &Conn{ + ClientConn: localConn, + isLocal: true, + }, nil + } + + return b.SelectRemote(dialOpts...) +} + +// SelectRemote chooses a manager from the remotes, and returns a TCP +// connection. +func (b *Broker) SelectRemote(dialOpts ...grpc.DialOption) (*Conn, error) { + peer, err := b.remotes.Select() + if err != nil { + return nil, err + } + + cc, err := grpc.Dial(peer.Addr, dialOpts...) + if err != nil { + b.remotes.ObserveIfExists(peer, -remotes.DefaultObservationWeight) + return nil, err + } + + return &Conn{ + ClientConn: cc, + remotes: b.remotes, + peer: peer, + }, nil +} + +// Remotes returns the remotes interface used by the broker, so the caller +// can make observations or see weights directly. +func (b *Broker) Remotes() remotes.Remotes { + return b.remotes +} + +// Conn is a wrapper around a gRPC client connection. +type Conn struct { + *grpc.ClientConn + isLocal bool + remotes remotes.Remotes + peer api.Peer +} + +// Close closes the client connection if it is a remote connection. It also +// records a positive experience with the remote peer if success is true, +// otherwise it records a negative experience. If a local connection is in use, +// Close is a noop. +func (c *Conn) Close(success bool) error { + if c.isLocal { + return nil + } + + if success { + c.remotes.ObserveIfExists(c.peer, -remotes.DefaultObservationWeight) + } else { + c.remotes.ObserveIfExists(c.peer, remotes.DefaultObservationWeight) + } + + return c.ClientConn.Close() +} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/log/context.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/log/context.go index 4539e47eb..3da380f11 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/log/context.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/log/context.go @@ -42,7 +42,7 @@ func GetLogger(ctx context.Context) *logrus.Entry { } // WithModule adds the module to the context, appending it with a slash if a -// module already exists. A module is just an roughly correlated defined by the +// module already exists. A module is just a roughly correlated defined by the // call tree for a given context. // // As an example, we might have a "node" module already part of a context. If diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go index a7391eba6..33d4b04f5 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go @@ -38,6 +38,71 @@ type portSpace struct { dynamicPortSpace *idm.Idm } +type allocatedPorts map[api.PortConfig]map[uint32]*api.PortConfig + +// addState add the state of an allocated port to the collection. +// `allocatedPorts` is a map of portKey:publishedPort:portState. +// In case the value of the portKey is missing, the map +// publishedPort:portState is created automatically +func (ps allocatedPorts) addState(p *api.PortConfig) { + portKey := getPortConfigKey(p) + if _, ok := ps[portKey]; !ok { + ps[portKey] = make(map[uint32]*api.PortConfig) + } + ps[portKey][p.PublishedPort] = p +} + +// delState delete the state of an allocated port from the collection. +// `allocatedPorts` is a map of portKey:publishedPort:portState. +// +// If publishedPort is non-zero, then it is user defined. We will try to +// remove the portState from `allocatedPorts` directly and return +// the portState (or nil if no portState exists) +// +// If publishedPort is zero, then it is dynamically allocated. We will try +// to remove the portState from `allocatedPorts`, as long as there is +// a portState associated with a non-zero publishedPort. +// Note multiple dynamically allocated ports might exists. In this case, +// we will remove only at a time so both allocated ports are tracked. +// +// Note becasue of the potential co-existence of user-defined and dynamically +// allocated ports, delState has to be called for user-defined port first. +// dynamically allocated ports should be removed later. +func (ps allocatedPorts) delState(p *api.PortConfig) *api.PortConfig { + portKey := getPortConfigKey(p) + + portStateMap, ok := ps[portKey] + + // If name, port, protocol values don't match then we + // are not allocated. + if !ok { + return nil + } + + if p.PublishedPort != 0 { + // If SwarmPort was user defined but the port state + // SwarmPort doesn't match we are not allocated. + v := portStateMap[p.PublishedPort] + + // Delete state from allocatedPorts + delete(portStateMap, p.PublishedPort) + + return v + } + + // If PublishedPort == 0 and we don't have non-zero port + // then we are not allocated + for publishedPort, v := range portStateMap { + if publishedPort != 0 { + // Delete state from allocatedPorts + delete(portStateMap, publishedPort) + return v + } + } + + return nil +} + func newPortAllocator() (*portAllocator, error) { portSpaces := make(map[api.PortConfig_Protocol]*portSpace) for _, protocol := range []api.PortConfig_Protocol{api.ProtocolTCP, api.ProtocolUDP} { @@ -73,7 +138,7 @@ func newPortSpace(protocol api.PortConfig_Protocol) (*portSpace, error) { }, nil } -// getPortConfigkey returns a map key for doing set operations with +// getPortConfigKey returns a map key for doing set operations with // ports. The key consists of name, protocol and target port which // uniquely identifies a port within a single Endpoint. func getPortConfigKey(p *api.PortConfig) api.PortConfig { @@ -91,40 +156,53 @@ func reconcilePortConfigs(s *api.Service) []*api.PortConfig { return s.Spec.Endpoint.Ports } - allocatedPorts := make(map[api.PortConfig]*api.PortConfig) + portStates := allocatedPorts{} for _, portState := range s.Endpoint.Ports { - if portState.PublishMode != api.PublishModeIngress { - continue + if portState.PublishMode == api.PublishModeIngress { + portStates.addState(portState) } - - allocatedPorts[getPortConfigKey(portState)] = portState } var portConfigs []*api.PortConfig + + // Process the portConfig with portConfig.PublishMode != api.PublishModeIngress + // and PublishedPort != 0 (high priority) for _, portConfig := range s.Spec.Endpoint.Ports { - // If the PublishMode is not Ingress simply pick up - // the port config. if portConfig.PublishMode != api.PublishModeIngress { + // If the PublishMode is not Ingress simply pick up the port config. portConfigs = append(portConfigs, portConfig) - continue - } + } else if portConfig.PublishedPort != 0 { + // Otherwise we only process PublishedPort != 0 in this round - portState, ok := allocatedPorts[getPortConfigKey(portConfig)] - - // If the portConfig is exactly the same as portState - // except if SwarmPort is not user-define then prefer - // portState to ensure sticky allocation of the same - // port that was allocated before. - if ok && portConfig.Name == portState.Name && - portConfig.TargetPort == portState.TargetPort && - portConfig.Protocol == portState.Protocol && - portConfig.PublishedPort == 0 { - portConfigs = append(portConfigs, portState) - continue + // Remove record from portState + portStates.delState(portConfig) + + // For PublishedPort != 0 prefer the portConfig + portConfigs = append(portConfigs, portConfig) } + } + + // Iterate portConfigs with PublishedPort == 0 (low priority) + for _, portConfig := range s.Spec.Endpoint.Ports { + // Ignore ports which are not PublishModeIngress (already processed) + // And we only process PublishedPort == 0 in this round + // So the following: + // `portConfig.PublishMode == api.PublishModeIngress && portConfig.PublishedPort == 0` + if portConfig.PublishMode == api.PublishModeIngress && portConfig.PublishedPort == 0 { + // If the portConfig is exactly the same as portState + // except if SwarmPort is not user-define then prefer + // portState to ensure sticky allocation of the same + // port that was allocated before. + + // Remove record from portState + if portState := portStates.delState(portConfig); portState != nil { + portConfigs = append(portConfigs, portState) + continue + } - // For all other cases prefer the portConfig - portConfigs = append(portConfigs, portConfig) + // For all other cases prefer the portConfig + portConfigs = append(portConfigs, portConfig) + } } return portConfigs @@ -213,40 +291,31 @@ func (pa *portAllocator) isPortsAllocated(s *api.Service) bool { return false } - allocatedPorts := make(map[api.PortConfig]*api.PortConfig) + portStates := allocatedPorts{} for _, portState := range s.Endpoint.Ports { - if portState.PublishMode != api.PublishModeIngress { - continue + if portState.PublishMode == api.PublishModeIngress { + portStates.addState(portState) } - - allocatedPorts[getPortConfigKey(portState)] = portState } + // Iterate portConfigs with PublishedPort != 0 (high priority) for _, portConfig := range s.Spec.Endpoint.Ports { // Ignore ports which are not PublishModeIngress if portConfig.PublishMode != api.PublishModeIngress { continue } - - portState, ok := allocatedPorts[getPortConfigKey(portConfig)] - - // If name, port, protocol values don't match then we - // are not allocated. - if !ok { + if portConfig.PublishedPort != 0 && portStates.delState(portConfig) == nil { return false } + } - // If SwarmPort was user defined but the port state - // SwarmPort doesn't match we are not allocated. - if portConfig.PublishedPort != portState.PublishedPort && - portConfig.PublishedPort != 0 { - return false + // Iterate portConfigs with PublishedPort == 0 (low priority) + for _, portConfig := range s.Spec.Endpoint.Ports { + // Ignore ports which are not PublishModeIngress + if portConfig.PublishMode != api.PublishModeIngress { + continue } - - // If SwarmPort was not defined by user and port state - // is not initialized with a valid SwarmPort value then - // we are not allocated. - if portConfig.PublishedPort == 0 && portState.PublishedPort == 0 { + if portConfig.PublishedPort == 0 && portStates.delState(portConfig) == nil { return false } } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/constraint/constraint.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/constraint/constraint.go index ae636cb10..a690bd3e2 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/constraint/constraint.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/constraint/constraint.go @@ -122,7 +122,7 @@ func NodeMatches(constraints []Constraint, n *api.Node) bool { return false } case strings.EqualFold(constraint.key, "node.role"): - if !constraint.Match(n.Spec.Role.String()) { + if !constraint.Match(n.Role.String()) { return false } case strings.EqualFold(constraint.key, "node.platform.os"): diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/controlapi/node.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/controlapi/node.go index 6689e6fdd..d880ab981 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/controlapi/node.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/controlapi/node.go @@ -146,7 +146,7 @@ func (s *Server) ListNodes(ctx context.Context, request *api.ListNodesRequest) ( return true } for _, c := range request.Filters.Roles { - if c == e.Spec.Role { + if c == e.Role { return true } } @@ -205,7 +205,6 @@ func (s *Server) UpdateNode(ctx context.Context, request *api.UpdateNodeRequest) var ( node *api.Node member *membership.Member - demote bool ) err := s.store.Update(func(tx store.Tx) error { @@ -215,9 +214,7 @@ func (s *Server) UpdateNode(ctx context.Context, request *api.UpdateNodeRequest) } // Demotion sanity checks. - if node.Spec.Role == api.NodeRoleManager && request.Spec.Role == api.NodeRoleWorker { - demote = true - + if node.Spec.DesiredRole == api.NodeRoleManager && request.Spec.DesiredRole == api.NodeRoleWorker { // Check for manager entries in Store. managers, err := store.FindNodes(tx, store.ByRole(api.NodeRoleManager)) if err != nil { @@ -246,16 +243,6 @@ func (s *Server) UpdateNode(ctx context.Context, request *api.UpdateNodeRequest) return nil, err } - if demote && s.raft != nil { - // TODO(abronan): the remove can potentially fail and leave the node with - // an incorrect role (worker rather than manager), we need to reconcile the - // memberlist with the desired state rather than attempting to remove the - // member once. - if err := s.raft.RemoveMember(ctx, member.RaftID); err != nil { - return nil, grpc.Errorf(codes.Internal, "cannot demote manager to worker: %v", err) - } - } - return &api.UpdateNodeResponse{ Node: node, }, nil @@ -276,7 +263,7 @@ func (s *Server) RemoveNode(ctx context.Context, request *api.RemoveNodeRequest) if node == nil { return grpc.Errorf(codes.NotFound, "node %s not found", request.NodeID) } - if node.Spec.Role == api.NodeRoleManager { + if node.Spec.DesiredRole == api.NodeRoleManager { if s.raft == nil { return grpc.Errorf(codes.FailedPrecondition, "node %s is a manager but cannot access node information from the raft memberlist", request.NodeID) } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/logbroker/broker.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/logbroker/broker.go index bec6fe434..fa07a0445 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/logbroker/broker.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/logbroker/broker.go @@ -173,7 +173,7 @@ func (lb *LogBroker) watchSubscriptions(nodeID string) ([]*subscription, chan ev })) // Grab current subscriptions. - subscriptions := make([]*subscription, 0, len(lb.registeredSubscriptions)) + var subscriptions []*subscription for _, s := range lb.registeredSubscriptions { if s.Contains(nodeID) { subscriptions = append(subscriptions, s) diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/manager.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/manager.go index 649f22953..b1c65aa14 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/manager.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/manager.go @@ -1,6 +1,7 @@ package manager import ( + "crypto/tls" "crypto/x509" "encoding/pem" "fmt" @@ -16,6 +17,7 @@ import ( "github.com/docker/go-events" "github.com/docker/swarmkit/api" "github.com/docker/swarmkit/ca" + "github.com/docker/swarmkit/connectionbroker" "github.com/docker/swarmkit/log" "github.com/docker/swarmkit/manager/allocator" "github.com/docker/swarmkit/manager/controlapi" @@ -38,6 +40,7 @@ import ( "github.com/pkg/errors" "golang.org/x/net/context" "google.golang.org/grpc" + "google.golang.org/grpc/credentials" ) const ( @@ -45,7 +48,7 @@ const ( defaultTaskHistoryRetentionLimit = 5 ) -// RemoteAddrs provides an listening address and an optional advertise address +// RemoteAddrs provides a listening address and an optional advertise address // for serving the remote API. type RemoteAddrs struct { // Address to bind @@ -125,6 +128,7 @@ type Manager struct { localserver *grpc.Server raftNode *raft.Node dekRotator *RaftDEKManager + roleManager *roleManager cancelFunc context.CancelFunc @@ -270,6 +274,12 @@ func New(config *Config) (*Manager, error) { return m, nil } +// RemovedFromRaft returns a channel that's closed if the manager is removed +// from the raft cluster. This should be used to trigger a manager shutdown. +func (m *Manager) RemovedFromRaft() <-chan struct{} { + return m.raftNode.RemovedFromRaft +} + // Addr returns tcp address on which remote api listens. func (m *Manager) Addr() string { return m.config.RemoteAPI.ListenAddr @@ -328,23 +338,46 @@ func (m *Manager) Run(parent context.Context) error { authenticatedHealthAPI := api.NewAuthenticatedWrapperHealthServer(healthServer, authorize) authenticatedRaftMembershipAPI := api.NewAuthenticatedWrapperRaftMembershipServer(m.raftNode, authorize) - proxyDispatcherAPI := api.NewRaftProxyDispatcherServer(authenticatedDispatcherAPI, m.raftNode, ca.WithMetadataForwardTLSInfo) - proxyCAAPI := api.NewRaftProxyCAServer(authenticatedCAAPI, m.raftNode, ca.WithMetadataForwardTLSInfo) - proxyNodeCAAPI := api.NewRaftProxyNodeCAServer(authenticatedNodeCAAPI, m.raftNode, ca.WithMetadataForwardTLSInfo) - proxyRaftMembershipAPI := api.NewRaftProxyRaftMembershipServer(authenticatedRaftMembershipAPI, m.raftNode, ca.WithMetadataForwardTLSInfo) - proxyResourceAPI := api.NewRaftProxyResourceAllocatorServer(authenticatedResourceAPI, m.raftNode, ca.WithMetadataForwardTLSInfo) - proxyLogBrokerAPI := api.NewRaftProxyLogBrokerServer(authenticatedLogBrokerAPI, m.raftNode, ca.WithMetadataForwardTLSInfo) - - // localProxyControlAPI is a special kind of proxy. It is only wired up - // to receive requests from a trusted local socket, and these requests - // don't use TLS, therefore the requests it handles locally should - // bypass authorization. When it proxies, it sends them as requests from - // this manager rather than forwarded requests (it has no TLS - // information to put in the metadata map). + proxyDispatcherAPI := api.NewRaftProxyDispatcherServer(authenticatedDispatcherAPI, m.raftNode, nil, ca.WithMetadataForwardTLSInfo) + proxyCAAPI := api.NewRaftProxyCAServer(authenticatedCAAPI, m.raftNode, nil, ca.WithMetadataForwardTLSInfo) + proxyNodeCAAPI := api.NewRaftProxyNodeCAServer(authenticatedNodeCAAPI, m.raftNode, nil, ca.WithMetadataForwardTLSInfo) + proxyRaftMembershipAPI := api.NewRaftProxyRaftMembershipServer(authenticatedRaftMembershipAPI, m.raftNode, nil, ca.WithMetadataForwardTLSInfo) + proxyResourceAPI := api.NewRaftProxyResourceAllocatorServer(authenticatedResourceAPI, m.raftNode, nil, ca.WithMetadataForwardTLSInfo) + proxyLogBrokerAPI := api.NewRaftProxyLogBrokerServer(authenticatedLogBrokerAPI, m.raftNode, nil, ca.WithMetadataForwardTLSInfo) + + // The following local proxies are only wired up to receive requests + // from a trusted local socket, and these requests don't use TLS, + // therefore the requests they handle locally should bypass + // authorization. When requests are proxied from these servers, they + // are sent as requests from this manager rather than forwarded + // requests (it has no TLS information to put in the metadata map). forwardAsOwnRequest := func(ctx context.Context) (context.Context, error) { return ctx, nil } - localProxyControlAPI := api.NewRaftProxyControlServer(baseControlAPI, m.raftNode, forwardAsOwnRequest) - localProxyLogsAPI := api.NewRaftProxyLogsServer(m.logbroker, m.raftNode, forwardAsOwnRequest) - localCAAPI := api.NewRaftProxyCAServer(m.caserver, m.raftNode, forwardAsOwnRequest) + handleRequestLocally := func(ctx context.Context) (context.Context, error) { + var remoteAddr string + if m.config.RemoteAPI.AdvertiseAddr != "" { + remoteAddr = m.config.RemoteAPI.AdvertiseAddr + } else { + remoteAddr = m.config.RemoteAPI.ListenAddr + } + + creds := m.config.SecurityConfig.ClientTLSCreds + + nodeInfo := ca.RemoteNodeInfo{ + Roles: []string{creds.Role()}, + Organization: creds.Organization(), + NodeID: creds.NodeID(), + RemoteAddr: remoteAddr, + } + + return context.WithValue(ctx, ca.LocalRequestKey, nodeInfo), nil + } + localProxyControlAPI := api.NewRaftProxyControlServer(baseControlAPI, m.raftNode, handleRequestLocally, forwardAsOwnRequest) + localProxyLogsAPI := api.NewRaftProxyLogsServer(m.logbroker, m.raftNode, handleRequestLocally, forwardAsOwnRequest) + localProxyDispatcherAPI := api.NewRaftProxyDispatcherServer(m.dispatcher, m.raftNode, handleRequestLocally, forwardAsOwnRequest) + localProxyCAAPI := api.NewRaftProxyCAServer(m.caserver, m.raftNode, handleRequestLocally, forwardAsOwnRequest) + localProxyNodeCAAPI := api.NewRaftProxyNodeCAServer(m.caserver, m.raftNode, handleRequestLocally, forwardAsOwnRequest) + localProxyResourceAPI := api.NewRaftProxyResourceAllocatorServer(baseResourceAPI, m.raftNode, handleRequestLocally, forwardAsOwnRequest) + localProxyLogBrokerAPI := api.NewRaftProxyLogBrokerServer(m.logbroker, m.raftNode, handleRequestLocally, forwardAsOwnRequest) // Everything registered on m.server should be an authenticated // wrapper, or a proxy wrapping an authenticated wrapper! @@ -362,7 +395,11 @@ func (m *Manager) Run(parent context.Context) error { api.RegisterControlServer(m.localserver, localProxyControlAPI) api.RegisterLogsServer(m.localserver, localProxyLogsAPI) api.RegisterHealthServer(m.localserver, localHealthServer) - api.RegisterCAServer(m.localserver, localCAAPI) + api.RegisterDispatcherServer(m.localserver, localProxyDispatcherAPI) + api.RegisterCAServer(m.localserver, localProxyCAAPI) + api.RegisterNodeCAServer(m.localserver, localProxyNodeCAAPI) + api.RegisterResourceAllocatorServer(m.localserver, localProxyResourceAPI) + api.RegisterLogBrokerServer(m.localserver, localProxyLogBrokerAPI) healthServer.SetServingStatus("Raft", api.HealthCheckResponse_NOT_SERVING) localHealthServer.SetServingStatus("ControlAPI", api.HealthCheckResponse_NOT_SERVING) @@ -388,39 +425,26 @@ func (m *Manager) Run(parent context.Context) error { close(m.started) - errCh := make(chan error, 1) go func() { err := m.raftNode.Run(ctx) if err != nil { - errCh <- err log.G(ctx).WithError(err).Error("raft node stopped") - m.Stop(ctx) + m.Stop(ctx, false) } }() - returnErr := func(err error) error { - select { - case runErr := <-errCh: - if runErr == raft.ErrMemberRemoved { - return runErr - } - default: - } - return err - } - if err := raft.WaitForLeader(ctx, m.raftNode); err != nil { - return returnErr(err) + return err } c, err := raft.WaitForCluster(ctx, m.raftNode) if err != nil { - return returnErr(err) + return err } raftConfig := c.Spec.Raft if err := m.watchForKEKChanges(ctx); err != nil { - return returnErr(err) + return err } if int(raftConfig.ElectionTick) != m.raftNode.Config.ElectionTick { @@ -438,16 +462,17 @@ func (m *Manager) Run(parent context.Context) error { return nil } m.mu.Unlock() - m.Stop(ctx) + m.Stop(ctx, false) - return returnErr(err) + return err } const stopTimeout = 8 * time.Second // Stop stops the manager. It immediately closes all open connections and -// active RPCs as well as stopping the scheduler. -func (m *Manager) Stop(ctx context.Context) { +// active RPCs as well as stopping the scheduler. If clearData is set, the +// raft logs, snapshots, and keys will be erased. +func (m *Manager) Stop(ctx context.Context, clearData bool) { log.G(ctx).Info("Stopping manager") // It's not safe to start shutting down while the manager is still // starting up. @@ -472,6 +497,8 @@ func (m *Manager) Stop(ctx context.Context) { close(localSrvDone) }() + m.raftNode.Cancel() + m.dispatcher.Stop() m.logbroker.Stop() m.caserver.Stop() @@ -494,10 +521,16 @@ func (m *Manager) Stop(ctx context.Context) { if m.scheduler != nil { m.scheduler.Stop() } + if m.roleManager != nil { + m.roleManager.Stop() + } if m.keyManager != nil { m.keyManager.Stop() } + if clearData { + m.raftNode.ClearData() + } m.cancelFunc() <-m.raftNode.Done() @@ -527,9 +560,6 @@ func (m *Manager) updateKEK(ctx context.Context, cluster *api.Cluster) error { "node.role": ca.ManagerRole, }) - // we are our own peer from which we get certs - try to connect over the local socket - r := remotes.NewRemotes(api.Peer{Addr: m.Addr(), NodeID: nodeID}) - kekData := ca.KEKData{Version: cluster.Meta.Version.Index} for _, encryptionKey := range cluster.UnlockKeys { if encryptionKey.Subsystem == ca.ManagerRole { @@ -549,8 +579,27 @@ func (m *Manager) updateKEK(ctx context.Context, cluster *api.Cluster) error { // a best effort attempt to update the TLS certificate - if it fails, it'll be updated the next time it renews; // don't wait because it might take a bit go func() { - if err := ca.RenewTLSConfigNow(ctx, securityConfig, r); err != nil { - logger.WithError(err).Errorf("failed to download new TLS certificate after locking the cluster") + insecureCreds := credentials.NewTLS(&tls.Config{InsecureSkipVerify: true}) + + conn, err := grpc.Dial( + m.config.ControlAPI, + grpc.WithTransportCredentials(insecureCreds), + grpc.WithDialer( + func(addr string, timeout time.Duration) (net.Conn, error) { + return xnet.DialTimeoutLocal(addr, timeout) + }), + ) + if err != nil { + logger.WithError(err).Error("failed to connect to local manager socket after locking the cluster") + return + } + + defer conn.Close() + + connBroker := connectionbroker.New(remotes.NewRemotes()) + connBroker.SetLocalConn(conn) + if err := ca.RenewTLSConfigNow(ctx, securityConfig, connBroker); err != nil { + logger.WithError(err).Error("failed to download new TLS certificate after locking the cluster") } }() } @@ -778,6 +827,7 @@ func (m *Manager) becomeLeader(ctx context.Context) { m.taskReaper = taskreaper.New(s) m.scheduler = scheduler.New(s) m.keyManager = keymanager.New(s, keymanager.DefaultConfig()) + m.roleManager = newRoleManager(s, m.raftNode) // TODO(stevvooe): Allocate a context that can be used to // shutdown underlying manager processes when leadership is @@ -853,6 +903,9 @@ func (m *Manager) becomeLeader(ctx context.Context) { } }(m.globalOrchestrator) + go func(roleManager *roleManager) { + roleManager.Run() + }(m.roleManager) } // becomeFollower shuts down the subsystems that are only run by the leader. @@ -881,6 +934,9 @@ func (m *Manager) becomeFollower() { m.scheduler.Stop() m.scheduler = nil + m.roleManager.Stop() + m.roleManager = nil + if m.keyManager != nil { m.keyManager.Stop() m.keyManager = nil @@ -937,7 +993,7 @@ func managerNode(nodeID string, availability api.NodeSpec_Availability) *api.Nod }, }, Spec: api.NodeSpec{ - Role: api.NodeRoleManager, + DesiredRole: api.NodeRoleManager, Membership: api.NodeMembershipAccepted, Availability: availability, }, diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/replicated.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/replicated.go index b7ecd3c37..c3b90676e 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/replicated.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/replicated.go @@ -102,7 +102,7 @@ func (r *Orchestrator) Stop() { func (r *Orchestrator) tick(ctx context.Context) { // tickTasks must be called first, so we respond to task-level changes - // before performing service reconcillation. + // before performing service reconciliation. r.tickTasks(ctx) r.tickServices(ctx) } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/services.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/services.go index 2084ba160..eee840c81 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/services.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/services.go @@ -181,7 +181,7 @@ func (r *Orchestrator) reconcile(ctx context.Context, service *api.Service) { func (r *Orchestrator) addTasks(ctx context.Context, batch *store.Batch, service *api.Service, runningSlots map[uint64]orchestrator.Slot, deadSlots map[uint64]orchestrator.Slot, count int) { slot := uint64(0) for i := 0; i < count; i++ { - // Find an slot number that is missing a running task + // Find a slot number that is missing a running task for { slot++ if _, ok := runningSlots[slot]; !ok { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/tasks.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/tasks.go index 7b8b44261..892f4e494 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/tasks.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/orchestrator/replicated/tasks.go @@ -15,7 +15,7 @@ import ( // This file provides task-level orchestration. It observes changes to task // and node state and kills/recreates tasks if necessary. This is distinct from -// service-level reconcillation, which observes changes to services and creates +// service-level reconciliation, which observes changes to services and creates // and/or kills tasks to match the service definition. func invalidNode(n *api.Node) bool { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/role_manager.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/role_manager.go new file mode 100644 index 000000000..63dbfb850 --- /dev/null +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/role_manager.go @@ -0,0 +1,167 @@ +package manager + +import ( + "time" + + "github.com/docker/swarmkit/api" + "github.com/docker/swarmkit/log" + "github.com/docker/swarmkit/manager/state" + "github.com/docker/swarmkit/manager/state/raft" + "github.com/docker/swarmkit/manager/state/store" + "golang.org/x/net/context" +) + +const roleReconcileInterval = 5 * time.Second + +// roleManager reconciles the raft member list with desired role changes. +type roleManager struct { + ctx context.Context + cancel func() + + store *store.MemoryStore + raft *raft.Node + doneChan chan struct{} + + // pending contains changed nodes that have not yet been reconciled in + // the raft member list. + pending map[string]*api.Node +} + +// newRoleManager creates a new roleManager. +func newRoleManager(store *store.MemoryStore, raftNode *raft.Node) *roleManager { + ctx, cancel := context.WithCancel(context.Background()) + return &roleManager{ + ctx: ctx, + cancel: cancel, + store: store, + raft: raftNode, + doneChan: make(chan struct{}), + pending: make(map[string]*api.Node), + } +} + +// Run is roleManager's main loop. +func (rm *roleManager) Run() { + defer close(rm.doneChan) + + var ( + nodes []*api.Node + ticker *time.Ticker + tickerCh <-chan time.Time + ) + + watcher, cancelWatch, err := store.ViewAndWatch(rm.store, + func(readTx store.ReadTx) error { + var err error + nodes, err = store.FindNodes(readTx, store.All) + return err + }, + state.EventUpdateNode{}) + defer cancelWatch() + + if err != nil { + log.L.WithError(err).Error("failed to check nodes for role changes") + } else { + for _, node := range nodes { + rm.pending[node.ID] = node + rm.reconcileRole(node) + } + if len(rm.pending) != 0 { + ticker = time.NewTicker(roleReconcileInterval) + tickerCh = ticker.C + } + } + + for { + select { + case event := <-watcher: + node := event.(state.EventUpdateNode).Node + rm.pending[node.ID] = node + rm.reconcileRole(node) + if len(rm.pending) != 0 && ticker == nil { + ticker = time.NewTicker(roleReconcileInterval) + tickerCh = ticker.C + } + case <-tickerCh: + for _, node := range rm.pending { + rm.reconcileRole(node) + } + if len(rm.pending) == 0 { + ticker.Stop() + ticker = nil + tickerCh = nil + } + case <-rm.ctx.Done(): + if ticker != nil { + ticker.Stop() + } + return + } + } +} + +func (rm *roleManager) reconcileRole(node *api.Node) { + if node.Role == node.Spec.DesiredRole { + // Nothing to do. + delete(rm.pending, node.ID) + return + } + + // Promotion can proceed right away. + if node.Spec.DesiredRole == api.NodeRoleManager && node.Role == api.NodeRoleWorker { + err := rm.store.Update(func(tx store.Tx) error { + updatedNode := store.GetNode(tx, node.ID) + if updatedNode == nil || updatedNode.Spec.DesiredRole != node.Spec.DesiredRole || updatedNode.Role != node.Role { + return nil + } + updatedNode.Role = api.NodeRoleManager + return store.UpdateNode(tx, updatedNode) + }) + if err != nil { + log.L.WithError(err).Errorf("failed to promote node %s", node.ID) + } else { + delete(rm.pending, node.ID) + } + } else if node.Spec.DesiredRole == api.NodeRoleWorker && node.Role == api.NodeRoleManager { + // Check for node in memberlist + member := rm.raft.GetMemberByNodeID(node.ID) + if member != nil { + // Quorum safeguard + if !rm.raft.CanRemoveMember(member.RaftID) { + // TODO(aaronl): Retry later + log.L.Debugf("can't demote node %s at this time: removing member from raft would result in a loss of quorum", node.ID) + return + } + + rmCtx, rmCancel := context.WithTimeout(rm.ctx, 5*time.Second) + defer rmCancel() + + if err := rm.raft.RemoveMember(rmCtx, member.RaftID); err != nil { + // TODO(aaronl): Retry later + log.L.WithError(err).Debugf("can't demote node %s at this time", node.ID) + return + } + } + + err := rm.store.Update(func(tx store.Tx) error { + updatedNode := store.GetNode(tx, node.ID) + if updatedNode == nil || updatedNode.Spec.DesiredRole != node.Spec.DesiredRole || updatedNode.Role != node.Role { + return nil + } + updatedNode.Role = api.NodeRoleWorker + + return store.UpdateNode(tx, updatedNode) + }) + if err != nil { + log.L.WithError(err).Errorf("failed to demote node %s", node.ID) + } else { + delete(rm.pending, node.ID) + } + } +} + +// Stop stops the roleManager and waits for the main loop to exit. +func (rm *roleManager) Stop() { + rm.cancel() + <-rm.doneChan +} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/raft.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/raft.go index 98b3f451c..a19f07b6e 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/raft.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/raft.go @@ -112,9 +112,10 @@ type Node struct { ticker clock.Ticker doneCh chan struct{} - // removeRaftCh notifies about node deletion from raft cluster - removeRaftCh chan struct{} + // RemovedFromRaft notifies about node deletion from raft cluster + RemovedFromRaft chan struct{} removeRaftFunc func() + cancelFunc func() leadershipBroadcast *watch.Queue // used to coordinate shutdown @@ -134,6 +135,7 @@ type Node struct { raftLogger *storage.EncryptedRaftLogger keyRotator EncryptionKeyRotator rotationQueued bool + clearData bool waitForAppliedIndex uint64 } @@ -199,7 +201,7 @@ func NewNode(opts NodeOptions) *Node { Logger: cfg.Logger, }, doneCh: make(chan struct{}), - removeRaftCh: make(chan struct{}), + RemovedFromRaft: make(chan struct{}), stopped: make(chan struct{}), leadershipBroadcast: watch.NewQueue(), lastSendToMember: make(map[uint64]chan struct{}), @@ -220,7 +222,17 @@ func NewNode(opts NodeOptions) *Node { var removeRaftOnce sync.Once return func() { removeRaftOnce.Do(func() { - close(n.removeRaftCh) + atomic.StoreUint32(&n.isMember, 0) + close(n.RemovedFromRaft) + }) + } + }(n) + + n.cancelFunc = func(n *Node) func() { + var cancelOnce sync.Once + return func() { + cancelOnce.Do(func() { + close(n.stopped) }) } }(n) @@ -364,6 +376,12 @@ func (n *Node) done() { close(n.doneCh) } +// ClearData tells the raft node to delete its WALs, snapshots, and keys on +// shutdown. +func (n *Node) ClearData() { + n.clearData = true +} + // Run is the main loop for a Raft node, it goes along the state machine, // acting on the messages received from other Raft nodes in the cluster. // @@ -373,15 +391,12 @@ func (n *Node) Run(ctx context.Context) error { ctx = log.WithLogger(ctx, logrus.WithField("raft_id", fmt.Sprintf("%x", n.Config.ID))) ctx, cancel := context.WithCancel(ctx) - // nodeRemoved indicates that node was stopped due its removal. - nodeRemoved := false - defer func() { cancel() n.stop(ctx) - if nodeRemoved { - // Move WAL and snapshot out of the way, since - // they are no longer usable. + if n.clearData { + // Delete WAL and snapshots, since they are no longer + // usable. if err := n.raftLogger.Clear(ctx); err != nil { log.G(ctx).WithError(err).Error("failed to move wal after node removal") } @@ -405,7 +420,7 @@ func (n *Node) Run(ctx context.Context) error { // Save entries to storage if err := n.saveToStorage(ctx, &raftConfig, rd.HardState, rd.Entries, rd.Snapshot); err != nil { - log.G(ctx).WithError(err).Error("failed to save entries to storage") + return errors.Wrap(err, "failed to save entries to storage") } if len(rd.Messages) != 0 { @@ -501,9 +516,7 @@ func (n *Node) Run(ctx context.Context) error { n.campaignWhenAble = false } if len(members) == 1 && members[n.Config.ID] != nil { - if err := n.raftNode.Campaign(ctx); err != nil { - panic("raft: cannot campaign to be the leader on node restore") - } + n.raftNode.Campaign(ctx) } } @@ -536,12 +549,6 @@ func (n *Node) Run(ctx context.Context) error { case n.needsSnapshot(ctx): n.doSnapshot(ctx, n.getCurrentRaftConfig()) } - case <-n.removeRaftCh: - nodeRemoved = true - // If the node was removed from other members, - // send back an error to the caller to start - // the shutdown process. - return ErrMemberRemoved case <-ctx.Done(): return nil } @@ -605,6 +612,15 @@ func (n *Node) getCurrentRaftConfig() api.RaftConfig { return raftConfig } +// Cancel interrupts all ongoing proposals, and prevents new ones from +// starting. This is useful for the shutdown sequence because it allows +// the manager to shut down raft-dependent services that might otherwise +// block on shutdown if quorum isn't met. Then the raft node can be completely +// shut down once no more code is using it. +func (n *Node) Cancel() { + n.cancelFunc() +} + // Done returns channel which is closed when raft node is fully stopped. func (n *Node) Done() <-chan struct{} { return n.doneCh @@ -614,8 +630,7 @@ func (n *Node) stop(ctx context.Context) { n.stopMu.Lock() defer n.stopMu.Unlock() - close(n.stopped) - + n.Cancel() n.waitProp.Wait() n.asyncTasks.Wait() @@ -710,11 +725,20 @@ func (n *Node) Join(ctx context.Context, req *api.JoinRequest) (*api.JoinRespons defer n.membershipLock.Unlock() if !n.IsMember() { - return nil, ErrNoRaftMember + return nil, grpc.Errorf(codes.FailedPrecondition, "%s", ErrNoRaftMember.Error()) } if !n.isLeader() { - return nil, ErrLostLeadership + return nil, grpc.Errorf(codes.FailedPrecondition, "%s", ErrLostLeadership.Error()) + } + + // A single manager must not be able to join the raft cluster twice. If + // it did, that would cause the quorum to be computed incorrectly. This + // could happen if the WAL was deleted from an active manager. + for _, m := range n.cluster.Members() { + if m.NodeID == nodeInfo.NodeID { + return nil, grpc.Errorf(codes.AlreadyExists, "%s", "a raft member with this node ID already exists") + } } // Find a unique ID for the joining member. @@ -734,7 +758,7 @@ func (n *Node) Join(ctx context.Context, req *api.JoinRequest) (*api.JoinRespons requestHost, requestPort, err := net.SplitHostPort(remoteAddr) if err != nil { - return nil, fmt.Errorf("invalid address %s in raft join request", remoteAddr) + return nil, grpc.Errorf(codes.InvalidArgument, "invalid address %s in raft join request", remoteAddr) } requestIP := net.ParseIP(requestHost) @@ -990,6 +1014,11 @@ func (n *Node) ProcessRaftMessage(ctx context.Context, msg *api.ProcessRaftMessa defer n.stopMu.RUnlock() if n.IsMember() { + if msg.Message.To != n.Config.ID { + n.processRaftMessageLogger(ctx, msg).Errorf("received message intended for raft_id %x", msg.Message.To) + return &api.ProcessRaftMessageResponse{}, nil + } + if err := n.raftNode.Step(ctx, *msg.Message); err != nil { n.processRaftMessageLogger(ctx, msg).WithError(err).Debug("raft Step failed") } @@ -1226,17 +1255,6 @@ func (n *Node) IsMember() bool { return atomic.LoadUint32(&n.isMember) == 1 } -// canSubmitProposal defines if any more proposals -// could be submitted and processed. -func (n *Node) canSubmitProposal() bool { - select { - case <-n.stopped: - return false - default: - return true - } -} - // Saves a log entry to our Store func (n *Node) saveToStorage( ctx context.Context, @@ -1453,11 +1471,6 @@ func (n *Node) handleAddressChange(ctx context.Context, member *membership.Membe return nil } -type applyResult struct { - resp proto.Message - err error -} - // processInternalRaftRequest sends a message to nodes participating // in the raft to apply a log entry and then waits for it to be applied // on the server. It will block until the update is performed, there is @@ -1465,7 +1478,7 @@ type applyResult struct { // shutdown. func (n *Node) processInternalRaftRequest(ctx context.Context, r *api.InternalRaftRequest, cb func()) (proto.Message, error) { n.stopMu.RLock() - if !n.canSubmitProposal() { + if !n.IsMember() { n.stopMu.RUnlock() return nil, ErrStopped } @@ -1505,15 +1518,27 @@ func (n *Node) processInternalRaftRequest(ctx context.Context, r *api.InternalRa } select { - case x := <-ch: - res := x.(*applyResult) - return res.resp, res.err + case x, ok := <-ch: + if !ok { + return nil, ErrLostLeadership + } + return x.(proto.Message), nil case <-waitCtx.Done(): n.wait.cancel(r.ID) - return nil, ErrLostLeadership + // if channel is closed, wait item was canceled, otherwise it was triggered + x, ok := <-ch + if !ok { + return nil, ErrLostLeadership + } + return x.(proto.Message), nil case <-ctx.Done(): n.wait.cancel(r.ID) - return nil, ctx.Err() + // if channel is closed, wait item was canceled, otherwise it was triggered + x, ok := <-ch + if !ok { + return nil, ctx.Err() + } + return x.(proto.Message), nil } } @@ -1574,7 +1599,7 @@ func (n *Node) processEntry(ctx context.Context, entry raftpb.Entry) error { return nil } - if !n.wait.trigger(r.ID, &applyResult{resp: r, err: nil}) { + if !n.wait.trigger(r.ID, r) { // There was no wait on this ID, meaning we don't have a // transaction in progress that would be committed to the // memory store by the "trigger" call. Either a different node @@ -1699,11 +1724,11 @@ func (n *Node) applyRemoveNode(ctx context.Context, cc raftpb.ConfChange) (err e } if cc.NodeID == n.Config.ID { - n.removeRaftFunc() - // wait the commit ack to be sent before closing connection n.asyncTasks.Wait() + n.removeRaftFunc() + // if there are only 2 nodes in the cluster, and leader is leaving // before closing the connection, leader has to ensure that follower gets // noticed about this raft conf change commit. Otherwise, follower would @@ -1801,10 +1826,10 @@ func createConfigChangeEnts(ids []uint64, self uint64, term, index uint64) []raf // - ConfChangeAddNode, in which case the contained ID will be added into the set. // - ConfChangeRemoveNode, in which case the contained ID will be removed from the set. func getIDs(snap *raftpb.Snapshot, ents []raftpb.Entry) []uint64 { - ids := make(map[uint64]bool) + ids := make(map[uint64]struct{}) if snap != nil { for _, id := range snap.Metadata.ConfState.Nodes { - ids[id] = true + ids[id] = struct{}{} } } for _, e := range ents { @@ -1820,7 +1845,7 @@ func getIDs(snap *raftpb.Snapshot, ents []raftpb.Entry) []uint64 { } switch cc.Type { case raftpb.ConfChangeAddNode: - ids[cc.NodeID] = true + ids[cc.NodeID] = struct{}{} case raftpb.ConfChangeRemoveNode: delete(ids, cc.NodeID) case raftpb.ConfChangeUpdateNode: diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/storage.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/storage.go index b1c74e035..402b04a33 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/storage.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/storage.go @@ -52,13 +52,6 @@ func (n *Node) loadAndStart(ctx context.Context, forceNewCluster bool) error { return err } - if snapshot != nil { - // Load the snapshot data into the store - if err := n.restoreFromSnapshot(snapshot.Data, forceNewCluster); err != nil { - return err - } - } - // Read logs to fully catch up store var raftNode api.RaftMember if err := raftNode.Unmarshal(waldata.Metadata); err != nil { @@ -66,6 +59,13 @@ func (n *Node) loadAndStart(ctx context.Context, forceNewCluster bool) error { } n.Config.ID = raftNode.RaftID + if snapshot != nil { + // Load the snapshot data into the store + if err := n.restoreFromSnapshot(snapshot.Data, forceNewCluster); err != nil { + return err + } + } + ents, st := waldata.Entries, waldata.HardState // All members that are no longer part of the cluster must be added to @@ -88,14 +88,14 @@ func (n *Node) loadAndStart(ctx context.Context, forceNewCluster bool) error { // discard the previously uncommitted entries for i, ent := range ents { if ent.Index > st.Commit { - log.G(ctx).Infof("discarding %d uncommitted WAL entries ", len(ents)-i) + log.G(ctx).Infof("discarding %d uncommitted WAL entries", len(ents)-i) ents = ents[:i] break } } // force append the configuration change entries - toAppEnts := createConfigChangeEnts(getIDs(snapshot, ents), uint64(n.Config.ID), st.Term, st.Commit) + toAppEnts := createConfigChangeEnts(getIDs(snapshot, ents), n.Config.ID, st.Term, st.Commit) // All members that are being removed as part of the // force-new-cluster process must be added to the @@ -230,13 +230,15 @@ func (n *Node) restoreFromSnapshot(data []byte, forceNewCluster bool) error { oldMembers := n.cluster.Members() - if !forceNewCluster { - for _, member := range snapshot.Membership.Members { + for _, member := range snapshot.Membership.Members { + if forceNewCluster && member.RaftID != n.Config.ID { + n.cluster.RemoveMember(member.RaftID) + } else { if err := n.registerNode(&api.RaftMember{RaftID: member.RaftID, NodeID: member.NodeID, Addr: member.Addr}); err != nil { return err } - delete(oldMembers, member.RaftID) } + delete(oldMembers, member.RaftID) } for _, removedMember := range snapshot.Membership.Removed { diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/wait.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/wait.go index ecd39284c..6a003c29b 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/wait.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/raft/wait.go @@ -55,8 +55,11 @@ func (w *wait) cancel(id uint64) { waitItem, ok := w.m[id] delete(w.m, id) w.l.Unlock() - if ok && waitItem.cancel != nil { - waitItem.cancel() + if ok { + if waitItem.cancel != nil { + waitItem.cancel() + } + close(waitItem.ch) } } @@ -69,5 +72,6 @@ func (w *wait) cancelAll() { if waitItem.cancel != nil { waitItem.cancel() } + close(waitItem.ch) } } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/store/nodes.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/store/nodes.go index 04985fc5a..ec4709abd 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/store/nodes.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/manager/state/store/nodes.go @@ -238,7 +238,7 @@ func (ni nodeIndexerByRole) FromObject(obj interface{}) (bool, []byte, error) { } // Add the null character as a terminator - return true, []byte(strconv.FormatInt(int64(n.Spec.Role), 10) + "\x00"), nil + return true, []byte(strconv.FormatInt(int64(n.Role), 10) + "\x00"), nil } type nodeIndexerByMembership struct{} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/node/node.go b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/node/node.go index cd92acd9d..be776dc15 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/node/node.go +++ b/vendor/github.com/docker/docker/vendor/github.com/docker/swarmkit/node/node.go @@ -18,11 +18,11 @@ import ( "github.com/docker/swarmkit/agent/exec" "github.com/docker/swarmkit/api" "github.com/docker/swarmkit/ca" + "github.com/docker/swarmkit/connectionbroker" "github.com/docker/swarmkit/ioutils" "github.com/docker/swarmkit/log" "github.com/docker/swarmkit/manager" "github.com/docker/swarmkit/manager/encryption" - "github.com/docker/swarmkit/manager/state/raft" "github.com/docker/swarmkit/remotes" "github.com/docker/swarmkit/xnet" "github.com/pkg/errors" @@ -106,6 +106,7 @@ type Node struct { sync.RWMutex config *Config remotes *persistentRemotes + connBroker *connectionbroker.Broker role string roleCond *sync.Cond conn *grpc.ClientConn @@ -155,7 +156,6 @@ func New(c *Config) (*Node, error) { return nil, err } } - n := &Node{ remotes: newPersistentRemotes(stateFile, p...), role: ca.WorkerRole, @@ -175,6 +175,8 @@ func New(c *Config) (*Node, error) { } } + n.connBroker = connectionbroker.New(n.remotes) + n.roleCond = sync.NewCond(n.RLocker()) n.connCond = sync.NewCond(n.RLocker()) return n, nil @@ -249,25 +251,20 @@ func (n *Node) run(ctx context.Context) (err error) { // If we got a role change, renew lastRole := n.role role := ca.WorkerRole - if node.Spec.Role == api.NodeRoleManager { + if node.Role == api.NodeRoleManager { role = ca.ManagerRole } if lastRole == role { n.Unlock() continue } - // switch role to agent immediately to shutdown manager early - if role == ca.WorkerRole { - n.role = role - n.roleCond.Broadcast() - } n.Unlock() renewCert() } } }() - updates := ca.RenewTLSConfig(ctx, securityConfig, n.remotes, forceCertRenewal) + updates := ca.RenewTLSConfig(ctx, securityConfig, n.connBroker, forceCertRenewal) go func() { for { select { @@ -295,7 +292,7 @@ func (n *Node) run(ctx context.Context) (err error) { var wg sync.WaitGroup wg.Add(2) go func() { - managerErr = n.runManager(ctx, securityConfig, managerReady) // store err and loop + managerErr = n.superviseManager(ctx, securityConfig, managerReady) // store err and loop wg.Done() cancel() }() @@ -308,7 +305,18 @@ func (n *Node) run(ctx context.Context) (err error) { go func() { <-agentReady if role == ca.ManagerRole { - <-managerReady + workerRole := make(chan struct{}) + waitRoleCtx, waitRoleCancel := context.WithCancel(ctx) + go func() { + if n.waitRole(waitRoleCtx, ca.WorkerRole) == nil { + close(workerRole) + } + }() + select { + case <-managerReady: + case <-workerRole: + } + waitRoleCancel() } close(n.ready) }() @@ -330,6 +338,14 @@ func (n *Node) Stop(ctx context.Context) error { default: return errNodeNotStarted } + // ask agent to clean up assignments + n.Lock() + if n.agent != nil { + if err := n.agent.Leave(ctx); err != nil { + log.G(ctx).WithError(err).Error("agent failed to clean up assignments") + } + } + n.Unlock() n.stopOnce.Do(func() { close(n.stopped) @@ -355,17 +371,35 @@ func (n *Node) Err(ctx context.Context) error { } func (n *Node) runAgent(ctx context.Context, db *bolt.DB, creds credentials.TransportCredentials, ready chan<- struct{}) error { + waitCtx, waitCancel := context.WithCancel(ctx) + remotesCh := n.remotes.WaitSelect(ctx) + controlCh := n.ListenControlSocket(waitCtx) + +waitPeer: + for { + select { + case <-ctx.Done(): + break waitPeer + case <-remotesCh: + break waitPeer + case conn := <-controlCh: + if conn != nil { + break waitPeer + } + } + } + + waitCancel() + select { case <-ctx.Done(): - case <-n.remotes.WaitSelect(ctx): - } - if ctx.Err() != nil { return ctx.Err() + default: } a, err := agent.New(&agent.Config{ Hostname: n.config.Hostname, - Managers: n.remotes, + ConnBroker: n.connBroker, Executor: n.config.Executor, DB: db, NotifyNodeChange: n.notifyNodeChange, @@ -410,6 +444,7 @@ func (n *Node) setControlSocket(conn *grpc.ClientConn) { n.conn.Close() } n.conn = conn + n.connBroker.SetLocalConn(conn) n.connCond.Broadcast() n.Unlock() } @@ -434,15 +469,21 @@ func (n *Node) ListenControlSocket(ctx context.Context) <-chan *grpc.ClientConn defer close(done) defer n.RUnlock() for { - if ctx.Err() != nil { + select { + case <-ctx.Done(): return + default: } if conn == n.conn { n.connCond.Wait() continue } conn = n.conn - c <- conn + select { + case c <- conn: + case <-ctx.Done(): + return + } } }() return c @@ -519,7 +560,7 @@ func (n *Node) loadSecurityConfig(ctx context.Context) (*ca.SecurityConfig, erro } log.G(ctx).Debug("generated CA key and certificate") } else if err == ca.ErrNoLocalRootCA { // from previous error loading the root CA from disk - rootCA, err = ca.DownloadRootCA(ctx, paths.RootCA, n.config.JoinToken, n.remotes) + rootCA, err = ca.DownloadRootCA(ctx, paths.RootCA, n.config.JoinToken, n.connBroker) if err != nil { return nil, err } @@ -546,7 +587,7 @@ func (n *Node) loadSecurityConfig(ctx context.Context) (*ca.SecurityConfig, erro securityConfig, err = rootCA.CreateSecurityConfig(ctx, krw, ca.CertificateRequestConfig{ Token: n.config.JoinToken, Availability: n.config.Availability, - Remotes: n.remotes, + ConnBroker: n.connBroker, }) if err != nil { @@ -616,9 +657,7 @@ func (n *Node) waitRole(ctx context.Context, role string) error { n.roleCond.Wait() select { case <-ctx.Done(): - if ctx.Err() != nil { - return ctx.Err() - } + return ctx.Err() default: } } @@ -626,101 +665,109 @@ func (n *Node) waitRole(ctx context.Context, role string) error { return nil } -func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig, ready chan struct{}) error { - for { - if err := n.waitRole(ctx, ca.ManagerRole); err != nil { - return err - } - - remoteAddr, _ := n.remotes.Select(n.NodeID()) - m, err := manager.New(&manager.Config{ - ForceNewCluster: n.config.ForceNewCluster, - RemoteAPI: manager.RemoteAddrs{ - ListenAddr: n.config.ListenRemoteAPI, - AdvertiseAddr: n.config.AdvertiseRemoteAPI, - }, - ControlAPI: n.config.ListenControlAPI, - SecurityConfig: securityConfig, - ExternalCAs: n.config.ExternalCAs, - JoinRaft: remoteAddr.Addr, - StateDir: n.config.StateDir, - HeartbeatTick: n.config.HeartbeatTick, - ElectionTick: n.config.ElectionTick, - AutoLockManagers: n.config.AutoLockManagers, - UnlockKey: n.unlockKey, - Availability: n.config.Availability, - }) - if err != nil { - return err +func (n *Node) runManager(ctx context.Context, securityConfig *ca.SecurityConfig, ready chan struct{}, workerRole <-chan struct{}) error { + remoteAddr, _ := n.remotes.Select(n.NodeID()) + m, err := manager.New(&manager.Config{ + ForceNewCluster: n.config.ForceNewCluster, + RemoteAPI: manager.RemoteAddrs{ + ListenAddr: n.config.ListenRemoteAPI, + AdvertiseAddr: n.config.AdvertiseRemoteAPI, + }, + ControlAPI: n.config.ListenControlAPI, + SecurityConfig: securityConfig, + ExternalCAs: n.config.ExternalCAs, + JoinRaft: remoteAddr.Addr, + StateDir: n.config.StateDir, + HeartbeatTick: n.config.HeartbeatTick, + ElectionTick: n.config.ElectionTick, + AutoLockManagers: n.config.AutoLockManagers, + UnlockKey: n.unlockKey, + Availability: n.config.Availability, + }) + if err != nil { + return err + } + done := make(chan struct{}) + var runErr error + go func() { + if err := m.Run(context.Background()); err != nil { + runErr = err } - done := make(chan struct{}) - var runErr error - go func() { - runErr = m.Run(context.Background()) - close(done) - }() + close(done) + }() + var clearData bool + defer func() { n.Lock() - n.manager = m + n.manager = nil n.Unlock() + m.Stop(ctx, clearData) + <-done + n.setControlSocket(nil) + }() - connCtx, connCancel := context.WithCancel(ctx) - go n.initManagerConnection(connCtx, ready) - - // this happens only on initial start - if ready != nil { - go func(ready chan struct{}) { - select { - case <-ready: - addr, err := n.RemoteAPIAddr() - if err != nil { - log.G(ctx).WithError(err).Errorf("get remote api addr") - } else { - n.remotes.Observe(api.Peer{NodeID: n.NodeID(), Addr: addr}, remotes.DefaultObservationWeight) - } - case <-connCtx.Done(): - } - }(ready) - ready = nil + n.Lock() + n.manager = m + n.Unlock() + + connCtx, connCancel := context.WithCancel(ctx) + defer connCancel() + + go n.initManagerConnection(connCtx, ready) + + // wait for manager stop or for role change + select { + case <-done: + return runErr + case <-workerRole: + log.G(ctx).Info("role changed to worker, stopping manager") + clearData = true + case <-m.RemovedFromRaft(): + log.G(ctx).Info("manager removed from raft cluster, stopping manager") + clearData = true + case <-ctx.Done(): + return ctx.Err() + } + return nil +} + +func (n *Node) superviseManager(ctx context.Context, securityConfig *ca.SecurityConfig, ready chan struct{}) error { + for { + if err := n.waitRole(ctx, ca.ManagerRole); err != nil { + return err } - roleChanged := make(chan error) - waitCtx, waitCancel := context.WithCancel(ctx) + workerRole := make(chan struct{}) + waitRoleCtx, waitRoleCancel := context.WithCancel(ctx) go func() { - err := n.waitRole(waitCtx, ca.WorkerRole) - roleChanged <- err + if n.waitRole(waitRoleCtx, ca.WorkerRole) == nil { + close(workerRole) + } }() - select { - case <-done: - // Fail out if m.Run() returns error, otherwise wait for - // role change. - if runErr != nil && runErr != raft.ErrMemberRemoved { - err = runErr - } else { - err = <-roleChanged - } - case err = <-roleChanged: + if err := n.runManager(ctx, securityConfig, ready, workerRole); err != nil { + waitRoleCancel() + return errors.Wrap(err, "manager stopped") } - n.Lock() - n.manager = nil - n.Unlock() - + // If the manager stopped running and our role is still + // "manager", it's possible that the manager was demoted and + // the agent hasn't realized this yet. We should wait for the + // role to change instead of restarting the manager immediately. + timer := time.NewTimer(16 * time.Second) select { - case <-done: + case <-timer.C: + log.G(ctx).Warn("failed to get worker role after manager stop, restarting manager") + case <-workerRole: case <-ctx.Done(): - err = ctx.Err() - m.Stop(context.Background()) - <-done + timer.Stop() + waitRoleCancel() + return ctx.Err() } - connCancel() - n.setControlSocket(nil) - waitCancel() + timer.Stop() + waitRoleCancel() - if err != nil { - return err - } + ready = nil } } diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/digester.go b/vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/algorithm.go similarity index 79% rename from vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/digester.go rename to vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/algorithm.go index 0435a1a61..a3c44801d 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/digester.go +++ b/vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/algorithm.go @@ -39,7 +39,7 @@ var ( ) // Available returns true if the digest type is available for use. If this -// returns false, New and Hash will return nil. +// returns false, Digester and Hash will return nil. func (a Algorithm) Available() bool { h, ok := algorithms[a] if !ok { @@ -72,13 +72,17 @@ func (a *Algorithm) Set(value string) error { *a = Algorithm(value) } + if !a.Available() { + return ErrDigestUnsupported + } + return nil } -// New returns a new digester for the specified algorithm. If the algorithm +// Digester returns a new digester for the specified algorithm. If the algorithm // does not have a digester implementation, nil will be returned. This can be -// checked by calling Available before calling New. -func (a Algorithm) New() Digester { +// checked by calling Available before calling Digester. +func (a Algorithm) Digester() Digester { return &digester{ alg: a, hash: a.Hash(), @@ -89,6 +93,11 @@ func (a Algorithm) New() Digester { // method will panic. Check Algorithm.Available() before calling. func (a Algorithm) Hash() hash.Hash { if !a.Available() { + // Empty algorithm string is invalid + if a == "" { + panic(fmt.Sprintf("empty digest algorithm, validate before calling Algorithm.Hash()")) + } + // NOTE(stevvooe): A missing hash is usually a programming error that // must be resolved at compile time. We don't import in the digest // package to allow users to choose their hash implementation (such as @@ -104,7 +113,7 @@ func (a Algorithm) Hash() hash.Hash { // FromReader returns the digest of the reader using the algorithm. func (a Algorithm) FromReader(rd io.Reader) (Digest, error) { - digester := a.New() + digester := a.Digester() if _, err := io.Copy(digester.Hash(), rd); err != nil { return "", err @@ -115,7 +124,7 @@ func (a Algorithm) FromReader(rd io.Reader) (Digest, error) { // FromBytes digests the input and returns a Digest. func (a Algorithm) FromBytes(p []byte) Digest { - digester := a.New() + digester := a.Digester() if _, err := digester.Hash().Write(p); err != nil { // Writes to a Hash should never fail. None of the existing @@ -133,28 +142,3 @@ func (a Algorithm) FromBytes(p []byte) Digest { func (a Algorithm) FromString(s string) Digest { return a.FromBytes([]byte(s)) } - -// TODO(stevvooe): Allow resolution of verifiers using the digest type and -// this registration system. - -// Digester calculates the digest of written data. Writes should go directly -// to the return value of Hash, while calling Digest will return the current -// value of the digest. -type Digester interface { - Hash() hash.Hash // provides direct access to underlying hash instance. - Digest() Digest -} - -// digester provides a simple digester definition that embeds a hasher. -type digester struct { - alg Algorithm - hash hash.Hash -} - -func (d *digester) Hash() hash.Hash { - return d.hash -} - -func (d *digester) Digest() Digest { - return NewDigest(d.alg, d.hash) -} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/digest.go b/vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/digest.go similarity index 78% rename from vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/digest.go rename to vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/digest.go index 65c6f7f0e..7c66c30c0 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/digest.go +++ b/vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/digest.go @@ -8,11 +8,6 @@ import ( "strings" ) -const ( - // DigestSha256EmptyTar is the canonical sha256 digest of empty data - DigestSha256EmptyTar = "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" -) - // Digest allows simple protection of hex formatted digest strings, prefixed // by their algorithm. Strings of type Digest have some guarantee of being in // the correct format and it provides quick access to the components of a @@ -61,16 +56,14 @@ var ( ErrDigestUnsupported = fmt.Errorf("unsupported digest algorithm") ) -// ParseDigest parses s and returns the validated digest object. An error will +// Parse parses s and returns the validated digest object. An error will // be returned if the format is invalid. -func ParseDigest(s string) (Digest, error) { +func Parse(s string) (Digest, error) { d := Digest(s) - return d, d.Validate() } -// FromReader returns the most valid digest for the underlying content using -// the canonical digest algorithm. +// FromReader consumes the content of rd until io.EOF, returning canonical digest. func FromReader(rd io.Reader) (Digest, error) { return Canonical.FromReader(rd) } @@ -90,30 +83,24 @@ func FromString(s string) Digest { func (d Digest) Validate() error { s := string(d) - if !DigestRegexpAnchored.MatchString(s) { - return ErrDigestInvalidFormat - } - i := strings.Index(s, ":") - if i < 0 { - return ErrDigestInvalidFormat - } - // case: "sha256:" with no hex. - if i+1 == len(s) { + // validate i then run through regexp + if i < 0 || i+1 == len(s) || !DigestRegexpAnchored.MatchString(s) { return ErrDigestInvalidFormat } - switch algorithm := Algorithm(s[:i]); algorithm { - case SHA256, SHA384, SHA512: - if algorithm.Size()*2 != len(s[i+1:]) { - return ErrDigestInvalidLength - } - break - default: + algorithm := Algorithm(s[:i]) + if !algorithm.Available() { return ErrDigestUnsupported } + // Digests much always be hex-encoded, ensuring that their hex portion will + // always be size*2 + if algorithm.Size()*2 != len(s[i+1:]) { + return ErrDigestInvalidLength + } + return nil } @@ -123,6 +110,15 @@ func (d Digest) Algorithm() Algorithm { return Algorithm(d[:d.sepIndex()]) } +// Verifier returns a writer object that can be used to verify a stream of +// content against the digest. If the digest is invalid, the method will panic. +func (d Digest) Verifier() Verifier { + return hashVerifier{ + hash: d.Algorithm().Hash(), + digest: d, + } +} + // Hex returns the hex digest portion of the digest. This will panic if the // underlying digest is not in a valid format. func (d Digest) Hex() string { @@ -137,7 +133,7 @@ func (d Digest) sepIndex() int { i := strings.Index(string(d), ":") if i < 0 { - panic("could not find ':' in digest: " + d) + panic(fmt.Sprintf("no ':' separator in digest %q", d)) } return i diff --git a/vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/digester.go b/vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/digester.go new file mode 100644 index 000000000..918a3f919 --- /dev/null +++ b/vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/digester.go @@ -0,0 +1,25 @@ +package digest + +import "hash" + +// Digester calculates the digest of written data. Writes should go directly +// to the return value of Hash, while calling Digest will return the current +// value of the digest. +type Digester interface { + Hash() hash.Hash // provides direct access to underlying hash instance. + Digest() Digest +} + +// digester provides a simple digester definition that embeds a hasher. +type digester struct { + alg Algorithm + hash hash.Hash +} + +func (d *digester) Hash() hash.Hash { + return d.hash +} + +func (d *digester) Digest() Digest { + return NewDigest(d.alg, d.hash) +} diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/doc.go b/vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/doc.go similarity index 100% rename from vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/doc.go rename to vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/doc.go diff --git a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/verifiers.go b/vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/verifiers.go similarity index 71% rename from vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/verifiers.go rename to vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/verifiers.go index 9af3be134..f1db6cda8 100644 --- a/vendor/github.com/docker/docker/vendor/github.com/docker/distribution/digest/verifiers.go +++ b/vendor/github.com/docker/docker/vendor/github.com/opencontainers/go-digest/verifiers.go @@ -17,19 +17,6 @@ type Verifier interface { Verified() bool } -// NewDigestVerifier returns a verifier that compares the written bytes -// against a passed in digest. -func NewDigestVerifier(d Digest) (Verifier, error) { - if err := d.Validate(); err != nil { - return nil, err - } - - return hashVerifier{ - hash: d.Algorithm().Hash(), - digest: d, - }, nil -} - type hashVerifier struct { digest Digest hash hash.Hash diff --git a/vendor/github.com/docker/docker/volume/drivers/extpoint.go b/vendor/github.com/docker/docker/volume/drivers/extpoint.go index 576dee8a1..cf55c0272 100644 --- a/vendor/github.com/docker/docker/volume/drivers/extpoint.go +++ b/vendor/github.com/docker/docker/volume/drivers/extpoint.go @@ -146,7 +146,7 @@ func GetDriver(name string) (volume.Driver, error) { if name == "" { name = volume.DefaultDriverName } - return lookup(name, getter.LOOKUP) + return lookup(name, getter.Lookup) } // CreateDriver returns a volume driver by its name and increments RefCount. @@ -155,7 +155,7 @@ func CreateDriver(name string) (volume.Driver, error) { if name == "" { name = volume.DefaultDriverName } - return lookup(name, getter.ACQUIRE) + return lookup(name, getter.Acquire) } // RemoveDriver returns a volume driver by its name and decrements RefCount.. @@ -164,7 +164,7 @@ func RemoveDriver(name string) (volume.Driver, error) { if name == "" { name = volume.DefaultDriverName } - return lookup(name, getter.RELEASE) + return lookup(name, getter.Release) } // GetDriverList returns list of volume drivers registered. diff --git a/vendor/github.com/docker/docker/volume/local/local.go b/vendor/github.com/docker/docker/volume/local/local.go index e32c5c124..d29559d48 100644 --- a/vendor/github.com/docker/docker/volume/local/local.go +++ b/vendor/github.com/docker/docker/volume/local/local.go @@ -269,7 +269,7 @@ func (r *Root) validateName(name string) error { return validationError{fmt.Errorf("volume name is too short, names should be at least two alphanumeric characters")} } if !volumeNameRegex.MatchString(name) { - return validationError{fmt.Errorf("%q includes invalid characters for a local volume name, only %q are allowed. If you intented to pass a host directory, use absolute path", name, api.RestrictedNameChars)} + return validationError{fmt.Errorf("%q includes invalid characters for a local volume name, only %q are allowed. If you intended to pass a host directory, use absolute path", name, api.RestrictedNameChars)} } return nil } diff --git a/vendor/github.com/docker/docker/volume/volume.go b/vendor/github.com/docker/docker/volume/volume.go index ad4f877f2..238124fa8 100644 --- a/vendor/github.com/docker/docker/volume/volume.go +++ b/vendor/github.com/docker/docker/volume/volume.go @@ -29,7 +29,7 @@ const ( type Driver interface { // Name returns the name of the volume driver. Name() string - // Create makes a new volume with the given id. + // Create makes a new volume with the given name. Create(name string, opts map[string]string) (Volume, error) // Remove deletes the volume. Remove(vol Volume) (err error) diff --git a/vendor/github.com/docker/docker/volume/volume_test.go b/vendor/github.com/docker/docker/volume/volume_test.go index 54df38053..426e6e5c1 100644 --- a/vendor/github.com/docker/docker/volume/volume_test.go +++ b/vendor/github.com/docker/docker/volume/volume_test.go @@ -22,7 +22,6 @@ func TestParseMountRaw(t *testing.T) { `d:`, `d:\path`, `d:\path with space`, - // TODO Windows post TP5 - readonly support `d:\pathandmode:ro`, `c:\:d:\`, `c:\windows\:d:`, `c:\windows:d:\s p a c e`, @@ -33,9 +32,9 @@ func TestParseMountRaw(t *testing.T) { `name:D:`, `name:D::rW`, `name:D::RW`, - // TODO Windows post TP5 - readonly support `name:D::RO`, + `name:D::RO`, `c:/:d:/forward/slashes/are/good/too`, - // TODO Windows post TP5 - readonly support `c:/:d:/including with/spaces:ro`, + `c:/:d:/including with/spaces:ro`, `c:\Windows`, // With capital `c:\Program Files (x86)`, // With capitals and brackets } @@ -59,6 +58,7 @@ func TestParseMountRaw(t *testing.T) { `name?:d:`: `invalid volume specification`, `name/:d:`: `invalid volume specification`, `d:\pathandmode:rw`: `invalid volume specification`, + `d:\pathandmode:ro`: `invalid volume specification`, `con:d:`: `cannot be a reserved word for Windows filenames`, `PRN:d:`: `cannot be a reserved word for Windows filenames`, `aUx:d:`: `cannot be a reserved word for Windows filenames`, @@ -157,12 +157,12 @@ func TestParseMountRawSplit(t *testing.T) { cases = []testParseMountRaw{ {`c:\:d:`, "local", `d:`, `c:\`, ``, "", true, false}, {`c:\:d:\`, "local", `d:\`, `c:\`, ``, "", true, false}, - // TODO Windows post TP5 - Add readonly support {`c:\:d:\:ro`, "local", `d:\`, `c:\`, ``, "", false, false}, + {`c:\:d:\:ro`, "local", `d:\`, `c:\`, ``, "", false, false}, {`c:\:d:\:rw`, "local", `d:\`, `c:\`, ``, "", true, false}, {`c:\:d:\:foo`, "local", `d:\`, `c:\`, ``, "", false, true}, {`name:d::rw`, "local", `d:`, ``, `name`, "local", true, false}, {`name:d:`, "local", `d:`, ``, `name`, "local", true, false}, - // TODO Windows post TP5 - Add readonly support {`name:d::ro`, "local", `d:`, ``, `name`, "local", false, false}, + {`name:d::ro`, "local", `d:`, ``, `name`, "local", false, false}, {`name:c:`, "", ``, ``, ``, "", true, true}, {`driver/name:c:`, "", ``, ``, ``, "", true, true}, } diff --git a/vendor/github.com/docker/libcompose/hack/cross-binary b/vendor/github.com/docker/libcompose/hack/cross-binary index d2f02d59b..bde94b0c9 100755 --- a/vendor/github.com/docker/libcompose/hack/cross-binary +++ b/vendor/github.com/docker/libcompose/hack/cross-binary @@ -18,6 +18,9 @@ fi # Get rid of existing binaries rm -f bundles/libcompose-cli* +BUILDTIME=$(date --rfc-3339 ns | sed -e 's/ /T/') &> /dev/null +GITCOMMIT=$(git rev-parse --short HEAD) + # Build binaries for OS in ${OS_PLATFORM_ARG[@]}; do for ARCH in ${OS_ARCH_ARG[@]}; do @@ -33,7 +36,7 @@ for OS in ${OS_PLATFORM_ARG[@]}; do fi echo "Building binary for $OS/$ARCH..." GOARCH=$ARCH GOOS=$OS CGO_ENABLED=0 go build \ - -ldflags="-w -X github.com/docker/libcompose/version.GITCOMMIT=`git rev-parse --short HEAD`" \ + -ldflags="-w -X github.com/docker/libcompose/version.GITCOMMIT=${GITCOMMIT} -X github.com/docker/libcompose/version.BUILDTIME=${BUILDTIME} -X github.com/docker/libcompose/version.SHOWWARNING=${SHOWWARNING}" \ -o ${OUTPUT_BIN} ./cli/main done done diff --git a/vendor/github.com/docker/libcompose/version/version.go b/vendor/github.com/docker/libcompose/version/version.go index 820c98367..2d4593e92 100644 --- a/vendor/github.com/docker/libcompose/version/version.go +++ b/vendor/github.com/docker/libcompose/version/version.go @@ -2,7 +2,7 @@ package version var ( // VERSION should be updated by hand at each release - VERSION = "0.4.0-dev" + VERSION = "0.4.0" // GITCOMMIT will be overwritten automatically by the build system GITCOMMIT = "HEAD" diff --git a/vendor/github.com/dustin/go-humanize/comma.go b/vendor/github.com/dustin/go-humanize/comma.go index 74f446b67..eb285cb95 100644 --- a/vendor/github.com/dustin/go-humanize/comma.go +++ b/vendor/github.com/dustin/go-humanize/comma.go @@ -2,6 +2,7 @@ package humanize import ( "bytes" + "math" "math/big" "strconv" "strings" @@ -13,6 +14,12 @@ import ( // e.g. Comma(834142) -> 834,142 func Comma(v int64) string { sign := "" + + // minin64 can't be negated to a usable value, so it has to be special cased. + if v == math.MinInt64 { + return "-9,223,372,036,854,775,808" + } + if v < 0 { sign = "-" v = 0 - v diff --git a/vendor/github.com/dustin/go-humanize/comma_test.go b/vendor/github.com/dustin/go-humanize/comma_test.go index 49040fb71..89daca5fb 100644 --- a/vendor/github.com/dustin/go-humanize/comma_test.go +++ b/vendor/github.com/dustin/go-humanize/comma_test.go @@ -20,6 +20,8 @@ func TestCommas(t *testing.T) { {"10,001,000", Comma(10001000), "10,001,000"}, {"123,456,789", Comma(123456789), "123,456,789"}, {"maxint", Comma(9.223372e+18), "9,223,372,000,000,000,000"}, + {"math.maxint", Comma(math.MaxInt64), "9,223,372,036,854,775,807"}, + {"math.minint", Comma(math.MinInt64), "-9,223,372,036,854,775,808"}, {"minint", Comma(-9.223372e+18), "-9,223,372,000,000,000,000"}, {"-123,456,789", Comma(-123456789), "-123,456,789"}, {"-10,100,000", Comma(-10100000), "-10,100,000"}, diff --git a/vendor/github.com/dustin/go-humanize/number.go b/vendor/github.com/dustin/go-humanize/number.go index 32141348c..dec618659 100644 --- a/vendor/github.com/dustin/go-humanize/number.go +++ b/vendor/github.com/dustin/go-humanize/number.go @@ -160,7 +160,7 @@ func FormatFloat(format string, n float64) string { intf, fracf := math.Modf(n + renderFloatPrecisionRounders[precision]) // generate integer part string - intStr := strconv.Itoa(int(intf)) + intStr := strconv.FormatInt(int64(intf), 10) // add thousand separator if required if len(thousandStr) > 0 { diff --git a/vendor/github.com/dustin/go-humanize/number_test.go b/vendor/github.com/dustin/go-humanize/number_test.go index dd38a5bb9..516f3378d 100644 --- a/vendor/github.com/dustin/go-humanize/number_test.go +++ b/vendor/github.com/dustin/go-humanize/number_test.go @@ -25,6 +25,7 @@ func TestFormatFloat(t *testing.T) { {"#,###.###", "#,###.###", 12345.6789, "12,345.679"}, {"#,###.####", "#,###.####", 12345.6789, "12,345.6789"}, {"#.###,######", "#.###,######", 12345.6789, "12.345,678900"}, + {"bug46", "#,###.##", 52746220055.92342, "52,746,220,055.92"}, {"#\u202f###,##", "#\u202f###,##", 12345.6789, "12 345,68"}, // special cases diff --git a/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk.go b/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk.go new file mode 100644 index 000000000..3c4524584 --- /dev/null +++ b/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk.go @@ -0,0 +1,172 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// A faster implementation of filepath.Walk. +// +// filepath.Walk's design necessarily calls os.Lstat on each file, +// even if the caller needs less info. And goimports only need to know +// the type of each file. The kernel interface provides the type in +// the Readdir call but the standard library ignored it. +// fastwalk_unix.go contains a fork of the syscall routines. +// +// See golang.org/issue/16399 + +package fastwalk + +import ( + "errors" + "os" + "path/filepath" + "runtime" +) + +// traverseLink is a sentinel error for fastWalk, similar to filepath.SkipDir. +var traverseLink = errors.New("traverse symlink, assuming target is a directory") + +// fastWalk walks the file tree rooted at root, calling walkFn for +// each file or directory in the tree, including root. +// +// If fastWalk returns filepath.SkipDir, the directory is skipped. +// +// Unlike filepath.Walk: +// * file stat calls must be done by the user. +// The only provided metadata is the file type, which does not include +// any permission bits. +// * multiple goroutines stat the filesystem concurrently. The provided +// walkFn must be safe for concurrent use. +// * fastWalk can follow symlinks if walkFn returns the traverseLink +// sentinel error. It is the walkFn's responsibility to prevent +// fastWalk from going into symlink cycles. +func FastWalk(root string, walkFn func(path string, typ os.FileMode) error) error { + // TODO(bradfitz): make numWorkers configurable? We used a + // minimum of 4 to give the kernel more info about multiple + // things we want, in hopes its I/O scheduling can take + // advantage of that. Hopefully most are in cache. Maybe 4 is + // even too low of a minimum. Profile more. + numWorkers := 4 + if n := runtime.NumCPU(); n > numWorkers { + numWorkers = n + } + w := &walker{ + fn: walkFn, + enqueuec: make(chan walkItem, numWorkers), // buffered for performance + workc: make(chan walkItem, numWorkers), // buffered for performance + donec: make(chan struct{}), + + // buffered for correctness & not leaking goroutines: + resc: make(chan error, numWorkers), + } + defer close(w.donec) + // TODO(bradfitz): start the workers as needed? maybe not worth it. + for i := 0; i < numWorkers; i++ { + go w.doWork() + } + todo := []walkItem{{dir: root}} + out := 0 + for { + workc := w.workc + var workItem walkItem + if len(todo) == 0 { + workc = nil + } else { + workItem = todo[len(todo)-1] + } + select { + case workc <- workItem: + todo = todo[:len(todo)-1] + out++ + case it := <-w.enqueuec: + todo = append(todo, it) + case err := <-w.resc: + out-- + if err != nil { + return err + } + if out == 0 && len(todo) == 0 { + // It's safe to quit here, as long as the buffered + // enqueue channel isn't also readable, which might + // happen if the worker sends both another unit of + // work and its result before the other select was + // scheduled and both w.resc and w.enqueuec were + // readable. + select { + case it := <-w.enqueuec: + todo = append(todo, it) + default: + return nil + } + } + } + } +} + +// doWork reads directories as instructed (via workc) and runs the +// user's callback function. +func (w *walker) doWork() { + for { + select { + case <-w.donec: + return + case it := <-w.workc: + w.resc <- w.walk(it.dir, !it.callbackDone) + } + } +} + +type walker struct { + fn func(path string, typ os.FileMode) error + + donec chan struct{} // closed on fastWalk's return + workc chan walkItem // to workers + enqueuec chan walkItem // from workers + resc chan error // from workers +} + +type walkItem struct { + dir string + callbackDone bool // callback already called; don't do it again +} + +func (w *walker) enqueue(it walkItem) { + select { + case w.enqueuec <- it: + case <-w.donec: + } +} + +func (w *walker) onDirEnt(dirName, baseName string, typ os.FileMode) error { + joined := dirName + string(os.PathSeparator) + baseName + if typ == os.ModeDir { + w.enqueue(walkItem{dir: joined}) + return nil + } + + err := w.fn(joined, typ) + if typ == os.ModeSymlink { + if err == traverseLink { + // Set callbackDone so we don't call it twice for both the + // symlink-as-symlink and the symlink-as-directory later: + w.enqueue(walkItem{dir: joined, callbackDone: true}) + return nil + } + if err == filepath.SkipDir { + // Permit SkipDir on symlinks too. + return nil + } + } + return err +} +func (w *walker) walk(root string, runUserCallback bool) error { + if runUserCallback { + err := w.fn(root, os.ModeDir) + if err == filepath.SkipDir { + return nil + } + if err != nil { + return err + } + } + + return readDir(root, w.onDirEnt) +} diff --git a/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_dirent_fileno.go b/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_dirent_fileno.go new file mode 100644 index 000000000..ccffec5ad --- /dev/null +++ b/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_dirent_fileno.go @@ -0,0 +1,13 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd openbsd netbsd + +package fastwalk + +import "syscall" + +func direntInode(dirent *syscall.Dirent) uint64 { + return uint64(dirent.Fileno) +} diff --git a/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_dirent_ino.go b/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_dirent_ino.go new file mode 100644 index 000000000..1e6eec3cf --- /dev/null +++ b/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_dirent_ino.go @@ -0,0 +1,13 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux,!appengine darwin + +package fastwalk + +import "syscall" + +func direntInode(dirent *syscall.Dirent) uint64 { + return uint64(dirent.Ino) +} diff --git a/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_portable.go b/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_portable.go new file mode 100644 index 000000000..e8ea50d65 --- /dev/null +++ b/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_portable.go @@ -0,0 +1,29 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build appengine !linux,!darwin,!freebsd,!openbsd,!netbsd + +package fastwalk + +import ( + "io/ioutil" + "os" +) + +// readDir calls fn for each directory entry in dirName. +// It does not descend into directories or follow symlinks. +// If fn returns a non-nil error, readDir returns with that error +// immediately. +func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error { + fis, err := ioutil.ReadDir(dirName) + if err != nil { + return err + } + for _, fi := range fis { + if err := fn(dirName, fi.Name(), fi.Mode()&os.ModeType); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_unix.go b/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_unix.go new file mode 100644 index 000000000..e9e74e4c4 --- /dev/null +++ b/vendor/github.com/mattn/go-zglob/fastwalk/fastwalk_unix.go @@ -0,0 +1,122 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux,!appengine darwin freebsd openbsd netbsd + +package fastwalk + +import ( + "bytes" + "fmt" + "os" + "syscall" + "unsafe" +) + +const blockSize = 8 << 10 + +// unknownFileMode is a sentinel (and bogus) os.FileMode +// value used to represent a syscall.DT_UNKNOWN Dirent.Type. +const unknownFileMode os.FileMode = os.ModeNamedPipe | os.ModeSocket | os.ModeDevice + +func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error { + fd, err := syscall.Open(dirName, 0, 0) + if err != nil { + return err + } + defer syscall.Close(fd) + + // The buffer must be at least a block long. + buf := make([]byte, blockSize) // stack-allocated; doesn't escape + bufp := 0 // starting read position in buf + nbuf := 0 // end valid data in buf + for { + if bufp >= nbuf { + bufp = 0 + nbuf, err = syscall.ReadDirent(fd, buf) + if err != nil { + return os.NewSyscallError("readdirent", err) + } + if nbuf <= 0 { + return nil + } + } + consumed, name, typ := parseDirEnt(buf[bufp:nbuf]) + bufp += consumed + if name == "" || name == "." || name == ".." { + continue + } + // Fallback for filesystems (like old XFS) that don't + // support Dirent.Type and have DT_UNKNOWN (0) there + // instead. + if typ == unknownFileMode { + fi, err := os.Lstat(dirName + "/" + name) + if err != nil { + // It got deleted in the meantime. + if os.IsNotExist(err) { + continue + } + return err + } + typ = fi.Mode() & os.ModeType + } + if err := fn(dirName, name, typ); err != nil { + return err + } + } +} + +func parseDirEnt(buf []byte) (consumed int, name string, typ os.FileMode) { + // golang.org/issue/15653 + dirent := (*syscall.Dirent)(unsafe.Pointer(&buf[0])) + if v := unsafe.Offsetof(dirent.Reclen) + unsafe.Sizeof(dirent.Reclen); uintptr(len(buf)) < v { + panic(fmt.Sprintf("buf size of %d smaller than dirent header size %d", len(buf), v)) + } + if len(buf) < int(dirent.Reclen) { + panic(fmt.Sprintf("buf size %d < record length %d", len(buf), dirent.Reclen)) + } + consumed = int(dirent.Reclen) + if direntInode(dirent) == 0 { // File absent in directory. + return + } + switch dirent.Type { + case syscall.DT_REG: + typ = 0 + case syscall.DT_DIR: + typ = os.ModeDir + case syscall.DT_LNK: + typ = os.ModeSymlink + case syscall.DT_BLK: + typ = os.ModeDevice + case syscall.DT_FIFO: + typ = os.ModeNamedPipe + case syscall.DT_SOCK: + typ = os.ModeSocket + case syscall.DT_UNKNOWN: + typ = unknownFileMode + default: + // Skip weird things. + // It's probably a DT_WHT (http://lwn.net/Articles/325369/) + // or something. Revisit if/when this package is moved outside + // of goimports. goimports only cares about regular files, + // symlinks, and directories. + return + } + + nameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0])) + nameLen := bytes.IndexByte(nameBuf[:], 0) + if nameLen < 0 { + panic("failed to find terminating 0 byte in dirent") + } + + // Special cases for common things: + if nameLen == 1 && nameBuf[0] == '.' { + name = "." + } else if nameLen == 2 && nameBuf[0] == '.' && nameBuf[1] == '.' { + name = ".." + } else { + name = string(nameBuf[:nameLen]) + } + return +} diff --git a/vendor/github.com/mattn/go-zglob/zglob.go b/vendor/github.com/mattn/go-zglob/zglob.go index 6a7d2e202..452a03ffa 100644 --- a/vendor/github.com/mattn/go-zglob/zglob.go +++ b/vendor/github.com/mattn/go-zglob/zglob.go @@ -7,17 +7,23 @@ import ( "regexp" "runtime" "strings" + + "github.com/mattn/go-zglob/fastwalk" ) var ( envre = regexp.MustCompile(`^(\$[a-zA-Z][a-zA-Z0-9_]+|\$\([a-zA-Z][a-zA-Z0-9_]+\))$`) ) -func Glob(pattern string) ([]string, error) { +type zenv struct { + dre *regexp.Regexp + fre *regexp.Regexp + root string +} + +func makePattern(pattern string) (*zenv, error) { globmask := "" root := "" - matches := []string{} - relative := !filepath.IsAbs(pattern) for n, i := range strings.Split(filepath.ToSlash(pattern), "/") { if root == "" && strings.Index(i, "*") != -1 { if globmask == "" { @@ -47,11 +53,11 @@ func Glob(pattern string) ([]string, error) { } } if root == "" { - _, err := os.Stat(pattern) - if err != nil { - return nil, os.ErrNotExist - } - return []string{pattern}, nil + return &zenv{ + dre: nil, + fre: nil, + root: "", + }, nil } if globmask == "" { globmask = "." @@ -95,30 +101,46 @@ func Glob(pattern string) ([]string, error) { dirmask = "(?i:" + dirmask + ")" filemask = "(?i:" + filemask + ")" } - dre := regexp.MustCompile("^" + dirmask) - fre := regexp.MustCompile("^" + filemask + "$") - - root = filepath.Clean(root) + return &zenv{ + dre: regexp.MustCompile("^" + dirmask), + fre: regexp.MustCompile("^" + filemask + "$"), + root: filepath.Clean(root), + }, nil +} - filepath.Walk(root, func(path string, info os.FileInfo, err error) error { - if info == nil { - return err +func Glob(pattern string) ([]string, error) { + zenv, err := makePattern(pattern) + if err != nil { + return nil, err + } + if zenv.root == "" { + _, err := os.Stat(pattern) + if err != nil { + return nil, os.ErrNotExist } + return []string{pattern}, nil + } + relative := !filepath.IsAbs(pattern) + matches := []string{} + fastwalk.FastWalk(zenv.root, func(path string, info os.FileMode) error { + if zenv.root == "." && len(zenv.root) < len(path) { + path = path[len(zenv.root)+1:] + } path = filepath.ToSlash(path) if info.IsDir() { - if path == "." || len(path) <= len(root) { + if path == "." || len(path) <= len(zenv.root) { return nil } - if !dre.MatchString(path + "/") { + if !zenv.dre.MatchString(path + "/") { return filepath.SkipDir } } - if fre.MatchString(path) { + if zenv.fre.MatchString(path) { if relative && filepath.IsAbs(path) { - path = path[len(root)+1:] + path = path[len(zenv.root)+1:] } matches = append(matches, path) } @@ -126,3 +148,27 @@ func Glob(pattern string) ([]string, error) { }) return matches, nil } + +func Match(pattern, name string) (matched bool, err error) { + zenv, err := makePattern(pattern) + if err != nil { + return false, err + } + if zenv.root == "" { + return pattern == name, nil + } + + name = filepath.ToSlash(name) + + if name == "." || len(name) <= len(zenv.root) { + return false, nil + } + if zenv.dre.MatchString(name + "/") { + return true, nil + } + + if zenv.fre.MatchString(name) { + return true, nil + } + return false, nil +} diff --git a/vendor/github.com/mattn/go-zglob/zglob_test.go b/vendor/github.com/mattn/go-zglob/zglob_test.go index abbdf87fd..ca666e16c 100644 --- a/vendor/github.com/mattn/go-zglob/zglob_test.go +++ b/vendor/github.com/mattn/go-zglob/zglob_test.go @@ -21,7 +21,7 @@ type testZGlob struct { err error } -var testZGlobs = []testZGlob{ +var testGlobs = []testZGlob{ {`fo*`, []string{`foo`}, nil}, {`foo`, []string{`foo`}, nil}, {`foo/*`, []string{`foo/bar`, `foo/baz`}, nil}, @@ -56,7 +56,7 @@ func setup(t *testing.T) string { return tmpdir } -func TestZGlob(t *testing.T) { +func TestGlob(t *testing.T) { tmpdir := setup(t) defer os.RemoveAll(tmpdir) @@ -71,7 +71,11 @@ func TestZGlob(t *testing.T) { defer os.Chdir(curdir) tmpdir = "." - for _, test := range testZGlobs { + for _, test := range testGlobs { + expected := make([]string, len(test.expected)) + for i, e := range test.expected { + expected[i] = e + } got, err := Glob(test.pattern) if err != nil { if test.err != err { @@ -79,13 +83,13 @@ func TestZGlob(t *testing.T) { } continue } - if !check(test.expected, got) { - t.Errorf(`zglob failed: pattern %q: expected %v but got %v`, test.pattern, test.expected, got) + if !check(expected, got) { + t.Errorf(`zglob failed: pattern %q(%q): expected %v but got %v`, test.pattern, tmpdir, expected, got) } } } -func TestZGlobAbs(t *testing.T) { +func TestGlobAbs(t *testing.T) { tmpdir := setup(t) defer os.RemoveAll(tmpdir) @@ -99,20 +103,36 @@ func TestZGlobAbs(t *testing.T) { } defer os.Chdir(curdir) - for _, test := range testZGlobs { - test.pattern = filepath.ToSlash(filepath.Join(tmpdir, test.pattern)) - for i, expected := range test.expected { - test.expected[i] = filepath.ToSlash(filepath.Join(tmpdir, expected)) + for _, test := range testGlobs { + pattern := filepath.ToSlash(filepath.Join(tmpdir, test.pattern)) + expected := make([]string, len(test.expected)) + for i, e := range test.expected { + expected[i] = filepath.ToSlash(filepath.Join(tmpdir, e)) } - got, err := Glob(test.pattern) + got, err := Glob(pattern) if err != nil { if test.err != err { t.Error(err) } continue } - if !check(test.expected, got) { - t.Errorf(`zglob failed: pattern %q: expected %v but got %v`, test.pattern, test.expected, got) + if !check(expected, got) { + t.Errorf(`zglob failed: pattern %q(%q): expected %v but got %v`, pattern, tmpdir, expected, got) + } + } +} + +func TestMatch(t *testing.T) { + for _, test := range testGlobs { + for _, f := range test.expected { + got, err := Match(test.pattern, f) + if err != nil { + t.Error(err) + continue + } + if !got { + t.Errorf("%q should match with %q", f, test.pattern) + } } } } diff --git a/vendor/golang.org/x/crypto/acme/autocert/cache.go b/vendor/golang.org/x/crypto/acme/autocert/cache.go index 1c67f6ce5..9b184aabe 100644 --- a/vendor/golang.org/x/crypto/acme/autocert/cache.go +++ b/vendor/golang.org/x/crypto/acme/autocert/cache.go @@ -27,7 +27,7 @@ type Cache interface { Get(ctx context.Context, key string) ([]byte, error) // Put stores the data in the cache under the specified key. - // Inderlying implementations may use any data storage format, + // Underlying implementations may use any data storage format, // as long as the reverse operation, Get, results in the original data. Put(ctx context.Context, key string, data []byte) error diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s index 1c895d8a8..39c58b44a 100644 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s @@ -278,8 +278,15 @@ TEXT ·chacha20Poly1305Open(SB), 0, $288-97 MOVQ ad+72(FP), adp // Check for AVX2 support - CMPB runtime·support_avx2(SB), $1 - JE chacha20Poly1305Open_AVX2 + CMPB runtime·support_avx2(SB), $0 + JE noavx2bmi2Open + + // Check BMI2 bit for MULXQ. + // runtime·cpuid_ebx7 is always available here + // because it passed avx2 check + TESTL $(1<<8), runtime·cpuid_ebx7(SB) + JNE chacha20Poly1305Open_AVX2 +noavx2bmi2Open: // Special optimization, for very short buffers CMPQ inl, $128 @@ -1485,8 +1492,15 @@ TEXT ·chacha20Poly1305Seal(SB), 0, $288-96 MOVQ ad+72(FP), adp // Check for AVX2 support - CMPB runtime·support_avx2(SB), $1 - JE chacha20Poly1305Seal_AVX2 + CMPB runtime·support_avx2(SB), $0 + JE noavx2bmi2Seal + + // Check BMI2 bit for MULXQ. + // runtime·cpuid_ebx7 is always available here + // because it passed avx2 check + TESTL $(1<<8), runtime·cpuid_ebx7(SB) + JNE chacha20Poly1305Seal_AVX2 +noavx2bmi2Seal: // Special optimization, for very short buffers CMPQ inl, $128 diff --git a/vendor/golang.org/x/crypto/openpgp/keys.go b/vendor/golang.org/x/crypto/openpgp/keys.go index fd9bbd29b..68b14c6ae 100644 --- a/vendor/golang.org/x/crypto/openpgp/keys.go +++ b/vendor/golang.org/x/crypto/openpgp/keys.go @@ -307,8 +307,6 @@ func readToNextPublicKey(packets *packet.Reader) (err error) { return } } - - panic("unreachable") } // ReadEntity reads an entity (public key, identities, subkeys etc) from the diff --git a/vendor/golang.org/x/crypto/openpgp/keys_test.go b/vendor/golang.org/x/crypto/openpgp/keys_test.go index fbc8fc240..f768e68a6 100644 --- a/vendor/golang.org/x/crypto/openpgp/keys_test.go +++ b/vendor/golang.org/x/crypto/openpgp/keys_test.go @@ -300,7 +300,7 @@ func TestNewEntityWithoutPreferredHash(t *testing.T) { for _, identity := range entity.Identities { if len(identity.SelfSignature.PreferredHash) != 0 { - t.Fatal("Expected preferred hash to be empty but got length %d", len(identity.SelfSignature.PreferredHash)) + t.Fatalf("Expected preferred hash to be empty but got length %d", len(identity.SelfSignature.PreferredHash)) } } } diff --git a/vendor/golang.org/x/crypto/openpgp/packet/packet.go b/vendor/golang.org/x/crypto/openpgp/packet/packet.go index e2bde1111..3eded93f0 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/packet.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/packet.go @@ -273,8 +273,6 @@ func consumeAll(r io.Reader) (n int64, err error) { return } } - - panic("unreachable") } // packetType represents the numeric ids of the different OpenPGP packet types. See diff --git a/vendor/golang.org/x/crypto/openpgp/packet/public_key.go b/vendor/golang.org/x/crypto/openpgp/packet/public_key.go index c769933ce..ead26233d 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/public_key.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/public_key.go @@ -540,7 +540,6 @@ func (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err erro default: return errors.SignatureError("Unsupported public key algorithm used in signature") } - panic("unreachable") } // VerifySignatureV3 returns nil iff sig is a valid signature, made by this @@ -585,7 +584,6 @@ func (pk *PublicKey) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err default: panic("shouldn't happen") } - panic("unreachable") } // keySignatureHash returns a Hash of the message that needs to be signed for diff --git a/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go b/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go index 26337f5aa..5daf7b6cf 100644 --- a/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go +++ b/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go @@ -216,7 +216,6 @@ func (pk *PublicKeyV3) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (er // V3 public keys only support RSA. panic("shouldn't happen") } - panic("unreachable") } // VerifyUserIdSignatureV3 returns nil iff sig is a valid signature, made by this diff --git a/vendor/golang.org/x/crypto/openpgp/write_test.go b/vendor/golang.org/x/crypto/openpgp/write_test.go index 2161ebcd7..f2d50a0cf 100644 --- a/vendor/golang.org/x/crypto/openpgp/write_test.go +++ b/vendor/golang.org/x/crypto/openpgp/write_test.go @@ -80,7 +80,7 @@ func TestNewEntity(t *testing.T) { t.Errorf("failed to find bit length: %s", err) } if int(bl) != defaultRSAKeyBits { - t.Errorf("BitLength %v, expected %v", defaultRSAKeyBits) + t.Errorf("BitLength %v, expected %v", int(bl), defaultRSAKeyBits) } // Check bit-length with a config. @@ -238,7 +238,7 @@ func TestEncryption(t *testing.T) { signKey, _ := kring[0].signingKey(testTime) expectedKeyId := signKey.PublicKey.KeyId if md.SignedByKeyId != expectedKeyId { - t.Errorf("#%d: message signed by wrong key id, got: %d, want: %d", i, *md.SignedBy, expectedKeyId) + t.Errorf("#%d: message signed by wrong key id, got: %v, want: %v", i, *md.SignedBy, expectedKeyId) } if md.SignedBy == nil { t.Errorf("#%d: failed to find the signing Entity", i) diff --git a/vendor/golang.org/x/crypto/ssh/handshake_test.go b/vendor/golang.org/x/crypto/ssh/handshake_test.go index da53d3a0d..4cf5368ba 100644 --- a/vendor/golang.org/x/crypto/ssh/handshake_test.go +++ b/vendor/golang.org/x/crypto/ssh/handshake_test.go @@ -9,6 +9,7 @@ import ( "crypto/rand" "errors" "fmt" + "io" "net" "reflect" "runtime" @@ -58,14 +59,46 @@ func netPipe() (net.Conn, net.Conn, error) { return c1, c2, nil } -func handshakePair(clientConf *ClientConfig, addr string) (client *handshakeTransport, server *handshakeTransport, err error) { +// noiseTransport inserts ignore messages to check that the read loop +// and the key exchange filters out these messages. +type noiseTransport struct { + keyingTransport +} + +func (t *noiseTransport) writePacket(p []byte) error { + ignore := []byte{msgIgnore} + if err := t.keyingTransport.writePacket(ignore); err != nil { + return err + } + debug := []byte{msgDebug, 1, 2, 3} + if err := t.keyingTransport.writePacket(debug); err != nil { + return err + } + + return t.keyingTransport.writePacket(p) +} + +func addNoiseTransport(t keyingTransport) keyingTransport { + return &noiseTransport{t} +} + +// handshakePair creates two handshakeTransports connected with each +// other. If the noise argument is true, both transports will try to +// confuse the other side by sending ignore and debug messages. +func handshakePair(clientConf *ClientConfig, addr string, noise bool) (client *handshakeTransport, server *handshakeTransport, err error) { a, b, err := netPipe() if err != nil { return nil, nil, err } - trC := newTransport(a, rand.Reader, true) - trS := newTransport(b, rand.Reader, false) + var trC, trS keyingTransport + + trC = newTransport(a, rand.Reader, true) + trS = newTransport(b, rand.Reader, false) + if noise { + trC = addNoiseTransport(trC) + trS = addNoiseTransport(trS) + } clientConf.SetDefaults() v := []byte("version") @@ -85,7 +118,7 @@ func TestHandshakeBasic(t *testing.T) { t.Skip("see golang.org/issue/7237") } checker := &testChecker{} - trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr") + trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr", true) if err != nil { t.Fatalf("handshakePair: %v", err) } @@ -93,7 +126,9 @@ func TestHandshakeBasic(t *testing.T) { defer trC.Close() defer trS.Close() + clientDone := make(chan int, 0) go func() { + defer close(clientDone) // Client writes a bunch of stuff, and does a key // change in the middle. This should not confuse the // handshake in progress @@ -115,8 +150,10 @@ func TestHandshakeBasic(t *testing.T) { // Server checks that client messages come in cleanly i := 0 + err = nil for { - p, err := trS.readPacket() + var p []byte + p, err = trS.readPacket() if err != nil { break } @@ -129,6 +166,10 @@ func TestHandshakeBasic(t *testing.T) { } i++ } + <-clientDone + if err != nil && err != io.EOF { + t.Fatalf("server error: %v", err) + } if i != 10 { t.Errorf("received %d messages, want 10.", i) } @@ -143,11 +184,12 @@ func TestHandshakeBasic(t *testing.T) { if want != checker.calls[0] { t.Errorf("got %q want %q for host key check", checker.calls[0], want) } + } func TestHandshakeError(t *testing.T) { checker := &testChecker{} - trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "bad") + trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "bad", false) if err != nil { t.Fatalf("handshakePair: %v", err) } @@ -186,7 +228,7 @@ func TestHandshakeError(t *testing.T) { func TestForceFirstKex(t *testing.T) { checker := &testChecker{} - trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr") + trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr", false) if err != nil { t.Fatalf("handshakePair: %v", err) } @@ -208,7 +250,7 @@ func TestForceFirstKex(t *testing.T) { func TestHandshakeTwice(t *testing.T) { checker := &testChecker{} - trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr") + trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr", false) if err != nil { t.Fatalf("handshakePair: %v", err) } @@ -278,7 +320,7 @@ func TestHandshakeAutoRekeyWrite(t *testing.T) { checker := &testChecker{} clientConf := &ClientConfig{HostKeyCallback: checker.Check} clientConf.RekeyThreshold = 500 - trC, trS, err := handshakePair(clientConf, "addr") + trC, trS, err := handshakePair(clientConf, "addr", false) if err != nil { t.Fatalf("handshakePair: %v", err) } @@ -326,7 +368,7 @@ func TestHandshakeAutoRekeyRead(t *testing.T) { } clientConf.RekeyThreshold = 500 - trC, trS, err := handshakePair(clientConf, "addr") + trC, trS, err := handshakePair(clientConf, "addr", false) if err != nil { t.Fatalf("handshakePair: %v", err) } @@ -448,7 +490,7 @@ func TestDisconnect(t *testing.T) { t.Skip("see golang.org/issue/7237") } checker := &testChecker{} - trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr") + trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr", false) if err != nil { t.Fatalf("handshakePair: %v", err) } diff --git a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go index f8167733b..0c5bd560e 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go @@ -772,8 +772,6 @@ func (t *Terminal) readLine() (line string, err error) { t.remainder = t.inBuf[:n+len(t.remainder)] } - - panic("unreachable") // for Go 1.0. } // SetPrompt sets the prompt to be used when reading subsequent lines. diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go index c869213ec..747f1b8e5 100644 --- a/vendor/golang.org/x/crypto/ssh/terminal/util.go +++ b/vendor/golang.org/x/crypto/ssh/terminal/util.go @@ -72,8 +72,10 @@ func GetState(fd int) (*State, error) { // Restore restores the terminal connected to the given file descriptor to a // previous state. func Restore(fd int, state *State) error { - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&state.termios)), 0, 0, 0) - return err + if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlWriteTermios, uintptr(unsafe.Pointer(&state.termios)), 0, 0, 0); err != 0 { + return err + } + return nil } // GetSize returns the dimensions of the given terminal. diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go index 62fba629e..7e43a1299 100644 --- a/vendor/golang.org/x/crypto/ssh/transport.go +++ b/vendor/golang.org/x/crypto/ssh/transport.go @@ -85,8 +85,18 @@ func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) err } // Read and decrypt next packet. -func (t *transport) readPacket() ([]byte, error) { - return t.reader.readPacket(t.bufReader) +func (t *transport) readPacket() (p []byte, err error) { + for { + p, err = t.reader.readPacket(t.bufReader) + if err != nil { + break + } + if len(p) == 0 || (p[0] != msgIgnore && p[0] != msgDebug) { + break + } + } + + return p, err } func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) {