diff options
Diffstat (limited to 'vendor/golang.org/x/net')
220 files changed, 15405 insertions, 11112 deletions
diff --git a/vendor/golang.org/x/net/dict/dict.go b/vendor/golang.org/x/net/dict/dict.go index 58fef89e0..93e65c03c 100644 --- a/vendor/golang.org/x/net/dict/dict.go +++ b/vendor/golang.org/x/net/dict/dict.go @@ -1,4 +1,4 @@ -// Copyright 2010 The Go Authors. All rights reserved. +// Copyright 2010 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. diff --git a/vendor/golang.org/x/net/http2/go17.go b/vendor/golang.org/x/net/http2/go17.go index 730319dd5..47b7fae08 100644 --- a/vendor/golang.org/x/net/http2/go17.go +++ b/vendor/golang.org/x/net/http2/go17.go @@ -39,6 +39,13 @@ type clientTrace httptrace.ClientTrace func reqContext(r *http.Request) context.Context { return r.Context() } +func (t *Transport) idleConnTimeout() time.Duration { + if t.t1 != nil { + return t.t1.IdleConnTimeout + } + return 0 +} + func setResponseUncompressed(res *http.Response) { res.Uncompressed = true } func traceGotConn(req *http.Request, cc *ClientConn) { @@ -92,3 +99,8 @@ func requestTrace(req *http.Request) *clientTrace { trace := httptrace.ContextClientTrace(req.Context()) return (*clientTrace)(trace) } + +// Ping sends a PING frame to the server and waits for the ack. +func (cc *ClientConn) Ping(ctx context.Context) error { + return cc.ping(ctx) +} diff --git a/vendor/golang.org/x/net/http2/go18.go b/vendor/golang.org/x/net/http2/go18.go index c2ae16731..8c0dd2508 100644 --- a/vendor/golang.org/x/net/http2/go18.go +++ b/vendor/golang.org/x/net/http2/go18.go @@ -6,6 +6,36 @@ package http2 -import "crypto/tls" +import ( + "crypto/tls" + "net/http" +) func cloneTLSConfig(c *tls.Config) *tls.Config { return c.Clone() } + +var _ http.Pusher = (*responseWriter)(nil) + +// Push implements http.Pusher. +func (w *responseWriter) Push(target string, opts *http.PushOptions) error { + internalOpts := pushOptions{} + if opts != nil { + internalOpts.Method = opts.Method + internalOpts.Header = opts.Header + } + return w.push(target, internalOpts) +} + +func configureServer18(h1 *http.Server, h2 *Server) error { + if h2.IdleTimeout == 0 { + if h1.IdleTimeout != 0 { + h2.IdleTimeout = h1.IdleTimeout + } else { + h2.IdleTimeout = h1.ReadTimeout + } + } + return nil +} + +func shouldLogPanic(panicValue interface{}) bool { + return panicValue != nil && panicValue != http.ErrAbortHandler +} diff --git a/vendor/golang.org/x/net/http2/go18_test.go b/vendor/golang.org/x/net/http2/go18_test.go new file mode 100644 index 000000000..836550597 --- /dev/null +++ b/vendor/golang.org/x/net/http2/go18_test.go @@ -0,0 +1,66 @@ +// 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 go1.8 + +package http2 + +import ( + "net/http" + "testing" + "time" +) + +// Tests that http2.Server.IdleTimeout is initialized from +// http.Server.{Idle,Read}Timeout. http.Server.IdleTimeout was +// added in Go 1.8. +func TestConfigureServerIdleTimeout_Go18(t *testing.T) { + const timeout = 5 * time.Second + const notThisOne = 1 * time.Second + + // With a zero http2.Server, verify that it copies IdleTimeout: + { + s1 := &http.Server{ + IdleTimeout: timeout, + ReadTimeout: notThisOne, + } + s2 := &Server{} + if err := ConfigureServer(s1, s2); err != nil { + t.Fatal(err) + } + if s2.IdleTimeout != timeout { + t.Errorf("s2.IdleTimeout = %v; want %v", s2.IdleTimeout, timeout) + } + } + + // And that it falls back to ReadTimeout: + { + s1 := &http.Server{ + ReadTimeout: timeout, + } + s2 := &Server{} + if err := ConfigureServer(s1, s2); err != nil { + t.Fatal(err) + } + if s2.IdleTimeout != timeout { + t.Errorf("s2.IdleTimeout = %v; want %v", s2.IdleTimeout, timeout) + } + } + + // Verify that s1's IdleTimeout doesn't overwrite an existing setting: + { + s1 := &http.Server{ + IdleTimeout: notThisOne, + } + s2 := &Server{ + IdleTimeout: timeout, + } + if err := ConfigureServer(s1, s2); err != nil { + t.Fatal(err) + } + if s2.IdleTimeout != timeout { + t.Errorf("s2.IdleTimeout = %v; want %v", s2.IdleTimeout, timeout) + } + } +} diff --git a/vendor/golang.org/x/net/http2/h2demo/h2demo.go b/vendor/golang.org/x/net/http2/h2demo/h2demo.go index a248d479e..980b6d67d 100644 --- a/vendor/golang.org/x/net/http2/h2demo/h2demo.go +++ b/vendor/golang.org/x/net/http2/h2demo/h2demo.go @@ -19,6 +19,7 @@ import ( "log" "net" "net/http" + "os" "path" "regexp" "runtime" @@ -27,8 +28,8 @@ import ( "sync" "time" - "camlistore.org/pkg/googlestorage" "go4.org/syncutil/singleflight" + "golang.org/x/crypto/acme/autocert" "golang.org/x/net/http2" ) @@ -378,37 +379,18 @@ func httpHost() string { } func serveProdTLS() error { - c, err := googlestorage.NewServiceClient() - if err != nil { + const cacheDir = "/var/cache/autocert" + if err := os.MkdirAll(cacheDir, 0700); err != nil { return err } - slurp := func(key string) ([]byte, error) { - const bucket = "http2-demo-server-tls" - rc, _, err := c.GetObject(&googlestorage.Object{ - Bucket: bucket, - Key: key, - }) - if err != nil { - return nil, fmt.Errorf("Error fetching GCS object %q in bucket %q: %v", key, bucket, err) - } - defer rc.Close() - return ioutil.ReadAll(rc) - } - certPem, err := slurp("http2.golang.org.chained.pem") - if err != nil { - return err - } - keyPem, err := slurp("http2.golang.org.key") - if err != nil { - return err - } - cert, err := tls.X509KeyPair(certPem, keyPem) - if err != nil { - return err + m := autocert.Manager{ + Cache: autocert.DirCache(cacheDir), + Prompt: autocert.AcceptTOS, + HostPolicy: autocert.HostWhitelist("http2.golang.org"), } srv := &http.Server{ TLSConfig: &tls.Config{ - Certificates: []tls.Certificate{cert}, + GetCertificate: m.GetCertificate, }, } http2.ConfigureServer(srv, &http2.Server{}) diff --git a/vendor/golang.org/x/net/http2/h2i/h2i.go b/vendor/golang.org/x/net/http2/h2i/h2i.go index b70976f77..228edf8a4 100644 --- a/vendor/golang.org/x/net/http2/h2i/h2i.go +++ b/vendor/golang.org/x/net/http2/h2i/h2i.go @@ -168,7 +168,7 @@ func (app *h2i) Main() error { app.framer = http2.NewFramer(tc, tc) - oldState, err := terminal.MakeRaw(0) + oldState, err := terminal.MakeRaw(int(os.Stdin.Fd())) if err != nil { return err } @@ -238,7 +238,7 @@ func (app *h2i) Main() error { } func (app *h2i) logf(format string, args ...interface{}) { - fmt.Fprintf(app.term, format+"\n", args...) + fmt.Fprintf(app.term, format+"\r\n", args...) } func (app *h2i) readConsole() error { @@ -435,9 +435,9 @@ func (app *h2i) readFrames() error { return nil }) case *http2.WindowUpdateFrame: - app.logf(" Window-Increment = %v\n", f.Increment) + app.logf(" Window-Increment = %v", f.Increment) case *http2.GoAwayFrame: - app.logf(" Last-Stream-ID = %d; Error-Code = %v (%d)\n", f.LastStreamID, f.ErrCode, f.ErrCode) + app.logf(" Last-Stream-ID = %d; Error-Code = %v (%d)", f.LastStreamID, f.ErrCode, f.ErrCode) case *http2.DataFrame: app.logf(" %q", f.Data()) case *http2.HeadersFrame: diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go index 2e27b093c..b6b0f9ad1 100644 --- a/vendor/golang.org/x/net/http2/http2.go +++ b/vendor/golang.org/x/net/http2/http2.go @@ -36,6 +36,7 @@ var ( VerboseLogs bool logFrameWrites bool logFrameReads bool + inTests bool ) func init() { @@ -77,13 +78,23 @@ var ( type streamState int +// HTTP/2 stream states. +// +// See http://tools.ietf.org/html/rfc7540#section-5.1. +// +// For simplicity, the server code merges "reserved (local)" into +// "half-closed (remote)". This is one less state transition to track. +// The only downside is that we send PUSH_PROMISEs slightly less +// liberally than allowable. More discussion here: +// https://lists.w3.org/Archives/Public/ietf-http-wg/2016JulSep/0599.html +// +// "reserved (remote)" is omitted since the client code does not +// support server push. const ( stateIdle streamState = iota stateOpen stateHalfClosedLocal stateHalfClosedRemote - stateResvLocal - stateResvRemote stateClosed ) @@ -92,8 +103,6 @@ var stateName = [...]string{ stateOpen: "Open", stateHalfClosedLocal: "HalfClosedLocal", stateHalfClosedRemote: "HalfClosedRemote", - stateResvLocal: "ResvLocal", - stateResvRemote: "ResvRemote", stateClosed: "Closed", } @@ -253,14 +262,27 @@ func newBufferedWriter(w io.Writer) *bufferedWriter { return &bufferedWriter{w: w} } +// bufWriterPoolBufferSize is the size of bufio.Writer's +// buffers created using bufWriterPool. +// +// TODO: pick a less arbitrary value? this is a bit under +// (3 x typical 1500 byte MTU) at least. Other than that, +// not much thought went into it. +const bufWriterPoolBufferSize = 4 << 10 + var bufWriterPool = sync.Pool{ New: func() interface{} { - // TODO: pick something better? this is a bit under - // (3 x typical 1500 byte MTU) at least. - return bufio.NewWriterSize(nil, 4<<10) + return bufio.NewWriterSize(nil, bufWriterPoolBufferSize) }, } +func (w *bufferedWriter) Available() int { + if w.bw == nil { + return bufWriterPoolBufferSize + } + return w.bw.Available() +} + func (w *bufferedWriter) Write(p []byte) (n int, err error) { if w.bw == nil { bw := bufWriterPool.Get().(*bufio.Writer) diff --git a/vendor/golang.org/x/net/http2/http2_test.go b/vendor/golang.org/x/net/http2/http2_test.go index 22c2ace82..524877647 100644 --- a/vendor/golang.org/x/net/http2/http2_test.go +++ b/vendor/golang.org/x/net/http2/http2_test.go @@ -27,6 +27,7 @@ func condSkipFailingTest(t *testing.T) { } func init() { + inTests = true DebugGoroutines = true flag.BoolVar(&VerboseLogs, "verboseh2", VerboseLogs, "Verbose HTTP/2 debug logging") } diff --git a/vendor/golang.org/x/net/http2/not_go17.go b/vendor/golang.org/x/net/http2/not_go17.go index 667867f4d..140434a79 100644 --- a/vendor/golang.org/x/net/http2/not_go17.go +++ b/vendor/golang.org/x/net/http2/not_go17.go @@ -10,9 +10,13 @@ import ( "crypto/tls" "net" "net/http" + "time" ) -type contextContext interface{} +type contextContext interface { + Done() <-chan struct{} + Err() error +} type fakeContext struct{} @@ -75,3 +79,9 @@ func cloneTLSConfig(c *tls.Config) *tls.Config { CurvePreferences: c.CurvePreferences, } } + +func (cc *ClientConn) Ping(ctx contextContext) error { + return cc.ping(ctx) +} + +func (t *Transport) idleConnTimeout() time.Duration { return 0 } diff --git a/vendor/golang.org/x/net/http2/not_go18.go b/vendor/golang.org/x/net/http2/not_go18.go new file mode 100644 index 000000000..2e600dc35 --- /dev/null +++ b/vendor/golang.org/x/net/http2/not_go18.go @@ -0,0 +1,18 @@ +// 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 !go1.8 + +package http2 + +import "net/http" + +func configureServer18(h1 *http.Server, h2 *Server) error { + // No IdleTimeout to sync prior to Go 1.8. + return nil +} + +func shouldLogPanic(panicValue interface{}) bool { + return panicValue != nil +} diff --git a/vendor/golang.org/x/net/http2/priority_test.go b/vendor/golang.org/x/net/http2/priority_test.go deleted file mode 100644 index a3fe2bb49..000000000 --- a/vendor/golang.org/x/net/http2/priority_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2014 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. - -package http2 - -import ( - "testing" -) - -func TestPriority(t *testing.T) { - // A -> B - // move A's parent to B - streams := make(map[uint32]*stream) - a := &stream{ - parent: nil, - weight: 16, - } - streams[1] = a - b := &stream{ - parent: a, - weight: 16, - } - streams[2] = b - adjustStreamPriority(streams, 1, PriorityParam{ - Weight: 20, - StreamDep: 2, - }) - if a.parent != b { - t.Errorf("Expected A's parent to be B") - } - if a.weight != 20 { - t.Errorf("Expected A's weight to be 20; got %d", a.weight) - } - if b.parent != nil { - t.Errorf("Expected B to have no parent") - } - if b.weight != 16 { - t.Errorf("Expected B's weight to be 16; got %d", b.weight) - } -} - -func TestPriorityExclusiveZero(t *testing.T) { - // A B and C are all children of the 0 stream. - // Exclusive reprioritization to any of the streams - // should bring the rest of the streams under the - // reprioritized stream - streams := make(map[uint32]*stream) - a := &stream{ - parent: nil, - weight: 16, - } - streams[1] = a - b := &stream{ - parent: nil, - weight: 16, - } - streams[2] = b - c := &stream{ - parent: nil, - weight: 16, - } - streams[3] = c - adjustStreamPriority(streams, 3, PriorityParam{ - Weight: 20, - StreamDep: 0, - Exclusive: true, - }) - if a.parent != c { - t.Errorf("Expected A's parent to be C") - } - if a.weight != 16 { - t.Errorf("Expected A's weight to be 16; got %d", a.weight) - } - if b.parent != c { - t.Errorf("Expected B's parent to be C") - } - if b.weight != 16 { - t.Errorf("Expected B's weight to be 16; got %d", b.weight) - } - if c.parent != nil { - t.Errorf("Expected C to have no parent") - } - if c.weight != 20 { - t.Errorf("Expected C's weight to be 20; got %d", b.weight) - } -} - -func TestPriorityOwnParent(t *testing.T) { - streams := make(map[uint32]*stream) - a := &stream{ - parent: nil, - weight: 16, - } - streams[1] = a - b := &stream{ - parent: a, - weight: 16, - } - streams[2] = b - adjustStreamPriority(streams, 1, PriorityParam{ - Weight: 20, - StreamDep: 1, - }) - if a.parent != nil { - t.Errorf("Expected A's parent to be nil") - } - if a.weight != 20 { - t.Errorf("Expected A's weight to be 20; got %d", a.weight) - } - if b.parent != a { - t.Errorf("Expected B's parent to be A") - } - if b.weight != 16 { - t.Errorf("Expected B's weight to be 16; got %d", b.weight) - } - -} diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 8206fa79d..0b6b4b08d 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -2,17 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// TODO: replace all <-sc.doneServing with reads from the stream's cw -// instead, and make sure that on close we close all open -// streams. then remove doneServing? - -// TODO: re-audit GOAWAY support. Consider each incoming frame type and -// whether it should be ignored during graceful shutdown. - -// TODO: disconnect idle clients. GFE seems to do 4 minutes. make -// configurable? or maximum number of idle clients and remove the -// oldest? - // TODO: turn off the serve goroutine when idle, so // an idle conn only has the readFrames goroutine active. (which could // also be optimized probably to pin less memory in crypto/tls). This @@ -44,6 +33,7 @@ import ( "fmt" "io" "log" + "math" "net" "net/http" "net/textproto" @@ -114,6 +104,15 @@ type Server struct { // PermitProhibitedCipherSuites, if true, permits the use of // cipher suites prohibited by the HTTP/2 spec. PermitProhibitedCipherSuites bool + + // IdleTimeout specifies how long until idle clients should be + // closed with a GOAWAY frame. PING frames are not considered + // activity for the purposes of IdleTimeout. + IdleTimeout time.Duration + + // NewWriteScheduler constructs a write scheduler for a connection. + // If nil, a default scheduler is chosen. + NewWriteScheduler func() WriteScheduler } func (s *Server) maxReadFrameSize() uint32 { @@ -136,9 +135,15 @@ func (s *Server) maxConcurrentStreams() uint32 { // // ConfigureServer must be called before s begins serving. func ConfigureServer(s *http.Server, conf *Server) error { + if s == nil { + panic("nil *http.Server") + } if conf == nil { conf = new(Server) } + if err := configureServer18(s, conf); err != nil { + return err + } if s.TLSConfig == nil { s.TLSConfig = new(tls.Config) @@ -183,9 +188,6 @@ func ConfigureServer(s *http.Server, conf *Server) error { if !haveNPN { s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, NextProtoTLS) } - // h2-14 is temporary (as of 2015-03-05) while we wait for all browsers - // to switch to "h2". - s.TLSConfig.NextProtos = append(s.TLSConfig.NextProtos, "h2-14") if s.TLSNextProto == nil { s.TLSNextProto = map[string]func(*http.Server, *tls.Conn, http.Handler){} @@ -200,7 +202,6 @@ func ConfigureServer(s *http.Server, conf *Server) error { }) } s.TLSNextProto[NextProtoTLS] = protoHandler - s.TLSNextProto["h2-14"] = protoHandler // temporary; see above. return nil } @@ -254,29 +255,35 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { defer cancel() sc := &serverConn{ - srv: s, - hs: opts.baseConfig(), - conn: c, - baseCtx: baseCtx, - remoteAddrStr: c.RemoteAddr().String(), - bw: newBufferedWriter(c), - handler: opts.handler(), - streams: make(map[uint32]*stream), - readFrameCh: make(chan readFrameResult), - wantWriteFrameCh: make(chan frameWriteMsg, 8), - wroteFrameCh: make(chan frameWriteResult, 1), // buffered; one send in writeFrameAsync - bodyReadCh: make(chan bodyReadMsg), // buffering doesn't matter either way - doneServing: make(chan struct{}), - advMaxStreams: s.maxConcurrentStreams(), - writeSched: writeScheduler{ - maxFrameSize: initialMaxFrameSize, - }, + srv: s, + hs: opts.baseConfig(), + conn: c, + baseCtx: baseCtx, + remoteAddrStr: c.RemoteAddr().String(), + bw: newBufferedWriter(c), + handler: opts.handler(), + streams: make(map[uint32]*stream), + readFrameCh: make(chan readFrameResult), + wantWriteFrameCh: make(chan FrameWriteRequest, 8), + wantStartPushCh: make(chan startPushRequest, 8), + wroteFrameCh: make(chan frameWriteResult, 1), // buffered; one send in writeFrameAsync + bodyReadCh: make(chan bodyReadMsg), // buffering doesn't matter either way + doneServing: make(chan struct{}), + clientMaxStreams: math.MaxUint32, // Section 6.5.2: "Initially, there is no limit to this value" + advMaxStreams: s.maxConcurrentStreams(), initialWindowSize: initialWindowSize, + maxFrameSize: initialMaxFrameSize, headerTableSize: initialHeaderTableSize, serveG: newGoroutineLock(), pushEnabled: true, } + if s.NewWriteScheduler != nil { + sc.writeSched = s.NewWriteScheduler() + } else { + sc.writeSched = NewRandomWriteScheduler() + } + sc.flow.add(initialWindowSize) sc.inflow.add(initialWindowSize) sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf) @@ -356,16 +363,18 @@ type serverConn struct { handler http.Handler baseCtx contextContext framer *Framer - doneServing chan struct{} // closed when serverConn.serve ends - readFrameCh chan readFrameResult // written by serverConn.readFrames - wantWriteFrameCh chan frameWriteMsg // from handlers -> serve - wroteFrameCh chan frameWriteResult // from writeFrameAsync -> serve, tickles more frame writes - bodyReadCh chan bodyReadMsg // from handlers -> serve - testHookCh chan func(int) // code to run on the serve loop - flow flow // conn-wide (not stream-specific) outbound flow control - inflow flow // conn-wide inbound flow control - tlsState *tls.ConnectionState // shared by all handlers, like net/http + doneServing chan struct{} // closed when serverConn.serve ends + readFrameCh chan readFrameResult // written by serverConn.readFrames + wantWriteFrameCh chan FrameWriteRequest // from handlers -> serve + wantStartPushCh chan startPushRequest // from handlers -> serve + wroteFrameCh chan frameWriteResult // from writeFrameAsync -> serve, tickles more frame writes + bodyReadCh chan bodyReadMsg // from handlers -> serve + testHookCh chan func(int) // code to run on the serve loop + flow flow // conn-wide (not stream-specific) outbound flow control + inflow flow // conn-wide inbound flow control + tlsState *tls.ConnectionState // shared by all handlers, like net/http remoteAddrStr string + writeSched WriteScheduler // Everything following is owned by the serve loop; use serveG.check(): serveG goroutineLock // used to verify funcs are on serve() @@ -375,22 +384,27 @@ type serverConn struct { unackedSettings int // how many SETTINGS have we sent without ACKs? clientMaxStreams uint32 // SETTINGS_MAX_CONCURRENT_STREAMS from client (our PUSH_PROMISE limit) advMaxStreams uint32 // our SETTINGS_MAX_CONCURRENT_STREAMS advertised the client - curOpenStreams uint32 // client's number of open streams - maxStreamID uint32 // max ever seen + curClientStreams uint32 // number of open streams initiated by the client + curPushedStreams uint32 // number of open streams initiated by server push + maxClientStreamID uint32 // max ever seen from client (odd), or 0 if there have been no client requests + maxPushPromiseID uint32 // ID of the last push promise (even), or 0 if there have been no pushes streams map[uint32]*stream initialWindowSize int32 + maxFrameSize int32 headerTableSize uint32 peerMaxHeaderListSize uint32 // zero means unknown (default) canonHeader map[string]string // http2-lower-case -> Go-Canonical-Case - writingFrame bool // started write goroutine but haven't heard back on wroteFrameCh + writingFrame bool // started writing a frame (on serve goroutine or separate) + writingFrameAsync bool // started a frame on its own goroutine but haven't heard back on wroteFrameCh needsFrameFlush bool // last frame write wasn't a flush - writeSched writeScheduler - inGoAway bool // we've started to or sent GOAWAY - needToSendGoAway bool // we need to schedule a GOAWAY frame write + inGoAway bool // we've started to or sent GOAWAY + inFrameScheduleLoop bool // whether we're in the scheduleFrameWrite loop + needToSendGoAway bool // we need to schedule a GOAWAY frame write goAwayCode ErrCode shutdownTimerCh <-chan time.Time // nil until used shutdownTimer *time.Timer // nil until used - freeRequestBodyBuf []byte // if non-nil, a free initialWindowSize buffer for getRequestBodyBuf + idleTimer *time.Timer // nil if unused + idleTimerCh <-chan time.Time // nil if unused // Owned by the writeFrameAsync goroutine: headerWriteBuf bytes.Buffer @@ -434,11 +448,11 @@ type stream struct { numTrailerValues int64 weight uint8 state streamState - sentReset bool // only true once detached from streams map - gotReset bool // only true once detacted from streams map - gotTrailerHeader bool // HEADER frame for trailers was seen - wroteHeaders bool // whether we wrote headers (not status 100) - reqBuf []byte + sentReset bool // only true once detached from streams map + gotReset bool // only true once detacted from streams map + gotTrailerHeader bool // HEADER frame for trailers was seen + wroteHeaders bool // whether we wrote headers (not status 100) + reqBuf []byte // if non-nil, body pipe buffer to return later at EOF trailer http.Header // accumulated trailers reqTrailer http.Header // handler's Request.Trailer @@ -453,7 +467,7 @@ func (sc *serverConn) HeaderEncoder() (*hpack.Encoder, *bytes.Buffer) { func (sc *serverConn) state(streamID uint32) (streamState, *stream) { sc.serveG.check() - // http://http2.github.io/http2-spec/#rfc.section.5.1 + // http://tools.ietf.org/html/rfc7540#section-5.1 if st, ok := sc.streams[streamID]; ok { return st.state, st } @@ -463,8 +477,14 @@ func (sc *serverConn) state(streamID uint32) (streamState, *stream) { // a client sends a HEADERS frame on stream 7 without ever sending a // frame on stream 5, then stream 5 transitions to the "closed" // state when the first frame for stream 7 is sent or received." - if streamID <= sc.maxStreamID { - return stateClosed, nil + if streamID%2 == 1 { + if streamID <= sc.maxClientStreamID { + return stateClosed, nil + } + } else { + if streamID <= sc.maxPushPromiseID { + return stateClosed, nil + } } return stateIdle, nil } @@ -603,17 +623,17 @@ func (sc *serverConn) readFrames() { // frameWriteResult is the message passed from writeFrameAsync to the serve goroutine. type frameWriteResult struct { - wm frameWriteMsg // what was written (or attempted) - err error // result of the writeFrame call + wr FrameWriteRequest // what was written (or attempted) + err error // result of the writeFrame call } // writeFrameAsync runs in its own goroutine and writes a single frame // and then reports when it's done. // At most one goroutine can be running writeFrameAsync at a time per // serverConn. -func (sc *serverConn) writeFrameAsync(wm frameWriteMsg) { - err := wm.write.writeFrame(sc) - sc.wroteFrameCh <- frameWriteResult{wm, err} +func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest) { + err := wr.write.writeFrame(sc) + sc.wroteFrameCh <- frameWriteResult{wr, err} } func (sc *serverConn) closeAllStreamsOnConnClose() { @@ -657,7 +677,7 @@ func (sc *serverConn) serve() { sc.vlogf("http2: server connection from %v on %p", sc.conn.RemoteAddr(), sc.hs) } - sc.writeFrame(frameWriteMsg{ + sc.writeFrame(FrameWriteRequest{ write: writeSettings{ {SettingMaxFrameSize, sc.srv.maxReadFrameSize()}, {SettingMaxConcurrentStreams, sc.advMaxStreams}, @@ -682,6 +702,17 @@ func (sc *serverConn) serve() { sc.setConnState(http.StateActive) sc.setConnState(http.StateIdle) + if sc.srv.IdleTimeout != 0 { + sc.idleTimer = time.NewTimer(sc.srv.IdleTimeout) + defer sc.idleTimer.Stop() + sc.idleTimerCh = sc.idleTimer.C + } + + var gracefulShutdownCh <-chan struct{} + if sc.hs != nil { + gracefulShutdownCh = h1ServerShutdownChan(sc.hs) + } + go sc.readFrames() // closed by defer sc.conn.Close above settingsTimer := time.NewTimer(firstSettingsTimeout) @@ -689,8 +720,10 @@ func (sc *serverConn) serve() { for { loopNum++ select { - case wm := <-sc.wantWriteFrameCh: - sc.writeFrame(wm) + case wr := <-sc.wantWriteFrameCh: + sc.writeFrame(wr) + case spr := <-sc.wantStartPushCh: + sc.startPush(spr) case res := <-sc.wroteFrameCh: sc.wroteFrame(res) case res := <-sc.readFrameCh: @@ -707,12 +740,22 @@ func (sc *serverConn) serve() { case <-settingsTimer.C: sc.logf("timeout waiting for SETTINGS frames from %v", sc.conn.RemoteAddr()) return + case <-gracefulShutdownCh: + gracefulShutdownCh = nil + sc.startGracefulShutdown() case <-sc.shutdownTimerCh: sc.vlogf("GOAWAY close timer fired; closing conn from %v", sc.conn.RemoteAddr()) return + case <-sc.idleTimerCh: + sc.vlogf("connection is idle") + sc.goAway(ErrCodeNo) case fn := <-sc.testHookCh: fn(loopNum) } + + if sc.inGoAway && sc.curClientStreams == 0 && !sc.needToSendGoAway && !sc.writingFrame { + return + } } } @@ -760,7 +803,7 @@ func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStrea ch := errChanPool.Get().(chan error) writeArg := writeDataPool.Get().(*writeData) *writeArg = writeData{stream.id, data, endStream} - err := sc.writeFrameFromHandler(frameWriteMsg{ + err := sc.writeFrameFromHandler(FrameWriteRequest{ write: writeArg, stream: stream, done: ch, @@ -796,17 +839,17 @@ func (sc *serverConn) writeDataFromHandler(stream *stream, data []byte, endStrea return err } -// writeFrameFromHandler sends wm to sc.wantWriteFrameCh, but aborts +// writeFrameFromHandler sends wr to sc.wantWriteFrameCh, but aborts // if the connection has gone away. // // This must not be run from the serve goroutine itself, else it might // deadlock writing to sc.wantWriteFrameCh (which is only mildly // buffered and is read by serve itself). If you're on the serve // goroutine, call writeFrame instead. -func (sc *serverConn) writeFrameFromHandler(wm frameWriteMsg) error { +func (sc *serverConn) writeFrameFromHandler(wr FrameWriteRequest) error { sc.serveG.checkNotOn() // NOT select { - case sc.wantWriteFrameCh <- wm: + case sc.wantWriteFrameCh <- wr: return nil case <-sc.doneServing: // Serve loop is gone. @@ -823,38 +866,38 @@ func (sc *serverConn) writeFrameFromHandler(wm frameWriteMsg) error { // make it onto the wire // // If you're not on the serve goroutine, use writeFrameFromHandler instead. -func (sc *serverConn) writeFrame(wm frameWriteMsg) { +func (sc *serverConn) writeFrame(wr FrameWriteRequest) { sc.serveG.check() var ignoreWrite bool // Don't send a 100-continue response if we've already sent headers. // See golang.org/issue/14030. - switch wm.write.(type) { + switch wr.write.(type) { case *writeResHeaders: - wm.stream.wroteHeaders = true + wr.stream.wroteHeaders = true case write100ContinueHeadersFrame: - if wm.stream.wroteHeaders { + if wr.stream.wroteHeaders { ignoreWrite = true } } if !ignoreWrite { - sc.writeSched.add(wm) + sc.writeSched.Push(wr) } sc.scheduleFrameWrite() } -// startFrameWrite starts a goroutine to write wm (in a separate +// startFrameWrite starts a goroutine to write wr (in a separate // goroutine since that might block on the network), and updates the -// serve goroutine's state about the world, updated from info in wm. -func (sc *serverConn) startFrameWrite(wm frameWriteMsg) { +// serve goroutine's state about the world, updated from info in wr. +func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) { sc.serveG.check() if sc.writingFrame { panic("internal error: can only be writing one frame at a time") } - st := wm.stream + st := wr.stream if st != nil { switch st.state { case stateHalfClosedLocal: @@ -865,13 +908,31 @@ func (sc *serverConn) startFrameWrite(wm frameWriteMsg) { sc.scheduleFrameWrite() return } - panic(fmt.Sprintf("internal error: attempt to send a write %v on a closed stream", wm)) + panic(fmt.Sprintf("internal error: attempt to send a write %v on a closed stream", wr)) + } + } + if wpp, ok := wr.write.(*writePushPromise); ok { + var err error + wpp.promisedID, err = wpp.allocatePromisedID() + if err != nil { + sc.writingFrameAsync = false + if wr.done != nil { + wr.done <- err + } + return } } sc.writingFrame = true sc.needsFrameFlush = true - go sc.writeFrameAsync(wm) + if wr.write.staysWithinBuffer(sc.bw.Available()) { + sc.writingFrameAsync = false + err := wr.write.writeFrame(sc) + sc.wroteFrame(frameWriteResult{wr, err}) + } else { + sc.writingFrameAsync = true + go sc.writeFrameAsync(wr) + } } // errHandlerPanicked is the error given to any callers blocked in a read from @@ -887,25 +948,26 @@ func (sc *serverConn) wroteFrame(res frameWriteResult) { panic("internal error: expected to be already writing a frame") } sc.writingFrame = false + sc.writingFrameAsync = false - wm := res.wm - st := wm.stream + wr := res.wr + st := wr.stream - closeStream := endsStream(wm.write) + closeStream := endsStream(wr.write) - if _, ok := wm.write.(handlerPanicRST); ok { + if _, ok := wr.write.(handlerPanicRST); ok { sc.closeStream(st, errHandlerPanicked) } // Reply (if requested) to the blocked ServeHTTP goroutine. - if ch := wm.done; ch != nil { + if ch := wr.done; ch != nil { select { case ch <- res.err: default: - panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wm.write)) + panic(fmt.Sprintf("unbuffered done channel passed in for type %T", wr.write)) } } - wm.write = nil // prevent use (assume it's tainted after wm.done send) + wr.write = nil // prevent use (assume it's tainted after wr.done send) if closeStream { if st == nil { @@ -916,11 +978,11 @@ func (sc *serverConn) wroteFrame(res frameWriteResult) { // Here we would go to stateHalfClosedLocal in // theory, but since our handler is done and // the net/http package provides no mechanism - // for finishing writing to a ResponseWriter - // while still reading data (see possible TODO - // at top of this file), we go into closed - // state here anyway, after telling the peer - // we're hanging up on them. + // for closing a ResponseWriter while still + // reading data (see possible TODO at top of + // this file), we go into closed state here + // anyway, after telling the peer we're + // hanging up on them. st.state = stateHalfClosedLocal // won't last long, but necessary for closeStream via resetStream errCancel := streamError(st.id, ErrCodeCancel) sc.resetStream(errCancel) @@ -946,47 +1008,68 @@ func (sc *serverConn) wroteFrame(res frameWriteResult) { // flush the write buffer. func (sc *serverConn) scheduleFrameWrite() { sc.serveG.check() - if sc.writingFrame { - return - } - if sc.needToSendGoAway { - sc.needToSendGoAway = false - sc.startFrameWrite(frameWriteMsg{ - write: &writeGoAway{ - maxStreamID: sc.maxStreamID, - code: sc.goAwayCode, - }, - }) - return - } - if sc.needToSendSettingsAck { - sc.needToSendSettingsAck = false - sc.startFrameWrite(frameWriteMsg{write: writeSettingsAck{}}) + if sc.writingFrame || sc.inFrameScheduleLoop { return } - if !sc.inGoAway { - if wm, ok := sc.writeSched.take(); ok { - sc.startFrameWrite(wm) - return + sc.inFrameScheduleLoop = true + for !sc.writingFrameAsync { + if sc.needToSendGoAway { + sc.needToSendGoAway = false + sc.startFrameWrite(FrameWriteRequest{ + write: &writeGoAway{ + maxStreamID: sc.maxClientStreamID, + code: sc.goAwayCode, + }, + }) + continue } + if sc.needToSendSettingsAck { + sc.needToSendSettingsAck = false + sc.startFrameWrite(FrameWriteRequest{write: writeSettingsAck{}}) + continue + } + if !sc.inGoAway || sc.goAwayCode == ErrCodeNo { + if wr, ok := sc.writeSched.Pop(); ok { + sc.startFrameWrite(wr) + continue + } + } + if sc.needsFrameFlush { + sc.startFrameWrite(FrameWriteRequest{write: flushFrameWriter{}}) + sc.needsFrameFlush = false // after startFrameWrite, since it sets this true + continue + } + break } - if sc.needsFrameFlush { - sc.startFrameWrite(frameWriteMsg{write: flushFrameWriter{}}) - sc.needsFrameFlush = false // after startFrameWrite, since it sets this true - return - } + sc.inFrameScheduleLoop = false +} + +// startGracefulShutdown sends a GOAWAY with ErrCodeNo to tell the +// client we're gracefully shutting down. The connection isn't closed +// until all current streams are done. +func (sc *serverConn) startGracefulShutdown() { + sc.goAwayIn(ErrCodeNo, 0) } func (sc *serverConn) goAway(code ErrCode) { sc.serveG.check() - if sc.inGoAway { - return - } + var forceCloseIn time.Duration if code != ErrCodeNo { - sc.shutDownIn(250 * time.Millisecond) + forceCloseIn = 250 * time.Millisecond } else { // TODO: configurable - sc.shutDownIn(1 * time.Second) + forceCloseIn = 1 * time.Second + } + sc.goAwayIn(code, forceCloseIn) +} + +func (sc *serverConn) goAwayIn(code ErrCode, forceCloseIn time.Duration) { + sc.serveG.check() + if sc.inGoAway { + return + } + if forceCloseIn != 0 { + sc.shutDownIn(forceCloseIn) } sc.inGoAway = true sc.needToSendGoAway = true @@ -1002,7 +1085,7 @@ func (sc *serverConn) shutDownIn(d time.Duration) { func (sc *serverConn) resetStream(se StreamError) { sc.serveG.check() - sc.writeFrame(frameWriteMsg{write: se}) + sc.writeFrame(FrameWriteRequest{write: se}) if st, ok := sc.streams[se.StreamID]; ok { st.sentReset = true sc.closeStream(st, se) @@ -1090,6 +1173,8 @@ func (sc *serverConn) processFrame(f Frame) error { return sc.processResetStream(f) case *PriorityFrame: return sc.processPriority(f) + case *GoAwayFrame: + return sc.processGoAway(f) case *PushPromiseFrame: // A client cannot push. Thus, servers MUST treat the receipt of a PUSH_PROMISE // frame as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. @@ -1115,7 +1200,10 @@ func (sc *serverConn) processPing(f *PingFrame) error { // PROTOCOL_ERROR." return ConnectionError(ErrCodeProtocol) } - sc.writeFrame(frameWriteMsg{write: writePingAck{f}}) + if sc.inGoAway && sc.goAwayCode != ErrCodeNo { + return nil + } + sc.writeFrame(FrameWriteRequest{write: writePingAck{f}}) return nil } @@ -1123,7 +1211,14 @@ func (sc *serverConn) processWindowUpdate(f *WindowUpdateFrame) error { sc.serveG.check() switch { case f.StreamID != 0: // stream-level flow control - st := sc.streams[f.StreamID] + state, st := sc.state(f.StreamID) + if state == stateIdle { + // Section 5.1: "Receiving any frame other than HEADERS + // or PRIORITY on a stream in this state MUST be + // treated as a connection error (Section 5.4.1) of + // type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } if st == nil { // "WINDOW_UPDATE can be sent by a peer that has sent a // frame bearing the END_STREAM flag. This means that a @@ -1170,11 +1265,21 @@ func (sc *serverConn) closeStream(st *stream, err error) { panic(fmt.Sprintf("invariant; can't close stream in state %v", st.state)) } st.state = stateClosed - sc.curOpenStreams-- - if sc.curOpenStreams == 0 { - sc.setConnState(http.StateIdle) + if st.isPushed() { + sc.curPushedStreams-- + } else { + sc.curClientStreams-- } delete(sc.streams, st.id) + if len(sc.streams) == 0 { + sc.setConnState(http.StateIdle) + if sc.srv.IdleTimeout != 0 { + sc.idleTimer.Reset(sc.srv.IdleTimeout) + } + if h1ServerKeepAlivesDisabled(sc.hs) { + sc.startGracefulShutdown() + } + } if p := st.body; p != nil { // Return any buffered unread bytes worth of conn-level flow control. // See golang.org/issue/16481 @@ -1183,19 +1288,7 @@ func (sc *serverConn) closeStream(st *stream, err error) { p.CloseWithError(err) } st.cw.Close() // signals Handler's CloseNotifier, unblocks writes, etc - sc.writeSched.forgetStream(st.id) - if st.reqBuf != nil { - // Stash this request body buffer (64k) away for reuse - // by a future POST/PUT/etc. - // - // TODO(bradfitz): share on the server? sync.Pool? - // Server requires locks and might hurt contention. - // sync.Pool might work, or might be worse, depending - // on goroutine CPU migrations. (get and put on - // separate CPUs). Maybe a mix of strategies. But - // this is an easy win for now. - sc.freeRequestBodyBuf = st.reqBuf - } + sc.writeSched.CloseStream(st.id) } func (sc *serverConn) processSettings(f *SettingsFrame) error { @@ -1237,7 +1330,7 @@ func (sc *serverConn) processSetting(s Setting) error { case SettingInitialWindowSize: return sc.processSettingInitialWindowSize(s.Val) case SettingMaxFrameSize: - sc.writeSched.maxFrameSize = s.Val + sc.maxFrameSize = int32(s.Val) // the maximum valid s.Val is < 2^31 case SettingMaxHeaderListSize: sc.peerMaxHeaderListSize = s.Val default: @@ -1281,14 +1374,24 @@ func (sc *serverConn) processSettingInitialWindowSize(val uint32) error { func (sc *serverConn) processData(f *DataFrame) error { sc.serveG.check() + if sc.inGoAway && sc.goAwayCode != ErrCodeNo { + return nil + } data := f.Data() // "If a DATA frame is received whose stream is not in "open" // or "half closed (local)" state, the recipient MUST respond // with a stream error (Section 5.4.2) of type STREAM_CLOSED." id := f.Header().StreamID - st, ok := sc.streams[id] - if !ok || st.state != stateOpen || st.gotTrailerHeader { + state, st := sc.state(id) + if id == 0 || state == stateIdle { + // Section 5.1: "Receiving any frame other than HEADERS + // or PRIORITY on a stream in this state MUST be + // treated as a connection error (Section 5.4.1) of + // type PROTOCOL_ERROR." + return ConnectionError(ErrCodeProtocol) + } + if st == nil || state != stateOpen || st.gotTrailerHeader { // This includes sending a RST_STREAM if the stream is // in stateHalfClosedLocal (which currently means that // the http.Handler returned, so it's done reading & @@ -1350,6 +1453,25 @@ func (sc *serverConn) processData(f *DataFrame) error { return nil } +func (sc *serverConn) processGoAway(f *GoAwayFrame) error { + sc.serveG.check() + if f.ErrCode != ErrCodeNo { + sc.logf("http2: received GOAWAY %+v, starting graceful shutdown", f) + } else { + sc.vlogf("http2: received GOAWAY %+v, starting graceful shutdown", f) + } + sc.startGracefulShutdown() + // http://tools.ietf.org/html/rfc7540#section-6.8 + // We should not create any new streams, which means we should disable push. + sc.pushEnabled = false + return nil +} + +// isPushed reports whether the stream is server-initiated. +func (st *stream) isPushed() bool { + return st.id%2 == 0 +} + // endStream closes a Request.Body's pipe. It is called when a DATA // frame says a request body is over (or after trailers). func (st *stream) endStream() { @@ -1379,12 +1501,12 @@ func (st *stream) copyTrailersToHandlerRequest() { func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { sc.serveG.check() - id := f.Header().StreamID + id := f.StreamID if sc.inGoAway { // Ignore. return nil } - // http://http2.github.io/http2-spec/#rfc.section.5.1.1 + // http://tools.ietf.org/html/rfc7540#section-5.1.1 // Streams initiated by a client MUST use odd-numbered stream // identifiers. [...] An endpoint that receives an unexpected // stream identifier MUST respond with a connection error @@ -1396,8 +1518,7 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { // send a trailer for an open one. If we already have a stream // open, let it process its own HEADERS frame (trailers at this // point, if it's valid). - st := sc.streams[f.Header().StreamID] - if st != nil { + if st := sc.streams[f.StreamID]; st != nil { return st.processTrailerHeaders(f) } @@ -1406,54 +1527,45 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { // endpoint has opened or reserved. [...] An endpoint that // receives an unexpected stream identifier MUST respond with // a connection error (Section 5.4.1) of type PROTOCOL_ERROR. - if id <= sc.maxStreamID { + if id <= sc.maxClientStreamID { return ConnectionError(ErrCodeProtocol) } - sc.maxStreamID = id + sc.maxClientStreamID = id - ctx, cancelCtx := contextWithCancel(sc.baseCtx) - st = &stream{ - sc: sc, - id: id, - state: stateOpen, - ctx: ctx, - cancelCtx: cancelCtx, + if sc.idleTimer != nil { + sc.idleTimer.Stop() } - if f.StreamEnded() { - st.state = stateHalfClosedRemote - } - st.cw.Init() - st.flow.conn = &sc.flow // link to conn-level counter - st.flow.add(sc.initialWindowSize) - st.inflow.conn = &sc.inflow // link to conn-level counter - st.inflow.add(initialWindowSize) // TODO: update this when we send a higher initial window size in the initial settings - - sc.streams[id] = st - if f.HasPriority() { - adjustStreamPriority(sc.streams, st.id, f.Priority) - } - sc.curOpenStreams++ - if sc.curOpenStreams == 1 { - sc.setConnState(http.StateActive) - } - if sc.curOpenStreams > sc.advMaxStreams { - // "Endpoints MUST NOT exceed the limit set by their - // peer. An endpoint that receives a HEADERS frame - // that causes their advertised concurrent stream - // limit to be exceeded MUST treat this as a stream - // error (Section 5.4.2) of type PROTOCOL_ERROR or - // REFUSED_STREAM." + // http://tools.ietf.org/html/rfc7540#section-5.1.2 + // [...] Endpoints MUST NOT exceed the limit set by their peer. An + // endpoint that receives a HEADERS frame that causes their + // advertised concurrent stream limit to be exceeded MUST treat + // this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR + // or REFUSED_STREAM. + if sc.curClientStreams+1 > sc.advMaxStreams { if sc.unackedSettings == 0 { // They should know better. - return streamError(st.id, ErrCodeProtocol) + return streamError(id, ErrCodeProtocol) } // Assume it's a network race, where they just haven't // received our last SETTINGS update. But actually // this can't happen yet, because we don't yet provide // a way for users to adjust server parameters at // runtime. - return streamError(st.id, ErrCodeRefusedStream) + return streamError(id, ErrCodeRefusedStream) + } + + initialState := stateOpen + if f.StreamEnded() { + initialState = stateHalfClosedRemote + } + st := sc.newStream(id, 0, initialState) + + if f.HasPriority() { + if err := checkPriority(f.StreamID, f.Priority); err != nil { + return err + } + sc.writeSched.AdjustStream(st.id, f.Priority) } rw, req, err := sc.newWriterAndRequest(st, f) @@ -1471,10 +1583,21 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error { if f.Truncated { // Their header list was too long. Send a 431 error. handler = handleHeaderListTooLong - } else if err := checkValidHTTP2Request(req); err != nil { + } else if err := checkValidHTTP2RequestHeaders(req.Header); err != nil { handler = new400Handler(err) } + // The net/http package sets the read deadline from the + // http.Server.ReadTimeout during the TLS handshake, but then + // passes the connection off to us with the deadline already + // set. Disarm it here after the request headers are read, + // similar to how the http1 server works. Here it's + // technically more like the http1 Server's ReadHeaderTimeout + // (in Go 1.8), though. That's a more sane option anyway. + if sc.hs.ReadTimeout != 0 { + sc.conn.SetReadDeadline(time.Time{}) + } + go sc.runHandler(rw, req, handler) return nil } @@ -1509,62 +1632,78 @@ func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error { return nil } +func checkPriority(streamID uint32, p PriorityParam) error { + if streamID == p.StreamDep { + // Section 5.3.1: "A stream cannot depend on itself. An endpoint MUST treat + // this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR." + // Section 5.3.3 says that a stream can depend on one of its dependencies, + // so it's only self-dependencies that are forbidden. + return streamError(streamID, ErrCodeProtocol) + } + return nil +} + func (sc *serverConn) processPriority(f *PriorityFrame) error { - adjustStreamPriority(sc.streams, f.StreamID, f.PriorityParam) + if sc.inGoAway { + return nil + } + if err := checkPriority(f.StreamID, f.PriorityParam); err != nil { + return err + } + sc.writeSched.AdjustStream(f.StreamID, f.PriorityParam) return nil } -func adjustStreamPriority(streams map[uint32]*stream, streamID uint32, priority PriorityParam) { - st, ok := streams[streamID] - if !ok { - // TODO: not quite correct (this streamID might - // already exist in the dep tree, but be closed), but - // close enough for now. - return +func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream { + sc.serveG.check() + if id == 0 { + panic("internal error: cannot create stream with id 0") } - st.weight = priority.Weight - parent := streams[priority.StreamDep] // might be nil - if parent == st { - // if client tries to set this stream to be the parent of itself - // ignore and keep going - return + + ctx, cancelCtx := contextWithCancel(sc.baseCtx) + st := &stream{ + sc: sc, + id: id, + state: state, + ctx: ctx, + cancelCtx: cancelCtx, } + st.cw.Init() + st.flow.conn = &sc.flow // link to conn-level counter + st.flow.add(sc.initialWindowSize) + st.inflow.conn = &sc.inflow // link to conn-level counter + st.inflow.add(initialWindowSize) // TODO: update this when we send a higher initial window size in the initial settings - // section 5.3.3: If a stream is made dependent on one of its - // own dependencies, the formerly dependent stream is first - // moved to be dependent on the reprioritized stream's previous - // parent. The moved dependency retains its weight. - for piter := parent; piter != nil; piter = piter.parent { - if piter == st { - parent.parent = st.parent - break - } + sc.streams[id] = st + sc.writeSched.OpenStream(st.id, OpenStreamOptions{PusherID: pusherID}) + if st.isPushed() { + sc.curPushedStreams++ + } else { + sc.curClientStreams++ } - st.parent = parent - if priority.Exclusive && (st.parent != nil || priority.StreamDep == 0) { - for _, openStream := range streams { - if openStream != st && openStream.parent == st.parent { - openStream.parent = st - } - } + if sc.curClientStreams+sc.curPushedStreams == 1 { + sc.setConnState(http.StateActive) } + + return st } func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*responseWriter, *http.Request, error) { sc.serveG.check() - method := f.PseudoValue("method") - path := f.PseudoValue("path") - scheme := f.PseudoValue("scheme") - authority := f.PseudoValue("authority") + rp := requestParam{ + method: f.PseudoValue("method"), + scheme: f.PseudoValue("scheme"), + authority: f.PseudoValue("authority"), + path: f.PseudoValue("path"), + } - isConnect := method == "CONNECT" + isConnect := rp.method == "CONNECT" if isConnect { - if path != "" || scheme != "" || authority == "" { + if rp.path != "" || rp.scheme != "" || rp.authority == "" { return nil, nil, streamError(f.StreamID, ErrCodeProtocol) } - } else if method == "" || path == "" || - (scheme != "https" && scheme != "http") { + } else if rp.method == "" || rp.path == "" || (rp.scheme != "https" && rp.scheme != "http") { // See 8.1.2.6 Malformed Requests and Responses: // // Malformed requests or responses that are detected @@ -1579,36 +1718,64 @@ func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*res } bodyOpen := !f.StreamEnded() - if method == "HEAD" && bodyOpen { + if rp.method == "HEAD" && bodyOpen { // HEAD requests can't have bodies return nil, nil, streamError(f.StreamID, ErrCodeProtocol) } - var tlsState *tls.ConnectionState // nil if not scheme https - if scheme == "https" { - tlsState = sc.tlsState + rp.header = make(http.Header) + for _, hf := range f.RegularFields() { + rp.header.Add(sc.canonicalHeader(hf.Name), hf.Value) + } + if rp.authority == "" { + rp.authority = rp.header.Get("Host") } - header := make(http.Header) - for _, hf := range f.RegularFields() { - header.Add(sc.canonicalHeader(hf.Name), hf.Value) + rw, req, err := sc.newWriterAndRequestNoBody(st, rp) + if err != nil { + return nil, nil, err + } + if bodyOpen { + st.reqBuf = getRequestBodyBuf() + req.Body.(*requestBody).pipe = &pipe{ + b: &fixedBuffer{buf: st.reqBuf}, + } + + if vv, ok := rp.header["Content-Length"]; ok { + req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64) + } else { + req.ContentLength = -1 + } } + return rw, req, nil +} - if authority == "" { - authority = header.Get("Host") +type requestParam struct { + method string + scheme, authority, path string + header http.Header +} + +func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*responseWriter, *http.Request, error) { + sc.serveG.check() + + var tlsState *tls.ConnectionState // nil if not scheme https + if rp.scheme == "https" { + tlsState = sc.tlsState } - needsContinue := header.Get("Expect") == "100-continue" + + needsContinue := rp.header.Get("Expect") == "100-continue" if needsContinue { - header.Del("Expect") + rp.header.Del("Expect") } // Merge Cookie headers into one "; "-delimited value. - if cookies := header["Cookie"]; len(cookies) > 1 { - header.Set("Cookie", strings.Join(cookies, "; ")) + if cookies := rp.header["Cookie"]; len(cookies) > 1 { + rp.header.Set("Cookie", strings.Join(cookies, "; ")) } // Setup Trailers var trailer http.Header - for _, v := range header["Trailer"] { + for _, v := range rp.header["Trailer"] { for _, key := range strings.Split(v, ",") { key = http.CanonicalHeaderKey(strings.TrimSpace(key)) switch key { @@ -1623,57 +1790,42 @@ func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*res } } } - delete(header, "Trailer") + delete(rp.header, "Trailer") - body := &requestBody{ - conn: sc, - stream: st, - needsContinue: needsContinue, - } var url_ *url.URL var requestURI string - if isConnect { - url_ = &url.URL{Host: authority} - requestURI = authority // mimic HTTP/1 server behavior + if rp.method == "CONNECT" { + url_ = &url.URL{Host: rp.authority} + requestURI = rp.authority // mimic HTTP/1 server behavior } else { var err error - url_, err = url.ParseRequestURI(path) + url_, err = url.ParseRequestURI(rp.path) if err != nil { - return nil, nil, streamError(f.StreamID, ErrCodeProtocol) + return nil, nil, streamError(st.id, ErrCodeProtocol) } - requestURI = path + requestURI = rp.path + } + + body := &requestBody{ + conn: sc, + stream: st, + needsContinue: needsContinue, } req := &http.Request{ - Method: method, + Method: rp.method, URL: url_, RemoteAddr: sc.remoteAddrStr, - Header: header, + Header: rp.header, RequestURI: requestURI, Proto: "HTTP/2.0", ProtoMajor: 2, ProtoMinor: 0, TLS: tlsState, - Host: authority, + Host: rp.authority, Body: body, Trailer: trailer, } req = requestWithContext(req, st.ctx) - if bodyOpen { - // Disabled, per golang.org/issue/14960: - // st.reqBuf = sc.getRequestBodyBuf() - // TODO: remove this 64k of garbage per request (again, but without a data race): - buf := make([]byte, initialWindowSize) - - body.pipe = &pipe{ - b: &fixedBuffer{buf: buf}, - } - - if vv, ok := header["Content-Length"]; ok { - req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64) - } else { - req.ContentLength = -1 - } - } rws := responseWriterStatePool.Get().(*responseWriterState) bwSave := rws.bw @@ -1689,13 +1841,22 @@ func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*res return rw, req, nil } -func (sc *serverConn) getRequestBodyBuf() []byte { - sc.serveG.check() - if buf := sc.freeRequestBodyBuf; buf != nil { - sc.freeRequestBodyBuf = nil - return buf +var reqBodyCache = make(chan []byte, 8) + +func getRequestBodyBuf() []byte { + select { + case b := <-reqBodyCache: + return b + default: + return make([]byte, initialWindowSize) + } +} + +func putRequestBodyBuf(b []byte) { + select { + case reqBodyCache <- b: + default: } - return make([]byte, initialWindowSize) } // Run on its own goroutine. @@ -1705,15 +1866,17 @@ func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler rw.rws.stream.cancelCtx() if didPanic { e := recover() - // Same as net/http: - const size = 64 << 10 - buf := make([]byte, size) - buf = buf[:runtime.Stack(buf, false)] - sc.writeFrameFromHandler(frameWriteMsg{ + sc.writeFrameFromHandler(FrameWriteRequest{ write: handlerPanicRST{rw.rws.stream.id}, stream: rw.rws.stream, }) - sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf) + // Same as net/http: + if shouldLogPanic(e) { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf) + } return } rw.handlerDone() @@ -1744,7 +1907,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro // mutates it. errc = errChanPool.Get().(chan error) } - if err := sc.writeFrameFromHandler(frameWriteMsg{ + if err := sc.writeFrameFromHandler(FrameWriteRequest{ write: headerData, stream: st, done: errc, @@ -1767,7 +1930,7 @@ func (sc *serverConn) writeHeaders(st *stream, headerData *writeResHeaders) erro // called from handler goroutines. func (sc *serverConn) write100ContinueHeaders(st *stream) { - sc.writeFrameFromHandler(frameWriteMsg{ + sc.writeFrameFromHandler(FrameWriteRequest{ write: write100ContinueHeadersFrame{st.id}, stream: st, }) @@ -1783,11 +1946,19 @@ type bodyReadMsg struct { // called from handler goroutines. // Notes that the handler for the given stream ID read n bytes of its body // and schedules flow control tokens to be sent. -func (sc *serverConn) noteBodyReadFromHandler(st *stream, n int) { +func (sc *serverConn) noteBodyReadFromHandler(st *stream, n int, err error) { sc.serveG.checkNotOn() // NOT on - select { - case sc.bodyReadCh <- bodyReadMsg{st, n}: - case <-sc.doneServing: + if n > 0 { + select { + case sc.bodyReadCh <- bodyReadMsg{st, n}: + case <-sc.doneServing: + } + } + if err == io.EOF { + if buf := st.reqBuf; buf != nil { + st.reqBuf = nil // shouldn't matter; field unused by other + putRequestBodyBuf(buf) + } } } @@ -1830,7 +2001,7 @@ func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) { if st != nil { streamID = st.id } - sc.writeFrame(frameWriteMsg{ + sc.writeFrame(FrameWriteRequest{ write: writeWindowUpdate{streamID: streamID, n: uint32(n)}, stream: st, }) @@ -1845,16 +2016,19 @@ func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) { } } +// requestBody is the Handler's Request.Body type. +// Read and Close may be called concurrently. type requestBody struct { stream *stream conn *serverConn - closed bool + closed bool // for use by Close only + sawEOF bool // for use by Read only pipe *pipe // non-nil if we have a HTTP entity message body needsContinue bool // need to send a 100-continue } func (b *requestBody) Close() error { - if b.pipe != nil { + if b.pipe != nil && !b.closed { b.pipe.BreakWithError(errClosedBody) } b.closed = true @@ -1866,13 +2040,17 @@ func (b *requestBody) Read(p []byte) (n int, err error) { b.needsContinue = false b.conn.write100ContinueHeaders(b.stream) } - if b.pipe == nil { + if b.pipe == nil || b.sawEOF { return 0, io.EOF } n, err = b.pipe.Read(p) - if n > 0 { - b.conn.noteBodyReadFromHandler(b.stream, n) + if err == io.EOF { + b.sawEOF = true } + if b.conn == nil && inTests { + return + } + b.conn.noteBodyReadFromHandler(b.stream, n, err) return } @@ -2110,8 +2288,9 @@ func (w *responseWriter) CloseNotify() <-chan bool { if ch == nil { ch = make(chan bool, 1) rws.closeNotifierCh = ch + cw := rws.stream.cw go func() { - rws.stream.cw.Wait() // wait for close + cw.Wait() // wait for close ch <- true }() } @@ -2207,6 +2386,200 @@ func (w *responseWriter) handlerDone() { responseWriterStatePool.Put(rws) } +// Push errors. +var ( + ErrRecursivePush = errors.New("http2: recursive push not allowed") + ErrPushLimitReached = errors.New("http2: push would exceed peer's SETTINGS_MAX_CONCURRENT_STREAMS") +) + +// pushOptions is the internal version of http.PushOptions, which we +// cannot include here because it's only defined in Go 1.8 and later. +type pushOptions struct { + Method string + Header http.Header +} + +func (w *responseWriter) push(target string, opts pushOptions) error { + st := w.rws.stream + sc := st.sc + sc.serveG.checkNotOn() + + // No recursive pushes: "PUSH_PROMISE frames MUST only be sent on a peer-initiated stream." + // http://tools.ietf.org/html/rfc7540#section-6.6 + if st.isPushed() { + return ErrRecursivePush + } + + // Default options. + if opts.Method == "" { + opts.Method = "GET" + } + if opts.Header == nil { + opts.Header = http.Header{} + } + wantScheme := "http" + if w.rws.req.TLS != nil { + wantScheme = "https" + } + + // Validate the request. + u, err := url.Parse(target) + if err != nil { + return err + } + if u.Scheme == "" { + if !strings.HasPrefix(target, "/") { + return fmt.Errorf("target must be an absolute URL or an absolute path: %q", target) + } + u.Scheme = wantScheme + u.Host = w.rws.req.Host + } else { + if u.Scheme != wantScheme { + return fmt.Errorf("cannot push URL with scheme %q from request with scheme %q", u.Scheme, wantScheme) + } + if u.Host == "" { + return errors.New("URL must have a host") + } + } + for k := range opts.Header { + if strings.HasPrefix(k, ":") { + return fmt.Errorf("promised request headers cannot include pseudo header %q", k) + } + // These headers are meaningful only if the request has a body, + // but PUSH_PROMISE requests cannot have a body. + // http://tools.ietf.org/html/rfc7540#section-8.2 + // Also disallow Host, since the promised URL must be absolute. + switch strings.ToLower(k) { + case "content-length", "content-encoding", "trailer", "te", "expect", "host": + return fmt.Errorf("promised request headers cannot include %q", k) + } + } + if err := checkValidHTTP2RequestHeaders(opts.Header); err != nil { + return err + } + + // The RFC effectively limits promised requests to GET and HEAD: + // "Promised requests MUST be cacheable [GET, HEAD, or POST], and MUST be safe [GET or HEAD]" + // http://tools.ietf.org/html/rfc7540#section-8.2 + if opts.Method != "GET" && opts.Method != "HEAD" { + return fmt.Errorf("method %q must be GET or HEAD", opts.Method) + } + + msg := startPushRequest{ + parent: st, + method: opts.Method, + url: u, + header: cloneHeader(opts.Header), + done: errChanPool.Get().(chan error), + } + + select { + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + case sc.wantStartPushCh <- msg: + } + + select { + case <-sc.doneServing: + return errClientDisconnected + case <-st.cw: + return errStreamClosed + case err := <-msg.done: + errChanPool.Put(msg.done) + return err + } +} + +type startPushRequest struct { + parent *stream + method string + url *url.URL + header http.Header + done chan error +} + +func (sc *serverConn) startPush(msg startPushRequest) { + sc.serveG.check() + + // http://tools.ietf.org/html/rfc7540#section-6.6. + // PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that + // is in either the "open" or "half-closed (remote)" state. + if msg.parent.state != stateOpen && msg.parent.state != stateHalfClosedRemote { + // responseWriter.Push checks that the stream is peer-initiaed. + msg.done <- errStreamClosed + return + } + + // http://tools.ietf.org/html/rfc7540#section-6.6. + if !sc.pushEnabled { + msg.done <- http.ErrNotSupported + return + } + + // PUSH_PROMISE frames must be sent in increasing order by stream ID, so + // we allocate an ID for the promised stream lazily, when the PUSH_PROMISE + // is written. Once the ID is allocated, we start the request handler. + allocatePromisedID := func() (uint32, error) { + sc.serveG.check() + + // Check this again, just in case. Technically, we might have received + // an updated SETTINGS by the time we got around to writing this frame. + if !sc.pushEnabled { + return 0, http.ErrNotSupported + } + // http://tools.ietf.org/html/rfc7540#section-6.5.2. + if sc.curPushedStreams+1 > sc.clientMaxStreams { + return 0, ErrPushLimitReached + } + + // http://tools.ietf.org/html/rfc7540#section-5.1.1. + // Streams initiated by the server MUST use even-numbered identifiers. + // A server that is unable to establish a new stream identifier can send a GOAWAY + // frame so that the client is forced to open a new connection for new streams. + if sc.maxPushPromiseID+2 >= 1<<31 { + sc.startGracefulShutdown() + return 0, ErrPushLimitReached + } + sc.maxPushPromiseID += 2 + promisedID := sc.maxPushPromiseID + + // http://tools.ietf.org/html/rfc7540#section-8.2. + // Strictly speaking, the new stream should start in "reserved (local)", then + // transition to "half closed (remote)" after sending the initial HEADERS, but + // we start in "half closed (remote)" for simplicity. + // See further comments at the definition of stateHalfClosedRemote. + promised := sc.newStream(promisedID, msg.parent.id, stateHalfClosedRemote) + rw, req, err := sc.newWriterAndRequestNoBody(promised, requestParam{ + method: msg.method, + scheme: msg.url.Scheme, + authority: msg.url.Host, + path: msg.url.RequestURI(), + header: msg.header, + }) + if err != nil { + // Should not happen, since we've already validated msg.url. + panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err)) + } + + go sc.runHandler(rw, req, sc.handler.ServeHTTP) + return promisedID, nil + } + + sc.writeFrame(FrameWriteRequest{ + write: &writePushPromise{ + streamID: msg.parent.id, + method: msg.method, + url: msg.url, + h: msg.header, + allocatePromisedID: allocatePromisedID, + }, + stream: msg.parent, + done: msg.done, + }) +} + // foreachHeaderElement splits v according to the "#rule" construction // in RFC 2616 section 2.1 and calls fn for each non-empty element. func foreachHeaderElement(v string, fn func(string)) { @@ -2234,16 +2607,16 @@ var connHeaders = []string{ "Upgrade", } -// checkValidHTTP2Request checks whether req is a valid HTTP/2 request, +// checkValidHTTP2RequestHeaders checks whether h is a valid HTTP/2 request, // per RFC 7540 Section 8.1.2.2. // The returned error is reported to users. -func checkValidHTTP2Request(req *http.Request) error { - for _, h := range connHeaders { - if _, ok := req.Header[h]; ok { - return fmt.Errorf("request header %q is not valid in HTTP/2", h) +func checkValidHTTP2RequestHeaders(h http.Header) error { + for _, k := range connHeaders { + if _, ok := h[k]; ok { + return fmt.Errorf("request header %q is not valid in HTTP/2", k) } } - te := req.Header["Te"] + te := h["Te"] if len(te) > 0 && (len(te) > 1 || (te[0] != "trailers" && te[0] != "")) { return errors.New(`request header "TE" may only be "trailers" in HTTP/2`) } @@ -2290,3 +2663,42 @@ var badTrailer = map[string]bool{ "Transfer-Encoding": true, "Www-Authenticate": true, } + +// h1ServerShutdownChan returns a channel that will be closed when the +// provided *http.Server wants to shut down. +// +// This is a somewhat hacky way to get at http1 innards. It works +// when the http2 code is bundled into the net/http package in the +// standard library. The alternatives ended up making the cmd/go tool +// depend on http Servers. This is the lightest option for now. +// This is tested via the TestServeShutdown* tests in net/http. +func h1ServerShutdownChan(hs *http.Server) <-chan struct{} { + if fn := testh1ServerShutdownChan; fn != nil { + return fn(hs) + } + var x interface{} = hs + type I interface { + getDoneChan() <-chan struct{} + } + if hs, ok := x.(I); ok { + return hs.getDoneChan() + } + return nil +} + +// optional test hook for h1ServerShutdownChan. +var testh1ServerShutdownChan func(hs *http.Server) <-chan struct{} + +// h1ServerKeepAlivesDisabled reports whether hs has its keep-alives +// disabled. See comments on h1ServerShutdownChan above for why +// the code is written this way. +func h1ServerKeepAlivesDisabled(hs *http.Server) bool { + var x interface{} = hs + type I interface { + doKeepAlives() bool + } + if hs, ok := x.(I); ok { + return !hs.doKeepAlives() + } + return false +} diff --git a/vendor/golang.org/x/net/http2/server_push_test.go b/vendor/golang.org/x/net/http2/server_push_test.go new file mode 100644 index 000000000..3fea20870 --- /dev/null +++ b/vendor/golang.org/x/net/http2/server_push_test.go @@ -0,0 +1,470 @@ +// 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 go1.8 + +package http2 + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "reflect" + "strconv" + "sync" + "testing" + "time" +) + +func TestServer_Push_Success(t *testing.T) { + const ( + mainBody = "<html>index page</html>" + pushedBody = "<html>pushed page</html>" + userAgent = "testagent" + cookie = "testcookie" + ) + + var stURL string + checkPromisedReq := func(r *http.Request, wantMethod string, wantH http.Header) error { + if got, want := r.Method, wantMethod; got != want { + return fmt.Errorf("promised Req.Method=%q, want %q", got, want) + } + if got, want := r.Header, wantH; !reflect.DeepEqual(got, want) { + return fmt.Errorf("promised Req.Header=%q, want %q", got, want) + } + if got, want := "https://"+r.Host, stURL; got != want { + return fmt.Errorf("promised Req.Host=%q, want %q", got, want) + } + if r.Body == nil { + return fmt.Errorf("nil Body") + } + if buf, err := ioutil.ReadAll(r.Body); err != nil || len(buf) != 0 { + return fmt.Errorf("ReadAll(Body)=%q,%v, want '',nil", buf, err) + } + return nil + } + + errc := make(chan error, 3) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + switch r.URL.RequestURI() { + case "/": + // Push "/pushed?get" as a GET request, using an absolute URL. + opt := &http.PushOptions{ + Header: http.Header{ + "User-Agent": {userAgent}, + }, + } + if err := w.(http.Pusher).Push(stURL+"/pushed?get", opt); err != nil { + errc <- fmt.Errorf("error pushing /pushed?get: %v", err) + return + } + // Push "/pushed?head" as a HEAD request, using a path. + opt = &http.PushOptions{ + Method: "HEAD", + Header: http.Header{ + "User-Agent": {userAgent}, + "Cookie": {cookie}, + }, + } + if err := w.(http.Pusher).Push("/pushed?head", opt); err != nil { + errc <- fmt.Errorf("error pushing /pushed?head: %v", err) + return + } + w.Header().Set("Content-Type", "text/html") + w.Header().Set("Content-Length", strconv.Itoa(len(mainBody))) + w.WriteHeader(200) + io.WriteString(w, mainBody) + errc <- nil + + case "/pushed?get": + wantH := http.Header{} + wantH.Set("User-Agent", userAgent) + if err := checkPromisedReq(r, "GET", wantH); err != nil { + errc <- fmt.Errorf("/pushed?get: %v", err) + return + } + w.Header().Set("Content-Type", "text/html") + w.Header().Set("Content-Length", strconv.Itoa(len(pushedBody))) + w.WriteHeader(200) + io.WriteString(w, pushedBody) + errc <- nil + + case "/pushed?head": + wantH := http.Header{} + wantH.Set("User-Agent", userAgent) + wantH.Set("Cookie", cookie) + if err := checkPromisedReq(r, "HEAD", wantH); err != nil { + errc <- fmt.Errorf("/pushed?head: %v", err) + return + } + w.WriteHeader(204) + errc <- nil + + default: + errc <- fmt.Errorf("unknown RequestURL %q", r.URL.RequestURI()) + } + }) + stURL = st.ts.URL + + // Send one request, which should push two responses. + st.greet() + getSlash(st) + for k := 0; k < 3; k++ { + select { + case <-time.After(2 * time.Second): + t.Errorf("timeout waiting for handler %d to finish", k) + case err := <-errc: + if err != nil { + t.Fatal(err) + } + } + } + + checkPushPromise := func(f Frame, promiseID uint32, wantH [][2]string) error { + pp, ok := f.(*PushPromiseFrame) + if !ok { + return fmt.Errorf("got a %T; want *PushPromiseFrame", f) + } + if !pp.HeadersEnded() { + return fmt.Errorf("want END_HEADERS flag in PushPromiseFrame") + } + if got, want := pp.PromiseID, promiseID; got != want { + return fmt.Errorf("got PromiseID %v; want %v", got, want) + } + gotH := st.decodeHeader(pp.HeaderBlockFragment()) + if !reflect.DeepEqual(gotH, wantH) { + return fmt.Errorf("got promised headers %v; want %v", gotH, wantH) + } + return nil + } + checkHeaders := func(f Frame, wantH [][2]string) error { + hf, ok := f.(*HeadersFrame) + if !ok { + return fmt.Errorf("got a %T; want *HeadersFrame", f) + } + gotH := st.decodeHeader(hf.HeaderBlockFragment()) + if !reflect.DeepEqual(gotH, wantH) { + return fmt.Errorf("got response headers %v; want %v", gotH, wantH) + } + return nil + } + checkData := func(f Frame, wantData string) error { + df, ok := f.(*DataFrame) + if !ok { + return fmt.Errorf("got a %T; want *DataFrame", f) + } + if gotData := string(df.Data()); gotData != wantData { + return fmt.Errorf("got response data %q; want %q", gotData, wantData) + } + return nil + } + + // Stream 1 has 2 PUSH_PROMISE + HEADERS + DATA + // Stream 2 has HEADERS + DATA + // Stream 4 has HEADERS + expected := map[uint32][]func(Frame) error{ + 1: { + func(f Frame) error { + return checkPushPromise(f, 2, [][2]string{ + {":method", "GET"}, + {":scheme", "https"}, + {":authority", st.ts.Listener.Addr().String()}, + {":path", "/pushed?get"}, + {"user-agent", userAgent}, + }) + }, + func(f Frame) error { + return checkPushPromise(f, 4, [][2]string{ + {":method", "HEAD"}, + {":scheme", "https"}, + {":authority", st.ts.Listener.Addr().String()}, + {":path", "/pushed?head"}, + {"cookie", cookie}, + {"user-agent", userAgent}, + }) + }, + func(f Frame) error { + return checkHeaders(f, [][2]string{ + {":status", "200"}, + {"content-type", "text/html"}, + {"content-length", strconv.Itoa(len(mainBody))}, + }) + }, + func(f Frame) error { + return checkData(f, mainBody) + }, + }, + 2: { + func(f Frame) error { + return checkHeaders(f, [][2]string{ + {":status", "200"}, + {"content-type", "text/html"}, + {"content-length", strconv.Itoa(len(pushedBody))}, + }) + }, + func(f Frame) error { + return checkData(f, pushedBody) + }, + }, + 4: { + func(f Frame) error { + return checkHeaders(f, [][2]string{ + {":status", "204"}, + }) + }, + }, + } + + consumed := map[uint32]int{} + for k := 0; len(expected) > 0; k++ { + f, err := st.readFrame() + if err != nil { + for id, left := range expected { + t.Errorf("stream %d: missing %d frames", id, len(left)) + } + t.Fatalf("readFrame %d: %v", k, err) + } + id := f.Header().StreamID + label := fmt.Sprintf("stream %d, frame %d", id, consumed[id]) + if len(expected[id]) == 0 { + t.Fatalf("%s: unexpected frame %#+v", label, f) + } + check := expected[id][0] + expected[id] = expected[id][1:] + if len(expected[id]) == 0 { + delete(expected, id) + } + if err := check(f); err != nil { + t.Fatalf("%s: %v", label, err) + } + consumed[id]++ + } +} + +func TestServer_Push_RejectRecursivePush(t *testing.T) { + // Expect two requests, but might get three if there's a bug and the second push succeeds. + errc := make(chan error, 3) + handler := func(w http.ResponseWriter, r *http.Request) error { + baseURL := "https://" + r.Host + switch r.URL.Path { + case "/": + if err := w.(http.Pusher).Push(baseURL+"/push1", nil); err != nil { + return fmt.Errorf("first Push()=%v, want nil", err) + } + return nil + + case "/push1": + if got, want := w.(http.Pusher).Push(baseURL+"/push2", nil), ErrRecursivePush; got != want { + return fmt.Errorf("Push()=%v, want %v", got, want) + } + return nil + + default: + return fmt.Errorf("unexpected path: %q", r.URL.Path) + } + } + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + errc <- handler(w, r) + }) + defer st.Close() + st.greet() + getSlash(st) + if err := <-errc; err != nil { + t.Errorf("First request failed: %v", err) + } + if err := <-errc; err != nil { + t.Errorf("Second request failed: %v", err) + } +} + +func testServer_Push_RejectSingleRequest(t *testing.T, doPush func(http.Pusher, *http.Request) error, settings ...Setting) { + // Expect one request, but might get two if there's a bug and the push succeeds. + errc := make(chan error, 2) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + errc <- doPush(w.(http.Pusher), r) + }) + defer st.Close() + st.greet() + if err := st.fr.WriteSettings(settings...); err != nil { + st.t.Fatalf("WriteSettings: %v", err) + } + st.wantSettingsAck() + getSlash(st) + if err := <-errc; err != nil { + t.Error(err) + } + // Should not get a PUSH_PROMISE frame. + hf := st.wantHeaders() + if !hf.StreamEnded() { + t.Error("stream should end after headers") + } +} + +func TestServer_Push_RejectIfDisabled(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if got, want := p.Push("https://"+r.Host+"/pushed", nil), http.ErrNotSupported; got != want { + return fmt.Errorf("Push()=%v, want %v", got, want) + } + return nil + }, + Setting{SettingEnablePush, 0}) +} + +func TestServer_Push_RejectWhenNoConcurrentStreams(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if got, want := p.Push("https://"+r.Host+"/pushed", nil), ErrPushLimitReached; got != want { + return fmt.Errorf("Push()=%v, want %v", got, want) + } + return nil + }, + Setting{SettingMaxConcurrentStreams, 0}) +} + +func TestServer_Push_RejectWrongScheme(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("http://"+r.Host+"/pushed", nil); err == nil { + return errors.New("Push() should have failed (push target URL is http)") + } + return nil + }) +} + +func TestServer_Push_RejectMissingHost(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("https:pushed", nil); err == nil { + return errors.New("Push() should have failed (push target URL missing host)") + } + return nil + }) +} + +func TestServer_Push_RejectRelativePath(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("../test", nil); err == nil { + return errors.New("Push() should have failed (push target is a relative path)") + } + return nil + }) +} + +func TestServer_Push_RejectForbiddenMethod(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + if err := p.Push("https://"+r.Host+"/pushed", &http.PushOptions{Method: "POST"}); err == nil { + return errors.New("Push() should have failed (cannot promise a POST)") + } + return nil + }) +} + +func TestServer_Push_RejectForbiddenHeader(t *testing.T) { + testServer_Push_RejectSingleRequest(t, + func(p http.Pusher, r *http.Request) error { + header := http.Header{ + "Content-Length": {"10"}, + "Content-Encoding": {"gzip"}, + "Trailer": {"Foo"}, + "Te": {"trailers"}, + "Host": {"test.com"}, + ":authority": {"test.com"}, + } + if err := p.Push("https://"+r.Host+"/pushed", &http.PushOptions{Header: header}); err == nil { + return errors.New("Push() should have failed (forbidden headers)") + } + return nil + }) +} + +func TestServer_Push_StateTransitions(t *testing.T) { + const body = "foo" + + startedPromise := make(chan bool) + finishedPush := make(chan bool) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + switch r.URL.RequestURI() { + case "/": + if err := w.(http.Pusher).Push("/pushed", nil); err != nil { + t.Errorf("Push error: %v", err) + } + close(startedPromise) + // Don't finish this request until the push finishes so we don't + // nondeterministically interleave output frames with the push. + <-finishedPush + } + w.Header().Set("Content-Type", "text/html") + w.Header().Set("Content-Length", strconv.Itoa(len(body))) + w.WriteHeader(200) + io.WriteString(w, body) + }) + defer st.Close() + + st.greet() + if st.stream(2) != nil { + t.Fatal("stream 2 should be empty") + } + if got, want := st.streamState(2), stateIdle; got != want { + t.Fatalf("streamState(2)=%v, want %v", got, want) + } + getSlash(st) + <-startedPromise + if got, want := st.streamState(2), stateHalfClosedRemote; got != want { + t.Fatalf("streamState(2)=%v, want %v", got, want) + } + st.wantPushPromise() + st.wantHeaders() + if df := st.wantData(); !df.StreamEnded() { + t.Fatal("expected END_STREAM flag on DATA") + } + if got, want := st.streamState(2), stateClosed; got != want { + t.Fatalf("streamState(2)=%v, want %v", got, want) + } + close(finishedPush) +} + +func TestServer_Push_RejectAfterGoAway(t *testing.T) { + var readyOnce sync.Once + ready := make(chan struct{}) + errc := make(chan error, 2) + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + select { + case <-ready: + case <-time.After(5 * time.Second): + errc <- fmt.Errorf("timeout waiting for GOAWAY to be processed") + } + if got, want := w.(http.Pusher).Push("https://"+r.Host+"/pushed", nil), http.ErrNotSupported; got != want { + errc <- fmt.Errorf("Push()=%v, want %v", got, want) + } + errc <- nil + }) + defer st.Close() + st.greet() + getSlash(st) + + // Send GOAWAY and wait for it to be processed. + st.fr.WriteGoAway(1, ErrCodeNo, nil) + go func() { + for { + select { + case <-ready: + return + default: + } + st.sc.testHookCh <- func(loopNum int) { + if !st.sc.pushEnabled { + readyOnce.Do(func() { close(ready) }) + } + } + } + }() + if err := <-errc; err != nil { + t.Error(err) + } +} diff --git a/vendor/golang.org/x/net/http2/server_test.go b/vendor/golang.org/x/net/http2/server_test.go index 879e82135..2e6146b67 100644 --- a/vendor/golang.org/x/net/http2/server_test.go +++ b/vendor/golang.org/x/net/http2/server_test.go @@ -80,18 +80,19 @@ func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{} tlsConfig := &tls.Config{ InsecureSkipVerify: true, - // The h2-14 is temporary, until curl is updated. (as used by unit tests - // in Docker) - NextProtos: []string{NextProtoTLS, "h2-14"}, + NextProtos: []string{NextProtoTLS}, } var onlyServer, quiet bool + h2server := new(Server) for _, opt := range opts { switch v := opt.(type) { case func(*tls.Config): v(tlsConfig) case func(*httptest.Server): v(ts) + case func(*Server): + v(h2server) case serverTesterOpt: switch v { case optOnlyServer: @@ -106,7 +107,7 @@ func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{} } } - ConfigureServer(ts.Config, &Server{}) + ConfigureServer(ts.Config, h2server) st := &serverTester{ t: t, @@ -253,6 +254,12 @@ func (st *serverTester) writeHeaders(p HeadersFrameParam) { } } +func (st *serverTester) writePriority(id uint32, p PriorityParam) { + if err := st.fr.WritePriority(id, p); err != nil { + st.t.Fatalf("Error writing PRIORITY: %v", err) + } +} + func (st *serverTester) encodeHeaderField(k, v string) { err := st.hpackEnc.WriteField(hpack.HeaderField{Name: k, Value: v}) if err != nil { @@ -278,37 +285,42 @@ func (st *serverTester) encodeHeaderRaw(headers ...string) []byte { // encodeHeader encodes headers and returns their HPACK bytes. headers // must contain an even number of key/value pairs. There may be // multiple pairs for keys (e.g. "cookie"). The :method, :path, and -// :scheme headers default to GET, / and https. +// :scheme headers default to GET, / and https. The :authority header +// defaults to st.ts.Listener.Addr(). func (st *serverTester) encodeHeader(headers ...string) []byte { if len(headers)%2 == 1 { panic("odd number of kv args") } st.headerBuf.Reset() + defaultAuthority := st.ts.Listener.Addr().String() if len(headers) == 0 { // Fast path, mostly for benchmarks, so test code doesn't pollute // profiles when we're looking to improve server allocations. st.encodeHeaderField(":method", "GET") - st.encodeHeaderField(":path", "/") st.encodeHeaderField(":scheme", "https") + st.encodeHeaderField(":authority", defaultAuthority) + st.encodeHeaderField(":path", "/") return st.headerBuf.Bytes() } if len(headers) == 2 && headers[0] == ":method" { // Another fast path for benchmarks. st.encodeHeaderField(":method", headers[1]) - st.encodeHeaderField(":path", "/") st.encodeHeaderField(":scheme", "https") + st.encodeHeaderField(":authority", defaultAuthority) + st.encodeHeaderField(":path", "/") return st.headerBuf.Bytes() } pseudoCount := map[string]int{} - keys := []string{":method", ":path", ":scheme"} + keys := []string{":method", ":scheme", ":authority", ":path"} vals := map[string][]string{ - ":method": {"GET"}, - ":path": {"/"}, - ":scheme": {"https"}, + ":method": {"GET"}, + ":scheme": {"https"}, + ":authority": {defaultAuthority}, + ":path": {"/"}, } for len(headers) > 0 { k, v := headers[0], headers[1] @@ -503,7 +515,18 @@ func (st *serverTester) wantSettingsAck() { if !sf.Header().Flags.Has(FlagSettingsAck) { st.t.Fatal("Settings Frame didn't have ACK set") } +} +func (st *serverTester) wantPushPromise() *PushPromiseFrame { + f, err := st.readFrame() + if err != nil { + st.t.Fatal(err) + } + ppf, ok := f.(*PushPromiseFrame) + if !ok { + st.t.Fatalf("Wanted PushPromise, received %T", ppf) + } + return ppf } func TestServer(t *testing.T) { @@ -758,7 +781,7 @@ func TestServer_Request_Get_Host(t *testing.T) { testServerRequest(t, func(st *serverTester) { st.writeHeaders(HeadersFrameParam{ StreamID: 1, // clients send odd numbers - BlockFragment: st.encodeHeader("host", host), + BlockFragment: st.encodeHeader(":authority", "", "host", host), EndStream: true, EndHeaders: true, }) @@ -937,7 +960,7 @@ func TestServer_Request_Reject_Pseudo_Unknown(t *testing.T) { func testRejectRequest(t *testing.T, send func(*serverTester)) { st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { - t.Fatal("server request made it to handler; should've been rejected") + t.Error("server request made it to handler; should've been rejected") }) defer st.Close() @@ -946,6 +969,39 @@ func testRejectRequest(t *testing.T, send func(*serverTester)) { st.wantRSTStream(1, ErrCodeProtocol) } +func testRejectRequestWithProtocolError(t *testing.T, send func(*serverTester)) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + t.Error("server request made it to handler; should've been rejected") + }, optQuiet) + defer st.Close() + + st.greet() + send(st) + gf := st.wantGoAway() + if gf.ErrCode != ErrCodeProtocol { + t.Errorf("err code = %v; want %v", gf.ErrCode, ErrCodeProtocol) + } +} + +// Section 5.1, on idle connections: "Receiving any frame other than +// HEADERS or PRIORITY on a stream in this state MUST be treated as a +// connection error (Section 5.4.1) of type PROTOCOL_ERROR." +func TestRejectFrameOnIdle_WindowUpdate(t *testing.T) { + testRejectRequestWithProtocolError(t, func(st *serverTester) { + st.fr.WriteWindowUpdate(123, 456) + }) +} +func TestRejectFrameOnIdle_Data(t *testing.T) { + testRejectRequestWithProtocolError(t, func(st *serverTester) { + st.fr.WriteData(123, true, nil) + }) +} +func TestRejectFrameOnIdle_RSTStream(t *testing.T) { + testRejectRequestWithProtocolError(t, func(st *serverTester) { + st.fr.WriteRSTStream(123, ErrCodeCancel) + }) +} + func TestServer_Request_Connect(t *testing.T) { testServerRequest(t, func(st *serverTester) { st.writeHeaders(HeadersFrameParam{ @@ -1445,6 +1501,36 @@ func TestServer_Rejects_Continuation0(t *testing.T) { }) } +// No PRIORITY on stream 0. +func TestServer_Rejects_Priority0(t *testing.T) { + testServerRejectsConn(t, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writePriority(0, PriorityParam{StreamDep: 1}) + }) +} + +// No HEADERS frame with a self-dependence. +func TestServer_Rejects_HeadersSelfDependence(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writeHeaders(HeadersFrameParam{ + StreamID: 1, + BlockFragment: st.encodeHeader(), + EndStream: true, + EndHeaders: true, + Priority: PriorityParam{StreamDep: 1}, + }) + }) +} + +// No PRIORTY frame with a self-dependence. +func TestServer_Rejects_PrioritySelfDependence(t *testing.T) { + testServerRejectsStream(t, ErrCodeProtocol, func(st *serverTester) { + st.fr.AllowIllegalWrites = true + st.writePriority(1, PriorityParam{StreamDep: 1}) + }) +} + func TestServer_Rejects_PushPromise(t *testing.T) { testServerRejectsConn(t, func(st *serverTester) { pp := PushPromiseParam{ @@ -2840,6 +2926,12 @@ func BenchmarkServerPosts(b *testing.B) { const msg = "Hello, world" st := newServerTester(b, func(w http.ResponseWriter, r *http.Request) { + // Consume the (empty) body from th peer before replying, otherwise + // the server will sometimes (depending on scheduling) send the peer a + // a RST_STREAM with the CANCEL error code. + if n, err := io.Copy(ioutil.Discard, r.Body); n != 0 || err != nil { + b.Errorf("Copy error; got %v, %v; want 0, nil", n, err) + } io.WriteString(w, msg) }) defer st.Close() @@ -3236,40 +3328,40 @@ func (he *hpackEncoder) encodeHeaderRaw(t *testing.T, headers ...string) []byte func TestCheckValidHTTP2Request(t *testing.T) { tests := []struct { - req *http.Request + h http.Header want error }{ { - req: &http.Request{Header: http.Header{"Te": {"trailers"}}}, + h: http.Header{"Te": {"trailers"}}, want: nil, }, { - req: &http.Request{Header: http.Header{"Te": {"trailers", "bogus"}}}, + h: http.Header{"Te": {"trailers", "bogus"}}, want: errors.New(`request header "TE" may only be "trailers" in HTTP/2`), }, { - req: &http.Request{Header: http.Header{"Foo": {""}}}, + h: http.Header{"Foo": {""}}, want: nil, }, { - req: &http.Request{Header: http.Header{"Connection": {""}}}, + h: http.Header{"Connection": {""}}, want: errors.New(`request header "Connection" is not valid in HTTP/2`), }, { - req: &http.Request{Header: http.Header{"Proxy-Connection": {""}}}, + h: http.Header{"Proxy-Connection": {""}}, want: errors.New(`request header "Proxy-Connection" is not valid in HTTP/2`), }, { - req: &http.Request{Header: http.Header{"Keep-Alive": {""}}}, + h: http.Header{"Keep-Alive": {""}}, want: errors.New(`request header "Keep-Alive" is not valid in HTTP/2`), }, { - req: &http.Request{Header: http.Header{"Upgrade": {""}}}, + h: http.Header{"Upgrade": {""}}, want: errors.New(`request header "Upgrade" is not valid in HTTP/2`), }, } for i, tt := range tests { - got := checkValidHTTP2Request(tt.req) + got := checkValidHTTP2RequestHeaders(tt.h) if !reflect.DeepEqual(got, tt.want) { t.Errorf("%d. checkValidHTTP2Request = %v; want %v", i, got, tt.want) } @@ -3366,3 +3458,118 @@ func TestUnreadFlowControlReturned_Server(t *testing.T) { } } + +func TestServerIdleTimeout(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + }, func(h2s *Server) { + h2s.IdleTimeout = 500 * time.Millisecond + }) + defer st.Close() + + st.greet() + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeNo { + t.Errorf("GOAWAY error = %v; want ErrCodeNo", ga.ErrCode) + } +} + +func TestServerIdleTimeout_AfterRequest(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + const timeout = 250 * time.Millisecond + + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + time.Sleep(timeout * 2) + }, func(h2s *Server) { + h2s.IdleTimeout = timeout + }) + defer st.Close() + + st.greet() + + // Send a request which takes twice the timeout. Verifies the + // idle timeout doesn't fire while we're in a request: + st.bodylessReq1() + st.wantHeaders() + + // But the idle timeout should be rearmed after the request + // is done: + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeNo { + t.Errorf("GOAWAY error = %v; want ErrCodeNo", ga.ErrCode) + } +} + +// grpc-go closes the Request.Body currently with a Read. +// Verify that it doesn't race. +// See https://github.com/grpc/grpc-go/pull/938 +func TestRequestBodyReadCloseRace(t *testing.T) { + for i := 0; i < 100; i++ { + body := &requestBody{ + pipe: &pipe{ + b: new(bytes.Buffer), + }, + } + body.pipe.CloseWithError(io.EOF) + + done := make(chan bool, 1) + buf := make([]byte, 10) + go func() { + time.Sleep(1 * time.Millisecond) + body.Close() + done <- true + }() + body.Read(buf) + <-done + } +} + +func TestServerGracefulShutdown(t *testing.T) { + shutdownCh := make(chan struct{}) + defer func() { testh1ServerShutdownChan = nil }() + testh1ServerShutdownChan = func(*http.Server) <-chan struct{} { return shutdownCh } + + var st *serverTester + handlerDone := make(chan struct{}) + st = newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + defer close(handlerDone) + close(shutdownCh) + + ga := st.wantGoAway() + if ga.ErrCode != ErrCodeNo { + t.Errorf("GOAWAY error = %v; want ErrCodeNo", ga.ErrCode) + } + if ga.LastStreamID != 1 { + t.Errorf("GOAWAY LastStreamID = %v; want 1", ga.LastStreamID) + } + + w.Header().Set("x-foo", "bar") + }) + defer st.Close() + + st.greet() + st.bodylessReq1() + + <-handlerDone + hf := st.wantHeaders() + goth := st.decodeHeader(hf.HeaderBlockFragment()) + wanth := [][2]string{ + {":status", "200"}, + {"x-foo", "bar"}, + {"content-type", "text/plain; charset=utf-8"}, + {"content-length", "0"}, + } + if !reflect.DeepEqual(goth, wanth) { + t.Errorf("Got headers %v; want %v", goth, wanth) + } + + n, err := st.cc.Read([]byte{0}) + if n != 0 || err == nil { + t.Errorf("Read = %v, %v; want 0, non-nil", n, err) + } +} diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 42c73bd1e..8f5f84412 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -10,6 +10,7 @@ import ( "bufio" "bytes" "compress/gzip" + "crypto/rand" "crypto/tls" "errors" "fmt" @@ -150,6 +151,9 @@ type ClientConn struct { readerDone chan struct{} // closed on error readerErr error // set before readerDone is closed + idleTimeout time.Duration // or 0 for never + idleTimer *time.Timer + mu sync.Mutex // guards following cond *sync.Cond // hold mu; broadcast on flow/closed changes flow flow // our conn-level flow control quota (cs.flow is per stream) @@ -160,6 +164,7 @@ type ClientConn struct { goAwayDebug string // goAway frame's debug data, retained as a string streams map[uint32]*clientStream // client-initiated nextStreamID uint32 + pings map[[8]byte]chan struct{} // in flight ping data to notification channel bw *bufio.Writer br *bufio.Reader fr *Framer @@ -194,6 +199,7 @@ type clientStream struct { bytesRemain int64 // -1 means unknown; owned by transportResponseBody.Read readErr error // sticky read error; owned by transportResponseBody.Read stopReqBody error // if non-nil, stop writing req body; guarded by cc.mu + didReset bool // whether we sent a RST_STREAM to the server; guarded by cc.mu peerReset chan struct{} // closed on peer reset resetErr error // populated before peerReset is closed @@ -221,15 +227,26 @@ func (cs *clientStream) awaitRequestCancel(req *http.Request) { } select { case <-req.Cancel: + cs.cancelStream() cs.bufPipe.CloseWithError(errRequestCanceled) - cs.cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) case <-ctx.Done(): + cs.cancelStream() cs.bufPipe.CloseWithError(ctx.Err()) - cs.cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) case <-cs.done: } } +func (cs *clientStream) cancelStream() { + cs.cc.mu.Lock() + didReset := cs.didReset + cs.didReset = true + cs.cc.mu.Unlock() + + if !didReset { + cs.cc.writeStreamReset(cs.ID, ErrCodeCancel, nil) + } +} + // checkResetOrDone reports any error sent in a RST_STREAM frame by the // server, or errStreamClosed if the stream is complete. func (cs *clientStream) checkResetOrDone() error { @@ -431,6 +448,11 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro streams: make(map[uint32]*clientStream), singleUse: singleUse, wantSettingsAck: true, + pings: make(map[[8]byte]chan struct{}), + } + if d := t.idleConnTimeout(); d != 0 { + cc.idleTimeout = d + cc.idleTimer = time.AfterFunc(d, cc.onIdleTimeout) } if VerboseLogs { t.vlogf("http2: Transport creating client conn %p to %v", cc, c.RemoteAddr()) @@ -508,6 +530,16 @@ func (cc *ClientConn) canTakeNewRequestLocked() bool { cc.nextStreamID < math.MaxInt32 } +// onIdleTimeout is called from a time.AfterFunc goroutine. It will +// only be called when we're idle, but because we're coming from a new +// goroutine, there could be a new request coming in at the same time, +// so this simply calls the synchronized closeIfIdle to shut down this +// connection. The timer could just call closeIfIdle, but this is more +// clear. +func (cc *ClientConn) onIdleTimeout() { + cc.closeIfIdle() +} + func (cc *ClientConn) closeIfIdle() { cc.mu.Lock() if len(cc.streams) > 0 { @@ -604,51 +636,37 @@ func (cc *ClientConn) responseHeaderTimeout() time.Duration { // Certain headers are special-cased as okay but not transmitted later. func checkConnHeaders(req *http.Request) error { if v := req.Header.Get("Upgrade"); v != "" { - return errors.New("http2: invalid Upgrade request header") + return fmt.Errorf("http2: invalid Upgrade request header: %q", req.Header["Upgrade"]) } - if v := req.Header.Get("Transfer-Encoding"); (v != "" && v != "chunked") || len(req.Header["Transfer-Encoding"]) > 1 { - return errors.New("http2: invalid Transfer-Encoding request header") + if vv := req.Header["Transfer-Encoding"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "chunked") { + return fmt.Errorf("http2: invalid Transfer-Encoding request header: %q", vv) } - if v := req.Header.Get("Connection"); (v != "" && v != "close" && v != "keep-alive") || len(req.Header["Connection"]) > 1 { - return errors.New("http2: invalid Connection request header") + if vv := req.Header["Connection"]; len(vv) > 0 && (len(vv) > 1 || vv[0] != "" && vv[0] != "close" && vv[0] != "keep-alive") { + return fmt.Errorf("http2: invalid Connection request header: %q", vv) } return nil } -func bodyAndLength(req *http.Request) (body io.Reader, contentLen int64) { - body = req.Body - if body == nil { - return nil, 0 +// actualContentLength returns a sanitized version of +// req.ContentLength, where 0 actually means zero (not unknown) and -1 +// means unknown. +func actualContentLength(req *http.Request) int64 { + if req.Body == nil { + return 0 } if req.ContentLength != 0 { - return req.Body, req.ContentLength - } - - // We have a body but a zero content length. Test to see if - // it's actually zero or just unset. - var buf [1]byte - n, rerr := body.Read(buf[:]) - if rerr != nil && rerr != io.EOF { - return errorReader{rerr}, -1 + return req.ContentLength } - if n == 1 { - // Oh, guess there is data in this Body Reader after all. - // The ContentLength field just wasn't set. - // Stitch the Body back together again, re-attaching our - // consumed byte. - if rerr == io.EOF { - return bytes.NewReader(buf[:]), 1 - } - return io.MultiReader(bytes.NewReader(buf[:]), body), -1 - } - // Body is actually zero bytes. - return nil, 0 + return -1 } func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { if err := checkConnHeaders(req); err != nil { return nil, err } + if cc.idleTimer != nil { + cc.idleTimer.Stop() + } trailers, err := commaSeparatedTrailers(req) if err != nil { @@ -663,8 +681,9 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { return nil, errClientConnUnusable } - body, contentLen := bodyAndLength(req) + body := req.Body hasBody := body != nil + contentLen := actualContentLength(req) // TODO(bradfitz): this is a copy of the logic in net/http. Unify somewhere? var requestedGzip bool @@ -1046,7 +1065,7 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail cc.writeHeader(":method", req.Method) if req.Method != "CONNECT" { cc.writeHeader(":path", path) - cc.writeHeader(":scheme", "https") + cc.writeHeader(":scheme", req.URL.Scheme) } if trailers != "" { cc.writeHeader("trailer", trailers) @@ -1173,6 +1192,9 @@ func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream { if andRemove && cs != nil && !cc.closed { cc.lastActive = time.Now() delete(cc.streams, id) + if len(cc.streams) == 0 && cc.idleTimer != nil { + cc.idleTimer.Reset(cc.idleTimeout) + } close(cs.done) cc.cond.Broadcast() // wake up checkResetOrDone via clientStream.awaitFlowControl } @@ -1229,6 +1251,10 @@ func (rl *clientConnReadLoop) cleanup() { defer cc.t.connPool().MarkDead(cc) defer close(cc.readerDone) + if cc.idleTimer != nil { + cc.idleTimer.Stop() + } + // Close any response bodies if the server closes prematurely. // TODO: also do this if we've written the headers but not // gotten a response yet. @@ -1652,9 +1678,10 @@ func (rl *clientConnReadLoop) processData(f *DataFrame) error { cc.bw.Flush() cc.wmu.Unlock() } + didReset := cs.didReset cc.mu.Unlock() - if len(data) > 0 { + if len(data) > 0 && !didReset { if _, err := cs.bufPipe.Write(data); err != nil { rl.endStreamError(cs, err) return err @@ -1815,10 +1842,56 @@ func (rl *clientConnReadLoop) processResetStream(f *RSTStreamFrame) error { return nil } +// Ping sends a PING frame to the server and waits for the ack. +// Public implementation is in go17.go and not_go17.go +func (cc *ClientConn) ping(ctx contextContext) error { + c := make(chan struct{}) + // Generate a random payload + var p [8]byte + for { + if _, err := rand.Read(p[:]); err != nil { + return err + } + cc.mu.Lock() + // check for dup before insert + if _, found := cc.pings[p]; !found { + cc.pings[p] = c + cc.mu.Unlock() + break + } + cc.mu.Unlock() + } + cc.wmu.Lock() + if err := cc.fr.WritePing(false, p); err != nil { + cc.wmu.Unlock() + return err + } + if err := cc.bw.Flush(); err != nil { + cc.wmu.Unlock() + return err + } + cc.wmu.Unlock() + select { + case <-c: + return nil + case <-ctx.Done(): + return ctx.Err() + case <-cc.readerDone: + // connection closed + return cc.readerErr + } +} + func (rl *clientConnReadLoop) processPing(f *PingFrame) error { if f.IsAck() { - // 6.7 PING: " An endpoint MUST NOT respond to PING frames - // containing this flag." + cc := rl.cc + cc.mu.Lock() + defer cc.mu.Unlock() + // If ack, notify listener if any + if c, ok := cc.pings[f.Data]; ok { + close(c) + delete(cc.pings, f.Data) + } return nil } cc := rl.cc diff --git a/vendor/golang.org/x/net/http2/transport_test.go b/vendor/golang.org/x/net/http2/transport_test.go index 96d0a0867..f9287e575 100644 --- a/vendor/golang.org/x/net/http2/transport_test.go +++ b/vendor/golang.org/x/net/http2/transport_test.go @@ -39,6 +39,13 @@ var ( var tlsConfigInsecure = &tls.Config{InsecureSkipVerify: true} +type testContext struct{} + +func (testContext) Done() <-chan struct{} { return make(chan struct{}) } +func (testContext) Err() error { panic("should not be called") } +func (testContext) Deadline() (deadline time.Time, ok bool) { return time.Time{}, false } +func (testContext) Value(key interface{}) interface{} { return nil } + func TestTransportExternal(t *testing.T) { if !*extNet { t.Skip("skipping external network test") @@ -52,6 +59,16 @@ func TestTransportExternal(t *testing.T) { res.Write(os.Stdout) } +type fakeTLSConn struct { + net.Conn +} + +func (c *fakeTLSConn) ConnectionState() tls.ConnectionState { + return tls.ConnectionState{ + Version: tls.VersionTLS12, + } +} + func startH2cServer(t *testing.T) net.Listener { h2Server := &Server{} l := newLocalListener(t) @@ -61,8 +78,8 @@ func startH2cServer(t *testing.T) net.Listener { t.Error(err) return } - h2Server.ServeConn(conn, &ServeConnOpts{Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hello, %v", r.URL.Path) + h2Server.ServeConn(&fakeTLSConn{conn}, &ServeConnOpts{Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello, %v, http: %v", r.URL.Path, r.TLS == nil) })}) }() return l @@ -92,7 +109,7 @@ func TestTransportH2c(t *testing.T) { if err != nil { t.Fatal(err) } - if got, want := string(body), "Hello, /foobar"; got != want { + if got, want := string(body), "Hello, /foobar, http: true"; got != want { t.Fatalf("response got %v, want %v", got, want) } } @@ -374,6 +391,40 @@ func randString(n int) string { return string(b) } +type panicReader struct{} + +func (panicReader) Read([]byte) (int, error) { panic("unexpected Read") } +func (panicReader) Close() error { panic("unexpected Close") } + +func TestActualContentLength(t *testing.T) { + tests := []struct { + req *http.Request + want int64 + }{ + // Verify we don't read from Body: + 0: { + req: &http.Request{Body: panicReader{}}, + want: -1, + }, + // nil Body means 0, regardless of ContentLength: + 1: { + req: &http.Request{Body: nil, ContentLength: 5}, + want: 0, + }, + // ContentLength is used if set. + 2: { + req: &http.Request{Body: panicReader{}, ContentLength: 5}, + want: 5, + }, + } + for i, tt := range tests { + got := actualContentLength(tt.req) + if got != tt.want { + t.Errorf("test[%d]: got %d; want %d", i, got, tt.want) + } + } +} + func TestTransportBody(t *testing.T) { bodyTests := []struct { body string @@ -381,8 +432,6 @@ func TestTransportBody(t *testing.T) { }{ {body: "some message"}, {body: "some message", noContentLen: true}, - {body: ""}, - {body: "", noContentLen: true}, {body: strings.Repeat("a", 1<<20), noContentLen: true}, {body: strings.Repeat("a", 1<<20)}, {body: randString(16<<10 - 1)}, @@ -1690,12 +1739,12 @@ func TestTransportRejectsConnHeaders(t *testing.T) { { key: "Upgrade", value: []string{"anything"}, - want: "ERROR: http2: invalid Upgrade request header", + want: "ERROR: http2: invalid Upgrade request header: [\"anything\"]", }, { key: "Connection", value: []string{"foo"}, - want: "ERROR: http2: invalid Connection request header", + want: "ERROR: http2: invalid Connection request header: [\"foo\"]", }, { key: "Connection", @@ -1705,7 +1754,7 @@ func TestTransportRejectsConnHeaders(t *testing.T) { { key: "Connection", value: []string{"close", "something-else"}, - want: "ERROR: http2: invalid Connection request header", + want: "ERROR: http2: invalid Connection request header: [\"close\" \"something-else\"]", }, { key: "Connection", @@ -1725,7 +1774,7 @@ func TestTransportRejectsConnHeaders(t *testing.T) { { key: "Transfer-Encoding", value: []string{"foo"}, - want: "ERROR: http2: invalid Transfer-Encoding request header", + want: "ERROR: http2: invalid Transfer-Encoding request header: [\"foo\"]", }, { key: "Transfer-Encoding", @@ -1735,7 +1784,7 @@ func TestTransportRejectsConnHeaders(t *testing.T) { { key: "Transfer-Encoding", value: []string{"chunked", "other"}, - want: "ERROR: http2: invalid Transfer-Encoding request header", + want: "ERROR: http2: invalid Transfer-Encoding request header: [\"chunked\" \"other\"]", }, { key: "Content-Length", @@ -1898,8 +1947,17 @@ func TestTransportNewTLSConfig(t *testing.T) { }, } for i, tt := range tests { + // Ignore the session ticket keys part, which ends up populating + // unexported fields in the Config: + if tt.conf != nil { + tt.conf.SessionTicketsDisabled = true + } + tr := &Transport{TLSClientConfig: tt.conf} got := tr.newTLSConfig(tt.host) + + got.SessionTicketsDisabled = false + if !reflect.DeepEqual(got, tt.want) { t.Errorf("%d. got %#v; want %#v", i, got, tt.want) } @@ -2618,3 +2676,72 @@ func TestRoundTripDoesntConsumeRequestBodyEarly(t *testing.T) { t.Errorf("Body = %q; want %q", slurp, body) } } + +func TestClientConnPing(t *testing.T) { + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {}, optOnlyServer) + defer st.Close() + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + cc, err := tr.dialClientConn(st.ts.Listener.Addr().String(), false) + if err != nil { + t.Fatal(err) + } + if err = cc.Ping(testContext{}); err != nil { + t.Fatal(err) + } +} + +// Issue 16974: if the server sent a DATA frame after the user +// canceled the Transport's Request, the Transport previously wrote to a +// closed pipe, got an error, and ended up closing the whole TCP +// connection. +func TestTransportCancelDataResponseRace(t *testing.T) { + cancel := make(chan struct{}) + clientGotError := make(chan bool, 1) + + const msg = "Hello." + st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) { + if strings.Contains(r.URL.Path, "/hello") { + time.Sleep(50 * time.Millisecond) + io.WriteString(w, msg) + return + } + for i := 0; i < 50; i++ { + io.WriteString(w, "Some data.") + w.(http.Flusher).Flush() + if i == 2 { + close(cancel) + <-clientGotError + } + time.Sleep(10 * time.Millisecond) + } + }, optOnlyServer) + defer st.Close() + + tr := &Transport{TLSClientConfig: tlsConfigInsecure} + defer tr.CloseIdleConnections() + + c := &http.Client{Transport: tr} + req, _ := http.NewRequest("GET", st.ts.URL, nil) + req.Cancel = cancel + res, err := c.Do(req) + if err != nil { + t.Fatal(err) + } + if _, err = io.Copy(ioutil.Discard, res.Body); err == nil { + t.Fatal("unexpected success") + } + clientGotError <- true + + res, err = c.Get(st.ts.URL + "/hello") + if err != nil { + t.Fatal(err) + } + slurp, err := ioutil.ReadAll(res.Body) + if err != nil { + t.Fatal(err) + } + if string(slurp) != msg { + t.Errorf("Got = %q; want %q", slurp, msg) + } +} diff --git a/vendor/golang.org/x/net/http2/write.go b/vendor/golang.org/x/net/http2/write.go index 27ef0dd4d..1c135fdf7 100644 --- a/vendor/golang.org/x/net/http2/write.go +++ b/vendor/golang.org/x/net/http2/write.go @@ -9,6 +9,7 @@ import ( "fmt" "log" "net/http" + "net/url" "time" "golang.org/x/net/http2/hpack" @@ -18,6 +19,11 @@ import ( // writeFramer is implemented by any type that is used to write frames. type writeFramer interface { writeFrame(writeContext) error + + // staysWithinBuffer reports whether this writer promises that + // it will only write less than or equal to size bytes, and it + // won't Flush the write context. + staysWithinBuffer(size int) bool } // writeContext is the interface needed by the various frame writer @@ -62,8 +68,16 @@ func (flushFrameWriter) writeFrame(ctx writeContext) error { return ctx.Flush() } +func (flushFrameWriter) staysWithinBuffer(max int) bool { return false } + type writeSettings []Setting +func (s writeSettings) staysWithinBuffer(max int) bool { + const settingSize = 6 // uint16 + uint32 + return frameHeaderLen+settingSize*len(s) <= max + +} + func (s writeSettings) writeFrame(ctx writeContext) error { return ctx.Framer().WriteSettings([]Setting(s)...) } @@ -83,6 +97,8 @@ func (p *writeGoAway) writeFrame(ctx writeContext) error { return err } +func (*writeGoAway) staysWithinBuffer(max int) bool { return false } // flushes + type writeData struct { streamID uint32 p []byte @@ -97,6 +113,10 @@ func (w *writeData) writeFrame(ctx writeContext) error { return ctx.Framer().WriteData(w.streamID, w.endStream, w.p) } +func (w *writeData) staysWithinBuffer(max int) bool { + return frameHeaderLen+len(w.p) <= max +} + // handlerPanicRST is the message sent from handler goroutines when // the handler panics. type handlerPanicRST struct { @@ -107,22 +127,57 @@ func (hp handlerPanicRST) writeFrame(ctx writeContext) error { return ctx.Framer().WriteRSTStream(hp.StreamID, ErrCodeInternal) } +func (hp handlerPanicRST) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + func (se StreamError) writeFrame(ctx writeContext) error { return ctx.Framer().WriteRSTStream(se.StreamID, se.Code) } +func (se StreamError) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + type writePingAck struct{ pf *PingFrame } func (w writePingAck) writeFrame(ctx writeContext) error { return ctx.Framer().WritePing(true, w.pf.Data) } +func (w writePingAck) staysWithinBuffer(max int) bool { return frameHeaderLen+len(w.pf.Data) <= max } + type writeSettingsAck struct{} func (writeSettingsAck) writeFrame(ctx writeContext) error { return ctx.Framer().WriteSettingsAck() } +func (writeSettingsAck) staysWithinBuffer(max int) bool { return frameHeaderLen <= max } + +// splitHeaderBlock splits headerBlock into fragments so that each fragment fits +// in a single frame, then calls fn for each fragment. firstFrag/lastFrag are true +// for the first/last fragment, respectively. +func splitHeaderBlock(ctx writeContext, headerBlock []byte, fn func(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error) error { + // For now we're lazy and just pick the minimum MAX_FRAME_SIZE + // that all peers must support (16KB). Later we could care + // more and send larger frames if the peer advertised it, but + // there's little point. Most headers are small anyway (so we + // generally won't have CONTINUATION frames), and extra frames + // only waste 9 bytes anyway. + const maxFrameSize = 16384 + + first := true + for len(headerBlock) > 0 { + frag := headerBlock + if len(frag) > maxFrameSize { + frag = frag[:maxFrameSize] + } + headerBlock = headerBlock[len(frag):] + if err := fn(ctx, frag, first, len(headerBlock) == 0); err != nil { + return err + } + first = false + } + return nil +} + // writeResHeaders is a request to write a HEADERS and 0+ CONTINUATION frames // for HTTP response headers or trailers from a server handler. type writeResHeaders struct { @@ -144,6 +199,17 @@ func encKV(enc *hpack.Encoder, k, v string) { enc.WriteField(hpack.HeaderField{Name: k, Value: v}) } +func (w *writeResHeaders) staysWithinBuffer(max int) bool { + // TODO: this is a common one. It'd be nice to return true + // here and get into the fast path if we could be clever and + // calculate the size fast enough, or at least a conservative + // uppper bound that usually fires. (Maybe if w.h and + // w.trailers are nil, so we don't need to enumerate it.) + // Otherwise I'm afraid that just calculating the length to + // answer this question would be slower than the ~2µs benefit. + return false +} + func (w *writeResHeaders) writeFrame(ctx writeContext) error { enc, buf := ctx.HeaderEncoder() buf.Reset() @@ -169,39 +235,69 @@ func (w *writeResHeaders) writeFrame(ctx writeContext) error { panic("unexpected empty hpack") } - // For now we're lazy and just pick the minimum MAX_FRAME_SIZE - // that all peers must support (16KB). Later we could care - // more and send larger frames if the peer advertised it, but - // there's little point. Most headers are small anyway (so we - // generally won't have CONTINUATION frames), and extra frames - // only waste 9 bytes anyway. - const maxFrameSize = 16384 + return splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock) +} - first := true - for len(headerBlock) > 0 { - frag := headerBlock - if len(frag) > maxFrameSize { - frag = frag[:maxFrameSize] - } - headerBlock = headerBlock[len(frag):] - endHeaders := len(headerBlock) == 0 - var err error - if first { - first = false - err = ctx.Framer().WriteHeaders(HeadersFrameParam{ - StreamID: w.streamID, - BlockFragment: frag, - EndStream: w.endStream, - EndHeaders: endHeaders, - }) - } else { - err = ctx.Framer().WriteContinuation(w.streamID, endHeaders, frag) - } - if err != nil { - return err - } +func (w *writeResHeaders) writeHeaderBlock(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error { + if firstFrag { + return ctx.Framer().WriteHeaders(HeadersFrameParam{ + StreamID: w.streamID, + BlockFragment: frag, + EndStream: w.endStream, + EndHeaders: lastFrag, + }) + } else { + return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag) + } +} + +// writePushPromise is a request to write a PUSH_PROMISE and 0+ CONTINUATION frames. +type writePushPromise struct { + streamID uint32 // pusher stream + method string // for :method + url *url.URL // for :scheme, :authority, :path + h http.Header + + // Creates an ID for a pushed stream. This runs on serveG just before + // the frame is written. The returned ID is copied to promisedID. + allocatePromisedID func() (uint32, error) + promisedID uint32 +} + +func (w *writePushPromise) staysWithinBuffer(max int) bool { + // TODO: see writeResHeaders.staysWithinBuffer + return false +} + +func (w *writePushPromise) writeFrame(ctx writeContext) error { + enc, buf := ctx.HeaderEncoder() + buf.Reset() + + encKV(enc, ":method", w.method) + encKV(enc, ":scheme", w.url.Scheme) + encKV(enc, ":authority", w.url.Host) + encKV(enc, ":path", w.url.RequestURI()) + encodeHeaders(enc, w.h, nil) + + headerBlock := buf.Bytes() + if len(headerBlock) == 0 { + panic("unexpected empty hpack") + } + + return splitHeaderBlock(ctx, headerBlock, w.writeHeaderBlock) +} + +func (w *writePushPromise) writeHeaderBlock(ctx writeContext, frag []byte, firstFrag, lastFrag bool) error { + if firstFrag { + return ctx.Framer().WritePushPromise(PushPromiseParam{ + StreamID: w.streamID, + PromiseID: w.promisedID, + BlockFragment: frag, + EndHeaders: lastFrag, + }) + } else { + return ctx.Framer().WriteContinuation(w.streamID, lastFrag, frag) } - return nil } type write100ContinueHeadersFrame struct { @@ -220,15 +316,24 @@ func (w write100ContinueHeadersFrame) writeFrame(ctx writeContext) error { }) } +func (w write100ContinueHeadersFrame) staysWithinBuffer(max int) bool { + // Sloppy but conservative: + return 9+2*(len(":status")+len("100")) <= max +} + type writeWindowUpdate struct { streamID uint32 // or 0 for conn-level n uint32 } +func (wu writeWindowUpdate) staysWithinBuffer(max int) bool { return frameHeaderLen+4 <= max } + func (wu writeWindowUpdate) writeFrame(ctx writeContext) error { return ctx.Framer().WriteWindowUpdate(wu.streamID, wu.n) } +// encodeHeaders encodes an http.Header. If keys is not nil, then (k, h[k]) +// is encoded only only if k is in keys. func encodeHeaders(enc *hpack.Encoder, h http.Header, keys []string) { if keys == nil { sorter := sorterPool.Get().(*sorter) diff --git a/vendor/golang.org/x/net/http2/writesched.go b/vendor/golang.org/x/net/http2/writesched.go index c24316ce7..caa77c7cb 100644 --- a/vendor/golang.org/x/net/http2/writesched.go +++ b/vendor/golang.org/x/net/http2/writesched.go @@ -6,14 +6,53 @@ package http2 import "fmt" -// frameWriteMsg is a request to write a frame. -type frameWriteMsg struct { +// WriteScheduler is the interface implemented by HTTP/2 write schedulers. +// Methods are never called concurrently. +type WriteScheduler interface { + // OpenStream opens a new stream in the write scheduler. + // It is illegal to call this with streamID=0 or with a streamID that is + // already open -- the call may panic. + OpenStream(streamID uint32, options OpenStreamOptions) + + // CloseStream closes a stream in the write scheduler. Any frames queued on + // this stream should be discarded. It is illegal to call this on a stream + // that is not open -- the call may panic. + CloseStream(streamID uint32) + + // AdjustStream adjusts the priority of the given stream. This may be called + // on a stream that has not yet been opened or has been closed. Note that + // RFC 7540 allows PRIORITY frames to be sent on streams in any state. See: + // https://tools.ietf.org/html/rfc7540#section-5.1 + AdjustStream(streamID uint32, priority PriorityParam) + + // Push queues a frame in the scheduler. In most cases, this will not be + // called with wr.StreamID()!=0 unless that stream is currently open. The one + // exception is RST_STREAM frames, which may be sent on idle or closed streams. + Push(wr FrameWriteRequest) + + // Pop dequeues the next frame to write. Returns false if no frames can + // be written. Frames with a given wr.StreamID() are Pop'd in the same + // order they are Push'd. + Pop() (wr FrameWriteRequest, ok bool) +} + +// OpenStreamOptions specifies extra options for WriteScheduler.OpenStream. +type OpenStreamOptions struct { + // PusherID is zero if the stream was initiated by the client. Otherwise, + // PusherID names the stream that pushed the newly opened stream. + PusherID uint32 +} + +// FrameWriteRequest is a request to write a frame. +type FrameWriteRequest struct { // write is the interface value that does the writing, once the - // writeScheduler (below) has decided to select this frame - // to write. The write functions are all defined in write.go. + // WriteScheduler has selected this frame to write. The write + // functions are all defined in write.go. write writeFramer - stream *stream // used for prioritization. nil for non-stream frames. + // stream is the stream on which this frame will be written. + // nil for non-stream frames like PING and SETTINGS. + stream *stream // done, if non-nil, must be a buffered channel with space for // 1 message and is sent the return value from write (or an @@ -21,263 +60,169 @@ type frameWriteMsg struct { done chan error } -// for debugging only: -func (wm frameWriteMsg) String() string { - var streamID uint32 - if wm.stream != nil { - streamID = wm.stream.id - } - var des string - if s, ok := wm.write.(fmt.Stringer); ok { - des = s.String() - } else { - des = fmt.Sprintf("%T", wm.write) - } - return fmt.Sprintf("[frameWriteMsg stream=%d, ch=%v, type: %v]", streamID, wm.done != nil, des) -} - -// writeScheduler tracks pending frames to write, priorities, and decides -// the next one to use. It is not thread-safe. -type writeScheduler struct { - // zero are frames not associated with a specific stream. - // They're sent before any stream-specific freams. - zero writeQueue - - // maxFrameSize is the maximum size of a DATA frame - // we'll write. Must be non-zero and between 16K-16M. - maxFrameSize uint32 - - // sq contains the stream-specific queues, keyed by stream ID. - // when a stream is idle, it's deleted from the map. - sq map[uint32]*writeQueue - - // canSend is a slice of memory that's reused between frame - // scheduling decisions to hold the list of writeQueues (from sq) - // which have enough flow control data to send. After canSend is - // built, the best is selected. - canSend []*writeQueue - - // pool of empty queues for reuse. - queuePool []*writeQueue -} - -func (ws *writeScheduler) putEmptyQueue(q *writeQueue) { - if len(q.s) != 0 { - panic("queue must be empty") - } - ws.queuePool = append(ws.queuePool, q) -} - -func (ws *writeScheduler) getEmptyQueue() *writeQueue { - ln := len(ws.queuePool) - if ln == 0 { - return new(writeQueue) - } - q := ws.queuePool[ln-1] - ws.queuePool = ws.queuePool[:ln-1] - return q -} - -func (ws *writeScheduler) empty() bool { return ws.zero.empty() && len(ws.sq) == 0 } - -func (ws *writeScheduler) add(wm frameWriteMsg) { - st := wm.stream - if st == nil { - ws.zero.push(wm) - } else { - ws.streamQueue(st.id).push(wm) - } -} - -func (ws *writeScheduler) streamQueue(streamID uint32) *writeQueue { - if q, ok := ws.sq[streamID]; ok { - return q - } - if ws.sq == nil { - ws.sq = make(map[uint32]*writeQueue) - } - q := ws.getEmptyQueue() - ws.sq[streamID] = q - return q -} - -// take returns the most important frame to write and removes it from the scheduler. -// It is illegal to call this if the scheduler is empty or if there are no connection-level -// flow control bytes available. -func (ws *writeScheduler) take() (wm frameWriteMsg, ok bool) { - if ws.maxFrameSize == 0 { - panic("internal error: ws.maxFrameSize not initialized or invalid") - } - - // If there any frames not associated with streams, prefer those first. - // These are usually SETTINGS, etc. - if !ws.zero.empty() { - return ws.zero.shift(), true - } - if len(ws.sq) == 0 { - return - } - - // Next, prioritize frames on streams that aren't DATA frames (no cost). - for id, q := range ws.sq { - if q.firstIsNoCost() { - return ws.takeFrom(id, q) +// StreamID returns the id of the stream this frame will be written to. +// 0 is used for non-stream frames such as PING and SETTINGS. +func (wr FrameWriteRequest) StreamID() uint32 { + if wr.stream == nil { + if se, ok := wr.write.(StreamError); ok { + // (*serverConn).resetStream doesn't set + // stream because it doesn't necessarily have + // one. So special case this type of write + // message. + return se.StreamID } - } - - // Now, all that remains are DATA frames with non-zero bytes to - // send. So pick the best one. - if len(ws.canSend) != 0 { - panic("should be empty") - } - for _, q := range ws.sq { - if n := ws.streamWritableBytes(q); n > 0 { - ws.canSend = append(ws.canSend, q) - } - } - if len(ws.canSend) == 0 { - return - } - defer ws.zeroCanSend() - - // TODO: find the best queue - q := ws.canSend[0] - - return ws.takeFrom(q.streamID(), q) -} - -// zeroCanSend is defered from take. -func (ws *writeScheduler) zeroCanSend() { - for i := range ws.canSend { - ws.canSend[i] = nil - } - ws.canSend = ws.canSend[:0] -} - -// streamWritableBytes returns the number of DATA bytes we could write -// from the given queue's stream, if this stream/queue were -// selected. It is an error to call this if q's head isn't a -// *writeData. -func (ws *writeScheduler) streamWritableBytes(q *writeQueue) int32 { - wm := q.head() - ret := wm.stream.flow.available() // max we can write - if ret == 0 { return 0 } - if int32(ws.maxFrameSize) < ret { - ret = int32(ws.maxFrameSize) - } - if ret == 0 { - panic("internal error: ws.maxFrameSize not initialized or invalid") - } - wd := wm.write.(*writeData) - if len(wd.p) < int(ret) { - ret = int32(len(wd.p)) - } - return ret -} - -func (ws *writeScheduler) takeFrom(id uint32, q *writeQueue) (wm frameWriteMsg, ok bool) { - wm = q.head() - // If the first item in this queue costs flow control tokens - // and we don't have enough, write as much as we can. - if wd, ok := wm.write.(*writeData); ok && len(wd.p) > 0 { - allowed := wm.stream.flow.available() // max we can write - if allowed == 0 { - // No quota available. Caller can try the next stream. - return frameWriteMsg{}, false + return wr.stream.id +} + +// DataSize returns the number of flow control bytes that must be consumed +// to write this entire frame. This is 0 for non-DATA frames. +func (wr FrameWriteRequest) DataSize() int { + if wd, ok := wr.write.(*writeData); ok { + return len(wd.p) + } + return 0 +} + +// Consume consumes min(n, available) bytes from this frame, where available +// is the number of flow control bytes available on the stream. Consume returns +// 0, 1, or 2 frames, where the integer return value gives the number of frames +// returned. +// +// If flow control prevents consuming any bytes, this returns (_, _, 0). If +// the entire frame was consumed, this returns (wr, _, 1). Otherwise, this +// returns (consumed, rest, 2), where 'consumed' contains the consumed bytes and +// 'rest' contains the remaining bytes. The consumed bytes are deducted from the +// underlying stream's flow control budget. +func (wr FrameWriteRequest) Consume(n int32) (FrameWriteRequest, FrameWriteRequest, int) { + var empty FrameWriteRequest + + // Non-DATA frames are always consumed whole. + wd, ok := wr.write.(*writeData) + if !ok || len(wd.p) == 0 { + return wr, empty, 1 + } + + // Might need to split after applying limits. + allowed := wr.stream.flow.available() + if n < allowed { + allowed = n + } + if wr.stream.sc.maxFrameSize < allowed { + allowed = wr.stream.sc.maxFrameSize + } + if allowed <= 0 { + return empty, empty, 0 + } + if len(wd.p) > int(allowed) { + wr.stream.flow.take(allowed) + consumed := FrameWriteRequest{ + stream: wr.stream, + write: &writeData{ + streamID: wd.streamID, + p: wd.p[:allowed], + // Even if the original had endStream set, there + // are bytes remaining because len(wd.p) > allowed, + // so we know endStream is false. + endStream: false, + }, + // Our caller is blocking on the final DATA frame, not + // this intermediate frame, so no need to wait. + done: nil, } - if int32(ws.maxFrameSize) < allowed { - allowed = int32(ws.maxFrameSize) + rest := FrameWriteRequest{ + stream: wr.stream, + write: &writeData{ + streamID: wd.streamID, + p: wd.p[allowed:], + endStream: wd.endStream, + }, + done: wr.done, } - // TODO: further restrict the allowed size, because even if - // the peer says it's okay to write 16MB data frames, we might - // want to write smaller ones to properly weight competing - // streams' priorities. - - if len(wd.p) > int(allowed) { - wm.stream.flow.take(allowed) - chunk := wd.p[:allowed] - wd.p = wd.p[allowed:] - // Make up a new write message of a valid size, rather - // than shifting one off the queue. - return frameWriteMsg{ - stream: wm.stream, - write: &writeData{ - streamID: wd.streamID, - p: chunk, - // even if the original had endStream set, there - // arebytes remaining because len(wd.p) > allowed, - // so we know endStream is false: - endStream: false, - }, - // our caller is blocking on the final DATA frame, not - // these intermediates, so no need to wait: - done: nil, - }, true - } - wm.stream.flow.take(int32(len(wd.p))) + return consumed, rest, 2 } - q.shift() - if q.empty() { - ws.putEmptyQueue(q) - delete(ws.sq, id) - } - return wm, true + // The frame is consumed whole. + // NB: This cast cannot overflow because allowed is <= math.MaxInt32. + wr.stream.flow.take(int32(len(wd.p))) + return wr, empty, 1 } -func (ws *writeScheduler) forgetStream(id uint32) { - q, ok := ws.sq[id] - if !ok { - return - } - delete(ws.sq, id) - - // But keep it for others later. - for i := range q.s { - q.s[i] = frameWriteMsg{} +// String is for debugging only. +func (wr FrameWriteRequest) String() string { + var des string + if s, ok := wr.write.(fmt.Stringer); ok { + des = s.String() + } else { + des = fmt.Sprintf("%T", wr.write) } - q.s = q.s[:0] - ws.putEmptyQueue(q) + return fmt.Sprintf("[FrameWriteRequest stream=%d, ch=%v, writer=%v]", wr.StreamID(), wr.done != nil, des) } +// writeQueue is used by implementations of WriteScheduler. type writeQueue struct { - s []frameWriteMsg + s []FrameWriteRequest } -// streamID returns the stream ID for a non-empty stream-specific queue. -func (q *writeQueue) streamID() uint32 { return q.s[0].stream.id } - func (q *writeQueue) empty() bool { return len(q.s) == 0 } -func (q *writeQueue) push(wm frameWriteMsg) { - q.s = append(q.s, wm) +func (q *writeQueue) push(wr FrameWriteRequest) { + q.s = append(q.s, wr) } -// head returns the next item that would be removed by shift. -func (q *writeQueue) head() frameWriteMsg { +func (q *writeQueue) shift() FrameWriteRequest { if len(q.s) == 0 { panic("invalid use of queue") } - return q.s[0] + wr := q.s[0] + // TODO: less copy-happy queue. + copy(q.s, q.s[1:]) + q.s[len(q.s)-1] = FrameWriteRequest{} + q.s = q.s[:len(q.s)-1] + return wr } -func (q *writeQueue) shift() frameWriteMsg { +// consume consumes up to n bytes from q.s[0]. If the frame is +// entirely consumed, it is removed from the queue. If the frame +// is partially consumed, the frame is kept with the consumed +// bytes removed. Returns true iff any bytes were consumed. +func (q *writeQueue) consume(n int32) (FrameWriteRequest, bool) { if len(q.s) == 0 { - panic("invalid use of queue") + return FrameWriteRequest{}, false } - wm := q.s[0] - // TODO: less copy-happy queue. - copy(q.s, q.s[1:]) - q.s[len(q.s)-1] = frameWriteMsg{} - q.s = q.s[:len(q.s)-1] - return wm + consumed, rest, numresult := q.s[0].Consume(n) + switch numresult { + case 0: + return FrameWriteRequest{}, false + case 1: + q.shift() + case 2: + q.s[0] = rest + } + return consumed, true +} + +type writeQueuePool []*writeQueue + +// put inserts an unused writeQueue into the pool. +func (p *writeQueuePool) put(q *writeQueue) { + for i := range q.s { + q.s[i] = FrameWriteRequest{} + } + q.s = q.s[:0] + *p = append(*p, q) } -func (q *writeQueue) firstIsNoCost() bool { - if df, ok := q.s[0].write.(*writeData); ok { - return len(df.p) == 0 +// get returns an empty writeQueue. +func (p *writeQueuePool) get() *writeQueue { + ln := len(*p) + if ln == 0 { + return new(writeQueue) } - return true + x := ln - 1 + q := (*p)[x] + (*p)[x] = nil + *p = (*p)[:x] + return q } diff --git a/vendor/golang.org/x/net/http2/writesched_priority.go b/vendor/golang.org/x/net/http2/writesched_priority.go new file mode 100644 index 000000000..01132721b --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched_priority.go @@ -0,0 +1,452 @@ +// 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. + +package http2 + +import ( + "fmt" + "math" + "sort" +) + +// RFC 7540, Section 5.3.5: the default weight is 16. +const priorityDefaultWeight = 15 // 16 = 15 + 1 + +// PriorityWriteSchedulerConfig configures a priorityWriteScheduler. +type PriorityWriteSchedulerConfig struct { + // MaxClosedNodesInTree controls the maximum number of closed streams to + // retain in the priority tree. Setting this to zero saves a small amount + // of memory at the cost of performance. + // + // See RFC 7540, Section 5.3.4: + // "It is possible for a stream to become closed while prioritization + // information ... is in transit. ... This potentially creates suboptimal + // prioritization, since the stream could be given a priority that is + // different from what is intended. To avoid these problems, an endpoint + // SHOULD retain stream prioritization state for a period after streams + // become closed. The longer state is retained, the lower the chance that + // streams are assigned incorrect or default priority values." + MaxClosedNodesInTree int + + // MaxIdleNodesInTree controls the maximum number of idle streams to + // retain in the priority tree. Setting this to zero saves a small amount + // of memory at the cost of performance. + // + // See RFC 7540, Section 5.3.4: + // Similarly, streams that are in the "idle" state can be assigned + // priority or become a parent of other streams. This allows for the + // creation of a grouping node in the dependency tree, which enables + // more flexible expressions of priority. Idle streams begin with a + // default priority (Section 5.3.5). + MaxIdleNodesInTree int + + // ThrottleOutOfOrderWrites enables write throttling to help ensure that + // data is delivered in priority order. This works around a race where + // stream B depends on stream A and both streams are about to call Write + // to queue DATA frames. If B wins the race, a naive scheduler would eagerly + // write as much data from B as possible, but this is suboptimal because A + // is a higher-priority stream. With throttling enabled, we write a small + // amount of data from B to minimize the amount of bandwidth that B can + // steal from A. + ThrottleOutOfOrderWrites bool +} + +// NewPriorityWriteScheduler constructs a WriteScheduler that schedules +// frames by following HTTP/2 priorities as described in RFC 7340 Section 5.3. +// If cfg is nil, default options are used. +func NewPriorityWriteScheduler(cfg *PriorityWriteSchedulerConfig) WriteScheduler { + if cfg == nil { + // For justification of these defaults, see: + // https://docs.google.com/document/d/1oLhNg1skaWD4_DtaoCxdSRN5erEXrH-KnLrMwEpOtFY + cfg = &PriorityWriteSchedulerConfig{ + MaxClosedNodesInTree: 10, + MaxIdleNodesInTree: 10, + ThrottleOutOfOrderWrites: false, + } + } + + ws := &priorityWriteScheduler{ + nodes: make(map[uint32]*priorityNode), + maxClosedNodesInTree: cfg.MaxClosedNodesInTree, + maxIdleNodesInTree: cfg.MaxIdleNodesInTree, + enableWriteThrottle: cfg.ThrottleOutOfOrderWrites, + } + ws.nodes[0] = &ws.root + if cfg.ThrottleOutOfOrderWrites { + ws.writeThrottleLimit = 1024 + } else { + ws.writeThrottleLimit = math.MaxInt32 + } + return ws +} + +type priorityNodeState int + +const ( + priorityNodeOpen priorityNodeState = iota + priorityNodeClosed + priorityNodeIdle +) + +// priorityNode is a node in an HTTP/2 priority tree. +// Each node is associated with a single stream ID. +// See RFC 7540, Section 5.3. +type priorityNode struct { + q writeQueue // queue of pending frames to write + id uint32 // id of the stream, or 0 for the root of the tree + weight uint8 // the actual weight is weight+1, so the value is in [1,256] + state priorityNodeState // open | closed | idle + bytes int64 // number of bytes written by this node, or 0 if closed + subtreeBytes int64 // sum(node.bytes) of all nodes in this subtree + + // These links form the priority tree. + parent *priorityNode + kids *priorityNode // start of the kids list + prev, next *priorityNode // doubly-linked list of siblings +} + +func (n *priorityNode) setParent(parent *priorityNode) { + if n == parent { + panic("setParent to self") + } + if n.parent == parent { + return + } + // Unlink from current parent. + if parent := n.parent; parent != nil { + if n.prev == nil { + parent.kids = n.next + } else { + n.prev.next = n.next + } + if n.next != nil { + n.next.prev = n.prev + } + } + // Link to new parent. + // If parent=nil, remove n from the tree. + // Always insert at the head of parent.kids (this is assumed by walkReadyInOrder). + n.parent = parent + if parent == nil { + n.next = nil + n.prev = nil + } else { + n.next = parent.kids + n.prev = nil + if n.next != nil { + n.next.prev = n + } + parent.kids = n + } +} + +func (n *priorityNode) addBytes(b int64) { + n.bytes += b + for ; n != nil; n = n.parent { + n.subtreeBytes += b + } +} + +// walkReadyInOrder iterates over the tree in priority order, calling f for each node +// with a non-empty write queue. When f returns true, this funcion returns true and the +// walk halts. tmp is used as scratch space for sorting. +// +// f(n, openParent) takes two arguments: the node to visit, n, and a bool that is true +// if any ancestor p of n is still open (ignoring the root node). +func (n *priorityNode) walkReadyInOrder(openParent bool, tmp *[]*priorityNode, f func(*priorityNode, bool) bool) bool { + if !n.q.empty() && f(n, openParent) { + return true + } + if n.kids == nil { + return false + } + + // Don't consider the root "open" when updating openParent since + // we can't send data frames on the root stream (only control frames). + if n.id != 0 { + openParent = openParent || (n.state == priorityNodeOpen) + } + + // Common case: only one kid or all kids have the same weight. + // Some clients don't use weights; other clients (like web browsers) + // use mostly-linear priority trees. + w := n.kids.weight + needSort := false + for k := n.kids.next; k != nil; k = k.next { + if k.weight != w { + needSort = true + break + } + } + if !needSort { + for k := n.kids; k != nil; k = k.next { + if k.walkReadyInOrder(openParent, tmp, f) { + return true + } + } + return false + } + + // Uncommon case: sort the child nodes. We remove the kids from the parent, + // then re-insert after sorting so we can reuse tmp for future sort calls. + *tmp = (*tmp)[:0] + for n.kids != nil { + *tmp = append(*tmp, n.kids) + n.kids.setParent(nil) + } + sort.Sort(sortPriorityNodeSiblings(*tmp)) + for i := len(*tmp) - 1; i >= 0; i-- { + (*tmp)[i].setParent(n) // setParent inserts at the head of n.kids + } + for k := n.kids; k != nil; k = k.next { + if k.walkReadyInOrder(openParent, tmp, f) { + return true + } + } + return false +} + +type sortPriorityNodeSiblings []*priorityNode + +func (z sortPriorityNodeSiblings) Len() int { return len(z) } +func (z sortPriorityNodeSiblings) Swap(i, k int) { z[i], z[k] = z[k], z[i] } +func (z sortPriorityNodeSiblings) Less(i, k int) bool { + // Prefer the subtree that has sent fewer bytes relative to its weight. + // See sections 5.3.2 and 5.3.4. + wi, bi := float64(z[i].weight+1), float64(z[i].subtreeBytes) + wk, bk := float64(z[k].weight+1), float64(z[k].subtreeBytes) + if bi == 0 && bk == 0 { + return wi >= wk + } + if bk == 0 { + return false + } + return bi/bk <= wi/wk +} + +type priorityWriteScheduler struct { + // root is the root of the priority tree, where root.id = 0. + // The root queues control frames that are not associated with any stream. + root priorityNode + + // nodes maps stream ids to priority tree nodes. + nodes map[uint32]*priorityNode + + // maxID is the maximum stream id in nodes. + maxID uint32 + + // lists of nodes that have been closed or are idle, but are kept in + // the tree for improved prioritization. When the lengths exceed either + // maxClosedNodesInTree or maxIdleNodesInTree, old nodes are discarded. + closedNodes, idleNodes []*priorityNode + + // From the config. + maxClosedNodesInTree int + maxIdleNodesInTree int + writeThrottleLimit int32 + enableWriteThrottle bool + + // tmp is scratch space for priorityNode.walkReadyInOrder to reduce allocations. + tmp []*priorityNode + + // pool of empty queues for reuse. + queuePool writeQueuePool +} + +func (ws *priorityWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { + // The stream may be currently idle but cannot be opened or closed. + if curr := ws.nodes[streamID]; curr != nil { + if curr.state != priorityNodeIdle { + panic(fmt.Sprintf("stream %d already opened", streamID)) + } + curr.state = priorityNodeOpen + return + } + + // RFC 7540, Section 5.3.5: + // "All streams are initially assigned a non-exclusive dependency on stream 0x0. + // Pushed streams initially depend on their associated stream. In both cases, + // streams are assigned a default weight of 16." + parent := ws.nodes[options.PusherID] + if parent == nil { + parent = &ws.root + } + n := &priorityNode{ + q: *ws.queuePool.get(), + id: streamID, + weight: priorityDefaultWeight, + state: priorityNodeOpen, + } + n.setParent(parent) + ws.nodes[streamID] = n + if streamID > ws.maxID { + ws.maxID = streamID + } +} + +func (ws *priorityWriteScheduler) CloseStream(streamID uint32) { + if streamID == 0 { + panic("violation of WriteScheduler interface: cannot close stream 0") + } + if ws.nodes[streamID] == nil { + panic(fmt.Sprintf("violation of WriteScheduler interface: unknown stream %d", streamID)) + } + if ws.nodes[streamID].state != priorityNodeOpen { + panic(fmt.Sprintf("violation of WriteScheduler interface: stream %d already closed", streamID)) + } + + n := ws.nodes[streamID] + n.state = priorityNodeClosed + n.addBytes(-n.bytes) + + q := n.q + ws.queuePool.put(&q) + n.q.s = nil + if ws.maxClosedNodesInTree > 0 { + ws.addClosedOrIdleNode(&ws.closedNodes, ws.maxClosedNodesInTree, n) + } else { + ws.removeNode(n) + } +} + +func (ws *priorityWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { + if streamID == 0 { + panic("adjustPriority on root") + } + + // If streamID does not exist, there are two cases: + // - A closed stream that has been removed (this will have ID <= maxID) + // - An idle stream that is being used for "grouping" (this will have ID > maxID) + n := ws.nodes[streamID] + if n == nil { + if streamID <= ws.maxID || ws.maxIdleNodesInTree == 0 { + return + } + ws.maxID = streamID + n = &priorityNode{ + q: *ws.queuePool.get(), + id: streamID, + weight: priorityDefaultWeight, + state: priorityNodeIdle, + } + n.setParent(&ws.root) + ws.nodes[streamID] = n + ws.addClosedOrIdleNode(&ws.idleNodes, ws.maxIdleNodesInTree, n) + } + + // Section 5.3.1: A dependency on a stream that is not currently in the tree + // results in that stream being given a default priority (Section 5.3.5). + parent := ws.nodes[priority.StreamDep] + if parent == nil { + n.setParent(&ws.root) + n.weight = priorityDefaultWeight + return + } + + // Ignore if the client tries to make a node its own parent. + if n == parent { + return + } + + // Section 5.3.3: + // "If a stream is made dependent on one of its own dependencies, the + // formerly dependent stream is first moved to be dependent on the + // reprioritized stream's previous parent. The moved dependency retains + // its weight." + // + // That is: if parent depends on n, move parent to depend on n.parent. + for x := parent.parent; x != nil; x = x.parent { + if x == n { + parent.setParent(n.parent) + break + } + } + + // Section 5.3.3: The exclusive flag causes the stream to become the sole + // dependency of its parent stream, causing other dependencies to become + // dependent on the exclusive stream. + if priority.Exclusive { + k := parent.kids + for k != nil { + next := k.next + if k != n { + k.setParent(n) + } + k = next + } + } + + n.setParent(parent) + n.weight = priority.Weight +} + +func (ws *priorityWriteScheduler) Push(wr FrameWriteRequest) { + var n *priorityNode + if id := wr.StreamID(); id == 0 { + n = &ws.root + } else { + n = ws.nodes[id] + if n == nil { + // id is an idle or closed stream. wr should not be a HEADERS or + // DATA frame. However, wr can be a RST_STREAM. In this case, we + // push wr onto the root, rather than creating a new priorityNode, + // since RST_STREAM is tiny and the stream's priority is unknown + // anyway. See issue #17919. + if wr.DataSize() > 0 { + panic("add DATA on non-open stream") + } + n = &ws.root + } + } + n.q.push(wr) +} + +func (ws *priorityWriteScheduler) Pop() (wr FrameWriteRequest, ok bool) { + ws.root.walkReadyInOrder(false, &ws.tmp, func(n *priorityNode, openParent bool) bool { + limit := int32(math.MaxInt32) + if openParent { + limit = ws.writeThrottleLimit + } + wr, ok = n.q.consume(limit) + if !ok { + return false + } + n.addBytes(int64(wr.DataSize())) + // If B depends on A and B continuously has data available but A + // does not, gradually increase the throttling limit to allow B to + // steal more and more bandwidth from A. + if openParent { + ws.writeThrottleLimit += 1024 + if ws.writeThrottleLimit < 0 { + ws.writeThrottleLimit = math.MaxInt32 + } + } else if ws.enableWriteThrottle { + ws.writeThrottleLimit = 1024 + } + return true + }) + return wr, ok +} + +func (ws *priorityWriteScheduler) addClosedOrIdleNode(list *[]*priorityNode, maxSize int, n *priorityNode) { + if maxSize == 0 { + return + } + if len(*list) == maxSize { + // Remove the oldest node, then shift left. + ws.removeNode((*list)[0]) + x := (*list)[1:] + copy(*list, x) + *list = (*list)[:len(x)] + } + *list = append(*list, n) +} + +func (ws *priorityWriteScheduler) removeNode(n *priorityNode) { + for k := n.kids; k != nil; k = k.next { + k.setParent(n.parent) + } + n.setParent(nil) + delete(ws.nodes, n.id) +} diff --git a/vendor/golang.org/x/net/http2/writesched_priority_test.go b/vendor/golang.org/x/net/http2/writesched_priority_test.go new file mode 100644 index 000000000..2b232043c --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched_priority_test.go @@ -0,0 +1,541 @@ +// 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. + +package http2 + +import ( + "bytes" + "fmt" + "sort" + "testing" +) + +func defaultPriorityWriteScheduler() *priorityWriteScheduler { + return NewPriorityWriteScheduler(nil).(*priorityWriteScheduler) +} + +func checkPriorityWellFormed(ws *priorityWriteScheduler) error { + for id, n := range ws.nodes { + if id != n.id { + return fmt.Errorf("bad ws.nodes: ws.nodes[%d] = %d", id, n.id) + } + if n.parent == nil { + if n.next != nil || n.prev != nil { + return fmt.Errorf("bad node %d: nil parent but prev/next not nil", id) + } + continue + } + found := false + for k := n.parent.kids; k != nil; k = k.next { + if k.id == id { + found = true + break + } + } + if !found { + return fmt.Errorf("bad node %d: not found in parent %d kids list", id, n.parent.id) + } + } + return nil +} + +func fmtTree(ws *priorityWriteScheduler, fmtNode func(*priorityNode) string) string { + var ids []int + for _, n := range ws.nodes { + ids = append(ids, int(n.id)) + } + sort.Ints(ids) + + var buf bytes.Buffer + for _, id := range ids { + if buf.Len() != 0 { + buf.WriteString(" ") + } + if id == 0 { + buf.WriteString(fmtNode(&ws.root)) + } else { + buf.WriteString(fmtNode(ws.nodes[uint32(id)])) + } + } + return buf.String() +} + +func fmtNodeParentSkipRoot(n *priorityNode) string { + switch { + case n.id == 0: + return "" + case n.parent == nil: + return fmt.Sprintf("%d{parent:nil}", n.id) + default: + return fmt.Sprintf("%d{parent:%d}", n.id, n.parent.id) + } +} + +func fmtNodeWeightParentSkipRoot(n *priorityNode) string { + switch { + case n.id == 0: + return "" + case n.parent == nil: + return fmt.Sprintf("%d{weight:%d,parent:nil}", n.id, n.weight) + default: + return fmt.Sprintf("%d{weight:%d,parent:%d}", n.id, n.weight, n.parent.id) + } +} + +func TestPriorityTwoStreams(t *testing.T) { + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + + want := "1{weight:15,parent:0} 2{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + + // Move 1's parent to 2. + ws.AdjustStream(1, PriorityParam{ + StreamDep: 2, + Weight: 32, + Exclusive: false, + }) + want = "1{weight:32,parent:2} 2{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityAdjustExclusiveZero(t *testing.T) { + // 1, 2, and 3 are all children of the 0 stream. + // Exclusive reprioritization to any of the streams should bring + // the rest of the streams under the reprioritized stream. + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + ws.OpenStream(3, OpenStreamOptions{}) + + want := "1{weight:15,parent:0} 2{weight:15,parent:0} 3{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + + ws.AdjustStream(2, PriorityParam{ + StreamDep: 0, + Weight: 20, + Exclusive: true, + }) + want = "1{weight:15,parent:2} 2{weight:20,parent:0} 3{weight:15,parent:2}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityAdjustOwnParent(t *testing.T) { + // Assigning a node as its own parent should have no effect. + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + ws.AdjustStream(2, PriorityParam{ + StreamDep: 2, + Weight: 20, + Exclusive: true, + }) + want := "1{weight:15,parent:0} 2{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityClosedStreams(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{MaxClosedNodesInTree: 2}).(*priorityWriteScheduler) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 2}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + + // Close the first three streams. We lose 1, but keep 2 and 3. + ws.CloseStream(1) + ws.CloseStream(2) + ws.CloseStream(3) + + want := "2{weight:15,parent:0} 3{weight:15,parent:2} 4{weight:15,parent:3}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After close\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } + + // Adding a stream as an exclusive child of 1 gives it default + // priorities, since 1 is gone. + ws.OpenStream(5, OpenStreamOptions{}) + ws.AdjustStream(5, PriorityParam{StreamDep: 1, Weight: 15, Exclusive: true}) + + // Adding a stream as an exclusive child of 2 should work, since 2 is not gone. + ws.OpenStream(6, OpenStreamOptions{}) + ws.AdjustStream(6, PriorityParam{StreamDep: 2, Weight: 15, Exclusive: true}) + + want = "2{weight:15,parent:0} 3{weight:15,parent:6} 4{weight:15,parent:3} 5{weight:15,parent:0} 6{weight:15,parent:2}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After add streams\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityClosedStreamsDisabled(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{}).(*priorityWriteScheduler) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 2}) + + // Close the first two streams. We keep only 3. + ws.CloseStream(1) + ws.CloseStream(2) + + want := "3{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After close\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityIdleStreams(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{MaxIdleNodesInTree: 2}).(*priorityWriteScheduler) + ws.AdjustStream(1, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(2, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(3, PriorityParam{StreamDep: 2, Weight: 20}) // idle + ws.OpenStream(4, OpenStreamOptions{}) + ws.OpenStream(5, OpenStreamOptions{}) + ws.OpenStream(6, OpenStreamOptions{}) + ws.AdjustStream(4, PriorityParam{StreamDep: 1, Weight: 15}) + ws.AdjustStream(5, PriorityParam{StreamDep: 2, Weight: 15}) + ws.AdjustStream(6, PriorityParam{StreamDep: 3, Weight: 15}) + + want := "2{weight:15,parent:0} 3{weight:20,parent:2} 4{weight:15,parent:0} 5{weight:15,parent:2} 6{weight:15,parent:3}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPriorityIdleStreamsDisabled(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{}).(*priorityWriteScheduler) + ws.AdjustStream(1, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(2, PriorityParam{StreamDep: 0, Weight: 15}) // idle + ws.AdjustStream(3, PriorityParam{StreamDep: 2, Weight: 20}) // idle + ws.OpenStream(4, OpenStreamOptions{}) + + want := "4{weight:15,parent:0}" + if got := fmtTree(ws, fmtNodeWeightParentSkipRoot); got != want { + t.Errorf("After open\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPrioritySection531NonExclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.1. + // A,B,C,D = 1,2,3,4 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{}) + ws.AdjustStream(4, PriorityParam{ + StreamDep: 1, + Weight: 15, + Exclusive: false, + }) + want := "1{parent:0} 2{parent:1} 3{parent:1} 4{parent:1}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPrioritySection531Exclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.1. + // A,B,C,D = 1,2,3,4 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{}) + ws.AdjustStream(4, PriorityParam{ + StreamDep: 1, + Weight: 15, + Exclusive: true, + }) + want := "1{parent:0} 2{parent:4} 3{parent:4} 4{parent:1}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func makeSection533Tree() *priorityWriteScheduler { + // Initial tree from RFC 7540 Section 5.3.3. + // A,B,C,D,E,F = 1,2,3,4,5,6 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(5, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(6, OpenStreamOptions{PusherID: 4}) + return ws +} + +func TestPrioritySection533NonExclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.3. + // A,B,C,D,E,F = 1,2,3,4,5,6 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(5, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(6, OpenStreamOptions{PusherID: 4}) + ws.AdjustStream(1, PriorityParam{ + StreamDep: 4, + Weight: 15, + Exclusive: false, + }) + want := "1{parent:4} 2{parent:1} 3{parent:1} 4{parent:0} 5{parent:3} 6{parent:4}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func TestPrioritySection533Exclusive(t *testing.T) { + // Example from RFC 7540 Section 5.3.3. + // A,B,C,D,E,F = 1,2,3,4,5,6 + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(5, OpenStreamOptions{PusherID: 3}) + ws.OpenStream(6, OpenStreamOptions{PusherID: 4}) + ws.AdjustStream(1, PriorityParam{ + StreamDep: 4, + Weight: 15, + Exclusive: true, + }) + want := "1{parent:4} 2{parent:1} 3{parent:1} 4{parent:0} 5{parent:3} 6{parent:1}" + if got := fmtTree(ws, fmtNodeParentSkipRoot); got != want { + t.Errorf("After adjust\ngot %q\nwant %q", got, want) + } + if err := checkPriorityWellFormed(ws); err != nil { + t.Error(err) + } +} + +func checkPopAll(ws WriteScheduler, order []uint32) error { + for k, id := range order { + wr, ok := ws.Pop() + if !ok { + return fmt.Errorf("Pop[%d]: got ok=false, want %d (order=%v)", k, id, order) + } + if got := wr.StreamID(); got != id { + return fmt.Errorf("Pop[%d]: got %v, want %d (order=%v)", k, got, id, order) + } + } + wr, ok := ws.Pop() + if ok { + return fmt.Errorf("Pop[%d]: got %v, want ok=false (order=%v)", len(order), wr.StreamID(), order) + } + return nil +} + +func TestPriorityPopFrom533Tree(t *testing.T) { + ws := makeSection533Tree() + + ws.Push(makeWriteHeadersRequest(3 /*C*/)) + ws.Push(makeWriteNonStreamRequest()) + ws.Push(makeWriteHeadersRequest(5 /*E*/)) + ws.Push(makeWriteHeadersRequest(1 /*A*/)) + t.Log("tree:", fmtTree(ws, fmtNodeParentSkipRoot)) + + if err := checkPopAll(ws, []uint32{0 /*NonStream*/, 1, 3, 5}); err != nil { + t.Error(err) + } +} + +func TestPriorityPopFromLinearTree(t *testing.T) { + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + ws.OpenStream(3, OpenStreamOptions{PusherID: 2}) + ws.OpenStream(4, OpenStreamOptions{PusherID: 3}) + + ws.Push(makeWriteHeadersRequest(3)) + ws.Push(makeWriteHeadersRequest(4)) + ws.Push(makeWriteHeadersRequest(1)) + ws.Push(makeWriteHeadersRequest(2)) + ws.Push(makeWriteNonStreamRequest()) + ws.Push(makeWriteNonStreamRequest()) + t.Log("tree:", fmtTree(ws, fmtNodeParentSkipRoot)) + + if err := checkPopAll(ws, []uint32{0, 0 /*NonStreams*/, 1, 2, 3, 4}); err != nil { + t.Error(err) + } +} + +func TestPriorityFlowControl(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{ThrottleOutOfOrderWrites: false}) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + + sc := &serverConn{maxFrameSize: 16} + st1 := &stream{id: 1, sc: sc} + st2 := &stream{id: 2, sc: sc} + + ws.Push(FrameWriteRequest{&writeData{1, make([]byte, 16), false}, st1, nil}) + ws.Push(FrameWriteRequest{&writeData{2, make([]byte, 16), false}, st2, nil}) + ws.AdjustStream(2, PriorityParam{StreamDep: 1}) + + // No flow-control bytes available. + if wr, ok := ws.Pop(); ok { + t.Fatalf("Pop(limited by flow control)=%v,true, want false", wr) + } + + // Add enough flow-control bytes to write st2 in two Pop calls. + // Should write data from st2 even though it's lower priority than st1. + for i := 1; i <= 2; i++ { + st2.flow.add(8) + wr, ok := ws.Pop() + if !ok { + t.Fatalf("Pop(%d)=false, want true", i) + } + if got, want := wr.DataSize(), 8; got != want { + t.Fatalf("Pop(%d)=%d bytes, want %d bytes", got, want) + } + } +} + +func TestPriorityThrottleOutOfOrderWrites(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{ThrottleOutOfOrderWrites: true}) + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{PusherID: 1}) + + sc := &serverConn{maxFrameSize: 4096} + st1 := &stream{id: 1, sc: sc} + st2 := &stream{id: 2, sc: sc} + st1.flow.add(4096) + st2.flow.add(4096) + ws.Push(FrameWriteRequest{&writeData{2, make([]byte, 4096), false}, st2, nil}) + ws.AdjustStream(2, PriorityParam{StreamDep: 1}) + + // We have enough flow-control bytes to write st2 in a single Pop call. + // However, due to out-of-order write throttling, the first call should + // only write 1KB. + wr, ok := ws.Pop() + if !ok { + t.Fatalf("Pop(st2.first)=false, want true") + } + if got, want := wr.StreamID(), uint32(2); got != want { + t.Fatalf("Pop(st2.first)=stream %d, want stream %d", got, want) + } + if got, want := wr.DataSize(), 1024; got != want { + t.Fatalf("Pop(st2.first)=%d bytes, want %d bytes", got, want) + } + + // Now add data on st1. This should take precedence. + ws.Push(FrameWriteRequest{&writeData{1, make([]byte, 4096), false}, st1, nil}) + wr, ok = ws.Pop() + if !ok { + t.Fatalf("Pop(st1)=false, want true") + } + if got, want := wr.StreamID(), uint32(1); got != want { + t.Fatalf("Pop(st1)=stream %d, want stream %d", got, want) + } + if got, want := wr.DataSize(), 4096; got != want { + t.Fatalf("Pop(st1)=%d bytes, want %d bytes", got, want) + } + + // Should go back to writing 1KB from st2. + wr, ok = ws.Pop() + if !ok { + t.Fatalf("Pop(st2.last)=false, want true") + } + if got, want := wr.StreamID(), uint32(2); got != want { + t.Fatalf("Pop(st2.last)=stream %d, want stream %d", got, want) + } + if got, want := wr.DataSize(), 1024; got != want { + t.Fatalf("Pop(st2.last)=%d bytes, want %d bytes", got, want) + } +} + +func TestPriorityWeights(t *testing.T) { + ws := defaultPriorityWriteScheduler() + ws.OpenStream(1, OpenStreamOptions{}) + ws.OpenStream(2, OpenStreamOptions{}) + + sc := &serverConn{maxFrameSize: 8} + st1 := &stream{id: 1, sc: sc} + st2 := &stream{id: 2, sc: sc} + st1.flow.add(40) + st2.flow.add(40) + + ws.Push(FrameWriteRequest{&writeData{1, make([]byte, 40), false}, st1, nil}) + ws.Push(FrameWriteRequest{&writeData{2, make([]byte, 40), false}, st2, nil}) + ws.AdjustStream(1, PriorityParam{StreamDep: 0, Weight: 34}) + ws.AdjustStream(2, PriorityParam{StreamDep: 0, Weight: 9}) + + // st1 gets 3.5x the bandwidth of st2 (3.5 = (34+1)/(9+1)). + // The maximum frame size is 8 bytes. The write sequence should be: + // st1, total bytes so far is (st1=8, st=0) + // st2, total bytes so far is (st1=8, st=8) + // st1, total bytes so far is (st1=16, st=8) + // st1, total bytes so far is (st1=24, st=8) // 3x bandwidth + // st1, total bytes so far is (st1=32, st=8) // 4x bandwidth + // st2, total bytes so far is (st1=32, st=16) // 2x bandwidth + // st1, total bytes so far is (st1=40, st=16) + // st2, total bytes so far is (st1=40, st=24) + // st2, total bytes so far is (st1=40, st=32) + // st2, total bytes so far is (st1=40, st=40) + if err := checkPopAll(ws, []uint32{1, 2, 1, 1, 1, 2, 1, 2, 2, 2}); err != nil { + t.Error(err) + } +} + +func TestPriorityRstStreamOnNonOpenStreams(t *testing.T) { + ws := NewPriorityWriteScheduler(&PriorityWriteSchedulerConfig{ + MaxClosedNodesInTree: 0, + MaxIdleNodesInTree: 0, + }) + ws.OpenStream(1, OpenStreamOptions{}) + ws.CloseStream(1) + ws.Push(FrameWriteRequest{write: streamError(1, ErrCodeProtocol)}) + ws.Push(FrameWriteRequest{write: streamError(2, ErrCodeProtocol)}) + + if err := checkPopAll(ws, []uint32{1, 2}); err != nil { + t.Error(err) + } +} diff --git a/vendor/golang.org/x/net/http2/writesched_random.go b/vendor/golang.org/x/net/http2/writesched_random.go new file mode 100644 index 000000000..36d7919f1 --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched_random.go @@ -0,0 +1,72 @@ +// Copyright 2014 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. + +package http2 + +import "math" + +// NewRandomWriteScheduler constructs a WriteScheduler that ignores HTTP/2 +// priorities. Control frames like SETTINGS and PING are written before DATA +// frames, but if no control frames are queued and multiple streams have queued +// HEADERS or DATA frames, Pop selects a ready stream arbitrarily. +func NewRandomWriteScheduler() WriteScheduler { + return &randomWriteScheduler{sq: make(map[uint32]*writeQueue)} +} + +type randomWriteScheduler struct { + // zero are frames not associated with a specific stream. + zero writeQueue + + // sq contains the stream-specific queues, keyed by stream ID. + // When a stream is idle or closed, it's deleted from the map. + sq map[uint32]*writeQueue + + // pool of empty queues for reuse. + queuePool writeQueuePool +} + +func (ws *randomWriteScheduler) OpenStream(streamID uint32, options OpenStreamOptions) { + // no-op: idle streams are not tracked +} + +func (ws *randomWriteScheduler) CloseStream(streamID uint32) { + q, ok := ws.sq[streamID] + if !ok { + return + } + delete(ws.sq, streamID) + ws.queuePool.put(q) +} + +func (ws *randomWriteScheduler) AdjustStream(streamID uint32, priority PriorityParam) { + // no-op: priorities are ignored +} + +func (ws *randomWriteScheduler) Push(wr FrameWriteRequest) { + id := wr.StreamID() + if id == 0 { + ws.zero.push(wr) + return + } + q, ok := ws.sq[id] + if !ok { + q = ws.queuePool.get() + ws.sq[id] = q + } + q.push(wr) +} + +func (ws *randomWriteScheduler) Pop() (FrameWriteRequest, bool) { + // Control frames first. + if !ws.zero.empty() { + return ws.zero.shift(), true + } + // Iterate over all non-idle streams until finding one that can be consumed. + for _, q := range ws.sq { + if wr, ok := q.consume(math.MaxInt32); ok { + return wr, true + } + } + return FrameWriteRequest{}, false +} diff --git a/vendor/golang.org/x/net/http2/writesched_random_test.go b/vendor/golang.org/x/net/http2/writesched_random_test.go new file mode 100644 index 000000000..97b0bcdbf --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched_random_test.go @@ -0,0 +1,44 @@ +// 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. + +package http2 + +import "testing" + +func TestRandomScheduler(t *testing.T) { + ws := NewRandomWriteScheduler() + ws.Push(makeWriteHeadersRequest(3)) + ws.Push(makeWriteHeadersRequest(4)) + ws.Push(makeWriteHeadersRequest(1)) + ws.Push(makeWriteHeadersRequest(2)) + ws.Push(makeWriteNonStreamRequest()) + ws.Push(makeWriteNonStreamRequest()) + + // Pop all frames. Should get the non-stream requests first, + // followed by the stream requests in any order. + var order []FrameWriteRequest + for { + wr, ok := ws.Pop() + if !ok { + break + } + order = append(order, wr) + } + t.Logf("got frames: %v", order) + if len(order) != 6 { + t.Fatalf("got %d frames, expected 6", len(order)) + } + if order[0].StreamID() != 0 || order[1].StreamID() != 0 { + t.Fatalf("expected non-stream frames first", order[0], order[1]) + } + got := make(map[uint32]bool) + for _, wr := range order[2:] { + got[wr.StreamID()] = true + } + for id := uint32(1); id <= 4; id++ { + if !got[id] { + t.Errorf("frame not found for stream %d", id) + } + } +} diff --git a/vendor/golang.org/x/net/http2/writesched_test.go b/vendor/golang.org/x/net/http2/writesched_test.go new file mode 100644 index 000000000..0807056bc --- /dev/null +++ b/vendor/golang.org/x/net/http2/writesched_test.go @@ -0,0 +1,125 @@ +// 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. + +package http2 + +import ( + "fmt" + "math" + "reflect" + "testing" +) + +func makeWriteNonStreamRequest() FrameWriteRequest { + return FrameWriteRequest{writeSettingsAck{}, nil, nil} +} + +func makeWriteHeadersRequest(streamID uint32) FrameWriteRequest { + st := &stream{id: streamID} + return FrameWriteRequest{&writeResHeaders{streamID: streamID, httpResCode: 200}, st, nil} +} + +func checkConsume(wr FrameWriteRequest, nbytes int32, want []FrameWriteRequest) error { + consumed, rest, n := wr.Consume(nbytes) + var wantConsumed, wantRest FrameWriteRequest + switch len(want) { + case 0: + case 1: + wantConsumed = want[0] + case 2: + wantConsumed = want[0] + wantRest = want[1] + } + if !reflect.DeepEqual(consumed, wantConsumed) || !reflect.DeepEqual(rest, wantRest) || n != len(want) { + return fmt.Errorf("got %v, %v, %v\nwant %v, %v, %v", consumed, rest, n, wantConsumed, wantRest, len(want)) + } + return nil +} + +func TestFrameWriteRequestNonData(t *testing.T) { + wr := makeWriteNonStreamRequest() + if got, want := wr.DataSize(), 0; got != want { + t.Errorf("DataSize: got %v, want %v", got, want) + } + + // Non-DATA frames are always consumed whole. + if err := checkConsume(wr, 0, []FrameWriteRequest{wr}); err != nil { + t.Errorf("Consume:\n%v", err) + } +} + +func TestFrameWriteRequestData(t *testing.T) { + st := &stream{ + id: 1, + sc: &serverConn{maxFrameSize: 16}, + } + const size = 32 + wr := FrameWriteRequest{&writeData{st.id, make([]byte, size), true}, st, make(chan error)} + if got, want := wr.DataSize(), size; got != want { + t.Errorf("DataSize: got %v, want %v", got, want) + } + + // No flow-control bytes available: cannot consume anything. + if err := checkConsume(wr, math.MaxInt32, []FrameWriteRequest{}); err != nil { + t.Errorf("Consume(limited by flow control):\n%v", err) + } + + // Add enough flow-control bytes to consume the entire frame, + // but we're now restricted by st.sc.maxFrameSize. + st.flow.add(size) + want := []FrameWriteRequest{ + { + write: &writeData{st.id, make([]byte, st.sc.maxFrameSize), false}, + stream: st, + done: nil, + }, + { + write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize), true}, + stream: st, + done: wr.done, + }, + } + if err := checkConsume(wr, math.MaxInt32, want); err != nil { + t.Errorf("Consume(limited by maxFrameSize):\n%v", err) + } + rest := want[1] + + // Consume 8 bytes from the remaining frame. + want = []FrameWriteRequest{ + { + write: &writeData{st.id, make([]byte, 8), false}, + stream: st, + done: nil, + }, + { + write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize-8), true}, + stream: st, + done: wr.done, + }, + } + if err := checkConsume(rest, 8, want); err != nil { + t.Errorf("Consume(8):\n%v", err) + } + rest = want[1] + + // Consume all remaining bytes. + want = []FrameWriteRequest{ + { + write: &writeData{st.id, make([]byte, size-st.sc.maxFrameSize-8), true}, + stream: st, + done: wr.done, + }, + } + if err := checkConsume(rest, math.MaxInt32, want); err != nil { + t.Errorf("Consume(remainder):\n%v", err) + } +} + +func TestFrameWriteRequest_StreamID(t *testing.T) { + const streamID = 123 + wr := FrameWriteRequest{write: streamError(streamID, ErrCodeNo)} + if got := wr.StreamID(); got != streamID { + t.Errorf("FrameWriteRequest(StreamError) = %v; want %v", got, streamID) + } +} diff --git a/vendor/golang.org/x/net/icmp/echo.go b/vendor/golang.org/x/net/icmp/echo.go index dd5518115..e6f15efd7 100644 --- a/vendor/golang.org/x/net/icmp/echo.go +++ b/vendor/golang.org/x/net/icmp/echo.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/icmp/ipv6.go b/vendor/golang.org/x/net/icmp/ipv6.go index 58eaa77d0..2e8cfeb13 100644 --- a/vendor/golang.org/x/net/icmp/ipv6.go +++ b/vendor/golang.org/x/net/icmp/ipv6.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/icmp/message.go b/vendor/golang.org/x/net/icmp/message.go index 42d6df2c1..ea01bba38 100644 --- a/vendor/golang.org/x/net/icmp/message.go +++ b/vendor/golang.org/x/net/icmp/message.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/icmp/messagebody.go b/vendor/golang.org/x/net/icmp/messagebody.go index 2121a17be..2463730ae 100644 --- a/vendor/golang.org/x/net/icmp/messagebody.go +++ b/vendor/golang.org/x/net/icmp/messagebody.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/internal/iana/gen.go b/vendor/golang.org/x/net/internal/iana/gen.go index 2d8c07ca1..86c78b3bb 100644 --- a/vendor/golang.org/x/net/internal/iana/gen.go +++ b/vendor/golang.org/x/net/internal/iana/gen.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/internal/nettest/helper_bsd.go b/vendor/golang.org/x/net/internal/nettest/helper_bsd.go index b2308a0e8..a6e433b58 100644 --- a/vendor/golang.org/x/net/internal/nettest/helper_bsd.go +++ b/vendor/golang.org/x/net/internal/nettest/helper_bsd.go @@ -13,6 +13,23 @@ import ( "syscall" ) +var darwinVersion int + +func init() { + if runtime.GOOS == "darwin" { + // See http://support.apple.com/kb/HT1633. + s, err := syscall.Sysctl("kern.osrelease") + if err != nil { + return + } + ss := strings.Split(s, ".") + if len(ss) == 0 { + return + } + darwinVersion, _ = strconv.Atoi(ss[0]) + } +} + func supportsIPv6MulticastDeliveryOnLoopback() bool { switch runtime.GOOS { case "freebsd": @@ -22,27 +39,15 @@ func supportsIPv6MulticastDeliveryOnLoopback() bool { // packets correctly. return false case "darwin": - // See http://support.apple.com/kb/HT1633. - s, err := syscall.Sysctl("kern.osrelease") - if err != nil { - return false - } - ss := strings.Split(s, ".") - if len(ss) == 0 { - return false - } - // OS X 10.9 (Darwin 13) or above seems to do the - // right thing; preserving the packet header as it's - // needed for the checksum calcuration with pseudo - // header on loopback multicast delivery process. - // If not, you'll probably see what is the slow-acting - // kernel crash caused by lazy mbuf corruption. - // See ip6_mloopback in netinet6/ip6_output.c. - if mjver, err := strconv.Atoi(ss[0]); err != nil || mjver < 13 { - return false - } - return true + return !causesIPv6Crash() default: return true } } + +func causesIPv6Crash() bool { + // We see some kernel crash when running IPv6 with IP-level + // options on Darwin kernel version 12 or below. + // See golang.org/issues/17015. + return darwinVersion < 13 +} diff --git a/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go b/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go index a42b80709..bc7da5e0d 100644 --- a/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go +++ b/vendor/golang.org/x/net/internal/nettest/helper_nobsd.go @@ -9,3 +9,7 @@ package nettest func supportsIPv6MulticastDeliveryOnLoopback() bool { return true } + +func causesIPv6Crash() bool { + return false +} diff --git a/vendor/golang.org/x/net/internal/nettest/helper_stub.go b/vendor/golang.org/x/net/internal/nettest/helper_stub.go index 22d493585..ea61b6f39 100644 --- a/vendor/golang.org/x/net/internal/nettest/helper_stub.go +++ b/vendor/golang.org/x/net/internal/nettest/helper_stub.go @@ -23,6 +23,10 @@ func supportsIPv6MulticastDeliveryOnLoopback() bool { return false } +func causesIPv6Crash() bool { + return false +} + func protocolNotSupported(err error) bool { return false } diff --git a/vendor/golang.org/x/net/internal/nettest/helper_windows.go b/vendor/golang.org/x/net/internal/nettest/helper_windows.go index b0a6a30c4..3dcb727c9 100644 --- a/vendor/golang.org/x/net/internal/nettest/helper_windows.go +++ b/vendor/golang.org/x/net/internal/nettest/helper_windows.go @@ -36,3 +36,7 @@ func supportsRawIPSocket() (string, bool) { func supportsIPv6MulticastDeliveryOnLoopback() bool { return true } + +func causesIPv6Crash() bool { + return false +} diff --git a/vendor/golang.org/x/net/internal/nettest/interface.go b/vendor/golang.org/x/net/internal/nettest/interface.go index 53ae13a98..8e6333afe 100644 --- a/vendor/golang.org/x/net/internal/nettest/interface.go +++ b/vendor/golang.org/x/net/internal/nettest/interface.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/internal/nettest/stack.go b/vendor/golang.org/x/net/internal/nettest/stack.go index 86de2773d..5ab95305d 100644 --- a/vendor/golang.org/x/net/internal/nettest/stack.go +++ b/vendor/golang.org/x/net/internal/nettest/stack.go @@ -21,6 +21,9 @@ func SupportsIPv4() bool { // SupportsIPv6 reports whether the platform supports IPv6 networking // functionality. func SupportsIPv6() bool { + if causesIPv6Crash() { + return false + } ln, err := net.Listen("tcp6", "[::1]:0") if err != nil { return false diff --git a/vendor/golang.org/x/net/ipv4/bpfopt_linux.go b/vendor/golang.org/x/net/ipv4/bpfopt_linux.go index e9bbda96e..2d626d924 100644 --- a/vendor/golang.org/x/net/ipv4/bpfopt_linux.go +++ b/vendor/golang.org/x/net/ipv4/bpfopt_linux.go @@ -20,9 +20,9 @@ func (c *dgramOpt) SetBPF(filter []bpf.RawInstruction) error { if err != nil { return err } - prog := sysSockFProg{ + prog := sockFProg{ Len: uint16(len(filter)), - Filter: (*sysSockFilter)(unsafe.Pointer(&filter[0])), + Filter: (*sockFilter)(unsafe.Pointer(&filter[0])), } return os.NewSyscallError("setsockopt", setsockopt(s, sysSOL_SOCKET, sysSO_ATTACH_FILTER, unsafe.Pointer(&prog), uint32(unsafe.Sizeof(prog)))) } diff --git a/vendor/golang.org/x/net/ipv4/control.go b/vendor/golang.org/x/net/ipv4/control.go index 8cadfd7f3..da4da2dd0 100644 --- a/vendor/golang.org/x/net/ipv4/control.go +++ b/vendor/golang.org/x/net/ipv4/control.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/ipv4/control_bsd.go b/vendor/golang.org/x/net/ipv4/control_bsd.go index 33d8bc8b3..3f27f9945 100644 --- a/vendor/golang.org/x/net/ipv4/control_bsd.go +++ b/vendor/golang.org/x/net/ipv4/control_bsd.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/ipv4/control_pktinfo.go b/vendor/golang.org/x/net/ipv4/control_pktinfo.go index 444782f39..9ed977341 100644 --- a/vendor/golang.org/x/net/ipv4/control_pktinfo.go +++ b/vendor/golang.org/x/net/ipv4/control_pktinfo.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin linux +// +build darwin linux solaris package ipv4 @@ -17,9 +17,9 @@ func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) m.Level = iana.ProtocolIP m.Type = sysIP_PKTINFO - m.SetLen(syscall.CmsgLen(sysSizeofInetPktinfo)) + m.SetLen(syscall.CmsgLen(sizeofInetPktinfo)) if cm != nil { - pi := (*sysInetPktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) + pi := (*inetPktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) if ip := cm.Src.To4(); ip != nil { copy(pi.Spec_dst[:], ip) } @@ -27,11 +27,11 @@ func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { pi.setIfindex(cm.IfIndex) } } - return b[syscall.CmsgSpace(sysSizeofInetPktinfo):] + return b[syscall.CmsgSpace(sizeofInetPktinfo):] } func parsePacketInfo(cm *ControlMessage, b []byte) { - pi := (*sysInetPktinfo)(unsafe.Pointer(&b[0])) + pi := (*inetPktinfo)(unsafe.Pointer(&b[0])) cm.IfIndex = int(pi.Ifindex) cm.Dst = pi.Addr[:] } diff --git a/vendor/golang.org/x/net/ipv4/control_stub.go b/vendor/golang.org/x/net/ipv4/control_stub.go index 5f5a1bd0d..27e618bc2 100644 --- a/vendor/golang.org/x/net/ipv4/control_stub.go +++ b/vendor/golang.org/x/net/ipv4/control_stub.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 nacl plan9 solaris +// +build nacl plan9 package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/control_unix.go b/vendor/golang.org/x/net/ipv4/control_unix.go index 6b6682d65..25ef66192 100644 --- a/vendor/golang.org/x/net/ipv4/control_unix.go +++ b/vendor/golang.org/x/net/ipv4/control_unix.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 darwin dragonfly freebsd linux netbsd openbsd +// +build darwin dragonfly freebsd linux netbsd openbsd solaris package ipv4 @@ -83,22 +83,6 @@ func newControlMessage(opt *rawOpt) (oob []byte) { } if l > 0 { oob = make([]byte, l) - b := oob - if opt.isset(FlagTTL) && ctlOpts[ctlTTL].name > 0 { - b = ctlOpts[ctlTTL].marshal(b, nil) - } - if ctlOpts[ctlPacketInfo].name > 0 { - if opt.isset(FlagSrc | FlagDst | FlagInterface) { - b = ctlOpts[ctlPacketInfo].marshal(b, nil) - } - } else { - if opt.isset(FlagDst) && ctlOpts[ctlDst].name > 0 { - b = ctlOpts[ctlDst].marshal(b, nil) - } - if opt.isset(FlagInterface) && ctlOpts[ctlInterface].name > 0 { - b = ctlOpts[ctlInterface].marshal(b, nil) - } - } } opt.RUnlock() return diff --git a/vendor/golang.org/x/net/ipv4/control_windows.go b/vendor/golang.org/x/net/ipv4/control_windows.go index 49a113b58..b27407db9 100644 --- a/vendor/golang.org/x/net/ipv4/control_windows.go +++ b/vendor/golang.org/x/net/ipv4/control_windows.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/ipv4/defs_darwin.go b/vendor/golang.org/x/net/ipv4/defs_darwin.go index 731d56a71..c8f2e05b8 100644 --- a/vendor/golang.org/x/net/ipv4/defs_darwin.go +++ b/vendor/golang.org/x/net/ipv4/defs_darwin.go @@ -49,29 +49,29 @@ const ( sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE - sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sysSizeofSockaddrInet = C.sizeof_struct_sockaddr_in - sysSizeofInetPktinfo = C.sizeof_struct_in_pktinfo - - sysSizeofIPMreq = C.sizeof_struct_ip_mreq - sysSizeofIPMreqn = C.sizeof_struct_ip_mreqn - sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofInetPktinfo = C.sizeof_struct_in_pktinfo + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqn = C.sizeof_struct_ip_mreqn + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req ) -type sysSockaddrStorage C.struct_sockaddr_storage +type sockaddrStorage C.struct_sockaddr_storage -type sysSockaddrInet C.struct_sockaddr_in +type sockaddrInet C.struct_sockaddr_in -type sysInetPktinfo C.struct_in_pktinfo +type inetPktinfo C.struct_in_pktinfo -type sysIPMreq C.struct_ip_mreq +type ipMreq C.struct_ip_mreq -type sysIPMreqn C.struct_ip_mreqn +type ipMreqn C.struct_ip_mreqn -type sysIPMreqSource C.struct_ip_mreq_source +type ipMreqSource C.struct_ip_mreq_source -type sysGroupReq C.struct_group_req +type groupReq C.struct_group_req -type sysGroupSourceReq C.struct_group_source_req +type groupSourceReq C.struct_group_source_req diff --git a/vendor/golang.org/x/net/ipv4/defs_dragonfly.go b/vendor/golang.org/x/net/ipv4/defs_dragonfly.go index 08e3b855d..f30544ea2 100644 --- a/vendor/golang.org/x/net/ipv4/defs_dragonfly.go +++ b/vendor/golang.org/x/net/ipv4/defs_dragonfly.go @@ -32,7 +32,7 @@ const ( sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP - sysSizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreq = C.sizeof_struct_ip_mreq ) -type sysIPMreq C.struct_ip_mreq +type ipMreq C.struct_ip_mreq diff --git a/vendor/golang.org/x/net/ipv4/defs_freebsd.go b/vendor/golang.org/x/net/ipv4/defs_freebsd.go index f12ca327b..4dd57d865 100644 --- a/vendor/golang.org/x/net/ipv4/defs_freebsd.go +++ b/vendor/golang.org/x/net/ipv4/defs_freebsd.go @@ -50,26 +50,26 @@ const ( sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE - sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sysSizeofSockaddrInet = C.sizeof_struct_sockaddr_in - - sysSizeofIPMreq = C.sizeof_struct_ip_mreq - sysSizeofIPMreqn = C.sizeof_struct_ip_mreqn - sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqn = C.sizeof_struct_ip_mreqn + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req ) -type sysSockaddrStorage C.struct_sockaddr_storage +type sockaddrStorage C.struct_sockaddr_storage -type sysSockaddrInet C.struct_sockaddr_in +type sockaddrInet C.struct_sockaddr_in -type sysIPMreq C.struct_ip_mreq +type ipMreq C.struct_ip_mreq -type sysIPMreqn C.struct_ip_mreqn +type ipMreqn C.struct_ip_mreqn -type sysIPMreqSource C.struct_ip_mreq_source +type ipMreqSource C.struct_ip_mreq_source -type sysGroupReq C.struct_group_req +type groupReq C.struct_group_req -type sysGroupSourceReq C.struct_group_source_req +type groupSourceReq C.struct_group_source_req diff --git a/vendor/golang.org/x/net/ipv4/defs_linux.go b/vendor/golang.org/x/net/ipv4/defs_linux.go index c4042eb60..31dfa093c 100644 --- a/vendor/golang.org/x/net/ipv4/defs_linux.go +++ b/vendor/golang.org/x/net/ipv4/defs_linux.go @@ -81,40 +81,40 @@ const ( sysSOL_SOCKET = C.SOL_SOCKET sysSO_ATTACH_FILTER = C.SO_ATTACH_FILTER - sysSizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage - sysSizeofSockaddrInet = C.sizeof_struct_sockaddr_in - sysSizeofInetPktinfo = C.sizeof_struct_in_pktinfo - sysSizeofSockExtendedErr = C.sizeof_struct_sock_extended_err - - sysSizeofIPMreq = C.sizeof_struct_ip_mreq - sysSizeofIPMreqn = C.sizeof_struct_ip_mreqn - sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req - - sysSizeofICMPFilter = C.sizeof_struct_icmp_filter + sizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofInetPktinfo = C.sizeof_struct_in_pktinfo + sizeofSockExtendedErr = C.sizeof_struct_sock_extended_err + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqn = C.sizeof_struct_ip_mreqn + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req + + sizeofICMPFilter = C.sizeof_struct_icmp_filter ) -type sysKernelSockaddrStorage C.struct___kernel_sockaddr_storage +type kernelSockaddrStorage C.struct___kernel_sockaddr_storage -type sysSockaddrInet C.struct_sockaddr_in +type sockaddrInet C.struct_sockaddr_in -type sysInetPktinfo C.struct_in_pktinfo +type inetPktinfo C.struct_in_pktinfo -type sysSockExtendedErr C.struct_sock_extended_err +type sockExtendedErr C.struct_sock_extended_err -type sysIPMreq C.struct_ip_mreq +type ipMreq C.struct_ip_mreq -type sysIPMreqn C.struct_ip_mreqn +type ipMreqn C.struct_ip_mreqn -type sysIPMreqSource C.struct_ip_mreq_source +type ipMreqSource C.struct_ip_mreq_source -type sysGroupReq C.struct_group_req +type groupReq C.struct_group_req -type sysGroupSourceReq C.struct_group_source_req +type groupSourceReq C.struct_group_source_req -type sysICMPFilter C.struct_icmp_filter +type icmpFilter C.struct_icmp_filter -type sysSockFProg C.struct_sock_fprog +type sockFProg C.struct_sock_fprog -type sysSockFilter C.struct_sock_filter +type sockFilter C.struct_sock_filter diff --git a/vendor/golang.org/x/net/ipv4/defs_netbsd.go b/vendor/golang.org/x/net/ipv4/defs_netbsd.go index 8642354f4..8f8af1b89 100644 --- a/vendor/golang.org/x/net/ipv4/defs_netbsd.go +++ b/vendor/golang.org/x/net/ipv4/defs_netbsd.go @@ -31,7 +31,7 @@ const ( sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP - sysSizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreq = C.sizeof_struct_ip_mreq ) -type sysIPMreq C.struct_ip_mreq +type ipMreq C.struct_ip_mreq diff --git a/vendor/golang.org/x/net/ipv4/defs_openbsd.go b/vendor/golang.org/x/net/ipv4/defs_openbsd.go index 8642354f4..8f8af1b89 100644 --- a/vendor/golang.org/x/net/ipv4/defs_openbsd.go +++ b/vendor/golang.org/x/net/ipv4/defs_openbsd.go @@ -31,7 +31,7 @@ const ( sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP - sysSizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreq = C.sizeof_struct_ip_mreq ) -type sysIPMreq C.struct_ip_mreq +type ipMreq C.struct_ip_mreq diff --git a/vendor/golang.org/x/net/ipv4/defs_solaris.go b/vendor/golang.org/x/net/ipv4/defs_solaris.go index bb74afa49..aeb33e9c8 100644 --- a/vendor/golang.org/x/net/ipv4/defs_solaris.go +++ b/vendor/golang.org/x/net/ipv4/defs_solaris.go @@ -9,30 +9,24 @@ package ipv4 /* +#include <sys/socket.h> + #include <netinet/in.h> */ import "C" const ( - sysIP_OPTIONS = C.IP_OPTIONS - sysIP_HDRINCL = C.IP_HDRINCL - sysIP_TOS = C.IP_TOS - sysIP_TTL = C.IP_TTL - sysIP_RECVOPTS = C.IP_RECVOPTS - sysIP_RECVRETOPTS = C.IP_RECVRETOPTS - sysIP_RECVDSTADDR = C.IP_RECVDSTADDR - sysIP_RETOPTS = C.IP_RETOPTS - sysIP_RECVIF = C.IP_RECVIF - sysIP_RECVSLLA = C.IP_RECVSLLA - sysIP_RECVTTL = C.IP_RECVTTL - sysIP_NEXTHOP = C.IP_NEXTHOP - sysIP_PKTINFO = C.IP_PKTINFO - sysIP_RECVPKTINFO = C.IP_RECVPKTINFO - sysIP_DONTFRAG = C.IP_DONTFRAG - sysIP_BOUND_IF = C.IP_BOUND_IF - sysIP_UNSPEC_SRC = C.IP_UNSPEC_SRC - sysIP_BROADCAST_TTL = C.IP_BROADCAST_TTL - sysIP_DHCPINIT_IF = C.IP_DHCPINIT_IF + sysIP_OPTIONS = C.IP_OPTIONS + sysIP_HDRINCL = C.IP_HDRINCL + sysIP_TOS = C.IP_TOS + sysIP_TTL = C.IP_TTL + sysIP_RECVOPTS = C.IP_RECVOPTS + sysIP_RECVRETOPTS = C.IP_RECVRETOPTS + sysIP_RECVDSTADDR = C.IP_RECVDSTADDR + sysIP_RETOPTS = C.IP_RETOPTS + sysIP_RECVIF = C.IP_RECVIF + sysIP_RECVSLLA = C.IP_RECVSLLA + sysIP_RECVTTL = C.IP_RECVTTL sysIP_MULTICAST_IF = C.IP_MULTICAST_IF sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL @@ -43,15 +37,48 @@ const ( sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP + sysIP_NEXTHOP = C.IP_NEXTHOP - sysSizeofInetPktinfo = C.sizeof_struct_in_pktinfo + sysIP_PKTINFO = C.IP_PKTINFO + sysIP_RECVPKTINFO = C.IP_RECVPKTINFO + sysIP_DONTFRAG = C.IP_DONTFRAG - sysSizeofIPMreq = C.sizeof_struct_ip_mreq - sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sysIP_BOUND_IF = C.IP_BOUND_IF + sysIP_UNSPEC_SRC = C.IP_UNSPEC_SRC + sysIP_BROADCAST_TTL = C.IP_BROADCAST_TTL + sysIP_DHCPINIT_IF = C.IP_DHCPINIT_IF + + sysIP_REUSEADDR = C.IP_REUSEADDR + sysIP_DONTROUTE = C.IP_DONTROUTE + sysIP_BROADCAST = C.IP_BROADCAST + + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofInetPktinfo = C.sizeof_struct_in_pktinfo + + sizeofIPMreq = C.sizeof_struct_ip_mreq + sizeofIPMreqSource = C.sizeof_struct_ip_mreq_source + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req ) -type sysInetPktinfo C.struct_in_pktinfo +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet C.struct_sockaddr_in + +type inetPktinfo C.struct_in_pktinfo + +type ipMreq C.struct_ip_mreq + +type ipMreqSource C.struct_ip_mreq_source -type sysIPMreq C.struct_ip_mreq +type groupReq C.struct_group_req -type sysIPMreqSource C.struct_ip_mreq_source +type groupSourceReq C.struct_group_source_req diff --git a/vendor/golang.org/x/net/ipv4/dgramopt_posix.go b/vendor/golang.org/x/net/ipv4/dgramopt_posix.go index 40b5e1cdc..fbc5df198 100644 --- a/vendor/golang.org/x/net/ipv4/dgramopt_posix.go +++ b/vendor/golang.org/x/net/ipv4/dgramopt_posix.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 darwin dragonfly freebsd linux netbsd openbsd windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/dgramopt_stub.go b/vendor/golang.org/x/net/ipv4/dgramopt_stub.go index b74df6931..f6b867f92 100644 --- a/vendor/golang.org/x/net/ipv4/dgramopt_stub.go +++ b/vendor/golang.org/x/net/ipv4/dgramopt_stub.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 nacl plan9 solaris +// +build nacl plan9 package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/doc.go b/vendor/golang.org/x/net/ipv4/doc.go index d58a4c9e6..7b25ea2ee 100644 --- a/vendor/golang.org/x/net/ipv4/doc.go +++ b/vendor/golang.org/x/net/ipv4/doc.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/ipv4/endpoint.go b/vendor/golang.org/x/net/ipv4/endpoint.go index a8ca2ff67..dc7557b66 100644 --- a/vendor/golang.org/x/net/ipv4/endpoint.go +++ b/vendor/golang.org/x/net/ipv4/endpoint.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/ipv4/example_test.go b/vendor/golang.org/x/net/ipv4/example_test.go index 4f5e2f312..ddc7577e8 100644 --- a/vendor/golang.org/x/net/ipv4/example_test.go +++ b/vendor/golang.org/x/net/ipv4/example_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/ipv4/gen.go b/vendor/golang.org/x/net/ipv4/gen.go index cbe70327b..ffb44fe68 100644 --- a/vendor/golang.org/x/net/ipv4/gen.go +++ b/vendor/golang.org/x/net/ipv4/gen.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -52,15 +52,6 @@ func genzsys() error { if err != nil { return err } - // The ipv4 package still supports go1.2, and so we need to - // take care of additional platforms in go1.3 and above for - // working with go1.2. - switch { - case runtime.GOOS == "dragonfly" || runtime.GOOS == "solaris": - b = bytes.Replace(b, []byte("package ipv4\n"), []byte("// +build "+runtime.GOOS+"\n\npackage ipv4\n"), 1) - case runtime.GOOS == "linux" && (runtime.GOARCH == "arm64" || runtime.GOARCH == "mips64" || runtime.GOARCH == "mips64le" || runtime.GOARCH == "ppc" || runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le" || runtime.GOARCH == "s390x"): - b = bytes.Replace(b, []byte("package ipv4\n"), []byte("// +build "+runtime.GOOS+","+runtime.GOARCH+"\n\npackage ipv4\n"), 1) - } b, err = format.Source(b) if err != nil { return err diff --git a/vendor/golang.org/x/net/ipv4/genericopt_posix.go b/vendor/golang.org/x/net/ipv4/genericopt_posix.go index 53bc79ff5..58168b737 100644 --- a/vendor/golang.org/x/net/ipv4/genericopt_posix.go +++ b/vendor/golang.org/x/net/ipv4/genericopt_posix.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 darwin dragonfly freebsd linux netbsd openbsd windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/genericopt_stub.go b/vendor/golang.org/x/net/ipv4/genericopt_stub.go index 1817badb1..661a4d1ab 100644 --- a/vendor/golang.org/x/net/ipv4/genericopt_stub.go +++ b/vendor/golang.org/x/net/ipv4/genericopt_stub.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 nacl plan9 solaris +// +build nacl plan9 package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/header.go b/vendor/golang.org/x/net/ipv4/header.go index 363d9c21a..6dc26d43f 100644 --- a/vendor/golang.org/x/net/ipv4/header.go +++ b/vendor/golang.org/x/net/ipv4/header.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. @@ -63,9 +63,17 @@ func (h *Header) Marshal() ([]byte, error) { b[1] = byte(h.TOS) flagsAndFragOff := (h.FragOff & 0x1fff) | int(h.Flags<<13) switch runtime.GOOS { - case "darwin", "dragonfly", "freebsd", "netbsd": + case "darwin", "dragonfly", "netbsd": nativeEndian.PutUint16(b[2:4], uint16(h.TotalLen)) nativeEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + case "freebsd": + if freebsdVersion < 1100000 { + nativeEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + nativeEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } else { + binary.BigEndian.PutUint16(b[2:4], uint16(h.TotalLen)) + binary.BigEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) + } default: binary.BigEndian.PutUint16(b[2:4], uint16(h.TotalLen)) binary.BigEndian.PutUint16(b[6:8], uint16(flagsAndFragOff)) @@ -113,11 +121,16 @@ func ParseHeader(b []byte) (*Header, error) { h.TotalLen = int(nativeEndian.Uint16(b[2:4])) + hdrlen h.FragOff = int(nativeEndian.Uint16(b[6:8])) case "freebsd": - h.TotalLen = int(nativeEndian.Uint16(b[2:4])) - if freebsdVersion < 1000000 { - h.TotalLen += hdrlen + if freebsdVersion < 1100000 { + h.TotalLen = int(nativeEndian.Uint16(b[2:4])) + if freebsdVersion < 1000000 { + h.TotalLen += hdrlen + } + h.FragOff = int(nativeEndian.Uint16(b[6:8])) + } else { + h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) + h.FragOff = int(binary.BigEndian.Uint16(b[6:8])) } - h.FragOff = int(nativeEndian.Uint16(b[6:8])) default: h.TotalLen = int(binary.BigEndian.Uint16(b[2:4])) h.FragOff = int(binary.BigEndian.Uint16(b[6:8])) diff --git a/vendor/golang.org/x/net/ipv4/header_test.go b/vendor/golang.org/x/net/ipv4/header_test.go index 85cb9c489..cdf27fd03 100644 --- a/vendor/golang.org/x/net/ipv4/header_test.go +++ b/vendor/golang.org/x/net/ipv4/header_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. @@ -18,8 +18,9 @@ type headerTest struct { wireHeaderFromKernel [HeaderLen]byte wireHeaderToKernel [HeaderLen]byte wireHeaderFromTradBSDKernel [HeaderLen]byte - wireHeaderFromFreeBSD10Kernel [HeaderLen]byte wireHeaderToTradBSDKernel [HeaderLen]byte + wireHeaderFromFreeBSD10Kernel [HeaderLen]byte + wireHeaderToFreeBSD10Kernel [HeaderLen]byte *Header } @@ -47,6 +48,13 @@ var headerLittleEndianTest = headerTest{ 172, 16, 254, 254, 192, 168, 0, 1, }, + wireHeaderToTradBSDKernel: [HeaderLen]byte{ + 0x45, 0x01, 0xef, 0xbe, + 0xca, 0xfe, 0xdc, 0x45, + 0xff, 0x01, 0xde, 0xad, + 172, 16, 254, 254, + 192, 168, 0, 1, + }, wireHeaderFromFreeBSD10Kernel: [HeaderLen]byte{ 0x45, 0x01, 0xef, 0xbe, 0xca, 0xfe, 0xdc, 0x45, @@ -54,7 +62,7 @@ var headerLittleEndianTest = headerTest{ 172, 16, 254, 254, 192, 168, 0, 1, }, - wireHeaderToTradBSDKernel: [HeaderLen]byte{ + wireHeaderToFreeBSD10Kernel: [HeaderLen]byte{ 0x45, 0x01, 0xef, 0xbe, 0xca, 0xfe, 0xdc, 0x45, 0xff, 0x01, 0xde, 0xad, @@ -92,10 +100,13 @@ func TestMarshalHeader(t *testing.T) { case "darwin", "dragonfly", "netbsd": wh = tt.wireHeaderToTradBSDKernel[:] case "freebsd": - if freebsdVersion < 1000000 { + switch { + case freebsdVersion < 1000000: wh = tt.wireHeaderToTradBSDKernel[:] - } else { - wh = tt.wireHeaderFromFreeBSD10Kernel[:] + case 1000000 <= freebsdVersion && freebsdVersion < 1100000: + wh = tt.wireHeaderToFreeBSD10Kernel[:] + default: + wh = tt.wireHeaderToKernel[:] } default: wh = tt.wireHeaderToKernel[:] @@ -116,10 +127,13 @@ func TestParseHeader(t *testing.T) { case "darwin", "dragonfly", "netbsd": wh = tt.wireHeaderFromTradBSDKernel[:] case "freebsd": - if freebsdVersion < 1000000 { + switch { + case freebsdVersion < 1000000: wh = tt.wireHeaderFromTradBSDKernel[:] - } else { + case 1000000 <= freebsdVersion && freebsdVersion < 1100000: wh = tt.wireHeaderFromFreeBSD10Kernel[:] + default: + wh = tt.wireHeaderFromKernel[:] } default: wh = tt.wireHeaderFromKernel[:] diff --git a/vendor/golang.org/x/net/ipv4/helper.go b/vendor/golang.org/x/net/ipv4/helper.go index acecfd0d3..083897995 100644 --- a/vendor/golang.org/x/net/ipv4/helper.go +++ b/vendor/golang.org/x/net/ipv4/helper.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/ipv4/icmp.go b/vendor/golang.org/x/net/ipv4/icmp.go index dbd05cff2..097bea846 100644 --- a/vendor/golang.org/x/net/ipv4/icmp.go +++ b/vendor/golang.org/x/net/ipv4/icmp.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -31,7 +31,7 @@ func (typ ICMPType) Protocol() int { // A router means a node that forwards IP packets not explicitly // addressed to itself, and a host means a node that is not a router. type ICMPFilter struct { - sysICMPFilter + icmpFilter } // Accept accepts incoming ICMP packets including the type field value diff --git a/vendor/golang.org/x/net/ipv4/icmp_linux.go b/vendor/golang.org/x/net/ipv4/icmp_linux.go index c91225335..6e1c5c80a 100644 --- a/vendor/golang.org/x/net/ipv4/icmp_linux.go +++ b/vendor/golang.org/x/net/ipv4/icmp_linux.go @@ -4,15 +4,15 @@ package ipv4 -func (f *sysICMPFilter) accept(typ ICMPType) { +func (f *icmpFilter) accept(typ ICMPType) { f.Data &^= 1 << (uint32(typ) & 31) } -func (f *sysICMPFilter) block(typ ICMPType) { +func (f *icmpFilter) block(typ ICMPType) { f.Data |= 1 << (uint32(typ) & 31) } -func (f *sysICMPFilter) setAll(block bool) { +func (f *icmpFilter) setAll(block bool) { if block { f.Data = 1<<32 - 1 } else { @@ -20,6 +20,6 @@ func (f *sysICMPFilter) setAll(block bool) { } } -func (f *sysICMPFilter) willBlock(typ ICMPType) bool { +func (f *icmpFilter) willBlock(typ ICMPType) bool { return f.Data&(1<<(uint32(typ)&31)) != 0 } diff --git a/vendor/golang.org/x/net/ipv4/icmp_stub.go b/vendor/golang.org/x/net/ipv4/icmp_stub.go index 9ee9b6a32..21bb29ab3 100644 --- a/vendor/golang.org/x/net/ipv4/icmp_stub.go +++ b/vendor/golang.org/x/net/ipv4/icmp_stub.go @@ -6,20 +6,20 @@ package ipv4 -const sysSizeofICMPFilter = 0x0 +const sizeofICMPFilter = 0x0 -type sysICMPFilter struct { +type icmpFilter struct { } -func (f *sysICMPFilter) accept(typ ICMPType) { +func (f *icmpFilter) accept(typ ICMPType) { } -func (f *sysICMPFilter) block(typ ICMPType) { +func (f *icmpFilter) block(typ ICMPType) { } -func (f *sysICMPFilter) setAll(block bool) { +func (f *icmpFilter) setAll(block bool) { } -func (f *sysICMPFilter) willBlock(typ ICMPType) bool { +func (f *icmpFilter) willBlock(typ ICMPType) bool { return false } diff --git a/vendor/golang.org/x/net/ipv4/mocktransponder_test.go b/vendor/golang.org/x/net/ipv4/mocktransponder_test.go index e55aaee91..e96c48af8 100644 --- a/vendor/golang.org/x/net/ipv4/mocktransponder_test.go +++ b/vendor/golang.org/x/net/ipv4/mocktransponder_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/ipv4/multicast_test.go b/vendor/golang.org/x/net/ipv4/multicast_test.go index d2bcf8533..bcf49736b 100644 --- a/vendor/golang.org/x/net/ipv4/multicast_test.go +++ b/vendor/golang.org/x/net/ipv4/multicast_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. @@ -166,7 +166,11 @@ func TestPacketConnReadWriteMulticastICMP(t *testing.T) { if _, err := p.MulticastLoopback(); err != nil { t.Fatal(err) } - cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + cf := ipv4.FlagDst | ipv4.FlagInterface + if runtime.GOOS != "solaris" { + // Solaris never allows to modify ICMP properties. + cf |= ipv4.FlagTTL + } for i, toggle := range []bool{true, false, true} { wb, err := (&icmp.Message{ diff --git a/vendor/golang.org/x/net/ipv4/multicastlistener_test.go b/vendor/golang.org/x/net/ipv4/multicastlistener_test.go index e342bf1d9..a0c24b55b 100644 --- a/vendor/golang.org/x/net/ipv4/multicastlistener_test.go +++ b/vendor/golang.org/x/net/ipv4/multicastlistener_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. @@ -21,7 +21,7 @@ var udpMultipleGroupListenerTests = []net.Addr{ func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if testing.Short() { @@ -61,7 +61,7 @@ func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if testing.Short() { @@ -113,7 +113,7 @@ func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if testing.Short() { @@ -156,7 +156,7 @@ func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { func TestIPSingleRawConnWithSingleGroupListener(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if testing.Short() { @@ -201,7 +201,7 @@ func TestIPSingleRawConnWithSingleGroupListener(t *testing.T) { func TestIPPerInterfaceSingleRawConnWithSingleGroupListener(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if testing.Short() { diff --git a/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go b/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go index c76dbe4de..f7efac24c 100644 --- a/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go +++ b/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. @@ -26,7 +26,7 @@ var packetConnMulticastSocketOptionTests = []struct { func TestPacketConnMulticastSocketOptions(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris": + case "nacl", "plan9": t.Skipf("not supported on %s", runtime.GOOS) } ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) @@ -66,7 +66,7 @@ var rawConnMulticastSocketOptionTests = []struct { func TestRawConnMulticastSocketOptions(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris": + case "nacl", "plan9": t.Skipf("not supported on %s", runtime.GOOS) } if m, ok := nettest.SupportsRawIPSocket(); !ok { diff --git a/vendor/golang.org/x/net/ipv4/packet.go b/vendor/golang.org/x/net/ipv4/packet.go index 09864314e..a4ff8159b 100644 --- a/vendor/golang.org/x/net/ipv4/packet.go +++ b/vendor/golang.org/x/net/ipv4/packet.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/ipv4/payload.go b/vendor/golang.org/x/net/ipv4/payload.go index d7698cbd3..25ca8a5fb 100644 --- a/vendor/golang.org/x/net/ipv4/payload.go +++ b/vendor/golang.org/x/net/ipv4/payload.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/vendor/golang.org/x/net/ipv4/payload_cmsg.go index d358fc3ac..9bcde8f9a 100644 --- a/vendor/golang.org/x/net/ipv4/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_cmsg.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 !plan9,!solaris,!windows +// +build !plan9,!windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go index d128c9c2e..6f1b402f7 100644 --- a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 plan9 solaris windows +// +build plan9 windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/readwrite_test.go b/vendor/golang.org/x/net/ipv4/readwrite_test.go index 247d06c1a..a2384b8f9 100644 --- a/vendor/golang.org/x/net/ipv4/readwrite_test.go +++ b/vendor/golang.org/x/net/ipv4/readwrite_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. @@ -91,7 +91,7 @@ func benchmarkReadWriteIPv4UDP(b *testing.B, p *ipv4.PacketConn, wb, rb []byte, func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq.go index 4a6aa78ef..8092f1db0 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_asmreq.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_asmreq.go @@ -1,14 +1,14 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 darwin dragonfly freebsd netbsd openbsd windows +// +build darwin dragonfly freebsd netbsd openbsd solaris windows package ipv4 import "net" -func setIPMreqInterface(mreq *sysIPMreq, ifi *net.Interface) error { +func setIPMreqInterface(mreq *ipMreq, ifi *net.Interface) error { if ifi == nil { return nil } diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_posix.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_posix.go index ef9b13902..2259a3903 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_posix.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_posix.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 darwin dragonfly freebsd netbsd openbsd windows +// +build darwin dragonfly freebsd netbsd openbsd solaris windows package ipv4 @@ -15,11 +15,11 @@ import ( ) func setsockoptIPMreq(s uintptr, name int, ifi *net.Interface, grp net.IP) error { - mreq := sysIPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} + mreq := ipMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} if err := setIPMreqInterface(&mreq, ifi); err != nil { return err } - return os.NewSyscallError("setsockopt", setsockopt(s, iana.ProtocolIP, name, unsafe.Pointer(&mreq), sysSizeofIPMreq)) + return os.NewSyscallError("setsockopt", setsockopt(s, iana.ProtocolIP, name, unsafe.Pointer(&mreq), sizeofIPMreq)) } func getsockoptInterface(s uintptr, name int) (*net.Interface, error) { diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_stub.go index 9f7b655f5..e655635ec 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_stub.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_stub.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 !darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!windows +// +build !darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!solaris,!windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_unix.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_unix.go index 9d4069ff5..92daffb0d 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_unix.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_unix.go @@ -15,8 +15,8 @@ import ( ) func getsockoptIPMreqn(s uintptr, name int) (*net.Interface, error) { - var mreqn sysIPMreqn - l := uint32(sysSizeofIPMreqn) + var mreqn ipMreqn + l := uint32(sizeofIPMreqn) if err := getsockopt(s, iana.ProtocolIP, name, unsafe.Pointer(&mreqn), &l); err != nil { return nil, os.NewSyscallError("getsockopt", err) } @@ -31,12 +31,12 @@ func getsockoptIPMreqn(s uintptr, name int) (*net.Interface, error) { } func setsockoptIPMreqn(s uintptr, name int, ifi *net.Interface, grp net.IP) error { - var mreqn sysIPMreqn + var mreqn ipMreqn if ifi != nil { mreqn.Ifindex = int32(ifi.Index) } if grp != nil { mreqn.Multiaddr = [4]byte{grp[0], grp[1], grp[2], grp[3]} } - return os.NewSyscallError("setsockopt", setsockopt(s, iana.ProtocolIP, name, unsafe.Pointer(&mreqn), sysSizeofIPMreqn)) + return os.NewSyscallError("setsockopt", setsockopt(s, iana.ProtocolIP, name, unsafe.Pointer(&mreqn), sizeofIPMreqn)) } diff --git a/vendor/golang.org/x/net/ipv4/sockopt_posix.go b/vendor/golang.org/x/net/ipv4/sockopt_posix.go index 0b7d6b659..d80680373 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_posix.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_posix.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 darwin dragonfly freebsd linux netbsd openbsd windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows package ipv4 @@ -84,8 +84,8 @@ func getICMPFilter(s uintptr, opt *sockOpt) (*ICMPFilter, error) { return nil, errOpNoSupport } var f ICMPFilter - l := uint32(sysSizeofICMPFilter) - if err := getsockopt(s, iana.ProtocolReserved, opt.name, unsafe.Pointer(&f.sysICMPFilter), &l); err != nil { + l := uint32(sizeofICMPFilter) + if err := getsockopt(s, iana.ProtocolReserved, opt.name, unsafe.Pointer(&f.icmpFilter), &l); err != nil { return nil, os.NewSyscallError("getsockopt", err) } return &f, nil @@ -95,7 +95,7 @@ func setICMPFilter(s uintptr, opt *sockOpt, f *ICMPFilter) error { if opt.name < 1 || opt.typ != ssoTypeICMPFilter { return errOpNoSupport } - return os.NewSyscallError("setsockopt", setsockopt(s, iana.ProtocolReserved, opt.name, unsafe.Pointer(&f.sysICMPFilter), sysSizeofICMPFilter)) + return os.NewSyscallError("setsockopt", setsockopt(s, iana.ProtocolReserved, opt.name, unsafe.Pointer(&f.icmpFilter), sizeofICMPFilter)) } func setGroup(s uintptr, opt *sockOpt, ifi *net.Interface, grp net.IP) error { diff --git a/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_stub.go index e2d98fdf5..02873962e 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_stub.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_stub.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !darwin,!freebsd,!linux +// +build !darwin,!freebsd,!linux,!solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_unix.go b/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_unix.go index 588e9b943..c9af55b91 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_unix.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin freebsd linux +// +build darwin freebsd linux solaris package ipv4 @@ -17,7 +17,7 @@ import ( var freebsd32o64 bool func setsockoptGroupReq(s uintptr, name int, ifi *net.Interface, grp net.IP) error { - var gr sysGroupReq + var gr groupReq if ifi != nil { gr.Interface = uint32(ifi.Index) } @@ -25,21 +25,21 @@ func setsockoptGroupReq(s uintptr, name int, ifi *net.Interface, grp net.IP) err var p unsafe.Pointer var l uint32 if freebsd32o64 { - var d [sysSizeofGroupReq + 4]byte - s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr)) + var d [sizeofGroupReq + 4]byte + s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr)) copy(d[:4], s[:4]) copy(d[8:], s[4:]) p = unsafe.Pointer(&d[0]) - l = sysSizeofGroupReq + 4 + l = sizeofGroupReq + 4 } else { p = unsafe.Pointer(&gr) - l = sysSizeofGroupReq + l = sizeofGroupReq } return os.NewSyscallError("setsockopt", setsockopt(s, iana.ProtocolIP, name, p, l)) } func setsockoptGroupSourceReq(s uintptr, name int, ifi *net.Interface, grp, src net.IP) error { - var gsr sysGroupSourceReq + var gsr groupSourceReq if ifi != nil { gsr.Interface = uint32(ifi.Index) } @@ -47,15 +47,15 @@ func setsockoptGroupSourceReq(s uintptr, name int, ifi *net.Interface, grp, src var p unsafe.Pointer var l uint32 if freebsd32o64 { - var d [sysSizeofGroupSourceReq + 4]byte - s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) + var d [sizeofGroupSourceReq + 4]byte + s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) copy(d[:4], s[:4]) copy(d[8:], s[4:]) p = unsafe.Pointer(&d[0]) - l = sysSizeofGroupSourceReq + 4 + l = sizeofGroupSourceReq + 4 } else { p = unsafe.Pointer(&gsr) - l = sysSizeofGroupSourceReq + l = sizeofGroupSourceReq } return os.NewSyscallError("setsockopt", setsockopt(s, iana.ProtocolIP, name, p, l)) } diff --git a/vendor/golang.org/x/net/ipv4/sockopt_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_stub.go index 7cfe57ca3..4ff609917 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_stub.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_stub.go @@ -1,8 +1,8 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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 nacl plan9 solaris +// +build nacl plan9 package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_darwin.go b/vendor/golang.org/x/net/ipv4/sys_darwin.go index b5f5bd515..bc694141c 100644 --- a/vendor/golang.org/x/net/ipv4/sys_darwin.go +++ b/vendor/golang.org/x/net/ipv4/sys_darwin.go @@ -52,7 +52,7 @@ func init() { // See http://support.apple.com/kb/HT1633. if i > 2 || i == 2 && osver[0] >= '1' && osver[1] >= '2' { ctlOpts[ctlPacketInfo].name = sysIP_PKTINFO - ctlOpts[ctlPacketInfo].length = sysSizeofInetPktinfo + ctlOpts[ctlPacketInfo].length = sizeofInetPktinfo ctlOpts[ctlPacketInfo].marshal = marshalPacketInfo ctlOpts[ctlPacketInfo].parse = parsePacketInfo sockOpts[ssoPacketInfo].name = sysIP_RECVPKTINFO @@ -73,24 +73,24 @@ func init() { } } -func (pi *sysInetPktinfo) setIfindex(i int) { +func (pi *inetPktinfo) setIfindex(i int) { pi.Ifindex = uint32(i) } -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Pad_cgo_0[0])) - sa.Len = sysSizeofSockaddrInet +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Len = sizeofSockaddrInet sa.Family = syscall.AF_INET copy(sa.Addr[:], grp) } -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Pad_cgo_0[0])) - sa.Len = sysSizeofSockaddrInet +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Len = sizeofSockaddrInet sa.Family = syscall.AF_INET copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Pad_cgo_1[0])) - sa.Len = sysSizeofSockaddrInet + sa = (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 132)) + sa.Len = sizeofSockaddrInet sa.Family = syscall.AF_INET copy(sa.Addr[:], src) } diff --git a/vendor/golang.org/x/net/ipv4/sys_freebsd.go b/vendor/golang.org/x/net/ipv4/sys_freebsd.go index 163ff9a77..fceffe98e 100644 --- a/vendor/golang.org/x/net/ipv4/sys_freebsd.go +++ b/vendor/golang.org/x/net/ipv4/sys_freebsd.go @@ -54,20 +54,20 @@ func init() { } } -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Group)) - sa.Len = sysSizeofSockaddrInet +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gr.Group)) + sa.Len = sizeofSockaddrInet sa.Family = syscall.AF_INET copy(sa.Addr[:], grp) } -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Group)) - sa.Len = sysSizeofSockaddrInet +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gsr.Group)) + sa.Len = sizeofSockaddrInet sa.Family = syscall.AF_INET copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Source)) - sa.Len = sysSizeofSockaddrInet + sa = (*sockaddrInet)(unsafe.Pointer(&gsr.Source)) + sa.Len = sizeofSockaddrInet sa.Family = syscall.AF_INET copy(sa.Addr[:], src) } diff --git a/vendor/golang.org/x/net/ipv4/sys_linux.go b/vendor/golang.org/x/net/ipv4/sys_linux.go index 73e0d4623..c6c2a5067 100644 --- a/vendor/golang.org/x/net/ipv4/sys_linux.go +++ b/vendor/golang.org/x/net/ipv4/sys_linux.go @@ -13,7 +13,7 @@ import ( var ( ctlOpts = [ctlMax]ctlOpt{ ctlTTL: {sysIP_TTL, 1, marshalTTL, parseTTL}, - ctlPacketInfo: {sysIP_PKTINFO, sysSizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, + ctlPacketInfo: {sysIP_PKTINFO, sizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, } sockOpts = [ssoMax]sockOpt{ @@ -35,21 +35,21 @@ var ( } ) -func (pi *sysInetPktinfo) setIfindex(i int) { +func (pi *inetPktinfo) setIfindex(i int) { pi.Ifindex = int32(i) } -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Group)) +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gr.Group)) sa.Family = syscall.AF_INET copy(sa.Addr[:], grp) } -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Group)) +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(&gsr.Group)) sa.Family = syscall.AF_INET copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Source)) + sa = (*sockaddrInet)(unsafe.Pointer(&gsr.Source)) sa.Family = syscall.AF_INET copy(sa.Addr[:], src) } diff --git a/vendor/golang.org/x/net/ipv4/thunk_linux_386.s b/vendor/golang.org/x/net/ipv4/sys_linux_386.s index daa78bc02..b85551a5c 100644 --- a/vendor/golang.org/x/net/ipv4/thunk_linux_386.s +++ b/vendor/golang.org/x/net/ipv4/sys_linux_386.s @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build go1.2 +#include "textflag.h" -TEXT ·socketcall(SB),4,$0-36 +TEXT ·socketcall(SB),NOSPLIT,$0-36 JMP syscall·socketcall(SB) diff --git a/vendor/golang.org/x/net/ipv4/sys_solaris.go b/vendor/golang.org/x/net/ipv4/sys_solaris.go new file mode 100644 index 000000000..879f39e0a --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_solaris.go @@ -0,0 +1,54 @@ +// 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. + +package ipv4 + +import ( + "net" + "syscall" + "unsafe" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTTL: {sysIP_RECVTTL, 4, marshalTTL, parseTTL}, + ctlPacketInfo: {sysIP_PKTINFO, sizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoTOS: {sysIP_TOS, ssoTypeInt}, + ssoTTL: {sysIP_TTL, ssoTypeInt}, + ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeByte}, + ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeByte}, + ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, + ssoPacketInfo: {sysIP_RECVPKTINFO, ssoTypeInt}, + ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, + ssoJoinGroup: {sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, + ssoLeaveGroup: {sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, + ssoJoinSourceGroup: {sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, + } +) + +func (pi *inetPktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], grp) + sa = (*sockaddrInet)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 260)) + sa.Family = syscall.AF_INET + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv4/sys_solaris_amd64.s b/vendor/golang.org/x/net/ipv4/sys_solaris_amd64.s new file mode 100644 index 000000000..39d76af79 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/sys_solaris_amd64.s @@ -0,0 +1,8 @@ +// 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. + +#include "textflag.h" + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) diff --git a/vendor/golang.org/x/net/ipv4/sys_stub.go b/vendor/golang.org/x/net/ipv4/sys_stub.go index c8e55cbc8..d6dd812fd 100644 --- a/vendor/golang.org/x/net/ipv4/sys_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_stub.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build nacl plan9 solaris +// +build nacl plan9 package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_windows.go b/vendor/golang.org/x/net/ipv4/sys_windows.go index 466489fe0..3f4c5357b 100644 --- a/vendor/golang.org/x/net/ipv4/sys_windows.go +++ b/vendor/golang.org/x/net/ipv4/sys_windows.go @@ -20,22 +20,22 @@ const ( sysIP_DROP_SOURCE_MEMBERSHIP = 0x10 sysIP_PKTINFO = 0x13 - sysSizeofInetPktinfo = 0x8 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqSource = 0xc + sizeofInetPktinfo = 0x8 + sizeofIPMreq = 0x8 + sizeofIPMreqSource = 0xc ) -type sysInetPktinfo struct { +type inetPktinfo struct { Addr [4]byte Ifindex int32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte Interface [4]byte } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr [4]byte Sourceaddr [4]byte Interface [4]byte @@ -56,6 +56,6 @@ var ( } ) -func (pi *sysInetPktinfo) setIfindex(i int) { +func (pi *inetPktinfo) setIfindex(i int) { pi.Ifindex = int32(i) } diff --git a/vendor/golang.org/x/net/ipv4/syscall_solaris.go b/vendor/golang.org/x/net/ipv4/syscall_solaris.go new file mode 100644 index 000000000..8b0e1e447 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/syscall_solaris.go @@ -0,0 +1,38 @@ +// 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. + +package ipv4 + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" + +//go:linkname procGetsockopt libc___xnet_getsockopt +//go:linkname procSetsockopt libc_setsockopt + +var ( + procGetsockopt uintptr + procSetsockopt uintptr +) + +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, v unsafe.Pointer, l *uint32) error { + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procGetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0) + if errno != 0 { + return error(errno) + } + return nil +} + +func setsockopt(s uintptr, level, name int, v unsafe.Pointer, l uint32) error { + if _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(v), uintptr(l), 0); errno != 0 { + return error(errno) + } + return nil +} diff --git a/vendor/golang.org/x/net/ipv4/unicast_test.go b/vendor/golang.org/x/net/ipv4/unicast_test.go index 9c632cd89..bce8763f7 100644 --- a/vendor/golang.org/x/net/ipv4/unicast_test.go +++ b/vendor/golang.org/x/net/ipv4/unicast_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. @@ -20,7 +20,7 @@ import ( func TestPacketConnReadWriteUnicastUDP(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) @@ -74,7 +74,7 @@ func TestPacketConnReadWriteUnicastUDP(t *testing.T) { func TestPacketConnReadWriteUnicastICMP(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if m, ok := nettest.SupportsRawIPSocket(); !ok { @@ -97,7 +97,11 @@ func TestPacketConnReadWriteUnicastICMP(t *testing.T) { } p := ipv4.NewPacketConn(c) defer p.Close() - cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface + cf := ipv4.FlagDst | ipv4.FlagInterface + if runtime.GOOS != "solaris" { + // Solaris never allows to modify ICMP properties. + cf |= ipv4.FlagTTL + } for i, toggle := range []bool{true, false, true} { wb, err := (&icmp.Message{ @@ -156,7 +160,7 @@ func TestPacketConnReadWriteUnicastICMP(t *testing.T) { func TestRawConnReadWriteUnicastICMP(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if m, ok := nettest.SupportsRawIPSocket(); !ok { diff --git a/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go b/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go index 25606f21d..b047e51f9 100644 --- a/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go +++ b/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. @@ -16,7 +16,7 @@ import ( func TestConnUnicastSocketOptions(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris": + case "nacl", "plan9": t.Skipf("not supported on %s", runtime.GOOS) } ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) @@ -53,7 +53,7 @@ var packetConnUnicastSocketOptionTests = []struct { func TestPacketConnUnicastSocketOptions(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris": + case "nacl", "plan9": t.Skipf("not supported on %s", runtime.GOOS) } ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) @@ -79,7 +79,7 @@ func TestPacketConnUnicastSocketOptions(t *testing.T) { func TestRawConnUnicastSocketOptions(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris": + case "nacl", "plan9": t.Skipf("not supported on %s", runtime.GOOS) } if m, ok := nettest.SupportsRawIPSocket(); !ok { diff --git a/vendor/golang.org/x/net/ipv4/zsys_darwin.go b/vendor/golang.org/x/net/ipv4/zsys_darwin.go index 087c63906..c07cc883f 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_darwin.go +++ b/vendor/golang.org/x/net/ipv4/zsys_darwin.go @@ -37,18 +37,18 @@ const ( sysMCAST_BLOCK_SOURCE = 0x54 sysMCAST_UNBLOCK_SOURCE = 0x55 - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 ) -type sysSockaddrStorage struct { +type sockaddrStorage struct { Len uint8 Family uint8 X__ss_pad1 [6]int8 @@ -56,7 +56,7 @@ type sysSockaddrStorage struct { X__ss_pad2 [112]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Len uint8 Family uint8 Port uint16 @@ -64,35 +64,35 @@ type sysSockaddrInet struct { Zero [8]int8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex uint32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr [4]byte /* in_addr */ Sourceaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [128]byte } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [128]byte Pad_cgo_1 [128]byte diff --git a/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go index f5c9ccec4..c4365e9e7 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go +++ b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_dragonfly.go -// +build dragonfly - package ipv4 const ( @@ -24,10 +22,10 @@ const ( sysIP_ADD_MEMBERSHIP = 0xc sysIP_DROP_MEMBERSHIP = 0xd - sysSizeofIPMreq = 0x8 + sizeofIPMreq = 0x8 ) -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go index 6fd67e1e9..8c4aec94c 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go @@ -38,17 +38,17 @@ const ( sysMCAST_BLOCK_SOURCE = 0x54 sysMCAST_UNBLOCK_SOURCE = 0x55 - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 ) -type sysSockaddrStorage struct { +type sockaddrStorage struct { Len uint8 Family uint8 X__ss_pad1 [6]int8 @@ -56,7 +56,7 @@ type sysSockaddrStorage struct { X__ss_pad2 [112]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Len uint8 Family uint8 Port uint16 @@ -64,30 +64,30 @@ type sysSockaddrInet struct { Zero [8]int8 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr [4]byte /* in_addr */ Sourceaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysGroupReq struct { +type groupReq struct { Interface uint32 - Group sysSockaddrStorage + Group sockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 - Group sysSockaddrStorage - Source sysSockaddrStorage + Group sockaddrStorage + Source sockaddrStorage } diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go index ebac6d792..4b10b7c57 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go @@ -38,17 +38,17 @@ const ( sysMCAST_BLOCK_SOURCE = 0x54 sysMCAST_UNBLOCK_SOURCE = 0x55 - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 ) -type sysSockaddrStorage struct { +type sockaddrStorage struct { Len uint8 Family uint8 X__ss_pad1 [6]int8 @@ -56,7 +56,7 @@ type sysSockaddrStorage struct { X__ss_pad2 [112]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Len uint8 Family uint8 Port uint16 @@ -64,32 +64,32 @@ type sysSockaddrInet struct { Zero [8]int8 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr [4]byte /* in_addr */ Sourceaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysSockaddrStorage + Group sockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysSockaddrStorage - Source sysSockaddrStorage + Group sockaddrStorage + Source sockaddrStorage } diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go index ebac6d792..4b10b7c57 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go +++ b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go @@ -38,17 +38,17 @@ const ( sysMCAST_BLOCK_SOURCE = 0x54 sysMCAST_UNBLOCK_SOURCE = 0x55 - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 ) -type sysSockaddrStorage struct { +type sockaddrStorage struct { Len uint8 Family uint8 X__ss_pad1 [6]int8 @@ -56,7 +56,7 @@ type sysSockaddrStorage struct { X__ss_pad2 [112]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Len uint8 Family uint8 Port uint16 @@ -64,32 +64,32 @@ type sysSockaddrInet struct { Zero [8]int8 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr [4]byte /* in_addr */ Sourceaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysSockaddrStorage + Group sockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysSockaddrStorage - Source sysSockaddrStorage + Group sockaddrStorage + Source sockaddrStorage } diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go index 3733152a4..4da672013 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go @@ -58,39 +58,39 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 - - sysSizeofICMPFilter = 0x4 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ X__pad [8]uint8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysSockExtendedErr struct { +type sockExtendedErr struct { Errno uint32 Origin uint8 Type uint8 @@ -100,45 +100,45 @@ type sysSockExtendedErr struct { Data uint32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr uint32 Interface uint32 Sourceaddr uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPFilter struct { +type icmpFilter struct { Data uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [2]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go index afa451906..65945bbd0 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go @@ -58,39 +58,39 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPFilter = 0x4 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 + + sizeofICMPFilter = 0x4 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ X__pad [8]uint8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysSockExtendedErr struct { +type sockExtendedErr struct { Errno uint32 Origin uint8 Type uint8 @@ -100,47 +100,47 @@ type sysSockExtendedErr struct { Data uint32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr uint32 Interface uint32 Sourceaddr uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPFilter struct { +type icmpFilter struct { Data uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go index 3733152a4..4da672013 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go @@ -58,39 +58,39 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 - - sysSizeofICMPFilter = 0x4 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 + + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 + + sizeofICMPFilter = 0x4 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ X__pad [8]uint8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysSockExtendedErr struct { +type sockExtendedErr struct { Errno uint32 Origin uint8 Type uint8 @@ -100,45 +100,45 @@ type sysSockExtendedErr struct { Data uint32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr uint32 Interface uint32 Sourceaddr uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPFilter struct { +type icmpFilter struct { Data uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [2]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go index 129a20ac6..65945bbd0 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,arm64 - package ipv4 const ( @@ -60,39 +58,39 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPFilter = 0x4 + sizeofICMPFilter = 0x4 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ X__pad [8]uint8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysSockExtendedErr struct { +type sockExtendedErr struct { Errno uint32 Origin uint8 Type uint8 @@ -102,47 +100,47 @@ type sysSockExtendedErr struct { Data uint32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr uint32 Interface uint32 Sourceaddr uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPFilter struct { +type icmpFilter struct { Data uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go index 7ed9368f5..65945bbd0 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,mips64 - package ipv4 const ( @@ -60,39 +58,39 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPFilter = 0x4 + sizeofICMPFilter = 0x4 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ X__pad [8]uint8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysSockExtendedErr struct { +type sockExtendedErr struct { Errno uint32 Origin uint8 Type uint8 @@ -102,47 +100,47 @@ type sysSockExtendedErr struct { Data uint32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr uint32 Interface uint32 Sourceaddr uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPFilter struct { +type icmpFilter struct { Data uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go index 19fadae62..65945bbd0 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_mips64le.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,mips64le - package ipv4 const ( @@ -60,39 +58,39 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPFilter = 0x4 + sizeofICMPFilter = 0x4 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ X__pad [8]uint8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysSockExtendedErr struct { +type sockExtendedErr struct { Errno uint32 Origin uint8 Type uint8 @@ -102,47 +100,47 @@ type sysSockExtendedErr struct { Data uint32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr uint32 Interface uint32 Sourceaddr uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPFilter struct { +type icmpFilter struct { Data uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go index 15426beee..b825a18e9 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,ppc - package ipv4 const ( @@ -60,39 +58,39 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 - sysSizeofICMPFilter = 0x4 + sizeofICMPFilter = 0x4 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]uint8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ X__pad [8]uint8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysSockExtendedErr struct { +type sockExtendedErr struct { Errno uint32 Origin uint8 Type uint8 @@ -102,45 +100,45 @@ type sysSockExtendedErr struct { Data uint32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr uint32 Interface uint32 Sourceaddr uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPFilter struct { +type icmpFilter struct { Data uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [2]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go index beaadd5f0..65945bbd0 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,ppc64 - package ipv4 const ( @@ -60,39 +58,39 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPFilter = 0x4 + sizeofICMPFilter = 0x4 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ X__pad [8]uint8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysSockExtendedErr struct { +type sockExtendedErr struct { Errno uint32 Origin uint8 Type uint8 @@ -102,47 +100,47 @@ type sysSockExtendedErr struct { Data uint32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr uint32 Interface uint32 Sourceaddr uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPFilter struct { +type icmpFilter struct { Data uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go index 0eb262305..65945bbd0 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,ppc64le - package ipv4 const ( @@ -60,39 +58,39 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPFilter = 0x4 + sizeofICMPFilter = 0x4 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ X__pad [8]uint8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysSockExtendedErr struct { +type sockExtendedErr struct { Errno uint32 Origin uint8 Type uint8 @@ -102,47 +100,47 @@ type sysSockExtendedErr struct { Data uint32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr uint32 Interface uint32 Sourceaddr uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPFilter struct { +type icmpFilter struct { Data uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go index 90fe99ebb..65945bbd0 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_s390x.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,s390x - package ipv4 const ( @@ -60,39 +58,39 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + sizeofSockExtendedErr = 0x10 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPMreq = 0x8 + sizeofIPMreqn = 0xc + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPFilter = 0x4 + sizeofICMPFilter = 0x4 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet struct { +type sockaddrInet struct { Family uint16 Port uint16 Addr [4]byte /* in_addr */ X__pad [8]uint8 } -type sysInetPktinfo struct { +type inetPktinfo struct { Ifindex int32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysSockExtendedErr struct { +type sockExtendedErr struct { Errno uint32 Origin uint8 Type uint8 @@ -102,47 +100,47 @@ type sysSockExtendedErr struct { Data uint32 } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqn struct { +type ipMreqn struct { Multiaddr [4]byte /* in_addr */ Address [4]byte /* in_addr */ Ifindex int32 } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr uint32 Interface uint32 Sourceaddr uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPFilter struct { +type icmpFilter struct { Data uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv4/zsys_netbsd.go b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go index 8a440eb65..fd3624d93 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_netbsd.go +++ b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go @@ -21,10 +21,10 @@ const ( sysIP_ADD_MEMBERSHIP = 0xc sysIP_DROP_MEMBERSHIP = 0xd - sysSizeofIPMreq = 0x8 + sizeofIPMreq = 0x8 ) -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } diff --git a/vendor/golang.org/x/net/ipv4/zsys_openbsd.go b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go index fd522b573..12f36be75 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_openbsd.go +++ b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go @@ -21,10 +21,10 @@ const ( sysIP_ADD_MEMBERSHIP = 0xc sysIP_DROP_MEMBERSHIP = 0xd - sysSizeofIPMreq = 0x8 + sizeofIPMreq = 0x8 ) -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } diff --git a/vendor/golang.org/x/net/ipv4/zsys_solaris.go b/vendor/golang.org/x/net/ipv4/zsys_solaris.go index d7c23349a..0a3875cc4 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_solaris.go +++ b/vendor/golang.org/x/net/ipv4/zsys_solaris.go @@ -1,30 +1,20 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_solaris.go -// +build solaris - package ipv4 const ( - sysIP_OPTIONS = 0x1 - sysIP_HDRINCL = 0x2 - sysIP_TOS = 0x3 - sysIP_TTL = 0x4 - sysIP_RECVOPTS = 0x5 - sysIP_RECVRETOPTS = 0x6 - sysIP_RECVDSTADDR = 0x7 - sysIP_RETOPTS = 0x8 - sysIP_RECVIF = 0x9 - sysIP_RECVSLLA = 0xa - sysIP_RECVTTL = 0xb - sysIP_NEXTHOP = 0x19 - sysIP_PKTINFO = 0x1a - sysIP_RECVPKTINFO = 0x1a - sysIP_DONTFRAG = 0x1b - sysIP_BOUND_IF = 0x41 - sysIP_UNSPEC_SRC = 0x42 - sysIP_BROADCAST_TTL = 0x43 - sysIP_DHCPINIT_IF = 0x45 + sysIP_OPTIONS = 0x1 + sysIP_HDRINCL = 0x2 + sysIP_TOS = 0x3 + sysIP_TTL = 0x4 + sysIP_RECVOPTS = 0x5 + sysIP_RECVRETOPTS = 0x6 + sysIP_RECVDSTADDR = 0x7 + sysIP_RETOPTS = 0x8 + sysIP_RECVIF = 0x9 + sysIP_RECVSLLA = 0xa + sysIP_RECVTTL = 0xb sysIP_MULTICAST_IF = 0x10 sysIP_MULTICAST_TTL = 0x11 @@ -35,26 +25,76 @@ const ( sysIP_UNBLOCK_SOURCE = 0x16 sysIP_ADD_SOURCE_MEMBERSHIP = 0x17 sysIP_DROP_SOURCE_MEMBERSHIP = 0x18 + sysIP_NEXTHOP = 0x19 + + sysIP_PKTINFO = 0x1a + sysIP_RECVPKTINFO = 0x1a + sysIP_DONTFRAG = 0x1b + + sysIP_BOUND_IF = 0x41 + sysIP_UNSPEC_SRC = 0x42 + sysIP_BROADCAST_TTL = 0x43 + sysIP_DHCPINIT_IF = 0x45 - sysSizeofInetPktinfo = 0xc + sysIP_REUSEADDR = 0x104 + sysIP_DONTROUTE = 0x105 + sysIP_BROADCAST = 0x106 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqSource = 0xc + sysMCAST_JOIN_GROUP = 0x29 + sysMCAST_LEAVE_GROUP = 0x2a + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_JOIN_SOURCE_GROUP = 0x2d + sysMCAST_LEAVE_SOURCE_GROUP = 0x2e + + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet = 0x10 + sizeofInetPktinfo = 0xc + + sizeofIPMreq = 0x8 + sizeofIPMreqSource = 0xc + sizeofGroupReq = 0x104 + sizeofGroupSourceReq = 0x204 ) -type sysInetPktinfo struct { +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +type sockaddrInet struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type inetPktinfo struct { Ifindex uint32 Spec_dst [4]byte /* in_addr */ Addr [4]byte /* in_addr */ } -type sysIPMreq struct { +type ipMreq struct { Multiaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } -type sysIPMreqSource struct { +type ipMreqSource struct { Multiaddr [4]byte /* in_addr */ Sourceaddr [4]byte /* in_addr */ Interface [4]byte /* in_addr */ } + +type groupReq struct { + Interface uint32 + Pad_cgo_0 [256]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [256]byte + Pad_cgo_1 [256]byte +} diff --git a/vendor/golang.org/x/net/ipv6/bpf_test.go b/vendor/golang.org/x/net/ipv6/bpf_test.go index 03d478dc0..8253e1f42 100644 --- a/vendor/golang.org/x/net/ipv6/bpf_test.go +++ b/vendor/golang.org/x/net/ipv6/bpf_test.go @@ -18,6 +18,9 @@ func TestBPF(t *testing.T) { if runtime.GOOS != "linux" { t.Skipf("not supported on %s", runtime.GOOS) } + if !supportsIPv6 { + t.Skip("ipv6 is not supported") + } l, err := net.ListenPacket("udp6", "[::1]:0") if err != nil { diff --git a/vendor/golang.org/x/net/ipv6/bpfopt_linux.go b/vendor/golang.org/x/net/ipv6/bpfopt_linux.go index 328427cba..daf7ea853 100644 --- a/vendor/golang.org/x/net/ipv6/bpfopt_linux.go +++ b/vendor/golang.org/x/net/ipv6/bpfopt_linux.go @@ -20,9 +20,9 @@ func (c *dgramOpt) SetBPF(filter []bpf.RawInstruction) error { if err != nil { return err } - prog := sysSockFProg{ + prog := sockFProg{ Len: uint16(len(filter)), - Filter: (*sysSockFilter)(unsafe.Pointer(&filter[0])), + Filter: (*sockFilter)(unsafe.Pointer(&filter[0])), } return os.NewSyscallError("setsockopt", setsockopt(s, sysSOL_SOCKET, sysSO_ATTACH_FILTER, unsafe.Pointer(&prog), uint32(unsafe.Sizeof(prog)))) } diff --git a/vendor/golang.org/x/net/ipv6/control.go b/vendor/golang.org/x/net/ipv6/control.go index b7362aae7..56303f08d 100644 --- a/vendor/golang.org/x/net/ipv6/control.go +++ b/vendor/golang.org/x/net/ipv6/control.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go index 80ec2e2f0..d1693af1f 100644 --- a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -29,9 +29,9 @@ func marshal2292PacketInfo(b []byte, cm *ControlMessage) []byte { m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) m.Level = iana.ProtocolIPv6 m.Type = sysIPV6_2292PKTINFO - m.SetLen(syscall.CmsgLen(sysSizeofInet6Pktinfo)) + m.SetLen(syscall.CmsgLen(sizeofInet6Pktinfo)) if cm != nil { - pi := (*sysInet6Pktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) + pi := (*inet6Pktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { copy(pi.Addr[:], ip) } @@ -39,17 +39,17 @@ func marshal2292PacketInfo(b []byte, cm *ControlMessage) []byte { pi.setIfindex(cm.IfIndex) } } - return b[syscall.CmsgSpace(sysSizeofInet6Pktinfo):] + return b[syscall.CmsgSpace(sizeofInet6Pktinfo):] } func marshal2292NextHop(b []byte, cm *ControlMessage) []byte { m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) m.Level = iana.ProtocolIPv6 m.Type = sysIPV6_2292NEXTHOP - m.SetLen(syscall.CmsgLen(sysSizeofSockaddrInet6)) + m.SetLen(syscall.CmsgLen(sizeofSockaddrInet6)) if cm != nil { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) + sa := (*sockaddrInet6)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) sa.setSockaddr(cm.NextHop, cm.IfIndex) } - return b[syscall.CmsgSpace(sysSizeofSockaddrInet6):] + return b[syscall.CmsgSpace(sizeofSockaddrInet6):] } diff --git a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go index f344d16d0..2800df4bc 100644 --- a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go @@ -1,8 +1,8 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd +// +build darwin dragonfly freebsd linux netbsd openbsd solaris package ipv6 @@ -49,9 +49,9 @@ func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) m.Level = iana.ProtocolIPv6 m.Type = sysIPV6_PKTINFO - m.SetLen(syscall.CmsgLen(sysSizeofInet6Pktinfo)) + m.SetLen(syscall.CmsgLen(sizeofInet6Pktinfo)) if cm != nil { - pi := (*sysInet6Pktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) + pi := (*inet6Pktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { copy(pi.Addr[:], ip) } @@ -59,11 +59,11 @@ func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { pi.setIfindex(cm.IfIndex) } } - return b[syscall.CmsgSpace(sysSizeofInet6Pktinfo):] + return b[syscall.CmsgSpace(sizeofInet6Pktinfo):] } func parsePacketInfo(cm *ControlMessage, b []byte) { - pi := (*sysInet6Pktinfo)(unsafe.Pointer(&b[0])) + pi := (*inet6Pktinfo)(unsafe.Pointer(&b[0])) cm.Dst = pi.Addr[:] cm.IfIndex = int(pi.Ifindex) } @@ -72,12 +72,12 @@ func marshalNextHop(b []byte, cm *ControlMessage) []byte { m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) m.Level = iana.ProtocolIPv6 m.Type = sysIPV6_NEXTHOP - m.SetLen(syscall.CmsgLen(sysSizeofSockaddrInet6)) + m.SetLen(syscall.CmsgLen(sizeofSockaddrInet6)) if cm != nil { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) + sa := (*sockaddrInet6)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) sa.setSockaddr(cm.NextHop, cm.IfIndex) } - return b[syscall.CmsgSpace(sysSizeofSockaddrInet6):] + return b[syscall.CmsgSpace(sizeofSockaddrInet6):] } func parseNextHop(cm *ControlMessage, b []byte) { @@ -87,12 +87,12 @@ func marshalPathMTU(b []byte, cm *ControlMessage) []byte { m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) m.Level = iana.ProtocolIPv6 m.Type = sysIPV6_PATHMTU - m.SetLen(syscall.CmsgLen(sysSizeofIPv6Mtuinfo)) - return b[syscall.CmsgSpace(sysSizeofIPv6Mtuinfo):] + m.SetLen(syscall.CmsgLen(sizeofIPv6Mtuinfo)) + return b[syscall.CmsgSpace(sizeofIPv6Mtuinfo):] } func parsePathMTU(cm *ControlMessage, b []byte) { - mi := (*sysIPv6Mtuinfo)(unsafe.Pointer(&b[0])) + mi := (*ipv6Mtuinfo)(unsafe.Pointer(&b[0])) cm.Dst = mi.Addr.Addr[:] cm.IfIndex = int(mi.Addr.Scope_id) cm.MTU = int(mi.Mtu) diff --git a/vendor/golang.org/x/net/ipv6/control_stub.go b/vendor/golang.org/x/net/ipv6/control_stub.go index 952b2bd2a..24b40a82d 100644 --- a/vendor/golang.org/x/net/ipv6/control_stub.go +++ b/vendor/golang.org/x/net/ipv6/control_stub.go @@ -1,8 +1,8 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 nacl plan9 solaris +// +build nacl plan9 package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/control_unix.go b/vendor/golang.org/x/net/ipv6/control_unix.go index 46fbdcbe3..7bd421053 100644 --- a/vendor/golang.org/x/net/ipv6/control_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_unix.go @@ -1,8 +1,8 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd +// +build darwin dragonfly freebsd linux netbsd openbsd solaris package ipv6 @@ -76,19 +76,6 @@ func newControlMessage(opt *rawOpt) (oob []byte) { } if l > 0 { oob = make([]byte, l) - b := oob - if opt.isset(FlagTrafficClass) && ctlOpts[ctlTrafficClass].name > 0 { - b = ctlOpts[ctlTrafficClass].marshal(b, nil) - } - if opt.isset(FlagHopLimit) && ctlOpts[ctlHopLimit].name > 0 { - b = ctlOpts[ctlHopLimit].marshal(b, nil) - } - if opt.isset(flagPacketInfo) && ctlOpts[ctlPacketInfo].name > 0 { - b = ctlOpts[ctlPacketInfo].marshal(b, nil) - } - if opt.isset(FlagPathMTU) && ctlOpts[ctlPathMTU].name > 0 { - b = ctlOpts[ctlPathMTU].marshal(b, nil) - } } opt.RUnlock() return diff --git a/vendor/golang.org/x/net/ipv6/control_windows.go b/vendor/golang.org/x/net/ipv6/control_windows.go index 2773a5204..feef6ab86 100644 --- a/vendor/golang.org/x/net/ipv6/control_windows.go +++ b/vendor/golang.org/x/net/ipv6/control_windows.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/ipv6/defs_darwin.go b/vendor/golang.org/x/net/ipv6/defs_darwin.go index 4c7f476a8..55ddc116f 100644 --- a/vendor/golang.org/x/net/ipv6/defs_darwin.go +++ b/vendor/golang.org/x/net/ipv6/defs_darwin.go @@ -83,30 +83,30 @@ const ( sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW - sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter ) -type sysSockaddrStorage C.struct_sockaddr_storage +type sockaddrStorage C.struct_sockaddr_storage -type sysSockaddrInet6 C.struct_sockaddr_in6 +type sockaddrInet6 C.struct_sockaddr_in6 -type sysInet6Pktinfo C.struct_in6_pktinfo +type inet6Pktinfo C.struct_in6_pktinfo -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo +type ipv6Mtuinfo C.struct_ip6_mtuinfo -type sysIPv6Mreq C.struct_ipv6_mreq +type ipv6Mreq C.struct_ipv6_mreq -type sysICMPv6Filter C.struct_icmp6_filter +type icmpv6Filter C.struct_icmp6_filter -type sysGroupReq C.struct_group_req +type groupReq C.struct_group_req -type sysGroupSourceReq C.struct_group_source_req +type groupSourceReq C.struct_group_source_req diff --git a/vendor/golang.org/x/net/ipv6/defs_dragonfly.go b/vendor/golang.org/x/net/ipv6/defs_dragonfly.go index c72487ceb..a4c383a51 100644 --- a/vendor/golang.org/x/net/ipv6/defs_dragonfly.go +++ b/vendor/golang.org/x/net/ipv6/defs_dragonfly.go @@ -64,21 +64,21 @@ const ( sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter ) -type sysSockaddrInet6 C.struct_sockaddr_in6 +type sockaddrInet6 C.struct_sockaddr_in6 -type sysInet6Pktinfo C.struct_in6_pktinfo +type inet6Pktinfo C.struct_in6_pktinfo -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo +type ipv6Mtuinfo C.struct_ip6_mtuinfo -type sysIPv6Mreq C.struct_ipv6_mreq +type ipv6Mreq C.struct_ipv6_mreq -type sysICMPv6Filter C.struct_icmp6_filter +type icmpv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_freebsd.go b/vendor/golang.org/x/net/ipv6/defs_freebsd.go index de199ec6a..53e625389 100644 --- a/vendor/golang.org/x/net/ipv6/defs_freebsd.go +++ b/vendor/golang.org/x/net/ipv6/defs_freebsd.go @@ -76,30 +76,30 @@ const ( sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW - sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter ) -type sysSockaddrStorage C.struct_sockaddr_storage +type sockaddrStorage C.struct_sockaddr_storage -type sysSockaddrInet6 C.struct_sockaddr_in6 +type sockaddrInet6 C.struct_sockaddr_in6 -type sysInet6Pktinfo C.struct_in6_pktinfo +type inet6Pktinfo C.struct_in6_pktinfo -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo +type ipv6Mtuinfo C.struct_ip6_mtuinfo -type sysIPv6Mreq C.struct_ipv6_mreq +type ipv6Mreq C.struct_ipv6_mreq -type sysGroupReq C.struct_group_req +type groupReq C.struct_group_req -type sysGroupSourceReq C.struct_group_source_req +type groupSourceReq C.struct_group_source_req -type sysICMPv6Filter C.struct_icmp6_filter +type icmpv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_linux.go b/vendor/golang.org/x/net/ipv6/defs_linux.go index 664305d8b..8a967fd21 100644 --- a/vendor/golang.org/x/net/ipv6/defs_linux.go +++ b/vendor/golang.org/x/net/ipv6/defs_linux.go @@ -109,37 +109,37 @@ const ( sysSOL_SOCKET = C.SOL_SOCKET sysSO_ATTACH_FILTER = C.SO_ATTACH_FILTER - sysSizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - sysSizeofIPv6FlowlabelReq = C.sizeof_struct_in6_flowlabel_req + sizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + sizeofIPv6FlowlabelReq = C.sizeof_struct_in6_flowlabel_req - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter ) -type sysKernelSockaddrStorage C.struct___kernel_sockaddr_storage +type kernelSockaddrStorage C.struct___kernel_sockaddr_storage -type sysSockaddrInet6 C.struct_sockaddr_in6 +type sockaddrInet6 C.struct_sockaddr_in6 -type sysInet6Pktinfo C.struct_in6_pktinfo +type inet6Pktinfo C.struct_in6_pktinfo -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo +type ipv6Mtuinfo C.struct_ip6_mtuinfo -type sysIPv6FlowlabelReq C.struct_in6_flowlabel_req +type ipv6FlowlabelReq C.struct_in6_flowlabel_req -type sysIPv6Mreq C.struct_ipv6_mreq +type ipv6Mreq C.struct_ipv6_mreq -type sysGroupReq C.struct_group_req +type groupReq C.struct_group_req -type sysGroupSourceReq C.struct_group_source_req +type groupSourceReq C.struct_group_source_req -type sysICMPv6Filter C.struct_icmp6_filter +type icmpv6Filter C.struct_icmp6_filter -type sysSockFProg C.struct_sock_fprog +type sockFProg C.struct_sock_fprog -type sysSockFilter C.struct_sock_filter +type sockFilter C.struct_sock_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_netbsd.go b/vendor/golang.org/x/net/ipv6/defs_netbsd.go index 7bd09e8e8..be9ceb9cc 100644 --- a/vendor/golang.org/x/net/ipv6/defs_netbsd.go +++ b/vendor/golang.org/x/net/ipv6/defs_netbsd.go @@ -60,21 +60,21 @@ const ( sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter ) -type sysSockaddrInet6 C.struct_sockaddr_in6 +type sockaddrInet6 C.struct_sockaddr_in6 -type sysInet6Pktinfo C.struct_in6_pktinfo +type inet6Pktinfo C.struct_in6_pktinfo -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo +type ipv6Mtuinfo C.struct_ip6_mtuinfo -type sysIPv6Mreq C.struct_ipv6_mreq +type ipv6Mreq C.struct_ipv6_mreq -type sysICMPv6Filter C.struct_icmp6_filter +type icmpv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_openbsd.go b/vendor/golang.org/x/net/ipv6/defs_openbsd.go index 6796d9b2f..177ddf87d 100644 --- a/vendor/golang.org/x/net/ipv6/defs_openbsd.go +++ b/vendor/golang.org/x/net/ipv6/defs_openbsd.go @@ -69,21 +69,21 @@ const ( sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter ) -type sysSockaddrInet6 C.struct_sockaddr_in6 +type sockaddrInet6 C.struct_sockaddr_in6 -type sysInet6Pktinfo C.struct_in6_pktinfo +type inet6Pktinfo C.struct_in6_pktinfo -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo +type ipv6Mtuinfo C.struct_ip6_mtuinfo -type sysIPv6Mreq C.struct_ipv6_mreq +type ipv6Mreq C.struct_ipv6_mreq -type sysICMPv6Filter C.struct_icmp6_filter +type icmpv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_solaris.go b/vendor/golang.org/x/net/ipv6/defs_solaris.go index 972b17126..0f8ce2b46 100644 --- a/vendor/golang.org/x/net/ipv6/defs_solaris.go +++ b/vendor/golang.org/x/net/ipv6/defs_solaris.go @@ -9,6 +9,8 @@ package ipv6 /* +#include <sys/socket.h> + #include <netinet/in.h> #include <netinet/icmp6.h> */ @@ -53,6 +55,13 @@ const ( sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS + sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP + sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP + sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE + sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE + sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP + sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP + sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC @@ -76,21 +85,30 @@ const ( sysICMP6_FILTER = C.ICMP6_FILTER - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + sizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + sizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + sizeofGroupReq = C.sizeof_struct_group_req + sizeofGroupSourceReq = C.sizeof_struct_group_source_req - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + sizeofICMPv6Filter = C.sizeof_struct_icmp6_filter ) -type sysSockaddrInet6 C.struct_sockaddr_in6 +type sockaddrStorage C.struct_sockaddr_storage + +type sockaddrInet6 C.struct_sockaddr_in6 + +type inet6Pktinfo C.struct_in6_pktinfo + +type ipv6Mtuinfo C.struct_ip6_mtuinfo -type sysInet6Pktinfo C.struct_in6_pktinfo +type ipv6Mreq C.struct_ipv6_mreq -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo +type groupReq C.struct_group_req -type sysIPv6Mreq C.struct_ipv6_mreq +type groupSourceReq C.struct_group_source_req -type sysICMPv6Filter C.struct_icmp6_filter +type icmpv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/dgramopt_posix.go b/vendor/golang.org/x/net/ipv6/dgramopt_posix.go index 4ea7bc2d6..46f7f2ffb 100644 --- a/vendor/golang.org/x/net/ipv6/dgramopt_posix.go +++ b/vendor/golang.org/x/net/ipv6/dgramopt_posix.go @@ -1,8 +1,8 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd windows +// +build darwin dragonfly freebsd linux netbsd openbsd windows solaris package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/dgramopt_stub.go b/vendor/golang.org/x/net/ipv6/dgramopt_stub.go index fb067fb2f..bc3290ad8 100644 --- a/vendor/golang.org/x/net/ipv6/dgramopt_stub.go +++ b/vendor/golang.org/x/net/ipv6/dgramopt_stub.go @@ -1,8 +1,8 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 nacl plan9 solaris +// +build nacl plan9 package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/doc.go b/vendor/golang.org/x/net/ipv6/doc.go index 7d75698fb..78a779c4e 100644 --- a/vendor/golang.org/x/net/ipv6/doc.go +++ b/vendor/golang.org/x/net/ipv6/doc.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -9,13 +9,14 @@ // manipulation of IPv6 facilities. // // The IPv6 protocol is defined in RFC 2460. -// Basic and advanced socket interface extensions are defined in RFC -// 3493 and RFC 3542. -// Socket interface extensions for multicast source filters are -// defined in RFC 3678. +// Socket interface extensions are defined in RFC 3493, RFC 3542 and +// RFC 3678. // MLDv1 and MLDv2 are defined in RFC 2710 and RFC 3810. // Source-specific multicast is defined in RFC 4607. // +// On Darwin, this package requires OS X Mavericks version 10.9 or +// above, or equivalent. +// // // Unicasting // diff --git a/vendor/golang.org/x/net/ipv6/endpoint.go b/vendor/golang.org/x/net/ipv6/endpoint.go index 60e7d93c2..b988782a9 100644 --- a/vendor/golang.org/x/net/ipv6/endpoint.go +++ b/vendor/golang.org/x/net/ipv6/endpoint.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/ipv6/gen.go b/vendor/golang.org/x/net/ipv6/gen.go index 826e3ae28..41886ec72 100644 --- a/vendor/golang.org/x/net/ipv6/gen.go +++ b/vendor/golang.org/x/net/ipv6/gen.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -52,15 +52,6 @@ func genzsys() error { if err != nil { return err } - // The ipv6 package still supports go1.2, and so we need to - // take care of additional platforms in go1.3 and above for - // working with go1.2. - switch { - case runtime.GOOS == "dragonfly" || runtime.GOOS == "solaris": - b = bytes.Replace(b, []byte("package ipv6\n"), []byte("// +build "+runtime.GOOS+"\n\npackage ipv6\n"), 1) - case runtime.GOOS == "linux" && (runtime.GOARCH == "arm64" || runtime.GOARCH == "mips64" || runtime.GOARCH == "mips64le" || runtime.GOARCH == "ppc" || runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le" || runtime.GOARCH == "s390x"): - b = bytes.Replace(b, []byte("package ipv6\n"), []byte("// +build "+runtime.GOOS+","+runtime.GOARCH+"\n\npackage ipv6\n"), 1) - } b, err = format.Source(b) if err != nil { return err diff --git a/vendor/golang.org/x/net/ipv6/genericopt_posix.go b/vendor/golang.org/x/net/ipv6/genericopt_posix.go index 513bd8c74..0a8d9883d 100644 --- a/vendor/golang.org/x/net/ipv6/genericopt_posix.go +++ b/vendor/golang.org/x/net/ipv6/genericopt_posix.go @@ -1,8 +1,8 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/genericopt_stub.go b/vendor/golang.org/x/net/ipv6/genericopt_stub.go index f5c372242..9dfc57dae 100644 --- a/vendor/golang.org/x/net/ipv6/genericopt_stub.go +++ b/vendor/golang.org/x/net/ipv6/genericopt_stub.go @@ -1,8 +1,8 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 nacl plan9 solaris +// +build nacl plan9 package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/helper.go b/vendor/golang.org/x/net/ipv6/helper.go index 53b999905..7a42e5860 100644 --- a/vendor/golang.org/x/net/ipv6/helper.go +++ b/vendor/golang.org/x/net/ipv6/helper.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/ipv6/icmp.go b/vendor/golang.org/x/net/ipv6/icmp.go index a2de65a08..df9e4fbe3 100644 --- a/vendor/golang.org/x/net/ipv6/icmp.go +++ b/vendor/golang.org/x/net/ipv6/icmp.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -31,7 +31,7 @@ func (typ ICMPType) Protocol() int { // packets not explicitly addressed to itself, and a host means a node // that is not a router. type ICMPFilter struct { - sysICMPv6Filter + icmpv6Filter } // Accept accepts incoming ICMP packets including the type field value diff --git a/vendor/golang.org/x/net/ipv6/icmp_bsd.go b/vendor/golang.org/x/net/ipv6/icmp_bsd.go index 30e3ce424..e1a791de4 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_bsd.go +++ b/vendor/golang.org/x/net/ipv6/icmp_bsd.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -6,15 +6,15 @@ package ipv6 -func (f *sysICMPv6Filter) accept(typ ICMPType) { +func (f *icmpv6Filter) accept(typ ICMPType) { f.Filt[typ>>5] |= 1 << (uint32(typ) & 31) } -func (f *sysICMPv6Filter) block(typ ICMPType) { +func (f *icmpv6Filter) block(typ ICMPType) { f.Filt[typ>>5] &^= 1 << (uint32(typ) & 31) } -func (f *sysICMPv6Filter) setAll(block bool) { +func (f *icmpv6Filter) setAll(block bool) { for i := range f.Filt { if block { f.Filt[i] = 0 @@ -24,6 +24,6 @@ func (f *sysICMPv6Filter) setAll(block bool) { } } -func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { return f.Filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 } diff --git a/vendor/golang.org/x/net/ipv6/icmp_linux.go b/vendor/golang.org/x/net/ipv6/icmp_linux.go index a67ecf690..647f6b44f 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_linux.go +++ b/vendor/golang.org/x/net/ipv6/icmp_linux.go @@ -1,18 +1,18 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. package ipv6 -func (f *sysICMPv6Filter) accept(typ ICMPType) { +func (f *icmpv6Filter) accept(typ ICMPType) { f.Data[typ>>5] &^= 1 << (uint32(typ) & 31) } -func (f *sysICMPv6Filter) block(typ ICMPType) { +func (f *icmpv6Filter) block(typ ICMPType) { f.Data[typ>>5] |= 1 << (uint32(typ) & 31) } -func (f *sysICMPv6Filter) setAll(block bool) { +func (f *icmpv6Filter) setAll(block bool) { for i := range f.Data { if block { f.Data[i] = 1<<32 - 1 @@ -22,6 +22,6 @@ func (f *sysICMPv6Filter) setAll(block bool) { } } -func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { return f.Data[typ>>5]&(1<<(uint32(typ)&31)) != 0 } diff --git a/vendor/golang.org/x/net/ipv6/icmp_solaris.go b/vendor/golang.org/x/net/ipv6/icmp_solaris.go index a942f354c..7c23bb1cf 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_solaris.go +++ b/vendor/golang.org/x/net/ipv6/icmp_solaris.go @@ -1,24 +1,27 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 solaris - package ipv6 -func (f *sysICMPv6Filter) accept(typ ICMPType) { - // TODO(mikio): implement this +func (f *icmpv6Filter) accept(typ ICMPType) { + f.X__icmp6_filt[typ>>5] |= 1 << (uint32(typ) & 31) } -func (f *sysICMPv6Filter) block(typ ICMPType) { - // TODO(mikio): implement this +func (f *icmpv6Filter) block(typ ICMPType) { + f.X__icmp6_filt[typ>>5] &^= 1 << (uint32(typ) & 31) } -func (f *sysICMPv6Filter) setAll(block bool) { - // TODO(mikio): implement this +func (f *icmpv6Filter) setAll(block bool) { + for i := range f.X__icmp6_filt { + if block { + f.X__icmp6_filt[i] = 0 + } else { + f.X__icmp6_filt[i] = 1<<32 - 1 + } + } } -func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { - // TODO(mikio): implement this - return false +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { + return f.X__icmp6_filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 } diff --git a/vendor/golang.org/x/net/ipv6/icmp_stub.go b/vendor/golang.org/x/net/ipv6/icmp_stub.go index c1263ecac..3cd84e195 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_stub.go +++ b/vendor/golang.org/x/net/ipv6/icmp_stub.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -6,18 +6,18 @@ package ipv6 -type sysICMPv6Filter struct { +type icmpv6Filter struct { } -func (f *sysICMPv6Filter) accept(typ ICMPType) { +func (f *icmpv6Filter) accept(typ ICMPType) { } -func (f *sysICMPv6Filter) block(typ ICMPType) { +func (f *icmpv6Filter) block(typ ICMPType) { } -func (f *sysICMPv6Filter) setAll(block bool) { +func (f *icmpv6Filter) setAll(block bool) { } -func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { return false } diff --git a/vendor/golang.org/x/net/ipv6/icmp_test.go b/vendor/golang.org/x/net/ipv6/icmp_test.go index e192d6d8c..d8e9675dc 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_test.go +++ b/vendor/golang.org/x/net/ipv6/icmp_test.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -34,7 +34,7 @@ func TestICMPString(t *testing.T) { func TestICMPFilter(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } @@ -61,7 +61,7 @@ func TestICMPFilter(t *testing.T) { func TestSetICMPFilter(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { diff --git a/vendor/golang.org/x/net/ipv6/icmp_windows.go b/vendor/golang.org/x/net/ipv6/icmp_windows.go index f477a8c0d..443cd0736 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_windows.go +++ b/vendor/golang.org/x/net/ipv6/icmp_windows.go @@ -1,22 +1,22 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. package ipv6 -func (f *sysICMPv6Filter) accept(typ ICMPType) { +func (f *icmpv6Filter) accept(typ ICMPType) { // TODO(mikio): implement this } -func (f *sysICMPv6Filter) block(typ ICMPType) { +func (f *icmpv6Filter) block(typ ICMPType) { // TODO(mikio): implement this } -func (f *sysICMPv6Filter) setAll(block bool) { +func (f *icmpv6Filter) setAll(block bool) { // TODO(mikio): implement this } -func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { +func (f *icmpv6Filter) willBlock(typ ICMPType) bool { // TODO(mikio): implement this return false } diff --git a/vendor/golang.org/x/net/ipv6/main_test.go b/vendor/golang.org/x/net/ipv6/main_test.go deleted file mode 100644 index 6ae53bb10..000000000 --- a/vendor/golang.org/x/net/ipv6/main_test.go +++ /dev/null @@ -1,27 +0,0 @@ -// 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. - -package ipv6_test - -import ( - "flag" - "fmt" - "os" - "os/exec" - "runtime" - "strings" - "testing" -) - -func TestMain(m *testing.M) { - flag.Parse() - if runtime.GOOS == "darwin" { - vers, _ := exec.Command("sw_vers", "-productVersion").Output() - if string(vers) == "10.8" || strings.HasPrefix(string(vers), "10.8.") { - fmt.Fprintf(os.Stderr, "# skipping tests on OS X 10.8 to avoid kernel panics; golang.org/issue/17015\n") - os.Exit(0) - } - } - os.Exit(m.Run()) -} diff --git a/vendor/golang.org/x/net/ipv6/mocktransponder_test.go b/vendor/golang.org/x/net/ipv6/mocktransponder_test.go index d587922a1..6efe56c68 100644 --- a/vendor/golang.org/x/net/ipv6/mocktransponder_test.go +++ b/vendor/golang.org/x/net/ipv6/mocktransponder_test.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/ipv6/multicast_test.go b/vendor/golang.org/x/net/ipv6/multicast_test.go index a3a8979d2..69a21cd38 100644 --- a/vendor/golang.org/x/net/ipv6/multicast_test.go +++ b/vendor/golang.org/x/net/ipv6/multicast_test.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -29,15 +29,15 @@ var packetConnReadWriteMulticastUDPTests = []struct { func TestPacketConnReadWriteMulticastUDP(t *testing.T) { switch runtime.GOOS { - case "freebsd": // due to a bug on loopback marking - // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. - t.Skipf("not supported on %s", runtime.GOOS) - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } + if !nettest.SupportsIPv6MulticastDeliveryOnLoopback() { + t.Skipf("multicast delivery doesn't work correctly on %s", runtime.GOOS) + } ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) if ifi == nil { t.Skipf("not available on %s", runtime.GOOS) @@ -129,15 +129,15 @@ var packetConnReadWriteMulticastICMPTests = []struct { func TestPacketConnReadWriteMulticastICMP(t *testing.T) { switch runtime.GOOS { - case "freebsd": // due to a bug on loopback marking - // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. - t.Skipf("not supported on %s", runtime.GOOS) - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { t.Skip("ipv6 is not supported") } + if !nettest.SupportsIPv6MulticastDeliveryOnLoopback() { + t.Skipf("multicast delivery doesn't work correctly on %s", runtime.GOOS) + } if m, ok := nettest.SupportsRawIPSocket(); !ok { t.Skip(m) } @@ -205,7 +205,11 @@ func TestPacketConnReadWriteMulticastICMP(t *testing.T) { if toggle { psh = nil if err := p.SetChecksum(true, 2); err != nil { - t.Fatal(err) + // Solaris never allows to + // modify ICMP properties. + if runtime.GOOS != "solaris" { + t.Fatal(err) + } } } else { psh = pshicmp diff --git a/vendor/golang.org/x/net/ipv6/multicastlistener_test.go b/vendor/golang.org/x/net/ipv6/multicastlistener_test.go index 9711f7513..044db157b 100644 --- a/vendor/golang.org/x/net/ipv6/multicastlistener_test.go +++ b/vendor/golang.org/x/net/ipv6/multicastlistener_test.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -22,7 +22,7 @@ var udpMultipleGroupListenerTests = []net.Addr{ func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { @@ -62,7 +62,7 @@ func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { @@ -114,7 +114,7 @@ func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { @@ -157,7 +157,7 @@ func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { func TestIPSinglePacketConnWithSingleGroupListener(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { @@ -201,7 +201,7 @@ func TestIPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { switch runtime.GOOS { case "darwin", "dragonfly", "openbsd": // platforms that return fe80::1%lo0: bind: can't assign requested address t.Skipf("not supported on %s", runtime.GOOS) - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { diff --git a/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go b/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go index fe0e6e1b1..9e6b902d7 100644 --- a/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go +++ b/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -26,7 +26,7 @@ var packetConnMulticastSocketOptionTests = []struct { func TestPacketConnMulticastSocketOptions(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { diff --git a/vendor/golang.org/x/net/ipv6/payload.go b/vendor/golang.org/x/net/ipv6/payload.go index 529b20bca..682ff22f2 100644 --- a/vendor/golang.org/x/net/ipv6/payload.go +++ b/vendor/golang.org/x/net/ipv6/payload.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/vendor/golang.org/x/net/ipv6/payload_cmsg.go index 8e90d324d..3a33585ef 100644 --- a/vendor/golang.org/x/net/ipv6/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_cmsg.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go index 499204d0c..9731cba43 100644 --- a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/ipv6/readwrite_test.go b/vendor/golang.org/x/net/ipv6/readwrite_test.go index 8c8c6fde0..41f59be5a 100644 --- a/vendor/golang.org/x/net/ipv6/readwrite_test.go +++ b/vendor/golang.org/x/net/ipv6/readwrite_test.go @@ -102,7 +102,7 @@ func benchmarkReadWriteIPv6UDP(b *testing.B, p *ipv6.PacketConn, wb, rb []byte, func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { diff --git a/vendor/golang.org/x/net/ipv6/sockopt_asmreq_posix.go b/vendor/golang.org/x/net/ipv6/sockopt_asmreq_posix.go index 092e39839..cd36739df 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_asmreq_posix.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_asmreq_posix.go @@ -1,8 +1,8 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows package ipv6 @@ -13,10 +13,10 @@ import ( ) func setsockoptIPMreq(s uintptr, opt *sockOpt, ifi *net.Interface, grp net.IP) error { - var mreq sysIPv6Mreq + var mreq ipv6Mreq copy(mreq.Multiaddr[:], grp) if ifi != nil { mreq.setIfindex(ifi.Index) } - return os.NewSyscallError("setsockopt", setsockopt(s, opt.level, opt.name, unsafe.Pointer(&mreq), sysSizeofIPv6Mreq)) + return os.NewSyscallError("setsockopt", setsockopt(s, opt.level, opt.name, unsafe.Pointer(&mreq), sizeofIPv6Mreq)) } diff --git a/vendor/golang.org/x/net/ipv6/sockopt_posix.go b/vendor/golang.org/x/net/ipv6/sockopt_posix.go index 651aa9326..e0a3fa693 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_posix.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_posix.go @@ -1,8 +1,8 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 darwin dragonfly freebsd linux netbsd openbsd windows +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows package ipv6 @@ -67,8 +67,8 @@ func getICMPFilter(s uintptr, opt *sockOpt) (*ICMPFilter, error) { return nil, errOpNoSupport } var f ICMPFilter - l := uint32(sysSizeofICMPv6Filter) - if err := getsockopt(s, opt.level, opt.name, unsafe.Pointer(&f.sysICMPv6Filter), &l); err != nil { + l := uint32(sizeofICMPv6Filter) + if err := getsockopt(s, opt.level, opt.name, unsafe.Pointer(&f.icmpv6Filter), &l); err != nil { return nil, os.NewSyscallError("getsockopt", err) } return &f, nil @@ -78,15 +78,15 @@ func setICMPFilter(s uintptr, opt *sockOpt, f *ICMPFilter) error { if opt.name < 1 || opt.typ != ssoTypeICMPFilter { return errOpNoSupport } - return os.NewSyscallError("setsockopt", setsockopt(s, opt.level, opt.name, unsafe.Pointer(&f.sysICMPv6Filter), sysSizeofICMPv6Filter)) + return os.NewSyscallError("setsockopt", setsockopt(s, opt.level, opt.name, unsafe.Pointer(&f.icmpv6Filter), sizeofICMPv6Filter)) } func getMTUInfo(s uintptr, opt *sockOpt) (*net.Interface, int, error) { if opt.name < 1 || opt.typ != ssoTypeMTUInfo { return nil, 0, errOpNoSupport } - var mi sysIPv6Mtuinfo - l := uint32(sysSizeofIPv6Mtuinfo) + var mi ipv6Mtuinfo + l := uint32(sizeofIPv6Mtuinfo) if err := getsockopt(s, opt.level, opt.name, unsafe.Pointer(&mi), &l); err != nil { return nil, 0, os.NewSyscallError("getsockopt", err) } diff --git a/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_stub.go b/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_stub.go index a17723265..1a8829092 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_stub.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_stub.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !darwin,!freebsd,!linux +// +build !darwin,!freebsd,!linux,!solaris package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_unix.go b/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_unix.go index 88f118ca2..f3668aefc 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_unix.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin freebsd linux +// +build darwin freebsd linux solaris package ipv6 @@ -15,7 +15,7 @@ import ( var freebsd32o64 bool func setsockoptGroupReq(s uintptr, opt *sockOpt, ifi *net.Interface, grp net.IP) error { - var gr sysGroupReq + var gr groupReq if ifi != nil { gr.Interface = uint32(ifi.Index) } @@ -23,21 +23,21 @@ func setsockoptGroupReq(s uintptr, opt *sockOpt, ifi *net.Interface, grp net.IP) var p unsafe.Pointer var l uint32 if freebsd32o64 { - var d [sysSizeofGroupReq + 4]byte - s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr)) + var d [sizeofGroupReq + 4]byte + s := (*[sizeofGroupReq]byte)(unsafe.Pointer(&gr)) copy(d[:4], s[:4]) copy(d[8:], s[4:]) p = unsafe.Pointer(&d[0]) - l = sysSizeofGroupReq + 4 + l = sizeofGroupReq + 4 } else { p = unsafe.Pointer(&gr) - l = sysSizeofGroupReq + l = sizeofGroupReq } return os.NewSyscallError("setsockopt", setsockopt(s, opt.level, opt.name, p, l)) } func setsockoptGroupSourceReq(s uintptr, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { - var gsr sysGroupSourceReq + var gsr groupSourceReq if ifi != nil { gsr.Interface = uint32(ifi.Index) } @@ -45,15 +45,15 @@ func setsockoptGroupSourceReq(s uintptr, opt *sockOpt, ifi *net.Interface, grp, var p unsafe.Pointer var l uint32 if freebsd32o64 { - var d [sysSizeofGroupSourceReq + 4]byte - s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) + var d [sizeofGroupSourceReq + 4]byte + s := (*[sizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) copy(d[:4], s[:4]) copy(d[8:], s[4:]) p = unsafe.Pointer(&d[0]) - l = sysSizeofGroupSourceReq + 4 + l = sizeofGroupSourceReq + 4 } else { p = unsafe.Pointer(&gsr) - l = sysSizeofGroupSourceReq + l = sizeofGroupSourceReq } return os.NewSyscallError("setsockopt", setsockopt(s, opt.level, opt.name, p, l)) } diff --git a/vendor/golang.org/x/net/ipv6/sockopt_stub.go b/vendor/golang.org/x/net/ipv6/sockopt_stub.go index b6b9c4b45..6d59a00c2 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_stub.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_stub.go @@ -1,8 +1,8 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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 nacl plan9 solaris +// +build nacl plan9 package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sockopt_test.go b/vendor/golang.org/x/net/ipv6/sockopt_test.go index 9c2190316..774338dbf 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_test.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_test.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -19,7 +19,7 @@ var supportsIPv6 bool = nettest.SupportsIPv6() func TestConnInitiatorPathMTU(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { @@ -57,7 +57,7 @@ func TestConnInitiatorPathMTU(t *testing.T) { func TestConnResponderPathMTU(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { @@ -95,7 +95,7 @@ func TestConnResponderPathMTU(t *testing.T) { func TestPacketConnChecksum(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { diff --git a/vendor/golang.org/x/net/ipv6/sys_bsd.go b/vendor/golang.org/x/net/ipv6/sys_bsd.go index 0ee43e6d2..c22f8ac63 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bsd.go +++ b/vendor/golang.org/x/net/ipv6/sys_bsd.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -17,9 +17,9 @@ var ( ctlOpts = [ctlMax]ctlOpt{ ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, - ctlPacketInfo: {sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, - ctlNextHop: {sysIPV6_NEXTHOP, sysSizeofSockaddrInet6, marshalNextHop, parseNextHop}, - ctlPathMTU: {sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, } sockOpts = [ssoMax]sockOpt{ @@ -40,17 +40,17 @@ var ( } ) -func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { - sa.Len = sysSizeofSockaddrInet6 +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], ip) sa.Scope_id = uint32(i) } -func (pi *sysInet6Pktinfo) setIfindex(i int) { +func (pi *inet6Pktinfo) setIfindex(i int) { pi.Ifindex = uint32(i) } -func (mreq *sysIPv6Mreq) setIfindex(i int) { +func (mreq *ipv6Mreq) setIfindex(i int) { mreq.Interface = uint32(i) } diff --git a/vendor/golang.org/x/net/ipv6/sys_darwin.go b/vendor/golang.org/x/net/ipv6/sys_darwin.go index 1e1c4aefa..ffcc9d4c4 100644 --- a/vendor/golang.org/x/net/ipv6/sys_darwin.go +++ b/vendor/golang.org/x/net/ipv6/sys_darwin.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -17,7 +17,7 @@ import ( var ( ctlOpts = [ctlMax]ctlOpt{ ctlHopLimit: {sysIPV6_2292HOPLIMIT, 4, marshal2292HopLimit, parseHopLimit}, - ctlPacketInfo: {sysIPV6_2292PKTINFO, sysSizeofInet6Pktinfo, marshal2292PacketInfo, parsePacketInfo}, + ctlPacketInfo: {sysIPV6_2292PKTINFO, sizeofInet6Pktinfo, marshal2292PacketInfo, parsePacketInfo}, } sockOpts = [ssoMax]sockOpt{ @@ -54,9 +54,9 @@ func init() { } ctlOpts[ctlTrafficClass] = ctlOpt{sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass} ctlOpts[ctlHopLimit] = ctlOpt{sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit} - ctlOpts[ctlPacketInfo] = ctlOpt{sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo} - ctlOpts[ctlNextHop] = ctlOpt{sysIPV6_NEXTHOP, sysSizeofSockaddrInet6, marshalNextHop, parseNextHop} - ctlOpts[ctlPathMTU] = ctlOpt{sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU} + ctlOpts[ctlPacketInfo] = ctlOpt{sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo} + ctlOpts[ctlNextHop] = ctlOpt{sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop} + ctlOpts[ctlPathMTU] = ctlOpt{sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU} sockOpts[ssoTrafficClass] = sockOpt{iana.ProtocolIPv6, sysIPV6_TCLASS, ssoTypeInt} sockOpts[ssoReceiveTrafficClass] = sockOpt{iana.ProtocolIPv6, sysIPV6_RECVTCLASS, ssoTypeInt} sockOpts[ssoReceiveHopLimit] = sockOpt{iana.ProtocolIPv6, sysIPV6_RECVHOPLIMIT, ssoTypeInt} @@ -71,35 +71,35 @@ func init() { sockOpts[ssoUnblockSourceGroup] = sockOpt{iana.ProtocolIPv6, sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq} } -func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { - sa.Len = sysSizeofSockaddrInet6 +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], ip) sa.Scope_id = uint32(i) } -func (pi *sysInet6Pktinfo) setIfindex(i int) { +func (pi *inet6Pktinfo) setIfindex(i int) { pi.Ifindex = uint32(i) } -func (mreq *sysIPv6Mreq) setIfindex(i int) { +func (mreq *ipv6Mreq) setIfindex(i int) { mreq.Interface = uint32(i) } -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gr.Pad_cgo_0[0])) - sa.Len = sysSizeofSockaddrInet6 +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Len = sizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], grp) } -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Pad_cgo_0[0])) - sa.Len = sysSizeofSockaddrInet6 +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Len = sizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Pad_cgo_1[0])) - sa.Len = sysSizeofSockaddrInet6 + sa = (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 132)) + sa.Len = sizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], src) } diff --git a/vendor/golang.org/x/net/ipv6/sys_freebsd.go b/vendor/golang.org/x/net/ipv6/sys_freebsd.go index 5527001f1..fd5204beb 100644 --- a/vendor/golang.org/x/net/ipv6/sys_freebsd.go +++ b/vendor/golang.org/x/net/ipv6/sys_freebsd.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -18,9 +18,9 @@ var ( ctlOpts = [ctlMax]ctlOpt{ ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, - ctlPacketInfo: {sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, - ctlNextHop: {sysIPV6_NEXTHOP, sysSizeofSockaddrInet6, marshalNextHop, parseNextHop}, - ctlPathMTU: {sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, } sockOpts = [ssoMax]sockOpt{ @@ -57,35 +57,35 @@ func init() { } } -func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { - sa.Len = sysSizeofSockaddrInet6 +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Len = sizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], ip) sa.Scope_id = uint32(i) } -func (pi *sysInet6Pktinfo) setIfindex(i int) { +func (pi *inet6Pktinfo) setIfindex(i int) { pi.Ifindex = uint32(i) } -func (mreq *sysIPv6Mreq) setIfindex(i int) { +func (mreq *ipv6Mreq) setIfindex(i int) { mreq.Interface = uint32(i) } -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gr.Group)) - sa.Len = sysSizeofSockaddrInet6 +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gr.Group)) + sa.Len = sizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], grp) } -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Group)) - sa.Len = sysSizeofSockaddrInet6 +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gsr.Group)) + sa.Len = sizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Source)) - sa.Len = sysSizeofSockaddrInet6 + sa = (*sockaddrInet6)(unsafe.Pointer(&gsr.Source)) + sa.Len = sizeofSockaddrInet6 sa.Family = syscall.AF_INET6 copy(sa.Addr[:], src) } diff --git a/vendor/golang.org/x/net/ipv6/sys_linux.go b/vendor/golang.org/x/net/ipv6/sys_linux.go index fd7d5b188..42f5f7853 100644 --- a/vendor/golang.org/x/net/ipv6/sys_linux.go +++ b/vendor/golang.org/x/net/ipv6/sys_linux.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -16,8 +16,8 @@ var ( ctlOpts = [ctlMax]ctlOpt{ ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, - ctlPacketInfo: {sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, - ctlPathMTU: {sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, } sockOpts = [ssoMax]sockOpt{ @@ -42,31 +42,31 @@ var ( } ) -func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { sa.Family = syscall.AF_INET6 copy(sa.Addr[:], ip) sa.Scope_id = uint32(i) } -func (pi *sysInet6Pktinfo) setIfindex(i int) { +func (pi *inet6Pktinfo) setIfindex(i int) { pi.Ifindex = int32(i) } -func (mreq *sysIPv6Mreq) setIfindex(i int) { +func (mreq *ipv6Mreq) setIfindex(i int) { mreq.Ifindex = int32(i) } -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gr.Group)) +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gr.Group)) sa.Family = syscall.AF_INET6 copy(sa.Addr[:], grp) } -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Group)) +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(&gsr.Group)) sa.Family = syscall.AF_INET6 copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Source)) + sa = (*sockaddrInet6)(unsafe.Pointer(&gsr.Source)) sa.Family = syscall.AF_INET6 copy(sa.Addr[:], src) } diff --git a/vendor/golang.org/x/net/ipv6/thunk_linux_386.s b/vendor/golang.org/x/net/ipv6/sys_linux_386.s index daa78bc02..b85551a5c 100644 --- a/vendor/golang.org/x/net/ipv6/thunk_linux_386.s +++ b/vendor/golang.org/x/net/ipv6/sys_linux_386.s @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build go1.2 +#include "textflag.h" -TEXT ·socketcall(SB),4,$0-36 +TEXT ·socketcall(SB),NOSPLIT,$0-36 JMP syscall·socketcall(SB) diff --git a/vendor/golang.org/x/net/ipv6/sys_solaris.go b/vendor/golang.org/x/net/ipv6/sys_solaris.go new file mode 100644 index 000000000..9bd2d66fd --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_solaris.go @@ -0,0 +1,73 @@ +// 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. + +package ipv6 + +import ( + "net" + "syscall" + "unsafe" + + "golang.org/x/net/internal/iana" +) + +var ( + ctlOpts = [ctlMax]ctlOpt{ + ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, + ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, + ctlPacketInfo: {sysIPV6_PKTINFO, sizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, + ctlNextHop: {sysIPV6_NEXTHOP, sizeofSockaddrInet6, marshalNextHop, parseNextHop}, + ctlPathMTU: {sysIPV6_PATHMTU, sizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, + } + + sockOpts = [ssoMax]sockOpt{ + ssoTrafficClass: {iana.ProtocolIPv6, sysIPV6_TCLASS, ssoTypeInt}, + ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, + ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, + ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, + ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, + ssoReceiveTrafficClass: {iana.ProtocolIPv6, sysIPV6_RECVTCLASS, ssoTypeInt}, + ssoReceiveHopLimit: {iana.ProtocolIPv6, sysIPV6_RECVHOPLIMIT, ssoTypeInt}, + ssoReceivePacketInfo: {iana.ProtocolIPv6, sysIPV6_RECVPKTINFO, ssoTypeInt}, + ssoReceivePathMTU: {iana.ProtocolIPv6, sysIPV6_RECVPATHMTU, ssoTypeInt}, + ssoPathMTU: {iana.ProtocolIPv6, sysIPV6_PATHMTU, ssoTypeMTUInfo}, + ssoChecksum: {iana.ProtocolIPv6, sysIPV6_CHECKSUM, ssoTypeInt}, + ssoICMPFilter: {iana.ProtocolIPv6ICMP, sysICMP6_FILTER, ssoTypeICMPFilter}, + ssoJoinGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, + ssoLeaveGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, + ssoJoinSourceGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoLeaveSourceGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, + ssoBlockSourceGroup: {iana.ProtocolIPv6, sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, + ssoUnblockSourceGroup: {iana.ProtocolIPv6, sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, + } +) + +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], ip) + sa.Scope_id = uint32(i) +} + +func (pi *inet6Pktinfo) setIfindex(i int) { + pi.Ifindex = uint32(i) +} + +func (mreq *ipv6Mreq) setIfindex(i int) { + mreq.Interface = uint32(i) +} + +func (gr *groupReq) setGroup(grp net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gr)) + 4)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) +} + +func (gsr *groupSourceReq) setSourceGroup(grp, src net.IP) { + sa := (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 4)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], grp) + sa = (*sockaddrInet6)(unsafe.Pointer(uintptr(unsafe.Pointer(gsr)) + 260)) + sa.Family = syscall.AF_INET6 + copy(sa.Addr[:], src) +} diff --git a/vendor/golang.org/x/net/ipv6/sys_solaris_amd64.s b/vendor/golang.org/x/net/ipv6/sys_solaris_amd64.s new file mode 100644 index 000000000..39d76af79 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/sys_solaris_amd64.s @@ -0,0 +1,8 @@ +// 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. + +#include "textflag.h" + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) diff --git a/vendor/golang.org/x/net/ipv6/sys_stub.go b/vendor/golang.org/x/net/ipv6/sys_stub.go index ead0f4d11..7663bfc09 100644 --- a/vendor/golang.org/x/net/ipv6/sys_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_stub.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build nacl plan9 solaris +// +build nacl plan9 package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_windows.go b/vendor/golang.org/x/net/ipv6/sys_windows.go index 405190684..003c507d5 100644 --- a/vendor/golang.org/x/net/ipv6/sys_windows.go +++ b/vendor/golang.org/x/net/ipv6/sys_windows.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -21,14 +21,14 @@ const ( sysIPV6_LEAVE_GROUP = 0xd sysIPV6_PKTINFO = 0x13 - sysSizeofSockaddrInet6 = 0x1c + sizeofSockaddrInet6 = 0x1c - sysSizeofIPv6Mreq = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofICMPv6Filter = 0 + sizeofIPv6Mreq = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofICMPv6Filter = 0 ) -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -36,17 +36,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysICMPv6Filter struct { +type icmpv6Filter struct { // TODO(mikio): implement this } @@ -63,12 +63,12 @@ var ( } ) -func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { +func (sa *sockaddrInet6) setSockaddr(ip net.IP, i int) { sa.Family = syscall.AF_INET6 copy(sa.Addr[:], ip) sa.Scope_id = uint32(i) } -func (mreq *sysIPv6Mreq) setIfindex(i int) { +func (mreq *ipv6Mreq) setIfindex(i int) { mreq.Interface = uint32(i) } diff --git a/vendor/golang.org/x/net/ipv6/syscall_solaris.go b/vendor/golang.org/x/net/ipv6/syscall_solaris.go new file mode 100644 index 000000000..2a5c8ee47 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/syscall_solaris.go @@ -0,0 +1,38 @@ +// 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. + +package ipv6 + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" + +//go:linkname procGetsockopt libc___xnet_getsockopt +//go:linkname procSetsockopt libc_setsockopt + +var ( + procGetsockopt uintptr + procSetsockopt uintptr +) + +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) + +func getsockopt(s uintptr, level, name int, v unsafe.Pointer, l *uint32) error { + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procGetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0) + if errno != 0 { + return error(errno) + } + return nil +} + +func setsockopt(s uintptr, level, name int, v unsafe.Pointer, l uint32) error { + if _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procSetsockopt)), 5, s, uintptr(level), uintptr(name), uintptr(v), uintptr(l), 0); errno != 0 { + return error(errno) + } + return nil +} diff --git a/vendor/golang.org/x/net/ipv6/syscall_unix.go b/vendor/golang.org/x/net/ipv6/syscall_unix.go index 52eb9bd79..58a75b528 100644 --- a/vendor/golang.org/x/net/ipv6/syscall_unix.go +++ b/vendor/golang.org/x/net/ipv6/syscall_unix.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/ipv6/unicast_test.go b/vendor/golang.org/x/net/ipv6/unicast_test.go index db5b08a28..406d07128 100644 --- a/vendor/golang.org/x/net/ipv6/unicast_test.go +++ b/vendor/golang.org/x/net/ipv6/unicast_test.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -20,7 +20,7 @@ import ( func TestPacketConnReadWriteUnicastUDP(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { @@ -81,7 +81,7 @@ func TestPacketConnReadWriteUnicastUDP(t *testing.T) { func TestPacketConnReadWriteUnicastICMP(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { @@ -127,7 +127,11 @@ func TestPacketConnReadWriteUnicastICMP(t *testing.T) { if toggle { psh = nil if err := p.SetChecksum(true, 2); err != nil { - t.Fatal(err) + // Solaris never allows to modify + // ICMP properties. + if runtime.GOOS != "solaris" { + t.Fatal(err) + } } } else { psh = pshicmp diff --git a/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go b/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go index 7bb2e440a..1c52b3d30 100644 --- a/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go +++ b/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. @@ -16,7 +16,7 @@ import ( func TestConnUnicastSocketOptions(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { @@ -52,7 +52,7 @@ var packetConnUnicastSocketOptionTests = []struct { func TestPacketConnUnicastSocketOptions(t *testing.T) { switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": + case "nacl", "plan9", "windows": t.Skipf("not supported on %s", runtime.GOOS) } if !supportsIPv6 { diff --git a/vendor/golang.org/x/net/ipv6/zsys_darwin.go b/vendor/golang.org/x/net/ipv6/zsys_darwin.go index cb044b033..6aab1dfab 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_darwin.go +++ b/vendor/golang.org/x/net/ipv6/zsys_darwin.go @@ -71,19 +71,19 @@ const ( sysIPV6_PORTRANGE_HIGH = 0x1 sysIPV6_PORTRANGE_LOW = 0x2 - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysSockaddrStorage struct { +type sockaddrStorage struct { Len uint8 Family uint8 X__ss_pad1 [6]int8 @@ -91,7 +91,7 @@ type sysSockaddrStorage struct { X__ss_pad2 [112]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Len uint8 Family uint8 Port uint16 @@ -100,31 +100,31 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Filt [8]uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [128]byte } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [128]byte Pad_cgo_1 [128]byte diff --git a/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go index 5a03ab734..d2de804d8 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go +++ b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_dragonfly.go -// +build dragonfly - package ipv6 const ( @@ -52,16 +50,16 @@ const ( sysIPV6_PORTRANGE_HIGH = 0x1 sysIPV6_PORTRANGE_LOW = 0x2 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6Mreq = 0x14 + sizeofIPv6Mreq = 0x14 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Len uint8 Family uint8 Port uint16 @@ -70,21 +68,21 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Filt [8]uint32 } diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go index 4ace96f0c..919e572d4 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go @@ -62,19 +62,19 @@ const ( sysIPV6_PORTRANGE_HIGH = 0x1 sysIPV6_PORTRANGE_LOW = 0x2 - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysSockaddrStorage struct { +type sockaddrStorage struct { Len uint8 Family uint8 X__ss_pad1 [6]int8 @@ -82,7 +82,7 @@ type sysSockaddrStorage struct { X__ss_pad2 [112]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Len uint8 Family uint8 Port uint16 @@ -91,32 +91,32 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 - Group sysSockaddrStorage + Group sockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 - Group sysSockaddrStorage - Source sysSockaddrStorage + Group sockaddrStorage + Source sockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Filt [8]uint32 } diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go index 4a62c2d5c..cb8141f9c 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go @@ -62,19 +62,19 @@ const ( sysIPV6_PORTRANGE_HIGH = 0x1 sysIPV6_PORTRANGE_LOW = 0x2 - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysSockaddrStorage struct { +type sockaddrStorage struct { Len uint8 Family uint8 X__ss_pad1 [6]int8 @@ -82,7 +82,7 @@ type sysSockaddrStorage struct { X__ss_pad2 [112]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Len uint8 Family uint8 Port uint16 @@ -91,34 +91,34 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysSockaddrStorage + Group sockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysSockaddrStorage - Source sysSockaddrStorage + Group sockaddrStorage + Source sockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Filt [8]uint32 } diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go index 4a62c2d5c..cb8141f9c 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go +++ b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go @@ -62,19 +62,19 @@ const ( sysIPV6_PORTRANGE_HIGH = 0x1 sysIPV6_PORTRANGE_LOW = 0x2 - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysSockaddrStorage struct { +type sockaddrStorage struct { Len uint8 Family uint8 X__ss_pad1 [6]int8 @@ -82,7 +82,7 @@ type sysSockaddrStorage struct { X__ss_pad2 [112]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Len uint8 Family uint8 Port uint16 @@ -91,34 +91,34 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysSockaddrStorage + Group sockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysSockaddrStorage - Source sysSockaddrStorage + Group sockaddrStorage + Source sockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Filt [8]uint32 } diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go index 36fccbb62..f5a410945 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go @@ -87,25 +87,25 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -113,17 +113,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex int32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6FlowlabelReq struct { +type ipv6FlowlabelReq struct { Dst [16]byte /* in6_addr */ Label uint32 Action uint8 @@ -134,33 +134,33 @@ type sysIPv6FlowlabelReq struct { X__flr_pad uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Ifindex int32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Data [8]uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [2]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go index 7461e7e03..f9376b65c 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go @@ -87,25 +87,25 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -113,17 +113,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex int32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6FlowlabelReq struct { +type ipv6FlowlabelReq struct { Dst [16]byte /* in6_addr */ Label uint32 Action uint8 @@ -134,35 +134,35 @@ type sysIPv6FlowlabelReq struct { X__flr_pad uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Ifindex int32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Data [8]uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go index 36fccbb62..f5a410945 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go @@ -87,25 +87,25 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -113,17 +113,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex int32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6FlowlabelReq struct { +type ipv6FlowlabelReq struct { Dst [16]byte /* in6_addr */ Label uint32 Action uint8 @@ -134,33 +134,33 @@ type sysIPv6FlowlabelReq struct { X__flr_pad uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Ifindex int32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Data [8]uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [2]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go index ed35f6039..f9376b65c 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,arm64 - package ipv6 const ( @@ -89,25 +87,25 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -115,17 +113,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex int32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6FlowlabelReq struct { +type ipv6FlowlabelReq struct { Dst [16]byte /* in6_addr */ Label uint32 Action uint8 @@ -136,35 +134,35 @@ type sysIPv6FlowlabelReq struct { X__flr_pad uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Ifindex int32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Data [8]uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go index 141c86977..f9376b65c 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,mips64 - package ipv6 const ( @@ -89,25 +87,25 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -115,17 +113,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex int32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6FlowlabelReq struct { +type ipv6FlowlabelReq struct { Dst [16]byte /* in6_addr */ Label uint32 Action uint8 @@ -136,35 +134,35 @@ type sysIPv6FlowlabelReq struct { X__flr_pad uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Ifindex int32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Data [8]uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go index d50eb633e..f9376b65c 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_mips64le.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,mips64le - package ipv6 const ( @@ -89,25 +87,25 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -115,17 +113,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex int32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6FlowlabelReq struct { +type ipv6FlowlabelReq struct { Dst [16]byte /* in6_addr */ Label uint32 Action uint8 @@ -136,35 +134,35 @@ type sysIPv6FlowlabelReq struct { X__flr_pad uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Ifindex int32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Data [8]uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go index 4c58ea67d..be2dbd666 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,ppc - package ipv6 const ( @@ -89,25 +87,25 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x84 + sizeofGroupSourceReq = 0x104 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]uint8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -115,17 +113,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex int32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6FlowlabelReq struct { +type ipv6FlowlabelReq struct { Dst [16]byte /* in6_addr */ Label uint32 Action uint8 @@ -136,33 +134,33 @@ type sysIPv6FlowlabelReq struct { X__flr_pad uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Ifindex int32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Data [8]uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [2]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go index c1d775f77..f9376b65c 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,ppc64 - package ipv6 const ( @@ -89,25 +87,25 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -115,17 +113,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex int32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6FlowlabelReq struct { +type ipv6FlowlabelReq struct { Dst [16]byte /* in6_addr */ Label uint32 Action uint8 @@ -136,35 +134,35 @@ type sysIPv6FlowlabelReq struct { X__flr_pad uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Ifindex int32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Data [8]uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go index e385fb7aa..f9376b65c 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,ppc64le - package ipv6 const ( @@ -89,25 +87,25 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -115,17 +113,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex int32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6FlowlabelReq struct { +type ipv6FlowlabelReq struct { Dst [16]byte /* in6_addr */ Label uint32 Action uint8 @@ -136,35 +134,35 @@ type sysIPv6FlowlabelReq struct { X__flr_pad uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Ifindex int32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Data [8]uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go index 28d69b1b0..f9376b65c 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_s390x.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_linux.go -// +build linux,s390x - package ipv6 const ( @@ -89,25 +87,25 @@ const ( sysSOL_SOCKET = 0x1 sysSO_ATTACH_FILTER = 0x1a - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 + sizeofKernelSockaddrStorage = 0x80 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 + sizeofIPv6FlowlabelReq = 0x20 - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x88 + sizeofGroupSourceReq = 0x108 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysKernelSockaddrStorage struct { +type kernelSockaddrStorage struct { Family uint16 X__data [126]int8 } -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -115,17 +113,17 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex int32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6FlowlabelReq struct { +type ipv6FlowlabelReq struct { Dst [16]byte /* in6_addr */ Label uint32 Action uint8 @@ -136,35 +134,35 @@ type sysIPv6FlowlabelReq struct { X__flr_pad uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Ifindex int32 } -type sysGroupReq struct { +type groupReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage + Group kernelSockaddrStorage } -type sysGroupSourceReq struct { +type groupSourceReq struct { Interface uint32 Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage + Group kernelSockaddrStorage + Source kernelSockaddrStorage } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Data [8]uint32 } -type sysSockFProg struct { +type sockFProg struct { Len uint16 Pad_cgo_0 [6]byte - Filter *sysSockFilter + Filter *sockFilter } -type sysSockFilter struct { +type sockFilter struct { Code uint16 Jt uint8 Jf uint8 diff --git a/vendor/golang.org/x/net/ipv6/zsys_netbsd.go b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go index d6ec88e39..bcada13b7 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_netbsd.go +++ b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go @@ -46,16 +46,16 @@ const ( sysIPV6_PORTRANGE_HIGH = 0x1 sysIPV6_PORTRANGE_LOW = 0x2 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6Mreq = 0x14 + sizeofIPv6Mreq = 0x14 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Len uint8 Family uint8 Port uint16 @@ -64,21 +64,21 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Filt [8]uint32 } diff --git a/vendor/golang.org/x/net/ipv6/zsys_openbsd.go b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go index 3e080b78a..86cf3c637 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_openbsd.go +++ b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go @@ -55,16 +55,16 @@ const ( sysIPV6_PORTRANGE_HIGH = 0x1 sysIPV6_PORTRANGE_LOW = 0x2 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 + sizeofSockaddrInet6 = 0x1c + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6Mreq = 0x14 + sizeofIPv6Mreq = 0x14 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysSockaddrInet6 struct { +type sockaddrInet6 struct { Len uint8 Family uint8 Port uint16 @@ -73,21 +73,21 @@ type sysSockaddrInet6 struct { Scope_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } -type sysICMPv6Filter struct { +type icmpv6Filter struct { Filt [8]uint32 } diff --git a/vendor/golang.org/x/net/ipv6/zsys_solaris.go b/vendor/golang.org/x/net/ipv6/zsys_solaris.go index cdf00c25d..cf1837dd2 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_solaris.go +++ b/vendor/golang.org/x/net/ipv6/zsys_solaris.go @@ -1,8 +1,6 @@ // Created by cgo -godefs - DO NOT EDIT // cgo -godefs defs_solaris.go -// +build solaris - package ipv6 const ( @@ -44,6 +42,13 @@ const ( sysIPV6_RECVDSTOPTS = 0x28 + sysMCAST_JOIN_GROUP = 0x29 + sysMCAST_LEAVE_GROUP = 0x2a + sysMCAST_BLOCK_SOURCE = 0x2b + sysMCAST_UNBLOCK_SOURCE = 0x2c + sysMCAST_JOIN_SOURCE_GROUP = 0x2d + sysMCAST_LEAVE_SOURCE_GROUP = 0x2e + sysIPV6_PREFER_SRC_HOME = 0x1 sysIPV6_PREFER_SRC_COA = 0x2 sysIPV6_PREFER_SRC_PUBLIC = 0x4 @@ -67,16 +72,26 @@ const ( sysICMP6_FILTER = 0x1 - sysSizeofSockaddrInet6 = 0x20 - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x24 + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet6 = 0x20 + sizeofInet6Pktinfo = 0x14 + sizeofIPv6Mtuinfo = 0x24 - sysSizeofIPv6Mreq = 0x14 + sizeofIPv6Mreq = 0x14 + sizeofGroupReq = 0x104 + sizeofGroupSourceReq = 0x204 - sysSizeofICMPv6Filter = 0x20 + sizeofICMPv6Filter = 0x20 ) -type sysSockaddrInet6 struct { +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +type sockaddrInet6 struct { Family uint16 Port uint16 Flowinfo uint32 @@ -85,21 +100,32 @@ type sysSockaddrInet6 struct { X__sin6_src_id uint32 } -type sysInet6Pktinfo struct { +type inet6Pktinfo struct { Addr [16]byte /* in6_addr */ Ifindex uint32 } -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 +type ipv6Mtuinfo struct { + Addr sockaddrInet6 Mtu uint32 } -type sysIPv6Mreq struct { +type ipv6Mreq struct { Multiaddr [16]byte /* in6_addr */ Interface uint32 } -type sysICMPv6Filter struct { +type groupReq struct { + Interface uint32 + Pad_cgo_0 [256]byte +} + +type groupSourceReq struct { + Interface uint32 + Pad_cgo_0 [256]byte + Pad_cgo_1 [256]byte +} + +type icmpv6Filter struct { X__icmp6_filt [8]uint32 } diff --git a/vendor/golang.org/x/net/lif/address.go b/vendor/golang.org/x/net/lif/address.go new file mode 100644 index 000000000..f9b34aed0 --- /dev/null +++ b/vendor/golang.org/x/net/lif/address.go @@ -0,0 +1,105 @@ +// 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 solaris + +package lif + +import ( + "errors" + "unsafe" +) + +// An Addr represents an address associated with packet routing. +type Addr interface { + // Family returns an address family. + Family() int +} + +// An Inet4Addr represents an internet address for IPv4. +type Inet4Addr struct { + IP [4]byte // IP address + PrefixLen int // address prefix length +} + +// Family implements the Family method of Addr interface. +func (a *Inet4Addr) Family() int { return sysAF_INET } + +// An Inet6Addr represents an internet address for IPv6. +type Inet6Addr struct { + IP [16]byte // IP address + PrefixLen int // address prefix length + ZoneID int // zone identifier +} + +// Family implements the Family method of Addr interface. +func (a *Inet6Addr) Family() int { return sysAF_INET6 } + +// Addrs returns a list of interface addresses. +// +// The provided af must be an address family and name must be a data +// link name. The zero value of af or name means a wildcard. +func Addrs(af int, name string) ([]Addr, error) { + eps, err := newEndpoints(af) + if len(eps) == 0 { + return nil, err + } + defer func() { + for _, ep := range eps { + ep.close() + } + }() + lls, err := links(eps, name) + if len(lls) == 0 { + return nil, err + } + var as []Addr + for _, ll := range lls { + var lifr lifreq + for i := 0; i < len(ll.Name); i++ { + lifr.Name[i] = int8(ll.Name[i]) + } + for _, ep := range eps { + ioc := int64(sysSIOCGLIFADDR) + err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifr)) + if err != nil { + continue + } + sa := (*sockaddrStorage)(unsafe.Pointer(&lifr.Lifru[0])) + l := int(littleEndian.Uint32(lifr.Lifru1[:4])) + if l == 0 { + continue + } + switch sa.Family { + case sysAF_INET: + a := &Inet4Addr{PrefixLen: l} + copy(a.IP[:], lifr.Lifru[4:8]) + as = append(as, a) + case sysAF_INET6: + a := &Inet6Addr{PrefixLen: l, ZoneID: int(littleEndian.Uint32(lifr.Lifru[24:28]))} + copy(a.IP[:], lifr.Lifru[8:24]) + as = append(as, a) + } + } + } + return as, nil +} + +func parseLinkAddr(b []byte) ([]byte, error) { + nlen, alen, slen := int(b[1]), int(b[2]), int(b[3]) + l := 4 + nlen + alen + slen + if len(b) < l { + return nil, errors.New("invalid address") + } + b = b[4:] + var addr []byte + if nlen > 0 { + b = b[nlen:] + } + if alen > 0 { + addr = make([]byte, alen) + copy(addr, b[:alen]) + } + return addr, nil +} diff --git a/vendor/golang.org/x/net/lif/address_test.go b/vendor/golang.org/x/net/lif/address_test.go new file mode 100644 index 000000000..f62ed9347 --- /dev/null +++ b/vendor/golang.org/x/net/lif/address_test.go @@ -0,0 +1,121 @@ +// 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 solaris + +package lif + +import ( + "fmt" + "testing" +) + +type addrFamily int + +func (af addrFamily) String() string { + switch af { + case sysAF_UNSPEC: + return "unspec" + case sysAF_INET: + return "inet4" + case sysAF_INET6: + return "inet6" + default: + return fmt.Sprintf("%d", af) + } +} + +const hexDigit = "0123456789abcdef" + +type llAddr []byte + +func (a llAddr) String() string { + if len(a) == 0 { + return "" + } + buf := make([]byte, 0, len(a)*3-1) + for i, b := range a { + if i > 0 { + buf = append(buf, ':') + } + buf = append(buf, hexDigit[b>>4]) + buf = append(buf, hexDigit[b&0xF]) + } + return string(buf) +} + +type ipAddr []byte + +func (a ipAddr) String() string { + if len(a) == 0 { + return "<nil>" + } + if len(a) == 4 { + return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3]) + } + if len(a) == 16 { + return fmt.Sprintf("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]) + } + s := make([]byte, len(a)*2) + for i, tn := range a { + s[i*2], s[i*2+1] = hexDigit[tn>>4], hexDigit[tn&0xf] + } + return string(s) +} + +func (a *Inet4Addr) String() string { + return fmt.Sprintf("(%s %s %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen) +} + +func (a *Inet6Addr) String() string { + return fmt.Sprintf("(%s %s %d %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen, a.ZoneID) +} + +type addrPack struct { + af int + as []Addr +} + +func addrPacks() ([]addrPack, error) { + var aps []addrPack + for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + as, err := Addrs(af, "") + if err != nil { + return nil, err + } + aps = append(aps, addrPack{af: af, as: as}) + } + return aps, nil +} + +func TestAddrs(t *testing.T) { + aps, err := addrPacks() + if len(aps) == 0 && err != nil { + t.Fatal(err) + } + lps, err := linkPacks() + if len(lps) == 0 && err != nil { + t.Fatal(err) + } + for _, lp := range lps { + n := 0 + for _, ll := range lp.lls { + as, err := Addrs(lp.af, ll.Name) + if err != nil { + t.Fatal(lp.af, ll.Name, err) + } + t.Logf("af=%s name=%s %v", addrFamily(lp.af), ll.Name, as) + n += len(as) + } + for _, ap := range aps { + if ap.af != lp.af { + continue + } + if n != len(ap.as) { + t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(ap.as)) + continue + } + } + } +} diff --git a/vendor/golang.org/x/net/lif/binary.go b/vendor/golang.org/x/net/lif/binary.go new file mode 100644 index 000000000..aade9eafa --- /dev/null +++ b/vendor/golang.org/x/net/lif/binary.go @@ -0,0 +1,68 @@ +// 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 solaris + +package lif + +// This file contains duplicates of encoding/binary package. +// +// This package is supposed to be used by the net package of standard +// library. Therefore the package set used in the package must be the +// same as net package. + +var littleEndian binaryLittleEndian + +type binaryByteOrder interface { + Uint16([]byte) uint16 + Uint32([]byte) uint32 + Uint64([]byte) uint64 + PutUint16([]byte, uint16) + PutUint32([]byte, uint32) + PutUint64([]byte, uint64) +} + +type binaryLittleEndian struct{} + +func (binaryLittleEndian) Uint16(b []byte) uint16 { + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint16(b[0]) | uint16(b[1])<<8 +} + +func (binaryLittleEndian) PutUint16(b []byte, v uint16) { + _ = b[1] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) +} + +func (binaryLittleEndian) Uint32(b []byte) uint32 { + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func (binaryLittleEndian) PutUint32(b []byte, v uint32) { + _ = b[3] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) +} + +func (binaryLittleEndian) Uint64(b []byte) uint64 { + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 +} + +func (binaryLittleEndian) PutUint64(b []byte, v uint64) { + _ = b[7] // early bounds check to guarantee safety of writes below + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) +} diff --git a/vendor/golang.org/x/net/lif/defs_solaris.go b/vendor/golang.org/x/net/lif/defs_solaris.go new file mode 100644 index 000000000..8b84ba5e3 --- /dev/null +++ b/vendor/golang.org/x/net/lif/defs_solaris.go @@ -0,0 +1,90 @@ +// 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 ignore + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package lif + +/* +#include <sys/socket.h> +#include <sys/sockio.h> + +#include <net/if.h> +#include <net/if_types.h> +*/ +import "C" + +const ( + sysAF_UNSPEC = C.AF_UNSPEC + sysAF_INET = C.AF_INET + sysAF_INET6 = C.AF_INET6 + + sysSOCK_DGRAM = C.SOCK_DGRAM +) + +type sockaddrStorage C.struct_sockaddr_storage + +const ( + sysLIFC_NOXMIT = C.LIFC_NOXMIT + sysLIFC_EXTERNAL_SOURCE = C.LIFC_EXTERNAL_SOURCE + sysLIFC_TEMPORARY = C.LIFC_TEMPORARY + sysLIFC_ALLZONES = C.LIFC_ALLZONES + sysLIFC_UNDER_IPMP = C.LIFC_UNDER_IPMP + sysLIFC_ENABLED = C.LIFC_ENABLED + + sysSIOCGLIFADDR = C.SIOCGLIFADDR + sysSIOCGLIFDSTADDR = C.SIOCGLIFDSTADDR + sysSIOCGLIFFLAGS = C.SIOCGLIFFLAGS + sysSIOCGLIFMTU = C.SIOCGLIFMTU + sysSIOCGLIFNETMASK = C.SIOCGLIFNETMASK + sysSIOCGLIFMETRIC = C.SIOCGLIFMETRIC + sysSIOCGLIFNUM = C.SIOCGLIFNUM + sysSIOCGLIFINDEX = C.SIOCGLIFINDEX + sysSIOCGLIFSUBNET = C.SIOCGLIFSUBNET + sysSIOCGLIFLNKINFO = C.SIOCGLIFLNKINFO + sysSIOCGLIFCONF = C.SIOCGLIFCONF + sysSIOCGLIFHWADDR = C.SIOCGLIFHWADDR +) + +const ( + sysIFF_UP = C.IFF_UP + sysIFF_BROADCAST = C.IFF_BROADCAST + sysIFF_DEBUG = C.IFF_DEBUG + sysIFF_LOOPBACK = C.IFF_LOOPBACK + sysIFF_POINTOPOINT = C.IFF_POINTOPOINT + sysIFF_NOTRAILERS = C.IFF_NOTRAILERS + sysIFF_RUNNING = C.IFF_RUNNING + sysIFF_NOARP = C.IFF_NOARP + sysIFF_PROMISC = C.IFF_PROMISC + sysIFF_ALLMULTI = C.IFF_ALLMULTI + sysIFF_INTELLIGENT = C.IFF_INTELLIGENT + sysIFF_MULTICAST = C.IFF_MULTICAST + sysIFF_MULTI_BCAST = C.IFF_MULTI_BCAST + sysIFF_UNNUMBERED = C.IFF_UNNUMBERED + sysIFF_PRIVATE = C.IFF_PRIVATE +) + +const ( + sizeofLifnum = C.sizeof_struct_lifnum + sizeofLifreq = C.sizeof_struct_lifreq + sizeofLifconf = C.sizeof_struct_lifconf + sizeofLifIfinfoReq = C.sizeof_struct_lif_ifinfo_req +) + +type sysLifnum C.struct_lifnum + +type lifreq C.struct_lifreq + +type lifconf C.struct_lifconf + +type lifIfinfoReq C.struct_lif_ifinfo_req + +const ( + sysIFT_IPV4 = C.IFT_IPV4 + sysIFT_IPV6 = C.IFT_IPV6 + sysIFT_6TO4 = C.IFT_6TO4 +) diff --git a/vendor/golang.org/x/net/lif/lif.go b/vendor/golang.org/x/net/lif/lif.go new file mode 100644 index 000000000..6e81f81f1 --- /dev/null +++ b/vendor/golang.org/x/net/lif/lif.go @@ -0,0 +1,43 @@ +// 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 solaris + +// Package lif provides basic functions for the manipulation of +// logical network interfaces and interface addresses on Solaris. +// +// The package supports Solaris 11 or above. +package lif + +import "syscall" + +type endpoint struct { + af int + s uintptr +} + +func (ep *endpoint) close() error { + return syscall.Close(int(ep.s)) +} + +func newEndpoints(af int) ([]endpoint, error) { + var lastErr error + var eps []endpoint + afs := []int{sysAF_INET, sysAF_INET6} + if af != sysAF_UNSPEC { + afs = []int{af} + } + for _, af := range afs { + s, err := syscall.Socket(af, sysSOCK_DGRAM, 0) + if err != nil { + lastErr = err + continue + } + eps = append(eps, endpoint{af: af, s: uintptr(s)}) + } + if len(eps) == 0 { + return nil, lastErr + } + return eps, nil +} diff --git a/vendor/golang.org/x/net/lif/link.go b/vendor/golang.org/x/net/lif/link.go new file mode 100644 index 000000000..76fa6c687 --- /dev/null +++ b/vendor/golang.org/x/net/lif/link.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 solaris + +package lif + +import "unsafe" + +// A Link represents logical data link information. +// +// It also represents base information for logical network interface. +// On Solaris, each logical network interface represents network layer +// adjacency information and the interface has a only single network +// address or address pair for tunneling. It's usual that multiple +// logical network interfaces share the same logical data link. +type Link struct { + Name string // name, equivalent to IP interface name + Index int // index, equivalent to IP interface index + Type int // type + Flags int // flags + MTU int // maximum transmission unit, basically link MTU but may differ between IP address families + Addr []byte // address +} + +func (ll *Link) fetch(s uintptr) { + var lifr lifreq + for i := 0; i < len(ll.Name); i++ { + lifr.Name[i] = int8(ll.Name[i]) + } + ioc := int64(sysSIOCGLIFINDEX) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.Index = int(littleEndian.Uint32(lifr.Lifru[:4])) + } + ioc = int64(sysSIOCGLIFFLAGS) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.Flags = int(littleEndian.Uint64(lifr.Lifru[:8])) + } + ioc = int64(sysSIOCGLIFMTU) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.MTU = int(littleEndian.Uint32(lifr.Lifru[:4])) + } + switch ll.Type { + case sysIFT_IPV4, sysIFT_IPV6, sysIFT_6TO4: + default: + ioc = int64(sysSIOCGLIFHWADDR) + if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { + ll.Addr, _ = parseLinkAddr(lifr.Lifru[4:]) + } + } +} + +// Links returns a list of logical data links. +// +// The provided af must be an address family and name must be a data +// link name. The zero value of af or name means a wildcard. +func Links(af int, name string) ([]Link, error) { + eps, err := newEndpoints(af) + if len(eps) == 0 { + return nil, err + } + defer func() { + for _, ep := range eps { + ep.close() + } + }() + return links(eps, name) +} + +func links(eps []endpoint, name string) ([]Link, error) { + var lls []Link + lifn := sysLifnum{Flags: sysLIFC_NOXMIT | sysLIFC_TEMPORARY | sysLIFC_ALLZONES | sysLIFC_UNDER_IPMP} + lifc := lifconf{Flags: sysLIFC_NOXMIT | sysLIFC_TEMPORARY | sysLIFC_ALLZONES | sysLIFC_UNDER_IPMP} + for _, ep := range eps { + lifn.Family = uint16(ep.af) + ioc := int64(sysSIOCGLIFNUM) + if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifn)); err != nil { + continue + } + if lifn.Count == 0 { + continue + } + b := make([]byte, lifn.Count*sizeofLifreq) + lifc.Family = uint16(ep.af) + lifc.Len = lifn.Count * sizeofLifreq + littleEndian.PutUint64(lifc.Lifcu[:], uint64(uintptr(unsafe.Pointer(&b[0])))) + ioc = int64(sysSIOCGLIFCONF) + if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifc)); err != nil { + continue + } + nb := make([]byte, 32) // see LIFNAMSIZ in net/if.h + for i := 0; i < int(lifn.Count); i++ { + lifr := (*lifreq)(unsafe.Pointer(&b[i*sizeofLifreq])) + for i := 0; i < 32; i++ { + if lifr.Name[i] == 0 { + nb = nb[:i] + break + } + nb[i] = byte(lifr.Name[i]) + } + llname := string(nb) + nb = nb[:32] + if isDupLink(lls, llname) || name != "" && name != llname { + continue + } + ll := Link{Name: llname, Type: int(lifr.Type)} + ll.fetch(ep.s) + lls = append(lls, ll) + } + } + return lls, nil +} + +func isDupLink(lls []Link, name string) bool { + for _, ll := range lls { + if ll.Name == name { + return true + } + } + return false +} diff --git a/vendor/golang.org/x/net/lif/link_test.go b/vendor/golang.org/x/net/lif/link_test.go new file mode 100644 index 000000000..8fb2bf6f3 --- /dev/null +++ b/vendor/golang.org/x/net/lif/link_test.go @@ -0,0 +1,61 @@ +// 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 solaris + +package lif + +import ( + "fmt" + "testing" +) + +func (ll *Link) String() string { + return fmt.Sprintf("name=%s index=%d type=%d flags=%#x mtu=%d addr=%v", ll.Name, ll.Index, ll.Type, ll.Flags, ll.MTU, llAddr(ll.Addr)) +} + +type linkPack struct { + af int + lls []Link +} + +func linkPacks() ([]linkPack, error) { + var lps []linkPack + for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { + lls, err := Links(af, "") + if err != nil { + return nil, err + } + lps = append(lps, linkPack{af: af, lls: lls}) + } + return lps, nil +} + +func TestLinks(t *testing.T) { + lps, err := linkPacks() + if len(lps) == 0 && err != nil { + t.Fatal(err) + } + for _, lp := range lps { + n := 0 + for _, sll := range lp.lls { + lls, err := Links(lp.af, sll.Name) + if err != nil { + t.Fatal(lp.af, sll.Name, err) + } + for _, ll := range lls { + if ll.Name != sll.Name || ll.Index != sll.Index { + t.Errorf("af=%s got %v; want %v", addrFamily(lp.af), &ll, &sll) + continue + } + t.Logf("af=%s name=%s %v", addrFamily(lp.af), sll.Name, &ll) + n++ + } + } + if n != len(lp.lls) { + t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(lp.lls)) + continue + } + } +} diff --git a/vendor/golang.org/x/net/lif/sys_solaris_amd64.s b/vendor/golang.org/x/net/lif/sys_solaris_amd64.s new file mode 100644 index 000000000..1ebca3739 --- /dev/null +++ b/vendor/golang.org/x/net/lif/sys_solaris_amd64.s @@ -0,0 +1,11 @@ +// 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. + +#include "textflag.h" + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) + +TEXT ·keepAlive(SB),NOSPLIT,$0 + RET diff --git a/vendor/golang.org/x/net/lif/syscall.go b/vendor/golang.org/x/net/lif/syscall.go new file mode 100644 index 000000000..5fe073620 --- /dev/null +++ b/vendor/golang.org/x/net/lif/syscall.go @@ -0,0 +1,33 @@ +// 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 solaris + +package lif + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +//go:linkname procIoctl libc_ioctl + +var procIoctl uintptr + +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (uintptr, uintptr, syscall.Errno) + +// TODO: replace with runtime.KeepAlive when available +//go:noescape +func keepAlive(p unsafe.Pointer) + +func ioctl(s, ioc uintptr, arg unsafe.Pointer) error { + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procIoctl)), 3, s, ioc, uintptr(arg), 0, 0, 0) + keepAlive(arg) + if errno != 0 { + return error(errno) + } + return nil +} diff --git a/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go b/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go new file mode 100644 index 000000000..94231c49c --- /dev/null +++ b/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go @@ -0,0 +1,103 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs defs_solaris.go + +package lif + +const ( + sysAF_UNSPEC = 0x0 + sysAF_INET = 0x2 + sysAF_INET6 = 0x1a + + sysSOCK_DGRAM = 0x1 +) + +type sockaddrStorage struct { + Family uint16 + X_ss_pad1 [6]int8 + X_ss_align float64 + X_ss_pad2 [240]int8 +} + +const ( + sysLIFC_NOXMIT = 0x1 + sysLIFC_EXTERNAL_SOURCE = 0x2 + sysLIFC_TEMPORARY = 0x4 + sysLIFC_ALLZONES = 0x8 + sysLIFC_UNDER_IPMP = 0x10 + sysLIFC_ENABLED = 0x20 + + sysSIOCGLIFADDR = -0x3f87968f + sysSIOCGLIFDSTADDR = -0x3f87968d + sysSIOCGLIFFLAGS = -0x3f87968b + sysSIOCGLIFMTU = -0x3f879686 + sysSIOCGLIFNETMASK = -0x3f879683 + sysSIOCGLIFMETRIC = -0x3f879681 + sysSIOCGLIFNUM = -0x3ff3967e + sysSIOCGLIFINDEX = -0x3f87967b + sysSIOCGLIFSUBNET = -0x3f879676 + sysSIOCGLIFLNKINFO = -0x3f879674 + sysSIOCGLIFCONF = -0x3fef965b + sysSIOCGLIFHWADDR = -0x3f879640 +) + +const ( + sysIFF_UP = 0x1 + sysIFF_BROADCAST = 0x2 + sysIFF_DEBUG = 0x4 + sysIFF_LOOPBACK = 0x8 + sysIFF_POINTOPOINT = 0x10 + sysIFF_NOTRAILERS = 0x20 + sysIFF_RUNNING = 0x40 + sysIFF_NOARP = 0x80 + sysIFF_PROMISC = 0x100 + sysIFF_ALLMULTI = 0x200 + sysIFF_INTELLIGENT = 0x400 + sysIFF_MULTICAST = 0x800 + sysIFF_MULTI_BCAST = 0x1000 + sysIFF_UNNUMBERED = 0x2000 + sysIFF_PRIVATE = 0x8000 +) + +const ( + sizeofLifnum = 0xc + sizeofLifreq = 0x178 + sizeofLifconf = 0x18 + sizeofLifIfinfoReq = 0x10 +) + +type sysLifnum struct { + Family uint16 + Pad_cgo_0 [2]byte + Flags int32 + Count int32 +} + +type lifreq struct { + Name [32]int8 + Lifru1 [4]byte + Type uint32 + Lifru [336]byte +} + +type lifconf struct { + Family uint16 + Pad_cgo_0 [2]byte + Flags int32 + Len int32 + Pad_cgo_1 [4]byte + Lifcu [8]byte +} + +type lifIfinfoReq struct { + Maxhops uint8 + Pad_cgo_0 [3]byte + Reachtime uint32 + Reachretrans uint32 + Maxmtu uint32 +} + +const ( + sysIFT_IPV4 = 0xc8 + sysIFT_IPV6 = 0xc9 + sysIFT_6TO4 = 0xca +) diff --git a/vendor/golang.org/x/net/netutil/listen.go b/vendor/golang.org/x/net/netutil/listen.go index b317ba2e6..56f43bf65 100644 --- a/vendor/golang.org/x/net/netutil/listen.go +++ b/vendor/golang.org/x/net/netutil/listen.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/netutil/listen_test.go b/vendor/golang.org/x/net/netutil/listen_test.go index c1a3d5527..5e07d7bea 100644 --- a/vendor/golang.org/x/net/netutil/listen_test.go +++ b/vendor/golang.org/x/net/netutil/listen_test.go @@ -1,4 +1,4 @@ -// Copyright 2013 The Go Authors. All rights reserved. +// Copyright 2013 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. diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go index dfe67ebe6..bf20c036b 100644 --- a/vendor/golang.org/x/net/publicsuffix/table.go +++ b/vendor/golang.org/x/net/publicsuffix/table.go @@ -2,7 +2,7 @@ package publicsuffix -const version = "publicsuffix.org's public_suffix_list.dat, git revision 533b016049473e520193e70156e4b54dc1f19568 (2016-08-05T11:21:15Z)" +const version = "publicsuffix.org's public_suffix_list.dat, git revision 915565885d0fbd25caf7d8b339cd3478f558da94 (2016-10-19T08:16:09Z)" const ( nodesBitsChildren = 9 @@ -23,445 +23,446 @@ const ( ) // numTLD is the number of top level domains. -const numTLD = 1552 +const numTLD = 1553 // Text is the combined text of all labels. -const text = "biellaakesvuemieleccebieszczadygeyachimataipeigersundnpaleomutas" + - "hinainfolldalottebievatmallorcafederationinohekinannestadrangeda" + - "lottokonamegatakatorintuitateshinanomachintaijinuyamanouchikuhok" + - "uryugasakitashiobarabifukagawalmartateyamabihorologyusuisserveex" + - "changebikedagestangebilbaogakievenesandvikcoromantovalle-d-aosta" + - "thellexusdecorativeartsanfranciscofreakunemurorangeiseiyoichirop" + - "racticaseihichisobetsuitairabillustrationinomiyakonojoshkar-olaw" + - "abiobirdartcenterprisesakikonaircraftraeumtgeradealstahaugesundr" + - "ivelandrobaknoluoktainaikawachinaganoharamcoalaheadjudaicable-mo" + - "dembetsukuinvestmentsangobirkenesoddtangenovarabirthplacebjarkoy" + - "uulsandoyuzawabjerkreimdbalatinorddalimitediscountysnes3-sa-east" + - "-1bjugnieznordlandrudmurtiablockbusternidunloppacificasertaishin" + - "omakikuchikuseikarugausdalouvreitatsunobloombergbauernrtattoolsz" + - "tynsettlersanjotaxihuanirasakis-a-candidatebloxcmsannanishiazais" + - "-a-catererbluedaplierneuesannohelplfinancialowiczest-le-patrondh" + - "eimperiabmoattachmentsanokasuyakutiabmsantabarbarabmweirbnpparib" + - "aselburgloppenzaogashimadachicagoboatsantacruzsantafedextraspace" + - "-to-rentalstomakomaibarabomloanswatch-and-clockerbondunsanukis-a" + - "-celticsfanishigotsukisofukushimaritimodenakanotoddenishiharabon" + - "nishiizunazukis-a-chefarmsteadupontariobookingmbhartiffanyuzhno-" + - "sakhalinskaszubybootsaotomeloyalistjordalshalsenishikatakazakis-" + - "a-conservativefsncfdurbanamexhibitionishikatsuragithubuserconten" + - "tgoryboschaefflerdalucaniabostikatowicebostonakijinsekikogenting" + - "minakamichiharabotanicalgardenishikawazukanazawabotanicgardenish" + - "imerabotanybouncemerckatsushikabeeldengeluidurhamburgmodellingmx" + - "finitybounty-fullensakerrypropertiesapodhalewismillerboutiquebec" + - "ngrimstadvrcambridgestonewspaperbozentsujiiebradescorporationish" + - "inomiyashironobrandywinevalleybrasiliabresciabrindisibenikebrist" + - "olgapartmentsapporobritishcolumbialowiezaganishinoomotegotvallea" + - "ostatoiluccapitalonewhollandvrdnsfor-better-thandabroadcastlecle" + - "rcasinore-og-uvdalucernebroadwaybroke-itjeldsundwgripebrokerbron" + - "noysundyndns-ipalermomasvuotnakatombetsupplybrothermesaverdeatnu" + - "orogersvpalmspringsakerbrowsersafetymarketsaratovalled-aostavang" + - "erbrumunddalukowfarsundyndns-mailuroybrunelblagdenesnaaseralinge" + - "nkainanaejrietisalatinabenoboribetsucksardegnamsosnowiecateringe" + - "budejjuedischesapeakebayernurembergriwataraidyndns-office-on-the" + - "-webcampobassociatesardiniabrusselsarlutskatsuyamaseratis-a-cpad" + - "oval-daostavalleybruxellesarpsborgrondarbryanskleppamperedchefas" + - "hionishinoshimatta-varjjatjmaxxxjaworznobryneustarhubalestrandab" + - "ergamoarekemreviewskrakoweddingladelmenhorstackspacekitagatajimi" + - "crolightinglassassinationalheritagematsubarakawagoeu-1buskerudin" + - "ewhampshirebungoonordreisa-geekaufenishiokoppegardyndns-picsaruf" + - "utsunomiyawakasaikaitakoenigrongabuzenishitosashimizunaminamiash" + - "igarabuzzgorzeleccolognewmexicoldwarmiamiastalowa-wolahppiacenza" + - "kopanerairguardyndns-remotegildeskalmykiabwhalingrossetouchijiwa" + - "deloittevadsoccertificationishiwakis-a-cubicle-slavellinowruzhgo" + - "rodoybzhitomirkutskodjeepostfoldnavyatkakegawalterconferencecons" + - "tructionconsuladoharuhrconsultanthropologyconsultingvollcontacto" + - "yookanzakiwiencontemporaryarteducationalchikugojomedio-campidano" + - "-mediocampidanomediocontractorskenconventureshinodesashibetsuiki" + - "mobetsuliguriacookingchannelveruminamibosogndalcoolkuszgradcoope" + - "raunitemasekfhappoumuenchencopenhagencyclopedichernihivanovosibi" + - "rskypescaravantaacorsicahcesuolocalhistorybnikahokutoeiheijis-a-" + - "doctoraycorvettenrightathomegoodsbschokoladencosenzamamibuilders" + - "cholarshipschoolcostumedizinhistorischeschulezajskhabarovskhakas" + - "siacouchpotatofrieschwarzgwangjuifminamidaitomangotembaixadacoun" + - "cilcouponschweizippodlasiellakasamatsudovre-eikercoursesciencece" + - "ntersciencehistorycq-acranbrookuwanalyticscientistockholmestrand" + - "creditcardcreditunioncremonashorokanaiecrewiiheyaizuwakamatsubus" + - "hikusakadogawacricketrzyncrimeacrotonewportlligatewaycrownprovid" + - "ercrscjohnsoncruisescotlandcryptonomichigangwoncuisinellajollame" + - "ricanexpressexyzjcbnlculturalcentertainmentoyosatoyokawacuneocup" + - "cakecxn--1ctwolominamatamayukis-a-financialadvisor-aurdalcymruov" + - "atoyotaris-a-geekgalaxycyonabarussiacyouthdfcbankzlguovdageaidnu" + - "lvikharkivgucciprianiigataiwanairforcertmgretachikawakuyabukicks" + - "-assedichernivtsiciliafieldfiguerestaurantoyotomiyazakis-a-green" + - "filateliafilminamiechizenfinalfinancefineartserveftparaglidingzp" + - "arisor-fronfinlandfinnoyfirebaseapparliamentoyotsukaidownloadfir" + - "enzefirestonextdirectoyourafirmdaleirfjordfishingolffanservegame" + - "-serverisignfitjarqhachiojiyahikobeatservehalflifestylefitnesset" + - "tlementoystre-slidrettozawafjalerflesbergflickragerotikamakuraza" + - "kiraflightservehttparmaflirumannortonsbergflogintogurafloraflore" + - "ncefloridafloristanohatakahashimamakirkeneservehumourfloromskogu" + - "chikuzenflowerserveirchernovtsykkylvenetogakushimotoganewjerseyf" + - "lsmidthruheredstonexus-east-1flynnhubalsfjordiscoveryokamikawane" + - "honbetsurutaharaurskog-holandroverhalla-speziaetnagaivuotnagaoka" + - "kyotambabydgoszczecinemailavagiske164fndfoodnetworkshoppingfor-o" + - "urfor-someetozsdefor-theaterforexrothachirogatakanabeautydalforg" + - "otdnserveminecraftranbyforli-cesena-forlicesenaforlikescandyndns" + - "-at-workinggrouparocherkasyzrankoshigayaltaikis-a-guruslivinghis" + - "toryforsaleirvikhersonforsandasuoloftrani-andria-barletta-trani-" + - "andriafortmissoulan-udefenseljordfortworthadanotaireservemp3util" + - "itiesquarezzoologicalvinklein-addrammenuernbergdyniabogadocscbgg" + - "fareastcoastaldefence-burgjemnes3-ap-northeast-1kappleaseating-o" + - "rganicbcg12000emmafanconagawakayamadridvagsoyericsson-aptibleang" + - "aviikadenaamesjevuemielno-ip6foruminamifuranofosneservep2parserv" + - "epicservequakefotaruis-a-hard-workerfoxfordegreefreeboxostrowiec" + - "hiryukyuragifudaigodoesntexistanbullensvanguardyndns-servercelli" + - "kes-piedmontblancomeeresasayamafreemasonryfreiburgfreightcmwildl" + - "ifedjejuegoshikiminokamoenairlinedre-eikerfreseniuscountryestate" + - "ofdelawaredumbrellanbibaidarfribourgfriuli-v-giuliafriuli-ve-giu" + - "liafriuli-vegiuliafriuli-venezia-giuliafriuli-veneziagiuliafriul" + - "i-vgiuliafriuliv-giuliafriulive-giuliafriulivegiuliafriulivenezi" + - "a-giuliafriuliveneziagiuliafriulivgiuliafrlfroganservesarcasmata" + - "rtanddesignfrognfrolandfrom-akrehamnfrom-alfrom-arfrom-azwilliam" + - "hillfrom-capetownnews-stagingfrom-collectionfrom-ctraniandriabar" + - "lettatraniandriafrom-dchitachinakagawatchandclockautokeinofrom-d" + - "ell-ogliastrakhanawawinbaltimore-og-romsdalindasiaustevollaziobi" + - "ragroks-thisamitsukembuchikumagayagawakkanaibetsubamericanfamily" + - "dscloudcontrolledekafjorddnskingjerdrumckinseyekaterinburgjersta" + - "dotsuruokamchatkameokameyamashinatsukigatakamoriokamikitayamatot" + - "akadabruzzoologyeongbuk-uralsk12from-flanderservicesettsurfastly" + - "from-gafrom-higashiagatsumagoirminamiiselectranoyfrom-iafrom-idf" + - "rom-ilfrom-incheonfrom-ksevastopolefrom-kyotobetsumidatlantichit" + - "osetogitsuldaluxembourgrpanamafrom-lancashireggio-calabriafrom-m" + - "ansionsevenassisicilyfrom-mdfrom-megurorostrowwlkpmgfrom-microso" + - "ftbankhmelnitskiyamasfjordenfrom-mnfrom-mochizukirovogradoyfrom-" + - "msewindmillfrom-mtnfrom-nchloefrom-ndfrom-nefrom-nhktransportrap" + - "aniimimatakatsukis-a-hunterfrom-njcpartis-a-knightravelchannelfr" + - "om-nminamiizukamitondabayashiogamagoriziafrom-nvallee-aosteroyfr" + - "om-nyfrom-ohkurafrom-oketohmanxn--1qqw23afrom-orfrom-paderbornfr" + - "om-pratohnoshoooshikamaishimofusartsfranziskanerdpolicefrom-rivn" + - "efrom-schoenbrunnfrom-sdnipropetrovskhmelnytskyivalleeaosteigenf" + +const text = "biellaakesvuemieleccebieszczadygeyachimatainaircraftraeumtgerade" + + "alstahaugesunderseaportsinfolldalaskanittedallasalleasinglesango" + + "ppdalinzaintuitateshinanomachintaifun-dnsaliaskimitsubatamicable" + + "-modembetsukuinuyamanouchikuhokuryugasakitaurayasudabievatmallor" + + "cadaquesanjotateyamabifukagawalmartatsunobihorologyuzhno-sakhali" + + "nskaszubybikedagestangebilbaogakievenesannaninomiyakonojoshkar-o" + + "lawabillustrationirasakinvestmentsannohelplfinancialipetskatowic" + + "ebiobirdartcenterprisesakikuchikuseikarugapartmentsanokatsushika" + + "beeldengeluidunloppacificasinore-og-uvdalivornobirkenesoddtangen" + + "ovarabirthplacebjarkoybjerkreimdbalatinorddalillyonagoyastronomy" + + "asustor-elvdalwaysdatabaseballangenoamishirasatochigiessenebakke" + + "shibechambagriculturennebudapest-a-la-masionativeamericanantique" + + "s3-ap-northeast-2bjugnieznordlandunsantabarbarablockbusternidupo" + + "ntariobloombergbauernrtattoolsztynsettlersantacruzsantafedextras" + + "pace-to-rentalstomakomaibarabloxcmsanukis-a-candidatebluedaplier" + + "neustarhubalestrandabergamoarekeymachineues3-us-west-1bmoattachm" + + "entsaotomeloyalistjordalshalsenishiazais-a-catererbmsapodhalewis" + + "millerbmweirbnpparibaselburgloppenzaogashimadachicagoboatsapporo" + + "bnrwfarmsteadurbanamexhibitionishigotsukisosakitagawabomloanswat" + + "ch-and-clockerbondurhamburgmbhartiffanybonnishiharabookingminaka" + + "michiharabootsaratovalleaostatoilomzaporizhzheguris-a-celticsfan" + + "ishiizunazukis-a-chefarsundvrcambridgestonewyorkshirecreationish" + + "ikatakayamatsuzakis-a-conservativefsncfdvrdnsiskinkyotobetsumida" + + "tlanticateringebudejjuedischesapeakebayernurembergmodenakanotodd" + + "enishikatsuragithubusercontentaxihuanishikawazukanazawaboschaeff" + + "lerdalorenskogmxfinitybostikatsuyamaseratis-a-cpadoval-daostaval" + + "leybostonakijinsekikogentingrimstadwgripebotanicalgardenishimera" + + "botanicgardenishinomiyashironobotanybouncemerckmsdnipropetrovskl" + + "eppalmspringsakerbounty-fullensakerrypropertiesardegnamsosnowiec" + + "atholicheltenham-radio-openair-traffic-controlleyboutiquebecngri" + + "wataraidyndns-ipamperedchefashionishinoomotegovtgorybozentsujiie" + + "bradescorporationishinoshimatta-varjjatjeldsundyndns-mailotenkaw" + + "abrandywinevalleybrasiliabresciabrindisibenikebristolgaulardalot" + + "tebritishcolumbialowiezaganquannefrankfurtjmaxxxjaworznowtvalled" + + "-aostavangerbroadcastleclerchelyabinskypescaravantaabroadwaybrok" + + "e-itjometlifeinsurancebrokerbronnoysundyndns-office-on-the-webca" + + "mpobassociatesardiniabrothermesaverdeatnuorockartuzybrowsersafet" + + "ymarketsarlottokorozawabrumunddalouvreitjxn--0trq7p7nnishiokoppe" + + "gardyndns-picsarpsborgroks-thisayamanashiibaghdadultkmaxxn--11b4" + + "c3dyndns-remotegildeskalmykiabrunelblagdenesnaaseralingenkainana" + + "ejrietisalatinabenoboribetsucksarufutsunomiyawakasaikaitakoelnis" + + "hitosashimizunaminamiashigarabrusselsasayamabruxellesaseboknowsi" + + "tallowiczest-le-patrondheimperiabryanskodjeepostfoldnavyatkakami" + + "gaharabrynewhampshirebungoonordreisa-geekaufenishiwakis-a-cubicl" + + "e-slavellinotteroybuskerudinewhollandyndns-servercellikes-piedmo" + + "ntblancomeeresaskatchewanggouvicenzabuzenissandnessjoenissayokos" + + "hibahikariwanumatakazakis-a-democratmpanamabuzzgradyndns-weberli" + + "ncolnissedalucaniabwhalingrondarbzhitomirkutskydivingrongacomput" + + "erhistoryofscience-fictioncomsecuritytacticschulezajskddielddanu" + + "orrikuzentakatajirissagamiharacondoshichinohealth-carereformitak" + + "eharaconferenceconstructionconsuladoharuhrconsultanthropologycon" + + "sultingvollutskfhappoumuenchencontactoyotomiyazakis-a-geekgalaxy" + + "contemporaryarteducationalchikugojomedio-campidano-mediocampidan" + + "omediocontractorskenconventureshinodesashibetsuikinderoycookingc" + + "hannelveruminamibosogndaluxembourgujolstercoolkuszippodlasiellak" + + "asamatsudovre-eikercoopencraftoyotsukaidownloadcopenhagencyclope" + + "dichernovtsykkylvenetogakushimotoganewmexicoldwarmiamiastalowa-w" + + "oladbrokesassaris-a-designerimarumorimachidacorsicagliaridagawal" + + "tercorvettenrightathomegoodschwarzgwangjuifminamidaitomangotemba" + + "ixadacosenzamamibuilderschmidtre-gauldaluxurycostumedizinhistori" + + "scheschweizjcbnluzerncouchpotatofriesciencecentersciencehistoryc" + + "ouncilvivano-frankivskhabarovskhakassiacouponscientistockholmest" + + "randcoursescjohnsoncq-acranbrookuwanalyticscotlandcreditcardcred" + + "itunioncremonashorokanaiecrewiiheyaizuwakamatsubushikusakadogawa" + + "cricketrzyncrimeacrotonewspapercrownprovidercrsvparaglidingulenc" + + "ruisescrapper-sitecryptonomichigangwoncuisinellajollamericanexpr" + + "essexyculturalcentertainmentoyouracuneocupcakecxn--1ctwolominama" + + "takkofuefukihabororostrowwlkpmgunmarnardalcymruovatoystre-slidre" + + "ttozawacyonabarussiacyouthdfcbankzlguovdageaidnufcfanfieldfiguer" + + "estaurantozsdefilateliafilminamiechizenfinalfinancefineartservef" + + "tparisor-fronfinlandfinnoyfirebaseapparliamentranbyfirenzefirest" + + "onexus-east-1firmdaleirfjordfishingolffanservegame-serverisignfi" + + "tjarqhachiojiyahikobeatservehalflifestylefitnessettlementrani-an" + + "dria-barletta-trani-andriafjalerflesbergflickragerotikamakurazak" + + "irkeneservehttparmaflightservehumourflirumansionserveirchiryukyu" + + "ragifuchukotkakegawassamukawataricohdavvenjargausdaluccapitalone" + + "wjerseyflogintogurafloraflorencefloridafloristanohatakaharulvikh" + + "arkovalledaostavernflorokunohealthcareerserveminecraftraniandria" + + "barlettatraniandriaflowerservemp3utilitiesquarezzoologicalvinkle" + + "in-addrammenuernbergdyniabogadocscbggfareastcoastaldefence-burgj" + + "emnes3-ap-northeast-1kappleaseating-organicbcg12000emmafanconaga" + + "wakayamadridvagsoyericsson-aptibleangaviikadenaamesjevuemielno-i" + + "p6flynnhubalsfjordiscountysnes3-us-west-2fndfoodnetworkshoppingf" + + "or-ourfor-someetnedalfor-theaterforexrothruheredstoneforgotdnser" + + "vep2parocherkasyzrankoshigayaltaijis-a-greenforli-cesena-forlice" + + "senaforlikescandyndns-at-workinggrouparservepicservequakeforsale" + + "irvikhersonforsandasuoloftranoyfortmissoulan-udefenseljordfortwo" + + "rthachirogatakamoriokamikitayamatotakadaforuminamifuranofosneser" + + "vesarcasmatartanddesignfotaruis-a-gurunzenfoxfordegreefreeboxost" + + "rowiechitachinakagawatchandclockazimierz-dolnyfreemasonryfreibur" + + "gfreightcmwildlifedjejuegoshikiminokamoenairlinedre-eikerfreseni" + + "uscountryestateofdelawaredumbrellanbibaidarfribourgfriuli-v-giul" + + "iafriuli-ve-giuliafriuli-vegiuliafriuli-venezia-giuliafriuli-ven" + + "eziagiuliafriuli-vgiuliafriuliv-giuliafriulive-giuliafriulivegiu" + + "liafriulivenezia-giuliafriuliveneziagiuliafriulivgiuliafrlfrogan" + + "servicesettsurgeonshalloffamemergencyberlevagangaviikanonjis-a-h" + + "ard-workerfrognfrolandfrom-akrehamnfrom-alfrom-arfrom-azpartis-a" + + "-hunterfrom-capebretonamiasakuchinotsuchiurakawarszawashingtondc" + + "lkhmelnitskiyamasfjordenfrom-collectionfrom-ctransportransurlfro" + + "m-dchitosetogitsuldalucernefrom-dell-ogliastrakhanawafrom-flande" + + "rsevastopolefrom-gafrom-higashiagatsumagoirminamiiselectrapaniim" + + "imatakatoris-a-knightpointtokamachippubetsubetsugaruslivinghisto" + + "ryfrom-iafrom-idfrom-ilfrom-incheonfrom-ksevenassisicilyfrom-kyo" + + "wariasahikawafrom-lancashireggio-calabriafrom-manxn--1qqw23afrom" + + "-mdfrom-meguromskoguchikuzenfrom-microsoftbankhmelnytskyivallee-" + + "aosteroyfrom-mnfrom-mochizukirovogradoyfrom-msewilliamhillfrom-m" + + "tnfrom-nchloefrom-ndfrom-nefrom-nhktravelchannelfrom-njcpartners" + + "franziskanerdpolicefrom-nminamiizukamitondabayashiogamagoriziafr" + + "om-nvalleeaosteigenfrom-nyfrom-ohkurafrom-oketohmaorivnefrom-orf" + + "rom-paderbornfrom-pratohnoshoooshikamaishimofusartshangrilangeva" + + "grarboretumbriafrom-ris-a-landscaperugiafrom-schoenbrunnfrom-sdf" + "rom-tnfrom-txn--2m4a15efrom-utazuerichardlillehammerfest-mon-blo" + "gueurovisionfrom-vaksdalfrom-vtravelersinsurancefrom-wafrom-wiel" + - "unnerfrom-wvanylvenicefrom-wyfrosinonefrostalbanshangrilangevagr" + - "arboretumbriamallamagentositelefonicaaarborteaches-yogasawaracin" + - "groks-theatreefroyahabaghdadultrdfstavropolitiendafujiiderafujik" + - "awaguchikonefujiminohtawaramotoineppugliafujinomiyadafujiokayama" + - "oris-a-landscaperugiafujisatoshonairportland-4-salernogatagajobo" + - "jis-a-lawyerfujisawafujishiroishidakabiratoridellogliastraderfuj" + - "itsurugashimamateramodalenfujixeroxn--30rr7yfujiyoshidafukayabea" + - "rdubaiduckdnsdojoburgfukuchiyamadafukudominichocolatelevisioniss" + - "andnessjoenissayokoshibahikariwanumataketomisatomobellevuelosang" + - "elesjaguarchitecturealtychyattorneyagawalbrzycharternopilawalesu" + - "ndyndns-weberlincolnissedaluxuryfukuis-a-liberalfukumitsubishiga" + - "kiryuohadselfipartnersharis-a-libertarianfukuokazakisarazurewebs" + - "iteshikagamiishibukawafukuroishikarikaturindalfukusakishiwadafuk" + - "uyamagatakahatakaishimoichinosekigaharafunabashiriuchinadafunaga" + - "takamatsukawafunahashikamiamakusatsumasendaisennangonohejis-a-li" + - "nux-useranishiaritabashikaoizumizakitaurayasudafundaciofuoiskuju" + - "kuriyamarburgfuosskoczowindowsharpartshawaiijimarumorimachidafur" + - "nitureggio-emilia-romagnakanojohanamakinoharafurubiraquarellebes" + - "byglandfurudonostiafurukawairtelecityeatshellaspeziafusodegauraf" + - "ussaintlouis-a-anarchistoireggiocalabriafutabayamaguchinomigawaf" + - "utboldlygoingnowhere-for-moregontrailroadfuttsurugiminamimakis-a" + - "-llamarylhurstcgroupartyfvgfyis-a-musicianfylkesbiblackfridayfyr" + - "esdalhannovareserveblogspotrentino-a-adigehanyuzenhapmirhareidsb" + - "ergenharstadharvestcelebrationhasamarahasaminami-alpssells-itren" + - "tino-aadigehashbanghasudahasura-appasadenaklodzkodairahasviklabu" + - "dhabikinokawabarthagakhanamigawahatogayahoohatoyamazakitahatakan" + - "ezawahatsukaichikaiseis-a-painteractivegarsheis-a-patsfanhattfje" + - "lldalhayashimamotobuildinghazuminobusellsyourhomeipassagenshimon" + - "itayanagitlaborhboehringerikehelsinkitahiroshimarriottrentino-al" + - "to-adigehembygdsforbundhemneshimonosekikawahemsedalhepforgeherok" + - "ussldheroyhgtvarggatrentino-altoadigehigashichichibungotakadatin" + - "ghigashihiroshimanehigashiizumozakitakamiizumisanofidelitysvardo" + - "llshimosuwalkis-a-personaltrainerhigashikagawahigashikagurasoeda" + - "higashikawakitaaikitakatakaokamikoaniikappulawyhigashikurumeiwam" + - "arshallstatebankmpspbamblebtimnetz-2higashimatsushimarinehigashi" + - "matsuyamakitaakitadaitoigawahigashimurayamalatvuopmidoris-a-phot" + - "ographerokuappassenger-associationhigashinarusembokukitakyushuai" + - "ahigashinehigashiomihachimanchesterhigashiosakasayamamotorcycles" + - "himotsukehigashishirakawamatakarazukamiminershimotsumahigashisum" + - "iyoshikawaminamiaikitamidsundhigashitsunotteroyhigashiurausukita" + - "motosumitakaginankokubunjis-a-playerhigashiyamatokoriyamanakakog" + - "awahigashiyodogawahigashiyoshinogaris-a-republicancerresearchaeo" + - "logicaliforniahiraizumisatohobby-sitehirakatashinagawahiranairtr" + - "affichonanbugattipschmidtre-gauldalvivano-frankivskazimierz-doln" + - "yhirarahiratsukagawahirayaitakasagooglecodespotrentino-s-tirolla" + - "grigentomologyhistorichouseshinichinanhitachiomiyaginowaniihamat" + - "amakawajimarcheapaviancarbonia-iglesias-carboniaiglesiascarbonia" + - "hitachiotagopocznosegawahitoyoshimifunehitradinghjartdalhjelmela" + - "ndholeckobierzyceholidayhomelinuxn--32vp30hagebostadhomesecurity" + - "maceratakasakitanakagusukumoduminamiogunicomcastresistancehomese" + - "curitypccwinnershinjournalismailillesandefjordhomesenseminehomeu" + - "nixn--3bst00minamisanrikubetsupplieshinjukumanohondahonefosshink" + - "amigotoyohashimototalhoneywellhongorgehonjyoitakashimarugame-hos" + - "tinghornindalhorseoulminamitanehortendofinternetrentino-stirolho" + - "teleshinshinotsurgeonshalloffamemergencyberlevagangaviikanonjis-" + - "a-rockstarachowicehotmailhoyangerhoylandetroitskmshinshirohumani" + - "tieshintokushimahurdalhurumajis-a-socialistmeindianapolis-a-blog" + - "gerhyllestadhyogoris-a-soxfanhyugawarahyundaiwafunehzchoseiroute" + - "rjgorajlchoyodobashichikashukujitawarajlljmpgfoggiajnjelenia-gor" + - "ajoyokaichibahcavuotnagaraumakeupowiathletajimabariakepnord-fron" + - "tierjpmorganjpnchristmasakikugawatchesaskatchewanggouvicenzajprs" + - "hirahamatonbetsurgeryjuniperjurkristiansundkrodsheradkrokstadelv" + - "aldaostarnbergkryminamiyamashirokawanabelgorodeokumatorinokumeji" + - "massa-carrara-massacarraramassabunkyonanaoshimageandsoundandvisi" + - "onkumenanyokkaichirurgiens-dentistes-en-francekunisakis-an-anarc" + - "historicalsocietyumenkunitachiarailwaykunitomigusukumamotoyamaso" + - "ykunneppupharmacyshiraois-an-artisteinkjerusalembroiderykunstsam" + - "mlungkunstunddesignkuokgrouphiladelphiaareadmyblogsitekureisenku" + - "rgankurobelaudibleborkdalvdalaskanittedallasalleasingleshiraokan" + - "makiwakunigamihamadakurogimilitarykuroisoftwarendalenugkuromatsu" + - "nais-an-engineeringkurotakikawasakis-an-entertainerkurskomitamam" + - "urakushirogawakustanais-bykusupersportrentino-suedtirolkutchanel" + - "kutnokuzbassnillfjordkuzumakis-certifiedogawarabikomaezakirunort" + - "hwesternmutualkvafjordkvalsundkvamfamberkeleykvanangenkvinesdalk" + - "vinnheradkviteseidskogkvitsoykwpspjelkavikommunalforbundkyowaria" + - "sahikawamitourismolanciamitoyoakemiuramiyazumiyotamanomjondalenm" + - "lbfanmonmouthaibarakisosakitagawamonstermonticellombardiamondshi" + - "ratakahagivestbytomaritimekeepingmontrealestatefarmequipmentrent" + - "inoa-adigemonza-brianzaporizhzheguris-into-animelbournemonza-e-d" + - "ella-brianzaporizhzhiamonzabrianzapposhishikuis-into-carshiojiri" + - "shirifujiedamonzaebrianzaptokuyamatsunomonzaedellabrianzaramopar" + - "achutingmordoviajessheiminanomoriyamatsusakahoginozawaonsenmoriy" + - "oshiokamitsuemormoneymoroyamatsushigemortgagemoscowioshisognemos" + - "eushistorymosjoenmoskeneshisuifuettertdasnetzmosshitaramamosviko" + - "monomoviemovistargardmtpchromedicaltanissettaitogliattiresassari" + - "s-a-democratjxn--0trq7p7nniyodogawamtranakatsugawamuenstermugith" + - "ubcloudusercontentrentinoaadigemuikamogawamukochikushinonsenergy" + - "mulhouservebeermultichoicemunakatanemuncieszynmuosattemuphilatel" + - "ymurmanskomorotsukamisunagawamurotorcraftrentinoalto-adigemusash" + - "imurayamatsuuramusashinoharamuseetrentinoaltoadigemuseumverenigi" + - "ngmutsuzawamutuellevangermydissentrentinos-tirolmydrobofagemydsh" + - "izukuishimogosenmyeffectrentinostirolmyfritzmyftphilipsymykolaiv" + - "aroymymediapchryslermyokohamamatsudamypepsonyoursidedyn-o-saurec" + - "ipesaro-urbino-pesarourbinopesaromalvikomvuxn--3ds443gmypetshizu" + - "okannamiharumyphotoshibahccavuotnagareyamalopolskanlandmypsxn--3" + - "e0b707emysecuritycamerakermyshopblockshoujis-into-cartoonshioyam" + - "emorialmytis-a-bookkeepermincommbankommunemyvnchungbukazopicture" + - "showapiemontepilotshowtimeteorapphotographysiopimientakinouepink" + - "ongsbergpioneerpippupiszpittsburghofauskedsmokorsetagayasells-fo" + - "r-unzenpiwatepizzapkongsvingerplanetariuminnesotaketakayamatsuma" + - "ebashimodateplantationplantshriramlidlugolekagoshimaintenancepla" + - "tformintelligenceplaystationplazaplchungnamdalseidfjordyndns-wik" + - "inderoyplombardyndns-blogdnsiskinkyknethnologyplumbingovtrentino" + - "sudtirolplusterpmnpodzonepohlpointtomskoninjamisonpoivronpokerpo" + - "krovskonskowolayangroupharmacienshirakofuelpolkowicepoltavalle-a" + - "ostarostwodzislawitdkonsulatrobeepilepsydneypomorzeszowithgoogle" + - "apisa-hockeynutrentinosued-tirolpordenonepornporsangerporsanguid" + - "eltajirikuzentakatakahamamurogawaporsgrunnanpoznanpraxis-a-bruin" + - "sfanprdpreservationpresidioprgmrprimelhusgardenprincipeprivatize" + - "healthinsuranceprochowiceproductionsienaplesigdalprofbsbxn--1lqs" + - "03nprogressivegaskimitsubatamicadaquesilkonyvelolprojectrentinos" + - "uedtirolpromombetsupportrentoyonakagyokutoyakokamishihoronobeoka" + - "minoyamatsuris-into-gamessinashikitchenpropertyprotectionprudent" + - "ialpruszkowithyoutubeneventodayprzeworskogptzpvtrevisohughesimbi" + - "rskooris-a-therapistoiapwchurchaseljeffersonrwhoswhokksundyndns-" + - "workisboringruepzqldqponqslgbtroandinosaurlandesimple-urlquicksy" + - "tesirdalqvchuvashiasrlsrtromsakatakkoelnsrvbarcelonagasukeu-2sto" + - "ragestordalstorenburgstorfjordstpetersburgstreamsterdamnserverba" + - "niastudiostudyndns-homeftpaccesslupskopervikomatsushimashikestuf" + - "f-4-salestufftoread-booksnesmolenskoryolasitestuttgartromsojaval" + - "d-aostaplesnoasaitoshimasurnadalsurreysusakis-lostre-toteneis-a-" + - "teacherkassymantechnologysusonosuzakanrasuzukanumazurysuzukis-no" + - "t-certifieducatorahimeshimakanegasakindleikangersvalbardudinkaku" + - "damatsuesveiosvelvikosakaerodromegalsacechirealminamiuonumasudas" + - "vizzeraswedenswidnicargodaddyndns-at-homednshomebuiltrusteeswieb" + - "odzindianmarketingswiftcoveronaritakurashikis-savedunetbankokono" + - "eswinoujscienceandhistoryswisshikis-slickolobrzegersundtuxfamily" + - "vestnesolognevestre-slidreamhostersolundbeckosaigawavestre-toten" + - "nishiawakuravestvagoyvevelstadvibo-valentiavibovalentiavideovill" + - "askoyabearalvahkihokumakogengerdalipayufuchukotkagaminogiesseneb" + - "akkeshibechambagriculturennebudapest-a-la-masionthewifiat-band-c" + - "ampaniavinnicarriervinnytsiavipsinaappiagetmyiphoenixn--3oq18vl8" + - "pn36avirginiavirtualvirtueeldomeindustriesteambulancevirtuelvisa" + - "kegawavistaprinternationalfirearmsolutionslingviterboltrvdonskos" + - "eis-an-accountantshintomikasaharavivoldavladikavkazanvladimirvla" + - "divostokaizukarasuyamazoevlogoipictetrentinosud-tirolvolkenkunde" + - "rseaportrysiljan-mayenvolkswagentsomavologdanskoshimizumakiyosum" + - "ycdn77-securechtrainingvolvolgogradvolyngdalvoronezhytomyrvossev" + - "angenvotevotingvotoyonezawavrnworse-thangglidingwowiwatsukiyonow" + - "tvenneslaskerrylogisticsokndalwritesthisblogsytewroclawloclaweko" + - "shunantokigawawtcircus-2wtfbx-oslodingenwuozuwwworldwzmiuwajimax" + - "n--4gq48lf9jeonnamerikawauexn--4it168dxn--4it797kosugexn--4pvxso" + - "mnarashinoxn--54b7fta0ccivilaviationxn--55qw42gxn--55qx5dxn--5js" + - "045dxn--5rtp49civilisationxn--5rtq34kotohiradomainsurehabmerxn--" + - "5su34j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986" + - "b3xlxn--7t0a264civilizationxn--80adxhksooxn--80ao21axn--80aqecdr" + - "1axn--80asehdbarclaycardstvedestrandishakotankarumaifarmerseinew" + - "yorkshirecreationatuurwetenschappenaumburgliwicevents3-us-west-1" + - "xn--80aswgxn--80audnedalnxn--8ltr62kotouraxn--8pvr4uxn--8y0a063a" + - "xn--90a3academyactivedirectoryazannakadomari-elasticbeanstalkouh" + - "okutamakizunokunimilanoxn--90aishobaraomoriguchiharahkkeravjudyg" + - "arlandxn--90azhair-surveillancexn--9dbhblg6dietcimmobilienxn--9d" + - "bq2axn--9et52uxn--9krt00axn--andy-iraxn--aroport-byanagawaxn--as" + - "ky-iraxn--aurskog-hland-jnbarclays3-us-west-2xn--avery-yuasakuho" + - "kkaidontexisteingeekounosunndalxn--b-5gaxn--b4w605ferdxn--bck1b9" + - "a5dre4civilwarmanagementkmaxxn--1ck2e1balsanagochihayaakasakawah" + - "aravennagasakijobserverdalimoliserniaukraanghkebinorilskariyakum" + - "oldev-myqnapcloudcontrolappagefrontappagespeedmobilizerobihirosa" + - "kikamijimatteledatabaseballooningjesdalavangenativeamericanantiq" + - "ues3-eu-central-1xn--bdddj-mrabdxn--bearalvhki-y4axn--berlevg-jx" + - "axn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachikatsuuraxn-" + - "-bievt-0qa2xn--bjarky-fyanaizuxn--bjddar-ptamboversaillesolarsso" + - "nxn--blt-elabourxn--bmlo-graingerxn--bod-2naroyxn--brnny-wuaccid" + - "ent-investigationjukudoyamagadancebetsukubabia-goracleaningatlan" + - "tabusebastopologyeonggiehtavuoatnadexeterimo-i-ranagahamaroygard" + - "endoftheinternetflixilovecollegefantasyleaguernseyxn--brnnysund-" + - "m8accident-preventionlineat-urlxn--brum-voagatulansnzxn--btsfjor" + - "d-9zaxn--c1avgxn--c2br7gxn--c3s14misasaguris-gonexn--cck2b3baref" + - "ootballangenoamishirasatochigiftsakuraibestadiskstationaustdalin" + - "desnesakyotanabellunordkappgafanpachigasakidsmynasperschlesische" + - "salangenaval-d-aosta-valleyonagoyaustinnaturalhistorymuseumcente" + - "repbodyndns-freebox-oskolegokasells-for-less3-eu-west-1xn--cg4bk" + - "is-uberleetrentino-sudtirolxn--ciqpnxn--clchc0ea0b2g2a9gcdn77-ss" + - "lattumisawaxn--comunicaes-v6a2oxn--correios-e-telecomunicaes-ghc" + - "29axn--czr694bargainstitutelekommunikationavigationavuotnakayama" + - "tsuzakibigawaustraliaisondriodejaneirochestereportargets-itargiv" + - "ingjovikarlsoyokosukareliancebizenakamuratakaharuconnectarnobrze" + - "gyptianaturalsciencesnaturelles3-external-1xn--czrs0tunesokanoya" + - "kagexn--czru2dxn--czrw28barreauctionayoroceanographicsalondonets" + - "kasaokamisatokamachippubetsubetsugarufcfanflfanfshostrodawaraust" + - "rheimatunduhrennesoyokotehimeji234xn--d1acj3barrel-of-knowledgeo" + - "logyonaguniversityoriikashibatakasugaibmditchyouripalaceverbanka" + - "shiharauthordalandroidigitalillyokozemersongdalenviknakaniikawat" + - "anaguramusementarantours3-ap-northeast-2xn--d1alfaromeoxn--d1atu" + - "nkosherbrookegawaxn--d5qv7z876claimsauheradynv6xn--davvenjrga-y4" + - "axn--djrs72d6uyxn--djty4kouyamashikis-an-actorxn--dnna-grajewolt" + - "erskluwerxn--drbak-wuaxn--dyry-iraxn--e1a4clickddielddanuorrissa" + - "gamiharaxn--eckvdtc9dxn--efvn9sopotrogstadxn--efvy88hakatanotoga" + - "waxn--ehqz56nxn--elqq16hakodatexn--estv75gxn--eveni-0qa01gaxn--f" + - "6qx53axn--fct429kouzushimashikokuchuoxn--fhbeiarnxn--finny-yuaxn" + - "--fiq228c5hsor-odalxn--fiq64barrell-of-knowledgeometre-experts-c" + - "omptablesaltdalinkashiwarautomotivecodynaliascoli-picenoipiranga" + - "mvikarmoyomitanobninskarpaczeladz-1xn--fiqs8sor-varangerxn--fiqz" + - "9sorfoldxn--fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351" + - "exn--fpcrj9c3dxn--frde-grandrapidsorreisahayakawakamiichikawamis" + - "atottoris-leetrentino-sud-tirolxn--frna-woaraisaijosoyrovigorlic" + - "exn--frya-hraxn--fzc2c9e2clinichelyabinskydivingroundhandlingroz" + - "nyxn--fzys8d69uvgmailxn--g2xx48cliniquenoharaxn--gckr3f0fbxostro" + - "lekaluganskharkovalledaostavernxn--gecrj9clintonoshoesavannahgax" + - "n--ggaviika-8ya47hakonexn--gildeskl-g0axn--givuotna-8yandexn--3p" + - "xu8kostromahachijorpelandxn--gjvik-wuaxn--gk3at1exn--gls-elacaix" + - "axn--gmq050is-very-badaddjamalborkangerxn--gmqw5axn--h-2failxn--" + - "h1aeghakubankhvaolbia-tempio-olbiatempioolbialystokkemerovodkaka" + - "migaharagusaarlandxn--h2brj9clothingujolsterxn--hbmer-xqaxn--hce" + - "suolo-7ya35bashkiriautoscanadaejeonbukaruizawasnesoddenmarkhange" + - "lskjervoyagemologicallyngenglandds3-ap-southeast-1xn--hery-iraxn" + - "--hgebostad-g3axn--hmmrfeasta-s4accturystykarasjohkamiokaminokaw" + - "anishiaizubangexn--hnefoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpm" + - "ir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b6b1a6a2ex" + - "n--imr513nxn--indery-fyaotsurgutsiracusakakinokiaxn--io0a7is-ver" + - "y-evillagexn--j1aefermobilyxn--j1amhakuis-a-nascarfanxn--j6w193g" + - "xn--jlq61u9w7basilicataniaveroykeniwaizumiotsukumiyamazonawsabae" + - "robaticketsaritsynologyeongnamegawakeisenbahnaturbruksgymnaturhi" + - "storisches3-external-2xn--jlster-byaroslavlaanderenxn--jrpeland-" + - "54axn--jvr189misconfusedxn--k7yn95exn--karmy-yuaxn--kbrq7oxn--kc" + - "rx77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn--kltx" + - "9axn--klty5xn--42c2d9axn--koluokta-7ya57hakusandiegoodyearthaeba" + - "ruminamiminowaxn--kprw13dxn--kpry57dxn--kpu716ferraraxn--kput3is" + - "-very-goodhandsonxn--krager-gyasakaiminatoyonoxn--kranghke-b0axn" + - "--krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49jetztrentino-sue" + - "d-tirolxn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyasugis-very-nice" + - "xn--kvnangen-k0axn--l-1fairwindsortlandxn--l1accentureklamborghi" + - "niizaxn--laheadju-7yasuokaratexn--langevg-jxaxn--lcvr32dxn--ldin" + - "gen-q1axn--leagaviika-52basketballfinanzgoravocatanzarowebhoppda" + - "limanowarudastronomyasustor-elvdalpha-myqnapcloudappspotagerepai" + - "rbusantiquest-a-la-maisondre-landebusinessebyklefrakkestadgcanon" + - "oichinomiyakebinagisochildrensgardenasushiobaraeroportalabamagas" + - "akishimabarackmaze12xn--lesund-huaxn--lgbbat1ad8jevnakershuscult" + - "ureggioemiliaromagnakasatsunais-a-techietis-a-studentalxn--lgrd-" + - "poacoachampionshiphoptobamagazinebraskaunjargallupinbatochiokino" + - "shimalselvendrellinzaiinetarumizusawavoues3-fips-us-gov-west-1xn" + - "--lhppi-xqaxn--linds-pramericanartuscanyxn--lns-qlanxessorumisak" + - "is-foundationxn--loabt-0qaxn--lrdal-sraxn--lrenskog-54axn--lt-li" + - "acntmpanasonichernigovernmentjometlifeinsurancexn--lten-granexn-" + - "-lury-iraxn--mely-iraxn--merker-kuaxn--mgb2ddesouthcarolinazawax" + - "n--mgb9awbferrarittogoldpoint2thisayamanashiibadajozoraholtalenv" + - "ironmentalconservationxn--mgba3a3ejtushuissier-justicexn--mgba3a" + - "4f16axn--mgba3a4franamizuholdingsmileksvikozagawaxn--mgba7c0bbn0" + - "axn--mgbaakc7dvferreroticapebretonamiasakuchinotsuchiurakawassam" + - "ukawataricohdatsunanjoetsuwanouchikujogaszkoladbrokescrapper-sit" + - "exn--mgbaam7a8haldenxn--mgbab2bdxn--mgbai9a5eva00batsfjordivtasv" + - "uodnaharimaniwakuratexascolipicenord-aurdalcesalvadordalibabaika" + - "liszczytnord-odalipetskashiwazakiyokawaraxaugustowadaegubs3-ap-s" + - "outheast-2xn--mgbai9azgqp6jewelryxn--mgbayh7gpaduaxn--mgbb9fbpob" + - "anazawaxn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgberp4a5d" + - "4a87gxn--mgberp4a5d4arxn--mgbi4ecexposedxn--mgbpl2fhskozakis-an-" + - "actresshinyoshitomiokaneyamaxunusualpersonxn--mgbqly7c0a67fbcolo" + - "nialwilliamsburgulenxn--mgbqly7cvafredrikstadtvsouthwestfalenxn-" + - "-mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2bauhausposts-and-telecommu" + - "nicationsnasadodgeorgeorgiaxn--mgbx4cd0abbottuvalle-daostaticirc" + - "legnicagliaridagawarszawashingtondclkazunoxn--mix082fetsundxn--m" + - "ix891fgushikamifuranoshiroomuraxn--mjndalen-64axn--mk0axinfiniti" + - "s-very-sweetpepperxn--mk1bu44coloradoplateaudioxn--mkru45is-with" + - "-thebandoomdnsaliasdaburyatiaarpfizerxn--mlatvuopmi-s4axn--mli-t" + - "lapyatigorskpnxn--mlselv-iuaxn--moreke-juaxn--mori-qsakuragawaxn" + - "--mosjen-eyatominamiawajikisleofmandalxn--mot-tlaquilancasterxn-" + - "-mre-og-romsdal-qqbbcartoonartdecoffeedbackplaneappalanakhodkana" + - "gawaxn--msy-ula0halsaitamatsukuris-a-nurservebbshimokawaxn--mtta" + - "-vrjjat-k7afamilycompanycolumbusheyxn--muost-0qaxn--mxtq1mishima" + - "tsumotofukexn--ngbc5azdxn--ngbe9e0axn--ngbrxn--45brj9citadeliver" + - "yggeelvinckchristiansburguitarsatxn--11b4c3dynnsaudaxn--nit225kp" + - "pspiegelxn--nmesjevuemie-tcbajddarchaeologyxn--nnx388axn--nodexn" + - "--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nttery-by" + - "aeservecounterstrikexn--nvuotna-hwaxn--nyqy26axn--o1achattanooga" + - "norfolkebiblegallocus-1xn--o3cw4hammarfeastafricamagichofunatori" + - "entexpressaseboknowsitalluzernisshingugexn--od0algxn--od0aq3bbta" + - "tamotorsalzburglobalashovhachinohedmarkasukabedzin-the-bandaioir" + - "aseeklogesuranceoceanographiquevje-og-hornnesamegawaxn--ogbpf8fl" + - "ekkefjordxn--oppegrd-ixaxn--ostery-fyatsukaratsuginamikatagamiho" + - "boleslawiecommunitysfjordyroyrvikingunmarnardalxn--osyro-wuaxn--" + - "p1acfhvalerxn--p1aissmarterthanyoustkarasjokomaganexn--pbt977com" + - "obaraxn--pgbs0dhlxn--porsgu-sta26fidonnakamagayachtscrappingxn--" + - "1lqs71dxn--pssu33lxn--pssy2uxn--q9jyb4comparemarkerryhotelsaves-" + - "the-whalessandria-trani-barletta-andriatranibarlettaandriaxn--qc" + - "ka1pmcdonaldsowaxn--qqqt11missilelxn--qxamurskiptveterinairealto" + - "rlandxn--rady-iraxn--rdal-poaxn--rde-ularvikrasnodarxn--rdy-0nab" + - "ariwchoshibuyachiyodavvesiidazaifuefukihaborokunohealth-carerefo" + - "rmitakeharaxn--rennesy-v1axn--rhkkervju-01aflakstadaokagakibichu" + - "oxn--rholt-mragowoodsidexn--rhqv96gxn--rht27zxn--rht3dxn--rht61e" + - "xn--risa-5narusawaxn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rm" + - "skog-byatsushiroxn--rny31hamurakamigoriginshimokitayamaxn--rovu8" + - "8bbvacationsupdatelemarkasumigaurawa-mazowszexboxenapponazure-mo" + - "bilexn--rros-granvindafjordxn--rskog-uuaxn--rst-0narutokyotangot" + - "pantheonsitextileitungsenxn--rsta-francaiseharaxn--ryken-vuaxn--" + - "ryrvik-byawaraxn--s-1faitheguardianxn--s9brj9compute-1xn--sandne" + - "ssjen-ogbizhevskrasnoyarskomforbananarepublicartierhcloudfunctio" + - "ns3-us-gov-west-1xn--sandy-yuaxn--seral-lraxn--ses554gxn--sgne-g" + - "ratangenxn--skierv-utazaskvolloabathsbcomputerhistoryofscience-f" + - "ictionxn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknland-fxaxn-" + - "-slat-5narviikananporovnoxn--slt-elabbvieeexn--smla-hraxn--smna-" + - "gratis-a-bulls-fanxn--snase-nraxn--sndre-land-0cbremangerxn--sne" + - "s-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1a" + - "xn--sr-varanger-ggbentleyukuhashimojiitatebayashijonawatexn--srf" + - "old-byawatahamaxn--srreisa-q1axn--srum-grazxn--stfold-9xaxn--stj" + - "rdal-s1axn--stjrdalshalsen-sqbeppubolognagatorockartuzyurihonjou" + - "rnalistjohnhlfanhsamnangerxn--stre-toten-zcbspreadbettingxn--t60" + - "b56axn--tckweatherchannelxn--tiq49xqyjewishartgalleryxn--tjme-hr" + - "axn--tn0agrinet-freakspydebergxn--tnsberg-q1axn--tor131oxn--tran" + - "y-yuaxn--trgstad-r1axn--trna-woaxn--troms-zuaxn--tysvr-vraxn--uc" + - "0atversicherungxn--uc0ay4axn--uist22hangoutsystemscloudfrontdoor" + - "xn--uisz3gxn--unjrga-rtaobaokinawashirosatobishimaizurubtsovskja" + - "kdnepropetrovskiervaapsteiermarkredirectmeldalxn--unup4yxn--uuwu" + - "58axn--vads-jraxn--vard-jraxn--vegrshei-c0axn--vermgensberater-c" + - "tberndivttasvuotnakaiwamizawaxn--vermgensberatung-pwbeskidynatho" + - "medepotenzachpomorskienikiiyamanobeauxartsandcraftsamsclubindali" + - "vornoddaxn--vestvgy-ixa6oxn--vg-yiabcn-north-1xn--vgan-qoaxn--vg" + - "sy-qoa0jfkomakiyosatokashikiyosemitexn--vgu402comsecuritytactics" + - "avonamsskoganeis-a-designerimarylandxn--vhquvestfoldxn--vler-qoa" + - "xn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861bestbuysho" + - "usesamsunglobodoes-itverranzanquannefrankfurtatarstanikkoebenhav" + - "nikolaevennodessaikinkobayashikshacknetnedalomzansimagicasadelam" + - "onedavvenjargaulardalorenskoglogowegroweibolzanordre-landiyusuha" + - "raxn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1condoshichi" + - "nohealthcareersaxoxn--wgbl6axn--xhq521betainaboxfusejnynysagaero" + - "clubmedecincinnationwidealerxn--xkc2al3hye2axn--xkc2dl3a5ee0hann" + - "anmokuizumodernxn--y9a3aquariumisugitokorozawaxn--yer-znarvikris" + - "tiansandcatshiranukaniepcexn--yfro4i67oxn--ygarden-p1axn--ygbi2a" + - "mmxn--45q11citicatholicheltenham-radio-openair-traffic-controlle" + - "yxn--ystre-slidre-ujbieidsvollotenkawaxn--zbx025dxn--zf0ao64axn-" + - "-zf0avxn--4gbriminingxn--zfr164bielawallonieruchomoscienceandind" + - "ustrynikonantanangerxperiaxz" + "unnerfrom-wvanylvenicefrom-wyfrosinonefrostalbansharis-a-lawyerf" + + "royahabadajozoraholtalenvironmentalconservationfstavropolitienda" + + "fujiiderafujikawaguchikonefujiminohtawaramotoineppubolognakaniik" + + "awatanagurafujinomiyadafujiokayamapartsharpartyfujisatoshonairpo" + + "rtland-4-salernogatagajobojis-a-liberalfujisawafujishiroishidaka" + + "biratoridellogliastraderfujitsurugashimamateramodalenfujixeroxn-" + + "-30rr7yfujiyoshidafukayabeardubaiduckdnshomebuiltrdfukuchiyamada" + + "fukudominichocolatemasekazofukuis-a-libertarianfukumitsubishigak" + + "iryuohadanoshiroomurafukuokazakisarazurewebsiteshikagamiishibuka" + + "wafukuroishikarikaturindalfukusakishiwadafukuyamagatakahashimama" + + "kisofukushimarburgfunabashiriuchinadafunagatakahatakaishimoichin" + + "osekigaharafunahashikamiamakusatsumasendaisennangonohejis-a-linu" + + "x-useranishiaritabashikaoizumizakitchenfundaciofuoiskujukuriyama" + + "rcheapasadenaklodzkodairafuosskoczowinbaltimore-og-romsdalimited" + + "iscoveryonaguniversityoriikashibatakashimarylhurstjohnaval-d-aos" + + "ta-valleyukibestadishakotankashiharaukraanghkepnord-frontierepai" + + "rbusantiquest-a-la-maisondre-landebusinessebyklefrakkestadds3-ap" + + "-southeast-2furnitureggio-emilia-romagnakanojohanamakinoharafuru" + + "biraquarellebesbyglandfurudonostiafurukawairtelecityeatshawaiiji" + + "marugame-hostingfusodegaurafussaintlouis-a-anarchistoireggiocala" + + "briafutabayamaguchinomigawafutboldlygoingnowhere-for-moregontrai" + + "lroadfuttsurugiminamimakis-a-llamarylandfuturemailingfvgfyis-a-m" + + "usicianfylkesbiblackfridayfyresdalhannanmokuizumodernhannovarese" + + "rveblogspotrentino-a-adigehanyuzenhapmirhareidsbergenharstadharv" + + "estcelebrationhasamarahasaminami-alpssells-itrentino-aadigehashb" + + "anghasudahasura-appassenger-associationhasviklabudhabikinokawaba" + + "rthaebaruminamiminowahatogayahoohatoyamazakitahiroshimarriottren" + + "tino-alto-adigehatsukaichikaiseis-a-painteractivegarsheis-a-pats" + + "fanhattfjelldalhayashimamotobuildinghazuminobusellsyourhomeipavi" + + "ancargodaddyndns-at-homednshimonosekikawahboehringerikehelsinkit" + + "akamiizumisanofidelitysvardollshimosuwalkis-a-personaltrainerhem" + + "bygdsforbundhemneshimotsukehemsedalhepforgeherokussldheroyhgtvsh" + + "imotsumahigashichichibungotakadatinghigashihiroshimanehigashiizu" + + "mozakitakatakanezawahigashikagawahigashikagurasoedahigashikawaki" + + "taaikitakyushuaiahigashikurumeiwamarshallstatebankmpspbamblebtim" + + "netz-2higashimatsushimarinehigashimatsuyamakitaakitadaitoigawahi" + + "gashimurayamalatvuopmidoris-a-photographerokuappfizerhigashinaru" + + "sembokukitamidsundhigashinehigashiomihachimanchesterhigashiosaka" + + "sayamamotorcycleshinichinanhigashishirakawamatakaokamikoaniikapp" + + "ugliahigashisumiyoshikawaminamiaikitamotosumitakaginankokubunjis" + + "-a-playerhigashitsunotogawahigashiurausukitanakagusukumoduminami" + + "ogunicomcastresistancehigashiyamatokoriyamanakakogawahigashiyodo" + + "gawahigashiyoshinogaris-a-republicancerresearchaeologicalifornia" + + "hiraizumisatohobby-sitehirakatashinagawahiranairtraffichofunator" + + "ientexpressatxn--1ck2e1balsanagochihayaakasakawaharavennagasakik" + + "onaikawachinaganoharamcoalaheadjudaicaaarborteaches-yogasawaraci" + + "ngroks-theatreemersongdalenviknakamuratakahamannortonsbergladelm" + + "enhorstackspacekitagataiwanairguardigitalimanowarudaugustowadaeg" + + "ubs3-ap-southeast-1hirarahiratsukagawahirayaitakarazukamiminersh" + + "injournalismailillesandefjordhistorichouseshinjukumanohitachiomi" + + "yaginowaniihamatamakawajimaritimodellinghitachiotagooglecodespot" + + "rentino-altoadigehitoyoshimifunehitradinghjartdalhjelmelandholec" + + "kobierzyceholidayhomelinuxn--32vp30hagakhanamigawahomesecurityma" + + "ceratakasagoperaunitextileitungsenhomesecuritypccwindmillhomesen" + + "seminehomeunixn--3bst00minamisanrikubetsupplyhondahoneywellbeing" + + "zonehongorgehonjyoitakasakitashiobarahornindalhorseoulminamitane" + + "hortendofinternetrentino-s-tirollagrigentomologyhoteleshinkamigo" + + "toyohashimototalhotmailhoyangerhoylandetroitskokonoehumanitieshi" + + "nshinotsurgeryhurdalhurumajis-a-rockstarachowicehyllestadhyogori" + + "s-a-socialistmeindianapolis-a-bloggerhyugawarahyundaiwafunehzcho" + + "nanbugattipschlesischesaudajgorajlchoshibuyachiyodavvesiidazaifu" + + "daigodoesntexistanbullensvanguardyndns-wikindleikangerjlljmpharm" + + "acienshiojirishirifujiedajnjelenia-gorajoyentrentino-sued-tirolj" + + "oyokaichibahcavuotnagaraumalselvendrelljpmorganjpnchoyodobashich" + + "ikashukujitawarajprshioyamemorialjuniperjurkristiansundkrodshera" + + "dkrokstadelvaldaostarnbergkryminamiyamashirokawanabelgorodeokuma" + + "torinokumejimassa-carrara-massacarraramassabunkyonanaoshimageand" + + "soundandvisionkumenanyokkaichirurgiens-dentistes-en-francekunisa" + + "kis-an-artistcgroupgfoggiakunitachiarailwaykunitomigusukumamotoy" + + "amasoykunneppulawykunstsammlungkunstunddesignkuokgrouphdkureisen" + + "kurgankurobelaudibleborkdalkurogimilitarykuroisoftwarendalenugku" + + "romatsunais-an-engineeringkurotakikawasakis-an-entertainerkursko" + + "mmunalforbundkushirogawakustanais-bykusupplieshiranukaniepcekutc" + + "hanelkutnokuzbassnillfjordkuzumakis-certifiedogawarabikomaezakir" + + "unorthwesternmutualkvafjordkvalsundkvamfamberkeleykvanangenkvine" + + "sdalkvinnheradkviteseidskogkvitsoykwpspjelkavikommunemitourismol" + + "anciamitoyoakemiuramiyazumiyotamanomjondalenmlbfanmonmouthagebos" + + "tadmonstermonticellombardiamondshiraois-into-carshintomikasahara" + + "montrealestatefarmequipmentrentino-suedtirolmonza-brianzaporizhz" + + "hiamonza-e-della-brianzapposhiraokanmakiyokawaramonzabrianzaptok" + + "yotangotpantheonsitemonzaebrianzaramonzaedellabrianzamoparachuti" + + "ngmordoviajessheiminanomoriyamatsunomoriyoshiokamitsuemormoneymo" + + "royamatsusakahoginozawaonsenmortgagemoscowindowshiratakahagivest" + + "bytomaritimekeepingmoseushistorymosjoenmoskeneshishikuis-into-ca" + + "rtoonshinyoshitomiokaneyamaxunusualpersonmosshisognemosvikomorot" + + "sukamisunagawamoviemovistargardmtpchristmasakikugawatchesauherad" + + "yndns-workisboringrossetouchijiwadeloittevadsoccertificationissh" + + "ingugemtranakatsugawamuenstermugithubcloudusercontentrentinoa-ad" + + "igemuikamogawamukochikushinonsenergymulhouservebeermunakatanemun" + + "cieszynmuosattemuphiladelphiaareadmyblogsitemurmanskomvuxn--3ds4" + + "43gmurotorcraftrentinoaadigemusashimurayamatsushigemusashinohara" + + "museetrentinoalto-adigemuseumverenigingmutsuzawamutuellevangermy" + + "dissentrentinoaltoadigemydrobofagemydshisuifuelmyeffectrentinos-" + + "tirolmyfritzwinnershitaramamyftphilatelymykolaivarggatrentinosti" + + "rolmymediapchromedicaltanissettaishinomakimobetsuliguriamyokoham" + + "amatsudamypepsonyoursidedyn-o-saurecipesaro-urbino-pesarourbinop" + + "esaromamurogawawioshizukuishimogosenmypetshizuokannamiharumyphot" + + "oshibahccavuotnagareyamalvikongsbergmypsxn--3e0b707emysecurityca" + + "merakermyshopblockshoujis-into-gamessinashikiwakunigamihamadamyt" + + "is-a-bookkeepermincommbankomonomyvnchryslerpictetrentinosud-tiro" + + "lpictureshowtimeteorapphoenixn--3oq18vl8pn36apiemontepilotshrira" + + "mlidlugolekagaminogiftsienaplesigdalpimientaketomisatomskongsvin" + + "gerpinkoninjamisonpioneerpippuphonefosshowapiszpittsburghofastly" + + "piwatepizzapkonskowolayangroupharmacyshirahamatonbetsurgutsiracu" + + "saitoshimaplanetariuminnesotaketakatsukis-foundationplantationpl" + + "antsilkonsulatrobeepilepsydneyplatformintelligenceplaystationpla" + + "zaplchungbukazunoplombardyndns-blogdnsimbirskonyvelolplumbingopm" + + "npodzonepohlpoivronpokerpokrovskooris-a-techietis-a-soxfanpolkow" + + "icepoltavalle-aostarostwodzislawitdkopervikomforbananarepublicar" + + "toonartdecoffeedbackplaneappalacemreviewskrakoweddinglassassinat" + + "ionalheritagematsubarakawagoeu-1pomorzeszowithgoogleapisa-hockey" + + "nutrentinosudtirolpordenonepornporsangerporsanguideltajimicrolig" + + "htingporsgrunnanpoznanpraxis-a-bruinsfanprdpreservationpresidiop" + + "rgmrprimelhusgardenprincipeprivatizehealthinsuranceprochowicepro" + + "ductionsimple-urlprofauskedsmokorsetagayasells-for-ulsandoyprogr" + + "essivegasiaprojectrentinosued-tirolpromombetsurfbsbxn--1lqs03npr" + + "opertyprotectionprotonetrentinosuedtirolprudentialpruszkowithyou" + + "tubeneventoeidsvollprzeworskogptplusterptzpvtrentoyonakagyokutoy" + + "akokamishihoronobeokaminoyamatsuris-leetrentino-stirolpwchungnam" + + "dalseidfjordynnsavannahgapzqldqponqslgbtrevisohughesirdalquicksy" + + "teslingqvchurchaseljeffersoniyodogawastoragestordalstorenburgsto" + + "rfjordstpetersburgstreamsterdamnserverbaniastudiostudyndns-homef" + + "tpaccessnoasakakinokiastuff-4-salestufftoread-booksnesnzstuttgar" + + "trogstadsurreysusakis-not-certifieducatorahimeshimakanegasakinko" + + "bayashikshacknethnologysusonosuzakanrasuzukanumazurysuzukis-save" + + "dunetbankolobrzegersundsvalbardudinkakudamatsuesveiosvelvikoseis" + + "-a-therapistoiasvizzeraswedenswidnicarrierswiebodzindianmarketin" + + "gswiftcoveronaritakurashikis-slickomaganeswinoujscienceandhistor" + + "yswisshikis-uberleetrentino-sud-tirolturystykarasjohkamiokaminok" + + "awanishiaizubangetuscanytushuissier-justicetuvalle-daostatichuva" + + "shiatuxfamilyversicherungvestfoldvestnesolutionslupskoryolasitev" + + "estre-slidreamhostersomavestre-totennishiawakuravestvagoyvevelst" + + "advibo-valentiavibovalentiavideovillaskoyabearalvahkijobserverda" + + "lvdalcesomnarashinovinnicartiervinnytsiavipsinaapphotographysiov" + + "irginiavirtualvirtueeldomeindustriesteambulancevirtuelvisakegawa" + + "vistaprinternationalfirearmsooviterboltromsakatakinouevivoldavla" + + "dikavkazanvladimirvladivostokaizukarasuyamazoevlogoipiagetmyiphi" + + "lipsyvolkenkundenvolkswagentsopotritonvologdanskoshunantokonameg" + + "atakasugais-an-accountantshinshirovolvolgogradvolyngdalvoronezhy" + + "tomyrvossevangenvotevotingvotoyonezawavrnworldworse-thanggliding" + + "wowiwatsukiyonowruzhgorodoywritesthisblogsytewroclawloclawekostr" + + "omahachijorpelandwtcirclegnicafederationwtfbx-oslodingenwuozuwww" + + "mflabsor-odalwzmiuwajimaxn--4gq48lf9jeonnamerikawauexn--4it168dx" + + "n--4it797kotohiradomainsurehabmerxn--4pvxsor-varangerxn--54b7fta" + + "0ccitichernigovernmentoyookanzakiyosatokigawaxn--55qw42gxn--55qx" + + "5dxn--5js045dxn--5rtp49civilaviationxn--5rtq34kotouraxn--5su34j9" + + "36bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn-" + + "-7t0a264civilisationxn--80adxhksorfoldxn--80ao21axn--80aqecdr1ax" + + "n--80asehdbarclaycardsakuraibigawaurskog-holandroverhalla-spezia" + + "grocerybnikahokutobishimaizurubtsovskiervaapsteiermarkariyakumol" + + "dev-myqnapcloudcontrolappagefrontappagespeedmobilizerobiraeropor" + + "talabamagasakishimabarackmaze12xn--80aswgxn--80audnedalnxn--8ltr" + + "62kouhokutamakis-an-actorxn--8pvr4uxn--8y0a063axn--90a3academyac" + + "tivedirectoryazannakadomari-elasticbeanstalkounosunndalxn--90ais" + + "hobaraomoriguchiharahkkeravjudygarlandxn--90azhaibarakitahatakan" + + "abeautydalxn--9dbhblg6dietcimmobilienxn--9dbq2axn--9et52uxn--9kr" + + "t00axn--andy-iraxn--aroport-byanagawaxn--asky-iraxn--aurskog-hla" + + "nd-jnbarclaysakyotanabellunordkappgafanpachigasakidsmynasushioba" + + "ragusaarlandiskstationavigationavuotnakayamatsuuraustevollavagis" + + "kebinagisochildrensgardenaturalhistorymuseumcenterepbodyndns-fre" + + "ebox-oskolegokasells-for-less3-eu-central-1xn--avery-yuasakuhokk" + + "aidontexisteingeekouyamashikis-an-actresshintokushimaxn--b-5gaxn" + + "--b4w605ferdxn--bck1b9a5dre4civilizationxn--bdddj-mrabdxn--beara" + + "lvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn-" + + "-bidr-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fyanaizuxn--bjddar-" + + "ptamayufuettertdasnetzxn--blt-elabourxn--bmlo-graingerxn--bod-2n" + + "aroyxn--brnny-wuaccident-investigationjukudoyamagadancebetsukuba" + + "bia-goracleaningatlantabusebastopologyeonggiehtavuoatnadexeterim" + + "o-i-ranagahamaroygardendoftheinternetflixilovecollegefantasyleag" + + "uernseyxn--brnnysund-m8accident-preventionlineat-urlxn--brum-voa" + + "gatromsojavald-aostaplesokanoyakagexn--btsfjord-9zaxn--c1avgxn--" + + "c2br7gxn--c3s14misasaguris-into-animelbournexn--cck2b3barefootba" + + "llooningliwiceventsalangenayoroddaustinnaturalsciencesnaturelles" + + "3-eu-west-1xn--cg4bkis-very-badaddjamalborkangerxn--ciqpnxn--clc" + + "hc0ea0b2g2a9gcdn77-sslattumisawaxn--comunicaes-v6a2oxn--correios" + + "-e-telecomunicaes-ghc29axn--czr694bargainstitutelemarkashiwaraus" + + "traliaisondriodejaneirochestereportarantours3-external-1xn--czrs" + + "0trusteexn--czru2dxn--czrw28barreauctionflfanfshostrodawaraustrh" + + "eimatunduhrennesoyokotebinorilskarlsoyokozebizenakamagayachts3-e" + + "xternal-2xn--d1acj3barrel-of-knowledgeologyukuhashimojibmditchyo" + + "uripalanakhodkanagawauthordalandroidgcahcesuolocalhistoryggeelvi" + + "nckarmoyomitanobninskarpaczeladz-1xn--d1alfaromeoxn--d1atrvbarce" + + "lonagasukeu-2xn--d5qv7z876civilwarmanagementoyosatoyokawaxn--dav" + + "venjrga-y4axn--djrs72d6uyxn--djty4kouzushimashikokuchuoxn--dnna-" + + "grajewolterskluwerxn--drbak-wuaxn--dyry-iraxn--e1a4claimsaves-th" + + "e-whalessandria-trani-barletta-andriatranibarlettaandriaxn--eckv" + + "dtc9dxn--efvn9sorreisahayakawakamiichikawamisatottoris-lostre-to" + + "teneis-a-studentalxn--efvy88hair-surveillancexn--ehqz56nxn--elqq" + + "16hakatanotaireshimokawaxn--estv75gxn--eveni-0qa01gaxn--f6qx53ax" + + "n--fct429kozagawaxn--fhbeiarnxn--finny-yuaxn--fiq228c5hsortlandx" + + "n--fiq64barrell-of-knowledgeometre-experts-comptablesalondonetsk" + + "ashiwazakiyosemiteverbankasukabedzin-the-bandaioiraseeklogesuran" + + "certmgretachikawakkanaibetsubamericanfamilydscloudcontrolledekaf" + + "jordivtasvuodnagatorogersaltdalimoliserniautomotivecodynaliascol" + + "i-picenoipirangamvikaruizawamusementaobaokinawashirosatochiokino" + + "shimakeupowiathletajimabariakembuchikumagayagawakuyabukihokumako" + + "gengerdalipayekaterinburgjerdrumckinseyokosukareliance164xn--fiq" + + "s8sorumisakis-gonexn--fiqz9southcarolinazawaxn--fjord-lraxn--fjq" + + "720axn--fl-ziaxn--flor-jraxn--flw351exn--fpcrj9c3dxn--frde-grand" + + "rapidsouthwestfalenxn--frna-woaraisaijosoyrovigorlicexn--frya-hr" + + "axn--fzc2c9e2clickchristiansburgroundhandlingroznyxn--fzys8d69uv" + + "gmailxn--g2xx48clinichernihivanovosibirskautokeinoxn--gckr3f0fbx" + + "ostrolekaluganskharkivgucciprianiigataitogliattirescrappingushik" + + "amifuranosegawaxn--gecrj9cliniquenoharaxn--ggaviika-8ya47hakodat" + + "exn--gildeskl-g0axn--givuotna-8yandexn--3pxu8kosugexn--gjvik-wua" + + "xn--gk3at1exn--gls-elacaixaxn--gmq050is-very-evillagexn--gmqw5ax" + + "n--h-2failxn--h1aeghakonexn--h2brj9clintonoshoesavonamsskoganeis" + + "-a-doctorayxn--hbmer-xqaxn--hcesuolo-7ya35bashkiriautoscanadaeje" + + "onbukarumaifarmerseinextdirectargets-itargivingjesdalavangenatur" + + "bruksgymnaturhistorisches3-fips-us-gov-west-1xn--hery-iraxn--hge" + + "bostad-g3axn--hmmrfeasta-s4acctrysiljan-mayenxn--hnefoss-q1axn--" + + "hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn" + + "--hylandet-54axn--i1b6b1a6a2exn--imr513nxn--indery-fyaotsurnadal" + + "xn--io0a7is-very-goodhandsonxn--j1aefermobilyxn--j1amhakubankhva" + + "olbia-tempio-olbiatempioolbialystokkemerovodkagoshimalopolskanla" + + "ndxn--j6w193gxn--jlq61u9w7basilicataniaveroykeniwaizumiotsukumiy" + + "amazonawsabaerobaticketsaritsynologyeongnamegawakeisenbahnatuurw" + + "etenschappenaumburgjovikasaokamisatokashikiwienaustdalazioceanog" + + "raphics3-sa-east-1xn--jlster-byaroslavlaanderenxn--jrpeland-54ax" + + "n--jvr189misconfusedxn--k7yn95exn--karmy-yuaxn--kbrq7oxn--kcrx77" + + "d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn--kltx9axn" + + "--klty5xn--42c2d9axn--koluokta-7ya57hakuis-a-nascarfanxn--kprw13" + + "dxn--kpry57dxn--kpu716ferraraxn--kput3is-very-nicexn--krager-gya" + + "sakaiminatoyonoxn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxax" + + "n--krjohka-hwab49jetztrentino-sudtirolxn--ksnes-uuaxn--kvfjord-n" + + "xaxn--kvitsy-fyasugis-very-sweetpepperxn--kvnangen-k0axn--l-1fai" + + "rwindsowaxn--l1accentureklamborghiniizaxn--laheadju-7yasuokarate" + + "xn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leagaviika-52basket" + + "ballfinanzgoravocatanzarowebhopocznoceanographiquehimeji234xn--l" + + "esund-huaxn--lgbbat1ad8jevnakershuscultureggioemiliaromagnakasat" + + "sunais-a-teacherkassymantechnologyxn--lgrd-poacoachampionshiphop" + + "tobamagazinebraskaunjargallupinbatodayurihonjournalisteinkjerusa" + + "lembroideryusuharavoues3-us-gov-west-1xn--lhppi-xqaxn--linds-pra" + + "mericanartulansokndalxn--lns-qlanxesspreadbettingxn--loabt-0qaxn" + + "--lrdal-sraxn--lrenskog-54axn--lt-liaclothingrpanasonichernivtsi" + + "ciliaxn--lten-granexn--lury-iraxn--mely-iraxn--merker-kuaxn--mgb" + + "2ddespydebergxn--mgb9awbferrarittogoldpoint2thisamitsukexn--mgba" + + "3a3ejtunesolarssonxn--mgba3a4f16axn--mgba3a4franamizuholdingsmil" + + "eksvikozakis-an-anarchistoricalsocietyumenxn--mgba7c0bbn0axn--mg" + + "baakc7dvferreroticanonoichinomiyakexn--mgbaam7a8hakusandiegoodye" + + "arthadselfipassagenshellaspeziaxn--mgbab2bdxn--mgbai9a5eva00bats" + + "fjordivttasvuotnaharimaniwakuratexascolipicenord-aurdalpha-myqna" + + "pcloudappspotagerhcloudfunctionsalvadordalibabaikaliszczytnord-o" + + "dalindasdaburyatiaarpaleomutashinaiinetarnobrzegyptianhlfanhsalz" + + "burglobalashovhachinohedmarkasumigaurawa-mazowszexboxenapponazur" + + "e-mobilevje-og-hornnesamegawaxasnesoddenmarkhangelskjervoyagemol" + + "ogicallyngenglanddnskingjerstadotsuruokamchatkameokameyamashinat" + + "sukigatakamatsukawaetnagaivuotnagaokakyotambabydgoszczecinemagen" + + "tositelekommunikationthewifiat-band-campaniamallamaintenanceobih" + + "irosakikamijimattelefonicarbonia-iglesias-carboniaiglesiascarbon" + + "iabruzzoologyeongbuk-uralsk12xn--mgbai9azgqp6jewelryxn--mgbayh7g" + + "paduaxn--mgbb9fbpobanazawaxn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca" + + "7dzdoxn--mgberp4a5d4a87gxn--mgberp4a5d4arxn--mgbi4ecexposedxn--m" + + "gbpl2fhskpnxn--mgbqly7c0a67fbcloudnsdojoetsuwanouchikujogaszkola" + + "hppiacenzakopanerairforcexn--mgbqly7cvafredrikstadtverranzanxn--" + + "mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2bauhausposts-and-telecommun" + + "icationsnasadodgeorgeorgiaxn--mgbx4cd0abbottunkosherbrookegawaxn" + + "--mix082fetsundxn--mix891fgxn--1lqs71dxn--mjndalen-64axn--mk0axi" + + "nfinitis-with-thebandoomdnsfor-better-thandaxn--mk1bu44cnsaxoxn-" + + "-mkru45isleofmandalxn--mlatvuopmi-s4axn--mli-tlapyatigorskppspie" + + "gelxn--mlselv-iuaxn--moreke-juaxn--mori-qsakuragawaxn--mosjen-ey" + + "atominamiawajikissmarterthanyoustkarasjokomakiyosumycdn77-secure" + + "chtrainingxn--mot-tlaquilancasterxn--mre-og-romsdal-qqbbcasadela" + + "monedatsunanjoburglobodoes-itvedestrandiyusuisserveexchangexn--m" + + "sy-ula0haldenxn--mtta-vrjjat-k7afamilycompanycntoyotaris-a-finan" + + "cialadvisor-aurdalukowhoswhokksundynv6xn--muost-0qaxn--mxtq1mish" + + "imatsumaebashimodatexn--ngbc5azdxn--ngbe9e0axn--ngbrxn--45brj9ci" + + "rcus-2xn--nit225krasnodarxn--nmesjevuemie-tcbajddarchaeologyxn--" + + "nnx388axn--nodexn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--nts" + + "q17gxn--nttery-byaeservecounterstrikexn--nvuotna-hwaxn--nyqy26ax" + + "n--o1achattanooganorfolkebiblegallocus-1xn--o3cw4halsaitamatsuku" + + "ris-a-nurservebbshimokitayamaxn--od0algxn--od0aq3bbtarumizusawax" + + "n--ogbpf8flekkefjordxn--oppegrd-ixaxn--ostery-fyatsukaratsuginam" + + "ikatagamihoboleslawiecolonialwilliamsburgruexn--osyro-wuaxn--p1a" + + "cfhvalerxn--p1aiwchoseirouterxn--pbt977coloradoplateaudioxn--pgb" + + "s0dhlxn--porsgu-sta26fidonnakaiwamizawaxn--pssu33lxn--pssy2uxn--" + + "q9jyb4columbusheyxn--qcka1pmcdonaldsrlxn--qqqt11missilelxn--qxam" + + "urskjakdnepropetrovskiptveterinairealtorlandxn--rady-iraxn--rdal" + + "-poaxn--rde-ularvikrasnoyarskomitamamuraxn--rdy-0nabarixn--renne" + + "sy-v1axn--rhkkervju-01aflakstadaokagakibichuoxn--rholt-mragowood" + + "sidexn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5narusawaxn" + + "--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byatsushiroxn--" + + "rny31hammarfeastafricapetownnews-stagingxn--rovu88bbvacationsupd" + + "atelevisionikiitatebayashijonawatexn--rros-granvindafjordxn--rsk" + + "og-uuaxn--rst-0narutomobellevuelosangelesjaguarchitecturealtychy" + + "attorneyagawalbrzycharternopilawalesundxn--rsta-francaiseharaxn-" + + "-ryken-vuaxn--ryrvik-byawaraxn--s-1faitheguardianxn--s9brj9commu" + + "nitysfjordyroyrvikinguitarsbschokoladenxn--sandnessjen-ogbizhevs" + + "kredirectmeldalxn--sandy-yuaxn--seral-lraxn--ses554gxn--sgne-gra" + + "tangenxn--skierv-utazaskvolloabathsbcomobaraxn--skjervy-v1axn--s" + + "kjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat-5narviikananporovnox" + + "n--slt-elabbvieeexn--smla-hraxn--smna-gratis-a-bulls-fanxn--snas" + + "e-nraxn--sndre-land-0cbremangerxn--snes-poaxn--snsa-roaxn--sr-au" + + "rdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbentleyu" + + "uconnectatamotorsamnangerxn--srfold-byawatahamaxn--srreisa-q1axn" + + "--srum-grazxn--stfold-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbep" + + "publishproxyzgorzeleccolognewportlligatewayuzawaxn--stre-toten-z" + + "cbsrtroandinosaurlandesmolenskosaigawaxn--t60b56axn--tckweatherc" + + "hannelxn--tiq49xqyjewishartgalleryxn--tjme-hraxn--tn0agrinet-fre" + + "aksrvaroyxn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trgstad-r1ax" + + "n--trna-woaxn--troms-zuaxn--tysvr-vraxn--uc0atvdonskoshimizumaki" + + "zunokunimilanoxn--uc0ay4axn--uist22hamurakamigoriginshimonitayan" + + "agitlaborxn--uisz3gxn--unjrga-rtambovenneslaskerrylogisticsologn" + + "exn--unup4yxn--uuwu58axn--vads-jraxn--vard-jraxn--vegrshei-c0axn" + + "--vermgensberater-ctberndnpalermomasvuotnakatombetsupportatarsta" + + "nikkoebenhavnikolaevennodessaikiraxn--vermgensberatung-pwbeskidy" + + "nathomedepotenzachpomorskienikonantanangerxn--vestvgy-ixa6oxn--v" + + "g-yiabcn-north-1xn--vgan-qoaxn--vgsy-qoa0jfkomatsushimashikexn--" + + "vgu402comparemarkerryhotelscholarshipschooluroyxn--vhquversaille" + + "solundbeckosakaerodromegalsacechirealminamiuonumasudaxn--vler-qo" + + "axn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861bestbuysh" + + "ousesamsclubindalindesnesamsunglogowegroweibolzanordre-landrange" + + "dalinkasuyakutiaxn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wg" + + "bh1compute-1xn--wgbl6axn--xhq521betainaboxfusejnynysagaeroclubme" + + "decincinnationwidealerxn--xkc2al3hye2axn--xkc2dl3a5ee0hangoutsys" + + "temscloudfrontdoorxn--y9a3aquariumisugitokuyamatsumotofukexn--ye" + + "r-znarvikristiansandcatshirakoenigxn--yfro4i67oxn--ygarden-p1axn" + + "--ygbi2ammxn--45q11citadeliveryokamikawanehonbetsurutaharaxn--ys" + + "tre-slidre-ujbieigersundrivelandrobaknoluoktaikicks-assedicaseih" + + "ichisobetsuitaipeiheijiiyamanobeauxartsandcraftsandvikcoromantov" + + "alle-d-aostathellexusdecorativeartsanfranciscofreakunemurorangei" + + "seiyoichiropracticasertairaxn--zbx025dxn--zf0ao64axn--zf0avxn--4" + + "gbriminingxn--zfr164bielawallonieruchomoscienceandindustryninohe" + + "kinannestadrudmurtiaxperiaxz" // nodes is the list of nodes. Each node is represented as a uint32, which // encodes the node's children, wildcard bit and node type (as an index into @@ -481,8068 +482,8141 @@ const text = "biellaakesvuemieleccebieszczadygeyachimataipeigersundnpaleomutas" // [15 bits] text index // [ 6 bits] text length var nodes = [...]uint32{ - 0x274903, - 0x370704, - 0x28c306, - 0x36c9c3, - 0x36c9c6, - 0x3948c6, - 0x3a4883, - 0x208e44, - 0x252cc7, - 0x28bf48, + 0x29e943, + 0x364444, + 0x28af46, + 0x371983, + 0x371986, + 0x394246, + 0x3a4103, + 0x202f04, + 0x24f607, + 0x28ab88, 0x1a00882, - 0x308207, - 0x350b49, - 0x2f91ca, - 0x2f91cb, - 0x232343, - 0x28d846, - 0x231645, + 0x309dc7, + 0x3533c9, + 0x2fb3ca, + 0x2fb3cb, + 0x22fe43, + 0x28cac6, + 0x2352c5, 0x1e00702, - 0x2105c4, - 0x22d243, - 0x275685, - 0x2207982, - 0x33d083, - 0x26ee604, - 0x24bb45, - 0x2a01782, - 0x37528e, - 0x2470c3, - 0x37bac6, - 0x37bacb, - 0x2e03642, - 0x28c487, - 0x233846, + 0x211ac4, + 0x2c7a83, + 0x226bc5, + 0x2200d42, + 0x2a0f43, + 0x2707e44, + 0x368485, + 0x2a00c42, + 0x3797ce, + 0x24a483, + 0x38b406, + 0x2e04642, + 0x2a5907, + 0x237d46, 0x3200a42, - 0x2573c3, - 0x2573c4, - 0x353f86, - 0x240788, - 0x285686, - 0x39ffc4, - 0x3600dc2, - 0x32ab89, - 0x364d87, - 0x2f4806, - 0x3527c9, - 0x295108, - 0x3404c4, - 0x2ee886, - 0x211206, - 0x3a02202, - 0x23cf4f, - 0x262c8e, - 0x215644, - 0x2bc805, - 0x2e16c5, - 0x2e8b89, - 0x239849, - 0x3293c7, - 0x3a8706, - 0x230103, - 0x3e04602, - 0x33d3c3, - 0x21c0ca, - 0x21c343, - 0x253c45, - 0x284d02, - 0x284d09, - 0x4203442, - 0x203444, - 0x208986, - 0x27c205, - 0x349a04, - 0x4a837c4, - 0x203803, - 0x230684, - 0x4e00f82, - 0x370444, - 0x261b84, - 0x22428a, - 0x52009c2, - 0x2ae907, - 0x27c6c8, - 0x5a07dc2, + 0x2ae043, + 0x2ae044, + 0x280f86, + 0x36f448, + 0x283a46, + 0x386144, + 0x3601002, + 0x326a09, + 0x363a07, + 0x3351c6, + 0x355049, + 0x293988, + 0x367104, + 0x3a6606, + 0x20e306, + 0x3a02e02, + 0x241d0f, + 0x33174e, + 0x212484, + 0x2bb945, + 0x202e05, + 0x2ea589, + 0x23e889, 0x325747, - 0x2b72c4, - 0x2b72c7, - 0x36fa85, - 0x36ba87, - 0x329186, - 0x260c44, - 0x33f4c5, - 0x2a1447, - 0x6a036c2, - 0x346e43, - 0x20d402, - 0x365a03, - 0x6e0dec2, - 0x27edc5, - 0x7203402, - 0x24c184, - 0x27a0c5, - 0x215587, - 0x3907ce, - 0x2f5e84, - 0x23fb44, - 0x203403, - 0x2e7ac9, - 0x30534b, - 0x30c688, - 0x31aec8, - 0x321348, - 0x3114c8, - 0x35260a, - 0x36b987, - 0x223546, - 0x769d742, - 0x373483, - 0x37cf03, - 0x38c044, - 0x254183, - 0x3a48c3, - 0x1712542, - 0x7a06442, - 0x245845, - 0x24dcc6, - 0x2ca2c4, - 0x397487, - 0x27d286, - 0x31b9c4, - 0x3a7d87, - 0x206443, - 0x7ebf042, - 0x8252f42, - 0x8613bc2, - 0x213bc6, - 0x8a00002, - 0x37b205, - 0x313a83, - 0x204184, - 0x2d9c84, - 0x2d9c85, + 0x221646, + 0x26b083, + 0x3e056c2, + 0x346fc3, + 0x207a4a, + 0x211e83, + 0x250585, + 0x2040c2, + 0x2830c9, + 0x4204802, + 0x209084, + 0x29e486, + 0x284b45, + 0x34c904, + 0x4a74a04, + 0x204803, + 0x234304, + 0x4e01842, + 0x364184, + 0x52e41c4, + 0x22410a, + 0x56009c2, + 0x334307, + 0x38e008, + 0x6201182, + 0x322847, + 0x2b7344, + 0x2b7347, + 0x383d05, + 0x370a47, + 0x325506, + 0x332a44, + 0x340c85, + 0x28df47, + 0x72046c2, + 0x349183, + 0x218782, + 0x366703, + 0x76108c2, + 0x2798c5, + 0x7a02d42, + 0x368ac4, + 0x277785, + 0x2123c7, + 0x2ddc0e, + 0x330a44, + 0x244744, + 0x20ca03, + 0x326ec9, + 0x30528b, + 0x30e148, + 0x31cd88, + 0x320888, + 0x20a588, + 0x354e8a, + 0x370947, + 0x217906, + 0x7e9c3c2, + 0x377d83, + 0x380c43, + 0x38bc84, + 0x250ac3, + 0x3a4143, + 0x1713b02, + 0x8203182, + 0x2484c5, + 0x30c046, + 0x2c9bc4, + 0x396e07, + 0x22eec6, + 0x280304, + 0x3a7dc7, + 0x203183, + 0x86bdb82, + 0x8a4f882, + 0x8e13702, + 0x213706, + 0x9200002, + 0x37f645, + 0x315043, + 0x205244, + 0x2dbe44, + 0x2dbe45, 0x207043, - 0x8f23743, - 0x9209e42, - 0x288c85, - 0x288c8b, - 0x258306, - 0x20b6cb, - 0x271f44, - 0x20c9c9, - 0x20e284, - 0x960f202, - 0x20f903, - 0x20fc83, - 0x160fe02, - 0x23d483, - 0x20fe0a, - 0x9a10842, - 0x210845, - 0x28f40a, - 0x2cdd44, - 0x211603, - 0x211c44, - 0x2139c3, - 0x2139c4, - 0x2139c7, - 0x214405, - 0x216145, - 0x216686, - 0x2169c6, - 0x2173c3, - 0x219d48, - 0x256d03, - 0x9e1a382, - 0x21ab08, - 0x21a38b, - 0x21e608, - 0x21ed86, - 0x21fb07, - 0x2246c8, - 0xa635842, - 0xaa95682, - 0x2f5708, - 0x29e287, - 0x235e05, - 0x235e08, - 0x354888, - 0x387283, - 0x22b144, - 0x38c082, - 0xae2ca42, - 0xb214382, - 0xba2e142, - 0x22e143, - 0xbe01742, - 0x208e03, - 0x201744, - 0x217543, - 0x340484, - 0x25248b, - 0x21a2c3, - 0x2d2446, - 0x224104, - 0x29cbce, - 0x354ec5, - 0x25f248, - 0x21d287, - 0x21d28a, - 0x2341c3, - 0x2341c7, - 0x305505, - 0x387e04, - 0x3ac206, - 0x3ac207, - 0x2c2d44, - 0x390b07, - 0x3a9dc4, - 0x206144, - 0x206146, - 0x268984, - 0x21e046, - 0x20e0c3, - 0x222dc8, - 0x3b03c8, - 0x23fb03, - 0x23d443, - 0x395bc4, - 0x39aa83, - 0xc200482, - 0xc6fc042, + 0x9723ac3, + 0x9a093c2, + 0x2873c5, + 0x2873cb, + 0x22d086, + 0x20cbcb, + 0x26ff44, + 0x20d189, + 0x20ed44, + 0x9e0fd82, + 0x210c83, + 0x211183, + 0x1611302, + 0x23c343, + 0x21130a, + 0xa211d42, + 0x211d45, + 0x28ea8a, + 0x2cd704, + 0x212d43, + 0x213384, + 0x213cc3, + 0x213cc4, + 0x213cc7, + 0x214245, + 0x218dc5, + 0x219586, + 0x21a0c6, + 0x21aa43, + 0x21dc48, + 0x258e83, + 0xa615802, + 0x21f008, + 0x21580b, + 0x222d08, + 0x223586, + 0x224547, + 0x229748, + 0xb279a82, + 0xb693f02, + 0x20b608, + 0x2ad0c7, + 0x23b405, + 0x23b408, + 0x281888, + 0x2ada03, + 0x22eac4, + 0x38bcc2, + 0xba2f482, + 0xbe051c2, + 0xc62f802, + 0x22f803, + 0xca02ec2, + 0x202ec3, + 0x2fe704, + 0x21abc3, + 0x3670c4, + 0x24edcb, + 0x215743, + 0x2d2f86, + 0x223f84, + 0x29b84e, + 0x360445, + 0x38b508, + 0x24bd87, + 0x24bd8a, + 0x222a83, + 0x222a87, + 0x305445, + 0x231c84, + 0x24d886, + 0x24d887, + 0x2beb44, + 0x2f6607, + 0x377e04, + 0x3afe84, + 0x3afe86, + 0x267544, + 0x208606, + 0x210ac3, + 0x217188, + 0x21cfc8, + 0x244703, + 0x23c303, + 0x395544, + 0x39a003, + 0xce00482, + 0xd304e82, 0x2004c3, 0x2072c6, - 0x37e383, - 0x21e4c4, - 0xca15442, - 0x326983, - 0x215443, - 0x217d82, - 0xce008c2, - 0x2bae86, - 0x232547, - 0x2e5745, - 0x2642c4, - 0x2a1305, - 0x202987, - 0x26b645, - 0x2af3c9, - 0x2c7606, - 0x2cf308, - 0x2e5646, - 0xd205742, - 0x240348, - 0x36cf06, - 0x205745, - 0x376d47, - 0x3b02c4, - 0x3b02c5, - 0x285844, - 0x285848, - 0xd60b782, - 0xda11a82, - 0x32b786, - 0x316cc8, - 0x32da85, - 0x337646, - 0x3387c8, - 0x33e708, - 0xde63085, - 0x3a3d84, - 0x3ad007, - 0xe20dbc2, - 0xe619fc2, - 0xfa04a82, - 0x3580c5, - 0x29f9c5, - 0x373806, - 0x318647, - 0x22b447, - 0x10258403, - 0x2a4a47, - 0x2d3708, - 0x380289, - 0x375447, - 0x383987, - 0x392988, - 0x3a5b86, - 0x3abd46, - 0x22ef0c, - 0x22fa8a, - 0x22fe07, - 0x23150b, - 0x232387, - 0x23238e, - 0x232bc4, - 0x232ec4, - 0x234447, - 0x259cc7, - 0x2380c6, - 0x2380c7, - 0x238c47, - 0x13207802, - 0x23a006, - 0x23a00a, - 0x23a28b, - 0x23b387, - 0x23bd45, - 0x23c083, - 0x23c346, - 0x23c347, - 0x239a03, - 0x1362d9c2, - 0x23cbca, - 0x13b51c82, - 0x13ea5202, - 0x1423e102, - 0x14633942, - 0x23ee45, - 0x23f904, - 0x14e00682, - 0x3704c5, - 0x275643, - 0x316745, - 0x20d9c4, - 0x291ec6, - 0x362306, - 0x288e83, - 0x36d844, - 0x3407c3, - 0x15201842, - 0x207bc4, - 0x3ad586, - 0x207bc5, - 0x256a86, - 0x376e48, - 0x218dc4, - 0x22d008, - 0x2ddfc5, - 0x2c8108, - 0x357c46, - 0x2b36c7, - 0x25e144, - 0x25e146, - 0x310083, - 0x382383, - 0x2bfd88, - 0x30aac4, - 0x329547, - 0x2443c6, - 0x308549, - 0x20aa88, - 0x24ab08, - 0x3058c4, - 0x3aae03, - 0x208c82, - 0x156b0a82, - 0x15a0b502, - 0x200d03, - 0x15e0a182, - 0x252e04, - 0x36c345, - 0x23b203, - 0x22f3c4, - 0x302b07, - 0x264003, - 0x243d48, - 0x207f85, - 0x3055c4, - 0x36ab03, - 0x27a045, - 0x27a184, - 0x20ba06, - 0x211d04, - 0x213746, - 0x2154c6, - 0x254984, - 0x21ebc3, - 0x1628bb42, - 0x34bdc5, - 0x21fec3, - 0x16600442, - 0x2633c5, - 0x230743, - 0x230749, - 0x16a03f42, - 0x17202282, - 0x24c545, - 0x218406, - 0x329907, - 0x2c9e86, - 0x2b9208, - 0x2b920b, + 0x369e83, + 0x263584, + 0xd616942, + 0x244c43, + 0x216943, + 0x21b182, + 0xda008c2, + 0x2b9fc6, + 0x235fc7, + 0x2e9345, + 0x367a44, + 0x27e045, + 0x2026c7, + 0x26a205, + 0x2c6889, + 0x2cf2c6, + 0x2d48c8, + 0x2e9246, + 0xde06c02, + 0x33b648, + 0x2fe4c6, + 0x3b1a45, + 0x3ae4c7, + 0x301084, + 0x301085, + 0x283c04, + 0x283c08, + 0xe20cc82, + 0xe6131c2, + 0x329cc6, + 0x318208, + 0x339345, + 0x33a3c6, + 0x33c648, + 0x35b948, + 0xeac8945, + 0xefa8204, + 0x3aae87, + 0xf20e802, + 0xf61dec2, + 0x10a16582, + 0x357b85, + 0x2a3e05, + 0x2de246, + 0x319b87, + 0x399547, + 0x1122d183, + 0x29a147, + 0x2d4488, + 0x38fec9, + 0x379987, + 0x3a5187, + 0x22fe88, + 0x230686, + 0x231786, + 0x2323cc, + 0x232f4a, + 0x233787, + 0x23518b, + 0x235e07, + 0x235e0e, + 0x236a84, + 0x2374c4, + 0x239b07, + 0x25b087, + 0x23d9c6, + 0x23d9c7, + 0x23e107, + 0x14600bc2, + 0x23ec86, + 0x23ec8a, + 0x23ef0b, + 0x240007, + 0x2407c5, + 0x240b03, + 0x240fc6, + 0x240fc7, + 0x230a83, + 0x14a0b382, + 0x24198a, + 0x14f54502, + 0x152a6c02, + 0x15642b82, + 0x15a37e42, + 0x243a85, + 0x244504, + 0x16200682, + 0x364205, + 0x226b83, + 0x317c85, + 0x20a484, + 0x20ec44, + 0x291786, + 0x378106, + 0x2875c3, + 0x261f84, + 0x281e43, + 0x16600f82, + 0x200f84, + 0x3ab406, + 0x200f85, + 0x258c06, + 0x3ae5c8, + 0x263804, + 0x2c7848, + 0x2e0c45, + 0x22e708, + 0x32c306, + 0x2b49c7, + 0x239504, + 0x239506, + 0x307003, + 0x384083, + 0x2be608, + 0x30c584, + 0x2a0887, + 0x30a106, + 0x30a109, + 0x252448, + 0x27efc8, + 0x280444, + 0x378983, + 0x22aa02, + 0x16ab1d82, + 0x16e2cf42, + 0x3a1603, + 0x17219c42, + 0x24f744, + 0x3400c6, + 0x371305, + 0x23fe83, + 0x232884, + 0x300447, + 0x367783, + 0x2379c8, + 0x3af5c5, + 0x36fc43, + 0x277705, + 0x277844, + 0x208306, + 0x20c804, + 0x20cf06, + 0x212306, + 0x2512c4, + 0x215683, + 0x21a883, + 0x1767e402, + 0x360fc5, + 0x215dc3, + 0x17a00442, + 0x232383, + 0x331e85, + 0x2343c3, + 0x2343c9, + 0x17e08042, + 0x18614b42, + 0x286b45, + 0x21ba46, + 0x29f387, + 0x2c9786, + 0x2b83c8, + 0x2b83cb, 0x20730b, - 0x22e5c5, - 0x2cf9c5, - 0x2c0cc9, - 0x1600bc2, - 0x254b48, - 0x20b904, - 0x17a00202, - 0x2520c3, - 0x18259e86, - 0x37e208, - 0x18606482, - 0x222308, - 0x18a079c2, - 0x27208a, - 0x226b03, - 0x306bc6, - 0x328dc8, - 0x203f88, - 0x331dc6, - 0x368847, - 0x23d147, - 0x210d8a, - 0x2cddc4, - 0x33ce04, - 0x3505c9, - 0x38f545, - 0x262e86, - 0x212203, - 0x244d04, - 0x213544, - 0x305d07, - 0x225f47, - 0x265e84, - 0x210cc5, - 0x3738c8, - 0x35e287, - 0x3613c7, - 0x18e0bc82, + 0x22aac5, + 0x2d02c5, + 0x2bf489, + 0x1600ec2, + 0x251488, + 0x20ce04, + 0x18e00202, + 0x24ea03, + 0x1965b246, + 0x330e88, + 0x19a031c2, + 0x228108, + 0x19e00d82, + 0x27008a, + 0x20f043, + 0x31d346, + 0x330448, + 0x378cc8, + 0x32f8c6, + 0x36dd07, + 0x241f07, + 0x20de8a, + 0x2cd784, + 0x33f184, + 0x352f49, + 0x38f8c5, + 0x2f31c6, + 0x2138c3, + 0x247984, + 0x212104, + 0x3412c7, + 0x21e687, + 0x2d7e84, + 0x20ddc5, + 0x2de308, + 0x35d607, + 0x360207, + 0x1a206ac2, + 0x369684, + 0x28f388, + 0x384544, + 0x2455c4, + 0x2459c5, + 0x245b07, + 0x206ac9, + 0x246684, + 0x246e89, + 0x247348, + 0x247704, + 0x247707, + 0x1a647f83, + 0x248a47, + 0x16475c2, + 0x17a4a82, + 0x249a06, + 0x24a4c7, + 0x24a904, + 0x24c9c7, + 0x24e4c7, + 0x252083, + 0x23aa82, + 0x201682, + 0x252b03, + 0x252b04, + 0x252b0b, + 0x31ce88, + 0x258b44, + 0x253805, + 0x255e47, + 0x257a05, + 0x2d9a8a, + 0x258a83, + 0x1aa21842, + 0x258d84, + 0x25ae49, + 0x25edc3, + 0x25ee87, + 0x3ac249, + 0x280d08, + 0x200c83, + 0x276607, + 0x276d49, + 0x202883, + 0x27d9c4, + 0x282309, + 0x2856c6, + 0x286e03, + 0x2038c2, + 0x233e83, + 0x39b6c7, + 0x37f785, + 0x3585c6, + 0x247b84, + 0x2d37c5, + 0x207a03, + 0x21ac86, + 0x20d382, + 0x390e04, + 0x227982, + 0x2db883, + 0x1ae007c2, + 0x244a43, + 0x21a544, + 0x21a547, + 0x3713c6, + 0x2499c2, + 0x1b22d642, + 0x325e44, + 0x1b626b02, + 0x1ba0acc2, + 0x2d6484, + 0x2d6485, + 0x2c3e85, + 0x341a46, + 0x1be01e02, + 0x29fe45, + 0x2ded05, + 0x201e03, + 0x3650c6, + 0x378445, + 0x213682, + 0x33a005, + 0x213684, + 0x217c43, + 0x219343, + 0x1c20c502, + 0x28e147, + 0x35d884, + 0x35d889, + 0x247884, + 0x22b603, + 0x346449, + 0x360e88, + 0x2a3c84, + 0x2a3c86, + 0x201f83, + 0x212883, + 0x21eb03, + 0x1c6e1102, + 0x2e9182, + 0x1ca0b2c2, + 0x316b88, + 0x34afc8, + 0x394986, + 0x2549c5, + 0x21a905, + 0x306007, + 0x255805, + 0x21c2c2, + 0x1ce61e82, + 0x1614b82, + 0x38fa48, + 0x33b585, + 0x2c8084, + 0x2e0b85, + 0x390507, + 0x258884, + 0x23a882, + 0x1d204c42, + 0x32c704, + 0x213507, + 0x3abd87, + 0x370a04, + 0x28ea43, + 0x244644, + 0x244648, + 0x231ac6, + 0x24d70a, + 0x206984, + 0x28edc8, + 0x253ac4, + 0x224646, + 0x290e84, + 0x357e86, + 0x35db49, + 0x259187, + 0x33a683, + 0x1d605e82, + 0x26a843, + 0x20ff82, + 0x1da04d42, + 0x2dfe86, + 0x35ed48, + 0x2a5287, + 0x3a30c9, + 0x23a4c9, + 0x2a5c85, + 0x2a6e49, + 0x2a7b45, + 0x2a7c89, + 0x2a8b85, + 0x284244, + 0x1de84247, + 0x2957c3, + 0x2a9c07, + 0x3a5546, + 0x2aa407, + 0x2a2945, + 0x2aba83, + 0x1e232a02, + 0x392844, + 0x1e63a3c2, + 0x25a183, + 0x1ea0f1c2, + 0x2e8b86, + 0x38df85, + 0x2acb87, + 0x324d83, + 0x250a44, + 0x206f83, + 0x20b343, + 0x1ee082c2, + 0x1f600042, + 0x394344, + 0x23aa43, + 0x364885, + 0x25fcc5, + 0x1fa05602, + 0x20200942, + 0x276946, + 0x209744, + 0x30c6c4, + 0x30c6ca, + 0x20a00a82, + 0x2f768a, + 0x372fc8, + 0x20e01604, + 0x201d83, + 0x216c03, + 0x3209c9, + 0x223349, + 0x300546, + 0x21202243, + 0x2da985, + 0x2f81cd, + 0x202246, + 0x2065cb, + 0x21606382, + 0x333208, + 0x21a0bf02, + 0x21e00b42, + 0x2af285, + 0x222074c2, + 0x264c47, + 0x2a2247, + 0x2103c3, + 0x2ae348, + 0x22601982, + 0x203a04, + 0x3786c3, + 0x332c05, + 0x3833c3, + 0x38da46, + 0x31b204, + 0x23c2c3, + 0x26ad83, + 0x22a095c2, + 0x22aa44, + 0x351445, + 0x36bb47, + 0x274643, + 0x2ad803, + 0x2aed83, + 0x1621a82, + 0x2aee43, + 0x2af643, + 0x22e04282, 0x2f5d44, - 0x292c88, - 0x382844, - 0x242244, - 0x242645, - 0x242787, - 0x20e8c9, - 0x243604, - 0x244109, - 0x2446c8, - 0x244a84, - 0x244a87, - 0x245303, - 0x245dc7, - 0x1644942, - 0x17a5202, - 0x246a46, - 0x247107, - 0x2475c4, - 0x248287, - 0x249207, - 0x249fc8, - 0x24a743, - 0x237842, - 0x201182, - 0x24ca03, - 0x24ca04, - 0x24ca0b, - 0x31afc8, - 0x2569c4, - 0x24d705, - 0x250107, - 0x255745, - 0x35b0ca, - 0x256903, - 0x19205642, - 0x256c04, - 0x259a89, - 0x25da03, - 0x25dac7, - 0x39edc9, - 0x2aef08, - 0x2078c3, - 0x278f47, - 0x279689, - 0x2809c3, - 0x282bc4, - 0x283f49, - 0x286fc6, - 0x2886c3, - 0x2022c2, - 0x23f443, - 0x39bb87, - 0x37b345, - 0x358b06, - 0x244f04, - 0x2e3505, - 0x21c083, - 0x217606, - 0x20cbc2, - 0x3901c4, - 0x221b82, - 0x2d9603, - 0x196007c2, - 0x23fe43, - 0x216e44, - 0x216e47, - 0x36c406, - 0x246a02, - 0x19a4f282, - 0x377044, - 0x19e28142, - 0x1a215c02, - 0x31b704, - 0x31b705, - 0x2c0205, - 0x322f46, - 0x1a6101c2, - 0x227785, - 0x228285, - 0x29f903, - 0x37d386, - 0x3a8245, - 0x213b42, - 0x338405, - 0x213b44, - 0x218d03, - 0x218f43, - 0x1aa0b142, - 0x2ef587, - 0x35e504, - 0x35e509, - 0x244c04, - 0x229383, - 0x34d189, - 0x34bc88, - 0x29f844, - 0x29f846, - 0x2a2283, - 0x2123c3, - 0x21cdc4, - 0x2d9d43, - 0x1aed51c2, - 0x300102, - 0x1b21a042, - 0x315648, - 0x325b88, - 0x395006, - 0x241ec5, - 0x21ec45, - 0x24f2c5, - 0x220442, - 0x1b6912c2, - 0x162c282, - 0x38f6c8, - 0x240285, - 0x37c904, - 0x2ddf05, - 0x377607, - 0x24fc84, - 0x237642, - 0x1ba03c82, - 0x30a384, - 0x218b87, - 0x39e907, - 0x36ba44, - 0x28f3c3, - 0x23fa44, - 0x23fa48, - 0x2e0006, - 0x3ac08a, - 0x20e784, - 0x28f748, - 0x24a244, - 0x21fc06, - 0x291284, - 0x3583c6, - 0x262249, - 0x2605c7, - 0x233d03, - 0x1be06dc2, - 0x26bc83, - 0x20f402, - 0x1c213f02, - 0x2dd186, - 0x360648, - 0x2a3447, - 0x3a2f89, - 0x235609, - 0x2a3d05, - 0x2a5b89, - 0x2a6bc5, - 0x2a7549, - 0x2a8345, - 0x2a7f44, - 0x2a7f47, - 0x296f43, - 0x2a8f87, - 0x383d46, - 0x2aa487, - 0x2a0585, - 0x2aa303, - 0x1c62f542, - 0x3928c4, - 0x1ca28182, - 0x258dc3, - 0x1ce0d4c2, - 0x2e4d86, - 0x27c645, - 0x2ac987, - 0x328943, - 0x254104, - 0x216903, - 0x2f5443, - 0x1d20b9c2, - 0x1da00042, - 0x3949c4, - 0x237803, - 0x359545, - 0x2a9d85, - 0x1de04542, - 0x1e600942, - 0x279286, - 0x20a544, - 0x30ac04, - 0x30ac0a, - 0x1ee01042, - 0x2f780a, - 0x36ee08, - 0x1f201104, - 0x213ac3, - 0x252583, - 0x321489, - 0x2729c9, - 0x302c06, - 0x1f602503, - 0x2d8145, - 0x2f834d, - 0x202506, - 0x20928b, - 0x1fa01982, - 0x332e08, - 0x1fe19e42, - 0x20205f02, - 0x2c2f45, - 0x20603dc2, - 0x266947, - 0x2a5687, - 0x214803, - 0x2576c8, - 0x20a02602, - 0x2828c4, - 0x3a84c3, - 0x332805, - 0x387083, - 0x27c106, - 0x2eaec4, - 0x23d403, - 0x26c843, - 0x20e0a3c2, - 0x22e544, - 0x34ec05, - 0x366687, - 0x276dc3, - 0x2ad183, - 0x2ad983, - 0x1626682, - 0x2ada43, - 0x2adcc3, - 0x21206d02, - 0x30f384, - 0x27a3c6, - 0x20d343, - 0x2ae043, - 0x216af102, - 0x2af108, - 0x2aff04, - 0x259186, - 0x2b0547, - 0x229786, - 0x32db84, - 0x2f2001c2, - 0x383c0b, - 0x2fe28e, - 0x21954f, - 0x2332c3, - 0x2fa3f402, - 0x1614082, - 0x2fe01b82, - 0x22c983, - 0x231f83, - 0x2d8fc6, - 0x2ed8c6, - 0x2e3807, - 0x230204, - 0x302953c2, - 0x306082c2, - 0x2e78c5, - 0x2e9ac7, - 0x32b046, - 0x30a69c02, - 0x269c04, - 0x3712c3, - 0x30e0a482, - 0x34e083, - 0x3a07c4, - 0x2b64c9, - 0x16bd742, - 0x31234082, - 0x2d9846, - 0x267a05, - 0x3163fc02, - 0x31a00102, - 0x33be87, - 0x362b09, - 0x350dcb, - 0x23cf05, - 0x372d09, - 0x2be486, - 0x258347, - 0x31e080c4, - 0x24b649, - 0x35ac47, - 0x2b7a47, - 0x20a683, - 0x20a686, - 0x2dc647, - 0x206f43, - 0x278186, - 0x32604582, - 0x32a2fdc2, - 0x21ea83, - 0x253d05, - 0x21dec7, - 0x354b86, - 0x37b2c5, - 0x31e604, - 0x205105, - 0x2e6684, - 0x32e0a902, - 0x322487, - 0x2d7884, - 0x245b84, - 0x35c88d, - 0x245b89, - 0x2280c8, - 0x24ec84, - 0x3296c5, - 0x20a907, - 0x30f644, - 0x27d347, - 0x31bf45, - 0x33332384, - 0x2cecc5, - 0x25c6c4, - 0x24fdc6, - 0x318445, - 0x33632c82, - 0x2116c4, - 0x2116c5, - 0x211ac6, - 0x37b405, - 0x250844, - 0x2e1b83, - 0x325dc6, - 0x201305, - 0x202005, - 0x318544, - 0x20e803, - 0x20e80c, - 0x33a87902, - 0x33e07c82, - 0x342120c2, - 0x332283, - 0x332284, - 0x346067c2, - 0x2f2908, - 0x358bc5, - 0x268344, - 0x27d686, - 0x34a326c2, - 0x34e1fa82, - 0x35200982, - 0x2b5345, - 0x254846, - 0x305c44, - 0x3544c6, - 0x2ae6c6, - 0x202cc3, - 0x3570e38a, - 0x237b45, - 0x220906, - 0x2f0249, - 0x220907, - 0x28fb88, - 0x294fc9, - 0x224c08, - 0x311206, - 0x237d03, - 0x35a08a42, - 0x385103, - 0x385109, - 0x263988, - 0x35e0a582, - 0x36202242, - 0x230c43, - 0x2cf185, - 0x24d204, - 0x2c1b89, - 0x2a9784, - 0x2d2fc8, - 0x209403, - 0x252904, - 0x264443, - 0x35c7c7, - 0x36640a02, - 0x25efc2, - 0x22b905, - 0x269e49, - 0x219bc3, - 0x27aa04, - 0x2d8104, - 0x20a983, - 0x27dd0a, - 0x36b6ecc2, - 0x36e11682, - 0x2befc3, - 0x371483, - 0x16528c2, - 0x2543c3, - 0x37253702, - 0x295744, - 0x37608f82, - 0x37b0ac84, - 0x345546, - 0x2794c4, - 0x259583, - 0x280543, - 0x21f4c3, - 0x23a606, - 0x2c5405, - 0x2bf847, - 0x258209, - 0x2c3ec5, - 0x2c5346, - 0x2c5948, - 0x2c5b46, - 0x249c04, - 0x298d4b, - 0x2c7103, - 0x2c7105, - 0x2c7248, - 0x20f082, - 0x33c182, - 0x37e272c2, - 0x3820dc02, - 0x261983, - 0x38607a42, - 0x26b403, - 0x2c7544, - 0x2c88c3, - 0x38e00ec2, - 0x2ca3cb, - 0x392ccc86, - 0x2bc206, - 0x2cd2c8, - 0x396ccdc2, - 0x39a0fcc2, - 0x39e18f82, - 0x3a22c902, - 0x3a7a9b42, - 0x3a9b4b, - 0x3aa01082, - 0x222543, - 0x317805, - 0x31d706, - 0x3ae021c4, - 0x31cbc7, - 0x3ad38a, - 0x31d9c6, - 0x22e804, - 0x261583, - 0x3ba05702, - 0x201cc2, - 0x24e2c3, - 0x3be49943, - 0x2f0d07, - 0x318347, - 0x3d24cb07, - 0x226ac7, - 0x21a5c3, - 0x21d48a, - 0x21a5c4, - 0x2442c4, - 0x2442ca, - 0x24a445, - 0x3d601142, - 0x2491c3, - 0x3da01ec2, - 0x209583, - 0x26bc43, - 0x3e201a02, - 0x2a49c4, - 0x21bdc4, - 0x3b3145, - 0x2daa05, - 0x27af06, - 0x27b286, - 0x3e60ba82, - 0x3ea01a82, - 0x344b05, - 0x2bbf12, - 0x2477c6, - 0x222c83, - 0x22ddc6, - 0x2fdf45, - 0x1600d42, - 0x46e0cd42, - 0x2ec943, - 0x2e5ac3, - 0x2da803, - 0x47202bc2, - 0x375583, - 0x47610342, - 0x2070c3, - 0x30f3c8, - 0x223cc3, - 0x223cc6, - 0x39f6c7, - 0x2db306, - 0x2db30b, - 0x22e747, - 0x3926c4, - 0x47e00e82, - 0x2ee785, - 0x21a583, - 0x22a743, - 0x3194c3, - 0x3194c6, - 0x2cfa8a, - 0x26f343, - 0x233704, - 0x316c06, - 0x205b46, - 0x482257c3, - 0x253fc7, - 0x37bf4d, - 0x38b907, - 0x298a85, - 0x243b86, - 0x201343, - 0x49b7d5c3, - 0x49e00d82, - 0x310684, - 0x225c8c, - 0x35c149, - 0x22c087, - 0x242fc5, - 0x255e44, - 0x27e388, - 0x283845, - 0x2884c5, - 0x28ec89, - 0x2f48c3, - 0x2f48c4, - 0x2a5184, - 0x4a200ac2, - 0x25f2c3, - 0x4a690d42, - 0x3707c6, - 0x16adac2, - 0x4aa96f02, - 0x2b5248, - 0x2cec07, - 0x296f05, - 0x2d480b, - 0x2d1386, - 0x2d4a06, - 0x2f6946, - 0x229e04, - 0x2fa7c6, - 0x2d3e48, - 0x230e83, - 0x24cdc3, - 0x24cdc4, - 0x2d4f04, - 0x2d5207, - 0x2d6345, - 0x4aed6482, - 0x4b209d02, - 0x209d05, - 0x29b784, - 0x2d844b, - 0x2d9b88, - 0x2da204, - 0x269c42, - 0x4baaed82, - 0x2af343, - 0x2da644, - 0x2dae45, - 0x275a07, - 0x2dda44, - 0x22e604, - 0x4be05fc2, - 0x35a549, - 0x2dec85, - 0x23d1c5, - 0x2df805, - 0x4c219683, - 0x2e0644, - 0x2e064b, - 0x2e0c44, - 0x2e10cb, - 0x2e2205, - 0x21968a, - 0x2e39c8, - 0x2e3bca, - 0x2e3e43, - 0x2e3e4a, - 0x4c625702, - 0x4ca3c782, - 0x29ca83, - 0x4cee55c2, - 0x2e55c3, - 0x4d371082, - 0x4d714202, - 0x2e6504, - 0x219e86, - 0x354205, - 0x2e7203, - 0x274ec6, - 0x223a44, - 0x4da058c2, - 0x2b6a04, - 0x2c094a, - 0x385e87, - 0x27c486, - 0x2cff47, - 0x225dc3, - 0x24a2c8, - 0x25a20b, - 0x302d05, - 0x2b6e05, - 0x2b6e06, - 0x20c744, - 0x323548, - 0x211103, - 0x211104, - 0x211107, - 0x353ec6, - 0x322b06, - 0x29ca0a, - 0x241804, - 0x24180a, - 0x227306, - 0x227307, - 0x24d787, - 0x271884, - 0x271889, - 0x3621c5, - 0x23544b, - 0x273d43, - 0x213903, - 0x21ec83, - 0x388004, - 0x4de03b82, - 0x24f446, - 0x2aa085, - 0x2b1ac5, - 0x220046, - 0x36e604, - 0x4e200c02, - 0x220144, - 0x4e60b482, - 0x22f4c4, - 0x221983, - 0x4eae5b02, - 0x306543, - 0x257086, - 0x4ee03182, - 0x33e288, - 0x220784, - 0x220786, - 0x31b806, - 0x2501c4, - 0x325d45, - 0x3a3c88, - 0x3a80c7, - 0x2048c7, - 0x2048cf, - 0x292b86, - 0x2198c3, - 0x2198c4, - 0x224884, - 0x228383, - 0x21fd44, - 0x3ac384, - 0x4f225742, - 0x288bc3, - 0x235803, - 0x4f6057c2, - 0x234183, + 0x378306, + 0x204283, + 0x2af9c3, + 0x232b09c2, + 0x2b09c8, + 0x2b1404, + 0x25a546, + 0x2b1847, + 0x22ba06, + 0x230d44, + 0x30e001c2, + 0x3a540b, + 0x39fb4e, + 0x21c80f, + 0x233383, + 0x31633e42, + 0x1604ec2, + 0x31a02b82, + 0x227683, + 0x202b83, + 0x235c06, + 0x2aea46, + 0x27d807, + 0x34aa44, + 0x31e1bb82, + 0x32229e82, + 0x228e45, + 0x3a4ac7, + 0x371b86, + 0x326436c2, + 0x2436c4, + 0x36e203, + 0x32a09682, + 0x32f508c3, + 0x391004, + 0x2b6b49, + 0x16bc882, + 0x33216c82, + 0x216c85, + 0x33644802, + 0x33a00102, + 0x33e507, + 0x239049, + 0x35364b, + 0x241cc5, + 0x377609, + 0x2bcfc6, + 0x22d0c7, + 0x33e0c744, + 0x305ac9, + 0x35a787, + 0x201b47, + 0x209883, + 0x209886, + 0x2da2c7, + 0x206003, + 0x271e46, + 0x34605642, + 0x34a34642, + 0x21fa43, + 0x250645, + 0x222547, + 0x281b86, + 0x37f705, + 0x311244, + 0x3b1405, + 0x2e8904, + 0x34e02102, + 0x3210c7, + 0x2d6044, + 0x223244, + 0x22324d, + 0x248809, + 0x2e0f48, + 0x22cd04, + 0x209b05, + 0x27ee47, + 0x332784, + 0x22ef87, + 0x3a8405, + 0x353a9084, + 0x2fa005, + 0x25da84, + 0x265d46, + 0x319985, + 0x35636b42, + 0x212e04, + 0x212e05, + 0x213206, + 0x37f845, + 0x256584, + 0x2dbc83, + 0x32fd86, + 0x220f45, + 0x225285, + 0x319a84, + 0x206a03, + 0x206a0c, + 0x35a86002, + 0x35e01042, + 0x3620b402, + 0x332683, + 0x332684, + 0x366061c2, + 0x3a6088, + 0x358685, + 0x236604, + 0x23b9c6, + 0x36a0a242, + 0x36e09bc2, + 0x37200982, + 0x2d8845, + 0x251186, + 0x341204, + 0x2814c6, + 0x3340c6, + 0x203483, + 0x3772788a, + 0x23ad85, + 0x274803, + 0x225046, + 0x2efe09, + 0x225047, + 0x28bd48, + 0x293849, + 0x219888, + 0x36a346, + 0x20b203, + 0x37a9a1c2, + 0x3856c3, + 0x3856c9, + 0x3357c8, + 0x37e09782, + 0x38206742, + 0x2348c3, + 0x2cf145, + 0x253304, + 0x31c8c9, + 0x25f6c4, + 0x2b1648, + 0x206743, + 0x24f244, + 0x326b83, + 0x21ba88, + 0x223187, + 0x38643742, + 0x269d42, + 0x238c45, + 0x268849, + 0x211003, + 0x278184, + 0x2da944, + 0x202c03, + 0x278cca, + 0x38b72e82, + 0x38e12dc2, + 0x2bdb03, + 0x3751c3, + 0x164f202, + 0x250d03, + 0x39250042, + 0x39603042, + 0x39b07b04, + 0x366086, + 0x3469c6, + 0x276b84, + 0x25a943, + 0x27be43, + 0x2e4983, + 0x23f286, + 0x2c2e45, + 0x2be0c7, + 0x22cf89, + 0x2c1d45, + 0x2c2d86, + 0x2c3708, + 0x2c3906, + 0x238744, + 0x29718b, + 0x2c6383, + 0x2c6385, + 0x2c64c8, + 0x21e442, + 0x33e802, + 0x39e43b02, + 0x3a20e842, + 0x21bbc3, + 0x3a600e02, + 0x269fc3, + 0x2c67c4, + 0x2c8183, + 0x3ae25682, + 0x3b2cc5c6, + 0x2bb346, + 0x2ccc08, + 0x3b6cad42, + 0x3ba111c2, + 0x3be19382, + 0x3c209f82, + 0x3c614882, + 0x3ca00ac2, + 0x228343, + 0x318d45, + 0x209c86, + 0x3ce12444, + 0x3ab20a, + 0x310606, + 0x22ad04, + 0x27e943, + 0x3da06bc2, + 0x205902, + 0x24dbc3, + 0x3de38483, + 0x2ee087, + 0x319887, + 0x3f252c07, + 0x20f007, + 0x215a43, + 0x22c6ca, + 0x240584, + 0x341504, + 0x34150a, + 0x247045, + 0x3f601642, + 0x24d483, + 0x3fa01dc2, + 0x201f43, + 0x26a803, + 0x40201942, + 0x29a0c4, + 0x220a84, + 0x3a36c5, + 0x2d7205, + 0x22da06, + 0x22dd86, + 0x40608382, + 0x40a025c2, + 0x2eb445, + 0x2bb052, + 0x29fbc6, + 0x21ce83, + 0x2fd346, + 0x221d85, + 0x1611342, + 0x48e0d502, + 0x2ed8c3, + 0x212043, + 0x265603, + 0x49203382, + 0x379ac3, + 0x49602182, + 0x204a03, + 0x2f5d88, + 0x223b43, + 0x223b46, + 0x333a07, + 0x2d84c6, + 0x2d84cb, + 0x22ac47, + 0x392644, + 0x49e02602, + 0x3a6505, + 0x215a03, + 0x22fd83, + 0x31aa03, + 0x31aa06, + 0x2d038a, + 0x26d703, + 0x21d5c4, + 0x318146, + 0x3b1e46, + 0x4a2264c3, + 0x250907, + 0x29cf8d, + 0x39eb87, + 0x296ec5, + 0x237806, + 0x220f83, + 0x4bb65303, + 0x4be07a82, + 0x307604, + 0x21e3cc, + 0x35bb89, + 0x36f307, + 0x246045, + 0x255904, + 0x26ae08, + 0x274885, + 0x274a85, + 0x3612c9, + 0x335283, + 0x2a6b84, + 0x4c206d42, + 0x206d43, + 0x4c690942, + 0x295bc6, + 0x16b5482, + 0x4ca95782, + 0x2d8748, + 0x2b6d43, + 0x2f9f47, + 0x2d7785, + 0x295785, + 0x2f6c4b, + 0x2d1f06, + 0x2f6e46, + 0x2f9d06, + 0x226284, + 0x2d4ac6, + 0x2d5048, + 0x234b03, 0x252ec3, - 0x2161ca, - 0x29e487, - 0x235fcc, - 0x236286, - 0x2369c6, - 0x237487, - 0x238dc7, - 0x23c109, - 0x21ac44, - 0x23c4c4, - 0x4fa05202, - 0x4fe03e42, - 0x253dc4, - 0x2fc1c6, - 0x2a3e08, - 0x37e044, - 0x266986, - 0x2c9e45, - 0x265b08, + 0x252ec4, + 0x2d70c4, + 0x2d7487, + 0x2d8185, + 0x4ced82c2, + 0x4d206a42, + 0x209285, + 0x2990c4, + 0x2dac8b, + 0x2dbd48, + 0x2e6804, + 0x243702, + 0x4da80b82, + 0x2b0c03, + 0x2dc204, + 0x2dc4c5, + 0x272d87, + 0x2e06c4, + 0x22ab04, + 0x4de07442, + 0x359f49, + 0x2e1585, + 0x241f85, + 0x2e2105, + 0x4e21bd03, + 0x2e2f44, + 0x2e2f4b, + 0x2e3444, + 0x2e3ecb, + 0x2e48c5, + 0x21c94a, + 0x2e4f88, + 0x2e518a, + 0x2e5a03, + 0x2e5a0a, + 0x4e626402, + 0x4ea41542, + 0x265903, + 0x4eee7d82, + 0x2e7d83, + 0x4f35d142, + 0x4f7157c2, + 0x2e8784, + 0x21dd86, + 0x281205, + 0x2e91c3, + 0x29ef06, + 0x21d445, + 0x21e104, + 0x4fa08782, + 0x2ca784, + 0x2bf10a, + 0x386847, + 0x38ddc6, + 0x2d0847, + 0x21e503, + 0x253b48, + 0x25b5cb, + 0x300645, + 0x2b6e85, + 0x2b6e86, + 0x225904, + 0x335b88, + 0x20b4c3, + 0x20e204, + 0x20e207, + 0x280ec6, + 0x321746, + 0x29b68a, + 0x244fc4, + 0x244fca, + 0x2de886, + 0x2de887, + 0x253887, + 0x26f884, + 0x26f889, + 0x24b7c5, + 0x23a30b, + 0x26ddc3, + 0x20d0c3, + 0x21a943, + 0x231e84, + 0x4fe04b42, + 0x254186, + 0x2ab805, + 0x2b2dc5, + 0x3324c6, + 0x279384, + 0x502013c2, + 0x240b44, + 0x50607982, + 0x232984, + 0x227783, + 0x50a12082, + 0x349f83, + 0x24ae86, + 0x50e01bc2, + 0x30f108, + 0x224ec4, + 0x224ec6, + 0x305546, + 0x255f04, + 0x32fd05, + 0x3a8108, + 0x3a8607, + 0x3b0bc7, + 0x3b0bcf, + 0x28f286, + 0x210d03, + 0x210d04, + 0x2251c4, + 0x229103, + 0x224784, + 0x373e44, + 0x51226442, + 0x287303, + 0x390683, + 0x51617642, + 0x222a43, + 0x24f803, + 0x218e4a, + 0x23b5c7, + 0x3a568c, + 0x3a5946, + 0x230ac6, + 0x23a6c7, + 0x2302c7, + 0x23e289, + 0x21f144, + 0x23ea84, + 0x51a0a442, + 0x51e01402, + 0x29ba46, + 0x250704, + 0x376e86, + 0x230748, + 0x330cc4, + 0x264c86, + 0x2c9745, + 0x25f008, 0x207503, - 0x269185, - 0x26b043, - 0x23d2c3, - 0x23d2c4, - 0x26f8c3, - 0x502de902, - 0x50600fc2, - 0x273c09, - 0x283745, - 0x283944, - 0x285a05, - 0x20de04, - 0x3a96c7, - 0x339c45, - 0x24ccc4, - 0x24ccc8, - 0x2d2946, - 0x2d4004, - 0x2d4488, - 0x2d76c7, - 0x50a1b842, - 0x2e1944, - 0x228444, - 0x2b7c47, - 0x50e74644, - 0x255342, - 0x51214202, - 0x2636c3, - 0x2636c4, - 0x234043, - 0x234045, - 0x5162dbc2, - 0x2f8a45, - 0x219b82, - 0x381505, - 0x360805, - 0x51a0acc2, - 0x2153c4, - 0x51e063c2, - 0x22d2c6, - 0x2ab886, - 0x269f88, - 0x2b89c8, - 0x2e4d04, - 0x314e05, - 0x2f8849, - 0x329a04, - 0x2cfa44, - 0x254a83, - 0x52210ec5, - 0x378047, - 0x2895c4, - 0x39ab0d, - 0x2e74c2, - 0x2e74c3, - 0x2e7583, - 0x52601d42, - 0x388bc5, - 0x2eb107, - 0x226b84, - 0x226b87, - 0x2951c9, - 0x2c0a89, - 0x21d047, - 0x253143, - 0x288308, - 0x239c09, - 0x2e7f47, - 0x2e82c5, - 0x2e8a86, - 0x2e90c6, - 0x2e9245, - 0x245c85, - 0x52a00c42, - 0x222885, - 0x2ba70a, - 0x2a6708, - 0x21f986, - 0x2e2447, - 0x265dc4, - 0x2b0387, - 0x2ecd86, - 0x52e00242, - 0x2117c6, - 0x2f048a, - 0x2f1645, - 0x532d1e82, - 0x53649742, - 0x2dc986, - 0x2ec288, - 0x39eac7, - 0x53a00602, - 0x20fa43, - 0x200a06, - 0x308e44, - 0x39f586, - 0x322c46, - 0x37cf8a, - 0x3a8b05, - 0x20cdc6, - 0x20d3c3, - 0x20d3c4, + 0x266a45, + 0x269b43, + 0x242083, + 0x242084, + 0x26afc3, + 0x522e1202, + 0x52602482, + 0x26dc89, + 0x274985, + 0x283dc4, + 0x3614c5, + 0x210804, + 0x2ed107, + 0x33fac5, + 0x252dc4, + 0x252dc8, + 0x2d3486, + 0x2d5204, + 0x2d5208, + 0x2d5e87, + 0x52a015c2, + 0x2da0c4, + 0x2d3904, + 0x201d47, + 0x52e41384, + 0x22dc82, + 0x53201882, + 0x202b43, + 0x216b84, + 0x222903, + 0x222905, + 0x5362c082, + 0x2e9085, + 0x210fc2, + 0x376445, + 0x35ef05, + 0x53a168c2, + 0x2168c4, + 0x53e08d82, + 0x2c7b06, + 0x2ac106, + 0x268988, + 0x2b7b88, + 0x2e8b04, + 0x35e245, + 0x2f39c9, + 0x29f484, + 0x2d0344, + 0x2513c3, + 0x5420dfc5, + 0x374f07, + 0x2881c4, + 0x35a90d, + 0x35b202, + 0x3858c3, + 0x39a083, + 0x54601082, + 0x3886c5, + 0x31b447, + 0x20f0c4, + 0x20f0c7, + 0x293a49, + 0x2bf249, + 0x214687, + 0x24fa83, + 0x2b52c8, + 0x23dd09, + 0x2e9947, + 0x2e9cc5, + 0x2ea486, + 0x2eaac6, + 0x2eac45, + 0x248905, + 0x54a01282, + 0x228685, + 0x2b9988, + 0x2a79c6, + 0x3a1c87, + 0x2e4b04, + 0x2ab1c7, + 0x2edd06, + 0x54e00242, + 0x212f06, + 0x2f004a, + 0x2f1045, + 0x552d29c2, + 0x55638282, + 0x2da606, + 0x3574c8, + 0x55babf47, + 0x55e00602, + 0x20a503, + 0x3b0306, + 0x30aa04, + 0x3338c6, + 0x341746, + 0x3971ca, + 0x3a1e05, + 0x20d586, + 0x218743, + 0x218744, 0x207282, - 0x2ff3c3, - 0x53e44382, - 0x2dc483, - 0x2f7a84, - 0x2ec3c4, - 0x2ec3ca, - 0x242103, - 0x285748, - 0x2746ca, - 0x233147, - 0x2f2f46, - 0x22d184, - 0x22e6c2, - 0x207a82, - 0x54205002, - 0x23fa03, - 0x24d547, - 0x275187, - 0x38f60b, - 0x370684, - 0x347107, - 0x275b06, - 0x213cc7, - 0x29e3c4, - 0x2c7d45, - 0x29fe45, - 0x54614882, - 0x226646, - 0x2c82c3, - 0x22e942, - 0x30e5c6, - 0x54a0d182, - 0x54e01582, - 0x201585, - 0x5521f6c2, - 0x556020c2, - 0x2e4685, - 0x38dd45, - 0x20ce85, - 0x267743, - 0x2350c5, - 0x2d1447, - 0x2a7405, - 0x32a4c5, - 0x25f344, - 0x23f046, - 0x246184, - 0x55a06882, - 0x278dc5, - 0x2a2a47, - 0x2fc3c8, - 0x26cc46, - 0x26cc4d, - 0x272789, - 0x272792, - 0x2efd05, - 0x2f8d83, - 0x56601382, - 0x2e4444, - 0x202583, - 0x324d05, - 0x35f8c5, - 0x56a1ce42, - 0x36ab43, - 0x56e3e2c2, - 0x57295802, - 0x5760d502, - 0x33d205, - 0x365dc3, - 0x323c08, - 0x57a030c2, - 0x57e035c2, - 0x2a4986, - 0x32820a, - 0x20c903, - 0x234703, - 0x2e9843, - 0x58a03d02, - 0x66e02c02, - 0x6760a242, - 0x201502, - 0x38c0c9, - 0x2bcb84, - 0x2579c8, - 0x67ae7242, - 0x67e03f02, - 0x2e1305, - 0x231948, - 0x245108, - 0x39e0cc, - 0x2352c3, - 0x240242, - 0x682049c2, - 0x2c4346, - 0x2f3dc5, - 0x321ac3, - 0x380786, - 0x2f3f06, - 0x24fe43, - 0x2f6703, - 0x2f7146, - 0x2f7f04, - 0x272186, - 0x2c72c5, - 0x2f818a, - 0x29e8c4, - 0x2f9844, - 0x348a4a, - 0x6866ff82, - 0x33de45, - 0x2fb58a, - 0x2fc5c5, - 0x2fd144, - 0x2fd246, - 0x2fd3c4, - 0x340186, - 0x68a00282, - 0x27bdc6, - 0x27ce85, - 0x203707, - 0x22eb06, - 0x237684, - 0x2afb87, - 0x30e2c6, - 0x211805, - 0x2af7c7, - 0x39b2c7, - 0x39b2ce, - 0x224046, - 0x27d205, - 0x27ef07, - 0x227603, - 0x227607, - 0x3aa985, - 0x20fd04, - 0x2213c2, - 0x2e5b47, - 0x230284, - 0x2d8f44, - 0x25ee4b, - 0x21b503, - 0x2835c7, - 0x21b504, - 0x2a5247, - 0x22b603, - 0x32cf0d, - 0x389408, - 0x24cbc4, - 0x24cbc5, - 0x2ffbc5, - 0x2fdc03, - 0x68e1a642, - 0x2ff383, - 0x2ff603, - 0x38cb44, - 0x279785, - 0x218fc7, - 0x20d446, - 0x36edc3, - 0x37784b, - 0x30e70b, - 0x26e78b, - 0x27988a, - 0x2a608b, - 0x2d0acb, - 0x2d1ecc, - 0x2f6d11, - 0x33ae8a, - 0x34b2cb, - 0x376acb, - 0x3b008a, - 0x3b218a, - 0x2fffcd, - 0x30128e, - 0x30190b, - 0x301bca, - 0x302f11, - 0x30334a, - 0x30384b, - 0x303d8e, - 0x3046cc, - 0x304a4b, - 0x304d0e, - 0x30508c, - 0x30700a, - 0x307d0c, - 0x6930800a, - 0x3095c9, - 0x30ae8a, - 0x30b10a, - 0x30b38b, - 0x30da0e, - 0x30dd91, - 0x31a149, - 0x31a38a, - 0x31ac4b, - 0x31edca, - 0x31f916, - 0x3210cb, - 0x324aca, - 0x32510a, - 0x32788b, - 0x32aa09, - 0x32d889, - 0x32e20d, - 0x32ea8b, - 0x32f7cb, - 0x33018b, - 0x330949, - 0x330f8e, - 0x3314ca, - 0x3338ca, - 0x333e0a, - 0x33454b, - 0x334d8b, - 0x33504d, - 0x33734d, - 0x338090, - 0x33854b, - 0x338b4c, - 0x3397cb, - 0x33b98b, - 0x33e48b, - 0x34318b, - 0x343c0f, - 0x343fcb, - 0x344c4a, - 0x345289, - 0x3456c9, - 0x345d4b, - 0x34600e, - 0x3490cb, - 0x349e8f, - 0x34c38b, - 0x34c64b, - 0x34c90b, - 0x34cd4a, - 0x3509c9, - 0x35688f, - 0x35d8cc, - 0x35dfcc, - 0x35f58e, - 0x35fd8f, - 0x36014e, - 0x360c50, - 0x36104f, - 0x36304e, - 0x36350c, - 0x363812, - 0x366291, - 0x36684e, - 0x366c8e, - 0x3671ce, - 0x36754f, - 0x36790e, - 0x367c93, - 0x368151, - 0x36858e, - 0x368a0c, - 0x369a93, - 0x36a510, - 0x36af4c, - 0x36b24c, - 0x36b70b, - 0x36c6ce, - 0x36da8b, - 0x36decb, - 0x36f48c, - 0x375c0a, - 0x3762cc, - 0x3765cc, - 0x3768c9, - 0x378acb, - 0x378d88, - 0x378f89, - 0x378f8f, - 0x37a8cb, - 0x37b5ca, - 0x37ed0c, - 0x380f09, - 0x3812c8, - 0x381ccb, - 0x38214b, - 0x38348a, - 0x38370b, - 0x384e8c, - 0x385888, - 0x38960b, - 0x38bdcb, - 0x38f8cb, - 0x391acb, - 0x39ae4b, - 0x39b109, - 0x39b64d, - 0x3a0b8a, - 0x3a1ad7, - 0x3a2758, - 0x3a6909, - 0x3a7b0b, - 0x3ab094, - 0x3ab58b, - 0x3abb0a, + 0x2fe483, + 0x56253e82, + 0x2dd843, + 0x2f7904, + 0x2dca04, + 0x35760a, + 0x245483, + 0x283b08, + 0x36a40a, + 0x278447, + 0x2f4846, + 0x2c79c4, + 0x22abc2, + 0x200e42, + 0x56609202, + 0x244603, + 0x253647, + 0x29f1c7, + 0x38f98b, + 0x3643c4, + 0x349447, + 0x272e86, + 0x213807, + 0x2ad204, + 0x33bb85, + 0x2a96c5, + 0x56a10442, + 0x221a46, + 0x2259c3, + 0x226cc2, + 0x226cc6, + 0x56e0d942, + 0x57203e42, + 0x203e45, + 0x57624982, + 0x57a06ec2, + 0x358845, + 0x2c0f45, + 0x20d645, + 0x264183, + 0x340185, + 0x2d1fc7, + 0x2aa2c5, + 0x3219c5, + 0x38b604, + 0x379bc6, + 0x243c84, + 0x57e00cc2, + 0x276485, + 0x2a4887, + 0x377088, + 0x26a8c6, + 0x26a8cd, + 0x270789, + 0x270792, + 0x322045, + 0x326e03, + 0x58a019c2, + 0x2e6004, + 0x2022c3, + 0x35e145, + 0x2f2605, + 0x58e21e42, + 0x290f03, + 0x59242d42, + 0x59694082, + 0x59a18882, + 0x346e05, + 0x2a1003, + 0x397008, + 0x59e011c2, + 0x5a203282, + 0x29a086, + 0x27f30a, + 0x204983, + 0x256503, + 0x2f3c43, + 0x5ae06202, + 0x692033c2, + 0x69a04cc2, + 0x203dc2, + 0x38bd09, + 0x2bbcc4, + 0x2ae648, + 0x69ee9202, + 0x6a205882, + 0x2e4105, + 0x2355c8, + 0x247d88, + 0x2f334c, + 0x23a183, + 0x25d442, + 0x6a62d742, + 0x2c21c6, + 0x2f56c5, + 0x30f5c3, + 0x3903c6, + 0x2f5806, + 0x22fc43, + 0x2f6a03, + 0x2f6fc6, + 0x2f7d84, + 0x270186, + 0x2c6545, + 0x2f800a, + 0x23d184, + 0x2f8d84, + 0x34b94a, + 0x6aa6cd42, + 0x347a45, + 0x2fa44a, + 0x2fb885, + 0x2fc404, + 0x2fc506, + 0x2fc684, + 0x366dc6, + 0x6ae00282, + 0x38d706, + 0x38e7c5, + 0x204707, + 0x239f46, + 0x22d584, + 0x22d587, + 0x3277c6, + 0x212f45, + 0x2c6c87, + 0x39ae07, + 0x39ae0e, + 0x223ec6, + 0x22ee45, + 0x279a07, + 0x2deb83, + 0x2deb87, + 0x3a8a05, + 0x211204, + 0x2120c2, + 0x37a547, + 0x34aac4, + 0x2ae9c4, + 0x269bcb, + 0x2201c3, + 0x2c3a47, + 0x2201c4, + 0x2ce307, + 0x238943, + 0x32914d, + 0x388f08, + 0x252cc4, + 0x252cc5, + 0x2fca45, + 0x2fd003, + 0x6b224dc2, + 0x2fe443, + 0x2fea03, + 0x365c44, + 0x276e45, + 0x2193c7, + 0x2187c6, + 0x372f83, + 0x226e0b, + 0x29d34b, + 0x267c4b, + 0x276f4a, + 0x2a734b, + 0x2cae0b, + 0x2d2a0c, + 0x2d5711, + 0x33d90a, + 0x34e1cb, + 0x37bd0b, + 0x3ae28a, + 0x3b2eca, + 0x2ff60d, + 0x300d4e, + 0x301b4b, + 0x301e0a, + 0x302d51, + 0x30318a, + 0x30368b, + 0x303bce, + 0x30450c, + 0x30498b, + 0x304c4e, + 0x304fcc, + 0x3087ca, + 0x3098cc, + 0x6b709bca, + 0x30adc9, + 0x30c94a, + 0x30cbca, + 0x30ce4b, + 0x312f8e, + 0x313311, + 0x31bcc9, + 0x31bf0a, + 0x31cb0b, + 0x31e2ca, + 0x31ee56, + 0x32060b, + 0x321e0a, + 0x32220a, + 0x32424b, + 0x326889, + 0x329ac9, + 0x32ae0d, + 0x32c48b, + 0x32d60b, + 0x32dfcb, + 0x32e449, + 0x32ea8e, + 0x32efca, + 0x335e4a, + 0x33648a, + 0x336e4b, + 0x33768b, + 0x33794d, + 0x33904d, + 0x339c90, + 0x33a14b, + 0x33ac8c, + 0x33c3cb, + 0x33e00b, + 0x33f64b, + 0x34490b, + 0x34538f, + 0x34574b, + 0x34600a, + 0x346709, + 0x346b49, + 0x34808b, + 0x34834e, + 0x34bfcb, + 0x34cd8f, + 0x34ed8b, + 0x34f04b, + 0x34f30b, + 0x34f74a, + 0x353249, + 0x35624f, + 0x35ce4c, + 0x35d34c, + 0x35de0e, + 0x35e48f, + 0x35e84e, + 0x35fa90, + 0x35fe8f, + 0x3608ce, + 0x3617cc, + 0x361ad2, + 0x36b751, + 0x36bd0e, + 0x36c14e, + 0x36c68e, + 0x36ca0f, + 0x36cdce, + 0x36d153, + 0x36d611, + 0x36da4e, + 0x36decc, + 0x36e2d3, + 0x36f650, + 0x36ff0c, + 0x37020c, + 0x3706cb, + 0x37168e, + 0x371f8b, + 0x3723cb, + 0x373b0c, + 0x37acca, + 0x37b50c, + 0x37b80c, + 0x37bb09, + 0x37cf0b, + 0x37d1c8, + 0x37d3c9, + 0x37d3cf, + 0x37ed0b, + 0x37fa0a, + 0x380fcc, + 0x382e49, + 0x383208, + 0x38374b, + 0x383e4b, + 0x384c8a, + 0x384f0b, + 0x38544c, + 0x385e08, + 0x38910b, + 0x38ba0b, + 0x38fc4b, + 0x391a4b, + 0x39a98b, + 0x39ac49, + 0x39b18d, + 0x3a004a, + 0x3a0f97, + 0x3a2898, + 0x3a5bc9, + 0x3a7b4b, + 0x3a9414, + 0x3a990b, + 0x3a9e8a, + 0x3aa30a, + 0x3aa58b, + 0x3ab590, + 0x3ab991, 0x3ac48a, - 0x3ac70b, - 0x3ad710, - 0x3adb11, - 0x3ae3ca, - 0x3af68d, - 0x3afd8d, - 0x3b254b, - 0x3b3506, - 0x226743, - 0x6963d343, - 0x382b86, - 0x28c985, - 0x369607, - 0x33ad46, - 0x16235c2, - 0x2ad2c9, - 0x274cc4, - 0x2cf548, - 0x23f943, - 0x2e4387, - 0x239942, - 0x2ac9c3, - 0x69a006c2, - 0x2c2806, - 0x2c3dc4, - 0x310d04, - 0x2383c3, - 0x2383c5, - 0x6a2c6b02, - 0x2da544, - 0x2717c7, - 0x165ee02, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x202883, + 0x3ad88d, + 0x3adf8d, + 0x3b328b, + 0x3b4506, + 0x221b43, + 0x6bb99283, + 0x323dc6, + 0x28b6c5, + 0x2c55c7, + 0x33d7c6, + 0x1617982, + 0x2b0d49, + 0x29ed04, + 0x2cfe48, + 0x242743, + 0x2e5f47, + 0x230902, + 0x2acbc3, + 0x6be006c2, + 0x2c0586, + 0x2c17c4, + 0x307c84, + 0x236c43, + 0x236c45, + 0x6c6ff382, + 0x6caa8004, + 0x26f7c7, + 0x16ce2c2, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x2025c3, 0x200882, - 0x894c8, - 0x204a82, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x2161c3, - 0x315ed6, - 0x319093, - 0x346f89, - 0x3acf08, - 0x2ee609, - 0x2fb706, - 0x30a3d0, - 0x3b0ad3, - 0x207748, - 0x259687, - 0x277847, - 0x29deca, - 0x2f7b09, - 0x32a189, - 0x2975cb, - 0x329186, - 0x3115ca, - 0x21ed86, - 0x2748c3, - 0x2ef4c5, - 0x222dc8, - 0x22d38d, - 0x35818c, - 0x27cb47, - 0x3015cd, - 0x3a3d84, - 0x22ec8a, - 0x22f5ca, - 0x22fa8a, - 0x2631c7, - 0x237f07, - 0x23a9c4, - 0x25e146, - 0x354e44, - 0x2ed248, - 0x2a97c9, - 0x2b9206, - 0x2b9208, - 0x23d78d, - 0x2c0cc9, - 0x203f88, - 0x23d147, - 0x2017ca, - 0x247106, - 0x258c87, - 0x2db9c4, - 0x242dc7, - 0x35c4ca, - 0x337bce, - 0x24f2c5, - 0x2fd94b, - 0x2efb09, - 0x2729c9, - 0x2a54c7, - 0x399f4a, - 0x2b7b87, - 0x2fe3c9, - 0x358648, - 0x2d7c8b, - 0x2cf185, - 0x227f8a, - 0x218d49, - 0x321a4a, - 0x2c3f4b, - 0x242ccb, - 0x297355, - 0x2d4345, - 0x23d1c5, - 0x2e064a, - 0x3061ca, - 0x31e007, - 0x21b9c3, - 0x29cd48, - 0x2cb7ca, - 0x220786, - 0x239a49, - 0x265b08, - 0x2d4004, - 0x3379c9, - 0x2b89c8, - 0x357b87, - 0x278dc6, - 0x2a2a47, - 0x293687, - 0x23a405, - 0x24f10c, - 0x24cbc5, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x204a82, - 0x258403, - 0x249943, - 0x202883, - 0x2257c3, - 0x258403, - 0x249943, - 0x223cc3, - 0x2257c3, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x894c8, - 0x204a82, - 0x201802, - 0x22fcc2, - 0x202602, - 0x203c42, - 0x2954c2, - 0x4658403, - 0x230743, - 0x2095c3, - 0x2d9d43, - 0x202503, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x231a03, - 0x894c8, - 0x24c844, - 0x2526c7, - 0x255683, - 0x2c2f44, - 0x232283, - 0x283f83, - 0x2d9d43, + 0x880c8, + 0x216582, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x217643, + 0x317416, + 0x31a5d3, + 0x3492c9, + 0x3aad88, + 0x3a6389, + 0x2fa5c6, + 0x32c750, + 0x21d6d3, + 0x200b08, + 0x25aa47, + 0x274ec7, + 0x29cb4a, + 0x2f7989, + 0x3336c9, + 0x28a70b, + 0x325506, + 0x31cf8a, + 0x223586, + 0x29e903, + 0x28e085, + 0x217188, + 0x2c7bcd, + 0x357c4c, + 0x38e487, + 0x3025cd, + 0x3a8204, + 0x23214a, + 0x232a8a, + 0x232f4a, + 0x21d9c7, + 0x23cfc7, + 0x23f644, + 0x239506, + 0x3258c4, + 0x2ec848, + 0x25f709, + 0x2b83c6, + 0x2b83c8, + 0x2423cd, + 0x2bf489, + 0x378cc8, + 0x241f07, + 0x2fe78a, + 0x24a4c6, + 0x25a047, + 0x2cdac4, + 0x240d07, + 0x30130a, + 0x3397ce, + 0x255805, + 0x2fcd4b, + 0x277a09, + 0x223349, + 0x2a2087, + 0x358b0a, + 0x201c87, + 0x39fc89, + 0x358108, + 0x369c4b, + 0x2cf145, + 0x2e0e0a, + 0x2a37c9, + 0x30f54a, + 0x2c1dcb, + 0x240c0b, + 0x28a495, + 0x2d5d45, + 0x241f85, + 0x2e2f4a, + 0x215cca, + 0x310c47, + 0x220683, + 0x29b9c8, + 0x2cb14a, + 0x224ec6, + 0x23db49, + 0x25f008, + 0x2d5204, + 0x22fb09, + 0x2b7b88, + 0x32c247, + 0x276486, + 0x2a4887, + 0x28fd87, + 0x23f085, + 0x25564c, + 0x252cc5, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x216582, + 0x22d183, + 0x238483, + 0x2025c3, + 0x2264c3, + 0x22d183, + 0x238483, + 0x223b43, + 0x2264c3, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x880c8, + 0x216582, + 0x201a42, + 0x233182, + 0x201982, + 0x204c02, + 0x293d42, + 0x462d183, + 0x2343c3, + 0x211cc3, + 0x21eb03, + 0x202243, + 0x211003, + 0x238483, + 0x2264c3, + 0x20b443, + 0x880c8, + 0x335d44, + 0x24f007, + 0x251fc3, + 0x231404, + 0x214bc3, + 0x282343, + 0x21eb03, + 0x16e747, 0x200882, - 0x123743, - 0x5604a82, - 0x22fcc2, - 0x1104, - 0x2016c2, - 0xdfdc4, - 0x894c8, - 0x206043, - 0x2c69c3, - 0x5e58403, - 0x22ec84, - 0x6230743, - 0x66d9d43, - 0x20b9c2, - 0x201104, - 0x249943, - 0x211783, - 0x202542, - 0x2257c3, - 0x21a842, - 0x2e6443, - 0x203182, - 0x200f43, - 0x265bc3, - 0x203702, - 0x894c8, - 0x206043, - 0x211783, - 0x202542, - 0x2e6443, - 0x203182, - 0x200f43, - 0x265bc3, - 0x203702, - 0x2e6443, - 0x203182, - 0x200f43, - 0x265bc3, - 0x203702, - 0x258403, - 0x323743, - 0x258403, - 0x230743, - 0x2d9d43, - 0x201104, - 0x202503, - 0x219bc3, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x20bb42, - 0x219683, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x323743, - 0x204a82, - 0x258403, - 0x230743, - 0x2d9d43, - 0x201104, - 0x249943, - 0x2257c3, - 0x2e82c5, - 0x21ce42, + 0x123ac3, + 0x5a16582, + 0x86a0d, + 0x233182, + 0x1604, + 0x201502, + 0x5e01508, + 0xe26c4, + 0x880c8, + 0x140de82, + 0x14fa2c6, + 0x230983, + 0x316403, + 0x662d183, + 0x232144, + 0x6a343c3, + 0x6e1eb03, + 0x2082c2, + 0x201604, + 0x238483, + 0x212ec3, + 0x202282, + 0x2264c3, + 0x21ed42, + 0x2e86c3, + 0x201bc2, + 0x29c743, + 0x22d743, + 0x204702, + 0x880c8, + 0x230983, + 0x212ec3, + 0x202282, + 0x2e86c3, + 0x201bc2, + 0x29c743, + 0x22d743, + 0x204702, + 0x2e86c3, + 0x201bc2, + 0x29c743, + 0x22d743, + 0x204702, + 0x22d183, + 0x323ac3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x201604, + 0x202243, + 0x211003, + 0x212444, + 0x238483, + 0x2264c3, + 0x202002, + 0x21bd03, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x323ac3, + 0x216582, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x201604, + 0x238483, + 0x2264c3, + 0x2e9cc5, + 0x221e42, 0x200882, - 0x894c8, - 0x2d9d43, - 0x2542c1, - 0x20b041, - 0x254281, - 0x20adc1, - 0x24c901, - 0x271541, - 0x24c8c1, - 0x279a81, - 0x2f6f01, - 0x300281, + 0x880c8, + 0x1462d48, + 0x21eb03, + 0x225b41, + 0x20fd41, + 0x20c401, + 0x20c041, + 0x226fc1, + 0x26f541, + 0x252041, + 0x225c41, + 0x2d5901, + 0x2ff8c1, 0x200141, 0x200001, - 0x894c8, + 0x880c8, 0x200481, 0x200741, 0x200081, - 0x201181, + 0x200c81, 0x2007c1, 0x200901, 0x200041, - 0x202b41, + 0x204281, 0x2001c1, 0x2000c1, 0x200341, - 0x200cc1, - 0x200e81, 0x200ac1, - 0x219e81, - 0x200c01, + 0x201501, + 0x2014c1, + 0x204101, + 0x200b81, 0x200241, 0x200a01, 0x2002c1, 0x200281, - 0x203701, - 0x203fc1, + 0x204701, + 0x20dec1, 0x200781, 0x200641, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x204a82, - 0x258403, - 0x230743, - 0x2016c2, - 0x2257c3, - 0x63007, - 0x1f186, - 0x1d84a, - 0x87548, - 0x4d088, - 0x4d447, - 0x543c6, - 0xceb05, - 0x555c5, - 0x7e246, - 0x152dc6, - 0x224284, - 0x325607, - 0x894c8, - 0x2afc84, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2095c3, - 0x2d9d43, - 0x202503, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x21ce42, - 0x2b6a83, - 0x21a1c3, - 0x262043, - 0x202202, - 0x245403, - 0x203803, - 0x202403, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x216582, + 0x22d183, + 0x2343c3, + 0x201502, + 0x2264c3, + 0x16e747, + 0x131ac7, + 0x1e1c6, + 0x1736ca, + 0x85c48, + 0x53188, + 0x53547, + 0x50d06, + 0xce6c5, + 0x51f05, + 0x161186, + 0x155646, + 0x224104, + 0x322707, + 0x880c8, + 0x22d684, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x211cc3, + 0x21eb03, + 0x202243, + 0x211003, + 0x238483, + 0x2264c3, + 0x221e42, + 0x2be043, + 0x2f5003, + 0x20b283, + 0x202e02, + 0x248083, + 0x204803, + 0x206e83, 0x200001, 0x207043, - 0x271f44, - 0x328983, - 0x30abc3, - 0x219fc3, - 0x35c043, - 0xa258403, - 0x232ec4, - 0x219f83, - 0x205283, - 0x230743, - 0x230483, - 0x218903, - 0x29fa83, - 0x30ab43, - 0x222303, - 0x213543, - 0x247a84, - 0x237842, - 0x24c943, - 0x256383, - 0x275843, - 0x254203, - 0x252f83, - 0x2d9d43, - 0x2e4f03, - 0x21bbc3, - 0x201103, - 0x2148c3, - 0x35fbc3, - 0x318703, - 0x3857c3, + 0x26ff44, + 0x324dc3, + 0x30c683, + 0x21dec3, + 0x379b43, + 0xaa2d183, + 0x2374c4, + 0x21de83, + 0x232383, + 0x2343c3, + 0x234103, + 0x208143, + 0x2a3ec3, + 0x30c603, + 0x228103, + 0x212103, + 0x24c1c4, + 0x23aa82, + 0x252a43, + 0x2585c3, + 0x272bc3, + 0x250b43, + 0x24f8c3, + 0x21eb03, + 0x2db983, + 0x220883, + 0x201603, + 0x210483, + 0x2f2903, + 0xaefe5c3, + 0x385d43, 0x200983, - 0x230c43, - 0x219bc3, - 0x20f082, - 0x288883, - 0x249943, - 0x1602883, - 0x212b43, - 0x231583, - 0x22e043, - 0x2257c3, - 0x31c643, - 0x219683, - 0x236243, - 0x2f6783, - 0x2e6603, - 0x3b0845, - 0x244443, - 0x2e6643, - 0x2e7a03, - 0x20d3c4, - 0x259f83, - 0x35c0c3, - 0x275783, - 0x231a03, - 0x21ce42, - 0x2352c3, - 0x2fa644, - 0x2d8f44, - 0x23fc43, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x204a82, - 0x2257c3, - 0xb658403, - 0x2d9d43, - 0x219bc3, - 0x205842, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, + 0x2348c3, + 0x211003, + 0x21e442, + 0x286fc3, + 0x238483, + 0x16025c3, + 0x217e83, + 0x21da43, + 0x29af43, + 0x2264c3, + 0x30e803, + 0x21bd03, + 0x2ad283, + 0x2f6a83, + 0x2e8883, + 0x21d445, + 0x215cc3, + 0x2e88c3, + 0x39c083, + 0x218744, + 0x25b343, + 0x22e8c3, + 0x277c03, + 0x20b443, + 0x221e42, + 0x23a183, + 0x2f9b84, + 0x2ae9c4, + 0x244843, + 0x880c8, + 0x882, + 0x1002, + 0x2e02, + 0x1482, + 0x2d42, + 0x4c2, + 0x44682, + 0x202, + 0x1f82, + 0x982, + 0x43742, + 0xe842, + 0xe02, + 0x7a82, + 0x93d42, + 0x6d42, + 0x26282, + 0x7442, + 0x1f882, + 0x8b02, + 0x4b42, + 0x1c882, + 0x13c2, + 0x17642, + 0x1402, + 0xdfc2, + 0x6ec2, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x216582, + 0x2264c3, + 0xc22d183, + 0x21eb03, + 0x211003, + 0x223b42, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, 0x6c2, - 0x2034c2, - 0x2240c2, - 0x894c8, - 0x4a82, - 0x232502, - 0x209082, - 0x239642, - 0x201142, - 0x20ba82, - 0x555c5, - 0x20d082, - 0x202542, - 0x202bc2, - 0x2019c2, - 0x200ac2, - 0x384f82, - 0x214202, - 0x22c942, - 0x11880d, - 0xe95c9, - 0x44f0b, - 0xd1308, - 0x182cc9, - 0x2d9d43, - 0x894c8, - 0x894c8, - 0x4dfc6, + 0x202f02, + 0x223f42, + 0x880c8, + 0x16582, + 0x235f82, + 0x203142, + 0x23e682, + 0x201642, + 0x208382, + 0x51f05, + 0x2029c2, + 0x202282, + 0x203382, + 0x205d02, + 0x206d42, + 0x385542, + 0x201882, + 0x227642, + 0x16e747, + 0x119d4d, + 0xeafc9, + 0x47b8b, + 0xd1e88, + 0x13bc89, + 0x21eb03, + 0x880c8, + 0x880c8, + 0x53e06, 0x200882, - 0x224284, - 0x204a82, - 0x258403, - 0x201802, - 0x230743, - 0x2095c2, - 0x2afc84, - 0x202503, - 0x20a582, - 0x249943, - 0x2016c2, - 0x2257c3, - 0x23d1c6, - 0x30b94f, - 0x6ffb43, - 0x894c8, - 0x204a82, - 0x2095c3, - 0x2d9d43, - 0x219bc3, - 0x147448b, - 0x204a82, - 0x258403, - 0x2d9d43, - 0x249943, + 0x224104, + 0x216582, + 0x22d183, + 0x201a42, + 0x2343c3, + 0x201f82, + 0x22d684, + 0x202243, + 0x209782, + 0x238483, + 0x201502, + 0x2264c3, + 0x241f86, + 0x30d40f, + 0x6fef43, + 0x880c8, + 0x216582, + 0x211cc3, + 0x21eb03, + 0x211003, + 0x1568ecb, + 0x16e747, + 0x216582, + 0x22d183, + 0x21eb03, + 0x238483, 0x200882, - 0x207d42, - 0x209e42, - 0xea58403, - 0x239482, - 0x230743, - 0x244942, - 0x221b82, - 0x2d9d43, - 0x220442, - 0x301b82, - 0x242f42, - 0x204042, - 0x28b382, - 0x201b02, + 0x201102, + 0x2093c2, + 0xfa2d183, + 0x23e4c2, + 0x2343c3, + 0x2475c2, + 0x227982, + 0x21eb03, + 0x21c2c2, + 0x301dc2, + 0x2a7fc2, + 0x201142, + 0x289f82, + 0x206982, 0x200902, - 0x206dc2, - 0x26b682, - 0x213f02, - 0x2ad182, - 0x236bc2, - 0x2c8302, - 0x255582, - 0x219bc3, - 0x208f82, - 0x249943, - 0x23d982, - 0x26e742, - 0x2257c3, - 0x245482, - 0x2057c2, - 0x205202, - 0x200fc2, - 0x20acc2, - 0x2d1e82, - 0x214882, - 0x23e2c2, - 0x2267c2, - 0x301bca, - 0x344c4a, - 0x37ca0a, - 0x3b3682, - 0x20d042, - 0x23d3c2, - 0xef46cc9, - 0xf3a490a, - 0xf58fb47, - 0xad82, - 0x1a490a, - 0x2054c4, - 0xfe58403, - 0x230743, - 0x2446c4, - 0x2d9d43, - 0x201104, - 0x202503, - 0x219bc3, - 0x249943, - 0x202883, - 0x2257c3, - 0x244443, - 0x224043, - 0x894c8, - 0x1454344, - 0x53bc5, - 0x51eca, - 0x107c82, - 0x17bac6, - 0x153811, - 0x10746cc9, - 0x153c47, - 0x3442, - 0x1ac98a, - 0xd9547, - 0x894c8, - 0xfea08, - 0xdac7, - 0x1181918b, - 0x1a382, - 0xee987, - 0x574a, - 0x11030f, - 0x6308f, - 0x19fc2, - 0x4a82, - 0x9f9c8, - 0xe8d0a, - 0x63608, - 0x1842, - 0x11008f, - 0x128a0b, - 0x1702c8, - 0x7a287, - 0xd964a, - 0x574cb, - 0x10d109, - 0x1701c7, - 0xf25cc, - 0x11cac7, - 0xcfd0a, - 0x132948, - 0xef6ce, - 0x4ee8e, - 0xd938b, - 0x11e14b, - 0xe930b, - 0x1f189, - 0x2158b, - 0x23b0d, - 0x29c4b, - 0x2c38d, - 0x57b8d, - 0x7d04a, - 0xd8d8b, - 0xe5e4b, - 0x177ac5, - 0x108b50, - 0x15428f, - 0xf584f, - 0xec4d, - 0x71d50, - 0x79c2, - 0x11fa9188, - 0x62e88, - 0x122e0d05, - 0x4360b, - 0x4a748, - 0x11e30a, - 0x56c09, - 0x5e5c7, - 0x5e907, - 0x5eac7, - 0x5f107, - 0x5fb07, - 0x60407, - 0x60e87, - 0x65807, - 0x66007, - 0x661c7, - 0x66c47, + 0x205e82, + 0x26a242, + 0x204d42, + 0x2ad802, + 0x230cc2, + 0x225a02, + 0x228f02, + 0x211003, + 0x203042, + 0x238483, + 0x2425c2, + 0x267c02, + 0x2264c3, + 0x248102, + 0x217642, + 0x20a442, + 0x202482, + 0x2168c2, + 0x2d29c2, + 0x210442, + 0x242d42, + 0x221bc2, + 0x301e0a, + 0x34600a, + 0x38074a, + 0x3b4682, + 0x20d802, + 0x23c282, + 0xff49009, + 0x103a418a, + 0x1042fe87, + 0xc002, + 0x1a418a, + 0x245dc4, + 0x10e2d183, + 0x2343c3, + 0x247344, + 0x21eb03, + 0x201604, + 0x202243, + 0x211003, + 0x238483, + 0x2025c3, + 0x2264c3, + 0x215cc3, + 0x223ec3, + 0x880c8, + 0x1450c84, + 0x50505, + 0x4e80a, + 0x109842, + 0x18b406, + 0x162d51, + 0x11749009, + 0x163187, + 0x4802, + 0x1aa80a, + 0xdb7c7, + 0x880c8, + 0xfd948, + 0xe707, + 0x1281c44b, + 0x15802, + 0x1a6707, + 0x1b1a4a, + 0x10728f, + 0x131b4f, + 0x1dec2, + 0x16582, + 0xa3e08, + 0xea70a, + 0x167408, + 0xf82, + 0x10700f, + 0x124e4b, + 0x2988, + 0x16e847, + 0x16a8a, + 0xae14b, + 0x112089, + 0x173507, + 0xf424c, + 0x10ec87, + 0xd060a, + 0x132d48, + 0x8e28e, + 0x553ce, + 0xdb60b, + 0x110d8b, + 0xead0b, + 0x1e1c9, + 0x1fb8b, + 0x2398d, + 0x260cb, + 0x2708d, + 0x2c90d, + 0x2ec8a, + 0xae80b, + 0xc6fcb, + 0xe82c5, + 0x10a710, + 0x8128f, + 0xb74f, + 0x2a24d, + 0x6fd50, + 0xd82, + 0x12fa2488, + 0x131948, + 0x132e4bc5, + 0x4668b, + 0x52088, + 0x110f4a, + 0x58d89, + 0x60587, + 0x608c7, + 0x60a87, + 0x611c7, + 0x629c7, + 0x62f47, + 0x636c7, + 0x63d47, + 0x64307, + 0x644c7, + 0x66087, + 0x66247, + 0x66407, + 0x665c7, + 0x668c7, 0x66e07, - 0x66fc7, - 0x67187, - 0x67487, - 0x678c7, - 0x68e87, - 0x69547, - 0x69d07, - 0x6a707, - 0x6a8c7, - 0x6aec7, - 0x6b2c7, + 0x67a47, + 0x67f07, + 0x68707, + 0x69207, + 0x693c7, + 0x699c7, + 0x69e87, + 0x6a087, + 0x6a347, + 0x6a507, + 0x6a6c7, + 0x6ac07, 0x6b4c7, - 0x6b787, - 0x6b947, - 0x6bb07, - 0x6c6c7, - 0x6cf87, - 0x6da47, - 0x6e147, - 0x6e407, - 0x6ea47, - 0x6ec07, - 0x6ef87, - 0x6fdc7, - 0x70047, - 0x70447, - 0x70fc7, - 0x71187, - 0x715c7, - 0x72307, - 0x72607, - 0x72c07, - 0x72dc7, - 0x73147, - 0x73587, - 0xcbc2, - 0x3f34a, - 0xf6a07, - 0x124c8f0b, - 0x14c8f16, - 0x15c11, - 0xdce8a, - 0x9f84a, - 0x4dfc6, - 0x18df4b, - 0x1a042, - 0x187c51, - 0x97149, - 0x90ec9, - 0x6dc2, - 0x9d6ca, - 0xa3609, - 0xa3d0f, - 0xa4e8e, - 0xa5ec8, - 0xd4c2, - 0x742c9, - 0x8628e, - 0xabdcc, - 0xd328f, - 0x19510e, - 0xdf8c, - 0x13349, - 0x14f51, - 0x24dc8, - 0x2d892, - 0xc7fcd, - 0x1a638d, - 0x34ecb, - 0x3e755, - 0x3f209, - 0x41d8a, - 0x4fb49, - 0x56510, - 0x6c40b, - 0x7708f, - 0x7804b, - 0x7d90c, - 0x7e650, - 0x87f0a, - 0x8874d, - 0x1459ce, - 0x17480a, - 0x8d54c, - 0x93354, - 0x96dd1, - 0x9b64b, - 0x9c8cf, - 0xa9f4d, - 0xab74e, - 0x157a4c, - 0xebecc, - 0x15774b, - 0xe518e, - 0xf9050, - 0x12c8cb, - 0x168e8d, - 0xb3d4f, - 0xb55cc, - 0xb908e, - 0xb9891, - 0xbb70c, - 0x11aa87, - 0xc18cd, - 0xc2b4c, - 0xd2a90, - 0xe330d, - 0x1361c7, - 0xeced0, - 0xf1848, - 0x11f00b, - 0x16fe4f, - 0x295c8, - 0xdd08d, - 0x181490, - 0xaf303, - 0xa482, - 0x57f89, - 0x4ec8a, - 0xfa686, - 0x128d4609, - 0x15683, - 0x108351, - 0x153489, - 0xcdc07, - 0x11018b, - 0xd21d0, - 0xd268c, - 0xd3a85, - 0x1195c8, - 0x19c30a, - 0x126b87, - 0x1a82, - 0x54cca, - 0xf5b89, - 0x32f4a, - 0x19ea0f, - 0x3bdcb, - 0x11068c, - 0x110952, - 0xadac5, - 0x15e60a, - 0x12edf6c5, - 0x114203, - 0x184f82, - 0xe6e4a, - 0x156288, - 0x190c87, - 0x3b82, - 0xb482, - 0x3182, - 0x183e90, - 0x3e42, - 0x1a5c4f, - 0x7e246, - 0x11e78e, - 0xd5e0b, - 0x174a08, - 0xca189, - 0x17a092, - 0x3e4d, - 0x42b08, - 0x44dc9, - 0x4594d, - 0x47289, - 0x48a8b, - 0x49388, - 0x51d08, - 0x55c88, - 0x55f09, - 0x5610a, - 0x5dc4c, - 0xe6bca, - 0xf67c7, - 0x10ecd, - 0xea20b, - 0x74acc, - 0x5f350, - 0x35c2, - 0x16974d, - 0x3d02, - 0x2c02, - 0xf670a, - 0xdcd8a, - 0xe428b, - 0xe600c, - 0xfe78e, - 0x18cc0d, - 0xea948, + 0x6bf87, + 0x6c687, + 0x6c947, + 0x6ce07, + 0x6cfc7, + 0x6d347, + 0x6e3c7, + 0x6ea07, + 0x6ee07, + 0x6efc7, + 0x6f187, + 0x6f5c7, + 0x70307, + 0x70607, + 0x70c07, + 0x70dc7, + 0x71147, + 0x71587, + 0xd382, + 0x33d8a, + 0xf9dc7, + 0x134c87cb, + 0x14c87d6, + 0x18351, + 0xdfb8a, + 0xa3c8a, + 0x53e06, + 0xc114b, + 0xb2c2, + 0x31ad1, + 0x959c9, + 0x90ac9, + 0x5e82, + 0x9c34a, + 0xa5449, + 0xa5c8f, + 0xa688e, + 0xa7188, + 0xf1c2, + 0x169a89, + 0x8498e, + 0xac64c, + 0xd400f, + 0x194a8e, + 0x1098c, + 0x15309, + 0x16451, + 0x19a48, + 0x2bd52, + 0x2e5cd, + 0x393cd, + 0x13ff8b, + 0x179d95, + 0x33c49, + 0x5488a, + 0x58749, + 0x5fe90, + 0x60f0b, + 0x6e54f, + 0x71d0b, + 0x756cc, + 0x787d0, + 0x8660a, + 0x86e8d, + 0x14ea0e, + 0x18004a, + 0x8c7cc, + 0x8fa54, + 0x95651, + 0x98f8b, + 0x9b54f, + 0xab6cd, + 0xabfce, + 0x12c10c, + 0x15710c, + 0xdc8cb, + 0xeef8e, + 0xfb250, + 0x10938b, + 0x11270d, + 0x15f28f, + 0xb504c, + 0xb824e, + 0xb8a51, + 0xba84c, + 0x1362c7, + 0x11c60d, + 0xbe94c, + 0xc4d90, + 0xd35cd, + 0xe7847, + 0xec4d0, + 0xf0688, + 0xf124b, + 0x17318f, + 0x2b848, + 0xdfd8d, + 0x1763d0, + 0x13aaf9c6, + 0xb0bc3, + 0x9682, + 0x2cd09, + 0x551ca, + 0xf9bc6, + 0x13cd5389, + 0x124c3, + 0x109f11, + 0x9f89, + 0xcd5c7, + 0x10710b, + 0xd2d10, + 0xd31cc, + 0xd47c5, + 0x11ab08, + 0x19be4a, + 0x122b07, + 0x25c2, + 0x5160a, + 0x1694c9, + 0xa62ca, + 0x1abe8f, + 0x4084b, + 0x10760c, + 0x1078d2, + 0xb5485, + 0x15d98a, + 0x142e1fc5, + 0x19900c, + 0x1157c3, + 0x185542, + 0xe8e4a, + 0x108548, + 0x163407, + 0x4b42, + 0x7982, + 0x1bc2, + 0x129e10, + 0x1402, + 0x3074f, + 0x161186, + 0x1113ce, + 0xe3a4b, + 0x180248, + 0xc9a89, + 0x17e4d2, + 0x178b8d, + 0x45e88, + 0x47a49, + 0x485cd, + 0x4a189, + 0x4a64b, + 0x4ac08, + 0x4e648, + 0x53f48, + 0x559c9, + 0x55bca, + 0x57f4c, + 0xe31ca, + 0xf6ac7, + 0xdfcd, + 0xeb88b, + 0x9eb0c, + 0x18b610, + 0x3282, + 0xc570d, + 0x6202, + 0x33c2, + 0xf6a0a, + 0xdfa8a, + 0xe5e4b, + 0xc718c, + 0xfd6ce, + 0x165d0d, + 0xf3dc8, 0x6c2, - 0x10b2a68e, - 0x10d8fb47, - 0x1118fb49, - 0x10083, - 0x1171214c, - 0xad82, - 0x537d1, - 0x12a5d1, - 0x140851, - 0x165e51, - 0x11208f, - 0x11eacc, - 0x12478d, - 0x14824d, - 0x159a55, - 0xad8c, - 0x191050, - 0x106d0c, - 0x10c84c, - 0x4a509, - 0xad82, - 0x5388e, - 0x12a68e, - 0x14090e, - 0x165f0e, - 0x11214c, - 0x11eb89, - 0xae49, - 0x159c4d, - 0x106dc9, - 0x10c909, - 0x133803, - 0x95843, - 0xad82, - 0x153805, - 0x1ac984, - 0x28c84, - 0xe7e44, - 0x17b4c4, - 0xff504, - 0x153c44, - 0x141d2c3, - 0x1410d83, - 0xfe444, - 0x79c2, - 0x18cc03, + 0x11a0c0ce, + 0x11c2fe87, + 0x121aa0c9, + 0x11583, + 0x127117cc, + 0xc002, + 0x50111, + 0xc011, + 0xa1091, + 0x81ed1, + 0x11170f, + 0x11dfcc, + 0x121acd, + 0x123f0d, + 0x142615, + 0x14b18c, + 0x159590, + 0xfa8c, + 0x5274c, + 0x47109, + 0xc002, + 0x501ce, + 0xc0ce, + 0xa114e, + 0x81f8e, + 0x1117cc, + 0x11e089, + 0x14b249, + 0x14280d, + 0xfb49, + 0x52809, + 0x1267c3, + 0x940c3, + 0xc002, + 0x162d45, + 0x1aa804, + 0xdf704, + 0x127244, + 0x17f904, + 0x17c084, + 0x163184, + 0x144bdc3, + 0x140de83, + 0x19fd04, + 0x1573dc3, + 0xd82, + 0x165d03, 0x200882, - 0x204a82, - 0x201802, - 0x20bc82, - 0x2095c2, - 0x2016c2, - 0x203182, - 0x258403, - 0x230743, - 0x2d9d43, - 0x201103, - 0x249943, - 0x2257c3, - 0x894c8, - 0x258403, - 0x230743, - 0x249943, - 0x2257c3, - 0x4fc3, - 0x2d9d43, + 0x216582, + 0x201a42, + 0x206ac2, + 0x201f82, + 0x201502, + 0x201bc2, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x201603, + 0x238483, + 0x2264c3, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x238483, + 0x2264c3, + 0x1d003, + 0x21eb03, 0x200882, - 0x323743, - 0x14a58403, - 0x37e0c7, - 0x2d9d43, - 0x332283, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x24388a, - 0x23d1c5, - 0x219683, - 0x201582, - 0x894c8, - 0x894c8, - 0x4a82, - 0x10e102, - 0xeeac5, - 0x894c8, - 0x58403, - 0xefa47, - 0xc678f, - 0xfa704, - 0x10d28a, - 0xaba07, - 0x9560a, - 0x18e3ca, - 0xfa686, - 0x790d, - 0x123743, - 0x894c8, - 0x4a82, - 0x446c4, - 0x68ac3, - 0xe82c5, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x203803, - 0x258403, - 0x230743, - 0x2095c3, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x291083, - 0x224043, - 0x203803, - 0x224284, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x22f903, - 0x258403, - 0x230743, - 0x20e8c3, - 0x2095c3, - 0x2d9d43, - 0x201104, - 0x265743, - 0x230c43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x219683, - 0x200a43, - 0x16e58403, - 0x230743, - 0x241583, - 0x2d9d43, - 0x27da43, - 0x230c43, - 0x2257c3, + 0x323ac3, + 0x15e2d183, + 0x330d47, + 0x21eb03, + 0x332683, + 0x212444, + 0x238483, + 0x2264c3, + 0x24690a, + 0x241f85, + 0x21bd03, + 0x203e42, + 0x880c8, + 0x880c8, + 0x16582, + 0x113682, + 0x1a6845, + 0x880c8, + 0x2d183, + 0x77947, + 0x1161cf, + 0xf9c44, + 0x11220a, + 0xac287, + 0xf78a, + 0x93e8a, + 0xa660a, + 0xf9bc6, + 0x27ca, + 0xccd, + 0x123ac3, + 0x880c8, + 0x16582, + 0x47344, + 0x67683, + 0xe9cc5, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x204803, + 0x22d183, + 0x2343c3, + 0x211cc3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x290c83, + 0x223ec3, + 0x204803, + 0x224104, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x232dc3, + 0x22d183, + 0x2343c3, + 0x206ac3, + 0x211cc3, + 0x21eb03, + 0x201604, + 0x36b683, + 0x2348c3, + 0x211003, + 0x238483, + 0x2264c3, + 0x21bd03, + 0x3b0343, + 0x1822d183, + 0x2343c3, + 0x244d43, + 0x21eb03, + 0x275803, + 0x2348c3, + 0x2264c3, 0x207443, - 0x3284c4, - 0x894c8, - 0x17658403, - 0x230743, - 0x2a5f83, - 0x2d9d43, - 0x219bc3, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x21ba43, - 0x894c8, - 0x17e58403, - 0x230743, - 0x2095c3, - 0x202883, - 0x2257c3, - 0x894c8, - 0x158fb47, - 0x323743, - 0x258403, - 0x230743, - 0x2d9d43, - 0x201104, - 0x2021c4, - 0x249943, - 0x2257c3, - 0xfbfc4, - 0x329345, - 0x894c8, + 0x27f5c4, + 0x880c8, + 0x18a2d183, + 0x2343c3, + 0x2a7243, + 0x21eb03, + 0x211003, + 0x212444, + 0x238483, + 0x2264c3, + 0x220703, + 0x880c8, + 0x1922d183, + 0x2343c3, + 0x211cc3, + 0x2025c3, + 0x2264c3, + 0x880c8, + 0x142fe87, + 0x323ac3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x201604, + 0x212444, + 0x238483, + 0x2264c3, + 0x16e747, + 0x176c84, + 0x1462d48, + 0xa7dcd, + 0x3256c5, + 0x880c8, 0x742, - 0x31f43, - 0x355b88, - 0x241047, - 0x224284, - 0x352ac6, - 0x359906, - 0x894c8, - 0x240303, - 0x2f5249, - 0x2b33d5, - 0xb33df, - 0x258403, - 0x331dd2, - 0xff686, - 0x138e05, - 0x11e30a, - 0x56c09, - 0x331b8f, - 0x2afc84, - 0x240a45, - 0x35f990, - 0x3ad107, - 0x202883, - 0x251b48, - 0x2db58a, - 0x23b9c4, - 0x2df103, - 0x23d1c6, - 0x201582, - 0x385c4b, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x2e4b43, - 0x204a82, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x332283, - 0x208f83, - 0x2257c3, - 0x204a82, - 0x258403, - 0x230743, - 0x249943, - 0x2257c3, + 0x35bc3, + 0xe6786, + 0x307e48, + 0x3afd07, + 0x224104, + 0x355346, + 0x359446, + 0x880c8, + 0x301043, + 0x20b149, + 0x2b46d5, + 0xb46df, + 0x22d183, + 0x32f8d2, + 0xfea86, + 0x13af45, + 0x110f4a, + 0x58d89, + 0x32f68f, + 0x22d684, + 0x331145, + 0x2f26d0, + 0x3aaf87, + 0x2025c3, + 0x32d208, + 0x2aeeca, + 0x2014c4, + 0x2e1a03, + 0x241f86, + 0x203e42, + 0x38660b, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x2e6a83, + 0x216582, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x332683, + 0x203043, + 0x2264c3, + 0x216582, + 0x22d183, + 0x2343c3, + 0x238483, + 0x2264c3, 0x200882, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x224284, - 0x258403, - 0x230743, - 0x30ac84, - 0x249943, - 0x2257c3, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2095c3, - 0x21bbc3, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x204a82, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x254943, - 0x672c3, - 0x132283, - 0x249943, - 0x2257c3, - 0x301bca, - 0x31f6c9, - 0x33c04b, - 0x33c9ca, - 0x344c4a, - 0x351b4b, - 0x36ebca, - 0x375c0a, - 0x37ca0a, - 0x37cc8b, - 0x39c049, - 0x39de8a, - 0x39e3cb, - 0x3ab84b, - 0x3b1f4a, - 0x258403, - 0x230743, - 0x2095c3, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x894c8, - 0x258403, - 0x25e5c4, - 0x213142, - 0x2021c4, - 0x275685, - 0x203803, - 0x224284, - 0x258403, - 0x232ec4, - 0x230743, - 0x2446c4, - 0x2afc84, - 0x201104, - 0x230c43, - 0x249943, - 0x2257c3, - 0x293485, - 0x22f903, - 0x219683, - 0x25a383, - 0x24ccc4, - 0x254284, - 0x273f45, - 0x894c8, - 0x2f8cc4, - 0x21e046, - 0x285844, - 0x204a82, - 0x3614c7, - 0x246c47, - 0x242244, - 0x255745, - 0x2e3505, - 0x2a8f85, - 0x201104, - 0x316e08, - 0x362906, - 0x2e1a08, - 0x2386c5, - 0x2cf185, - 0x21a5c4, - 0x2257c3, - 0x2dfdc4, - 0x350d06, - 0x23d2c3, - 0x24ccc4, - 0x26be05, - 0x232144, - 0x38ca84, - 0x201582, - 0x24d2c6, - 0x3924c6, - 0x2f3dc5, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x224104, + 0x22d183, + 0x2343c3, + 0x307b04, + 0x238483, + 0x2264c3, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x211cc3, + 0x220883, + 0x211003, + 0x238483, + 0x2264c3, + 0x216582, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x251283, + 0x2efc3, + 0x132683, + 0x238483, + 0x2264c3, + 0x301e0a, + 0x31ec09, + 0x33e6cb, + 0x33ed4a, + 0x34600a, + 0x3543cb, + 0x372d8a, + 0x37acca, + 0x38074a, + 0x3809cb, + 0x39bb89, + 0x39d94a, + 0x39e38b, + 0x3a9bcb, + 0x3b2c8a, + 0x22d183, + 0x2343c3, + 0x211cc3, + 0x211003, + 0x238483, + 0x2264c3, + 0x37549, + 0x880c8, + 0x22d183, + 0x260584, + 0x214a02, + 0x212444, + 0x226bc5, + 0x204803, + 0x224104, + 0x22d183, + 0x2374c4, + 0x2343c3, + 0x247344, + 0x22d684, + 0x201604, + 0x2348c3, + 0x238483, + 0x2264c3, + 0x28fb85, + 0x232dc3, + 0x21bd03, + 0x25b743, + 0x252dc4, + 0x250bc4, + 0x26dfc5, + 0x880c8, + 0x2f88c4, + 0x208606, + 0x283c04, + 0x216582, + 0x360307, + 0x249c07, + 0x2455c4, + 0x257a05, + 0x2d37c5, + 0x2a9c05, + 0x201604, + 0x318348, + 0x36ed86, + 0x2dbb08, + 0x236f45, + 0x2cf145, + 0x240584, + 0x2264c3, + 0x2e26c4, + 0x353586, + 0x242083, + 0x252dc4, + 0x262c45, + 0x2cfbc4, + 0x365b84, + 0x203e42, + 0x245206, + 0x392446, + 0x2f56c5, 0x200882, - 0x323743, - 0x1d604a82, - 0x231c44, - 0x2095c2, - 0x219bc3, - 0x22c902, - 0x249943, - 0x2016c2, - 0x2161c3, - 0x224043, - 0x894c8, - 0x894c8, - 0x2d9d43, + 0x323ac3, + 0x1f216582, + 0x2358c4, + 0x201f82, + 0x211003, + 0x209f82, + 0x238483, + 0x201502, + 0x217643, + 0x223ec3, + 0x880c8, + 0x880c8, + 0x21eb03, 0x200882, - 0x1e204a82, - 0x2d9d43, - 0x266f43, - 0x265743, - 0x320444, - 0x249943, - 0x2257c3, - 0x894c8, + 0x1fe16582, + 0x21eb03, + 0x266383, + 0x36b683, + 0x31f984, + 0x238483, + 0x2264c3, + 0x880c8, 0x200882, - 0x1ea04a82, - 0x258403, - 0x249943, - 0x2257c3, - 0x201382, - 0x21ce42, - 0x332283, - 0x2d8843, + 0x20616582, + 0x22d183, + 0x238483, + 0x2264c3, + 0x4b42, + 0x2019c2, + 0x221e42, + 0x332683, + 0x2db083, 0x200882, - 0x894c8, - 0x204a82, - 0x230743, - 0x2446c4, - 0x2099c3, - 0x2d9d43, - 0x21bbc3, - 0x219bc3, - 0x249943, - 0x2174c3, - 0x2257c3, - 0x21b9c3, - 0x127b13, - 0x131714, - 0x1a206, - 0x1f186, - 0x4cec7, - 0x75009, - 0x6208a, - 0x8740d, - 0x11850c, - 0x17c3ca, - 0x555c5, - 0x18c288, - 0x7e246, - 0x152dc6, - 0x2079c2, - 0x1739cc, - 0x1acb47, - 0x205d1, - 0x258403, - 0xcfc85, - 0xb444, - 0x15c06, - 0x8f1c6, - 0x8b64a, - 0xaccc3, - 0x74fc5, - 0xb983, - 0x18e00c, - 0x1af108, - 0x27bc8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, + 0x880c8, + 0x16e747, + 0x216582, + 0x2343c3, + 0x247344, + 0x208f43, + 0x21eb03, + 0x220883, + 0x211003, + 0x238483, + 0x21ab43, + 0x2264c3, + 0x220683, + 0x1244d3, + 0x12f214, + 0x16e747, + 0x15686, + 0x1e1c6, + 0x52fc7, + 0x9f049, + 0x2654a, + 0x85b0d, + 0x119a4c, + 0x29e8a, + 0x51f05, + 0x18bec8, + 0x161186, + 0x155646, + 0x200d82, + 0xde40c, + 0x1aa9c7, + 0x24d11, + 0x22d183, + 0xd0585, + 0x1b4284, + 0x18346, + 0x19f046, + 0x8a24a, + 0xacec3, + 0x9f005, + 0xce83, + 0xc120c, + 0xe5408, + 0x1ad408, + 0xa0288, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, 0x200882, - 0x204a82, - 0x2d9d43, - 0x20b9c2, - 0x249943, - 0x2257c3, - 0x2161c3, - 0x35fd8f, - 0x36014e, - 0x894c8, - 0x258403, - 0x3df47, - 0x230743, - 0x2d9d43, - 0x202503, - 0x249943, - 0x2257c3, - 0x21b943, - 0x265107, - 0x203642, - 0x29ffc9, - 0x200dc2, - 0x38418b, - 0x28ff8a, - 0x291709, - 0x201c42, - 0x2544c6, - 0x250a95, - 0x3842d5, - 0x25fdd3, - 0x384853, - 0x204602, - 0x204ec5, - 0x31d3cc, - 0x22518b, - 0x26dd85, - 0x20e3c2, - 0x284d02, - 0x372c06, - 0x203442, - 0x2521c6, - 0x332acd, - 0x36458c, - 0x308bc4, + 0x216582, + 0x21eb03, + 0x2082c2, + 0x238483, + 0x2264c3, + 0x217643, + 0x35e48f, + 0x35e84e, + 0x880c8, + 0x22d183, + 0x429c7, + 0x2343c3, + 0x21eb03, + 0x202243, + 0x238483, + 0x2264c3, + 0x220003, + 0x36b047, + 0x204642, + 0x2a9849, + 0x201002, + 0x32a10b, + 0x28c14a, + 0x2a4209, + 0x201902, + 0x250e06, + 0x248f95, + 0x32a255, + 0x24de93, + 0x32a7d3, + 0x2056c2, + 0x214605, + 0x27ff4c, + 0x219e0b, + 0x269005, + 0x201482, + 0x2040c2, + 0x377506, + 0x204802, + 0x24eb06, + 0x332ecd, + 0x36288c, + 0x30a784, 0x2009c2, - 0x21fd82, - 0x22dc48, - 0x203402, - 0x30e986, - 0x2aebc4, - 0x250c55, - 0x25ff53, - 0x20ffc3, - 0x34634a, - 0x31c387, - 0x2e44c9, - 0x226fc7, - 0x252f42, + 0x219f02, + 0x22c108, + 0x202d42, + 0x29d5c6, + 0x3345c4, + 0x249155, + 0x24e013, + 0x20a583, + 0x34868a, + 0x30e547, + 0x2e6089, + 0x20f507, + 0x24f882, 0x200002, 0x200006, - 0x208e82, - 0x894c8, - 0x20fe02, - 0x210842, - 0x399887, - 0x3aaa47, - 0x21a805, - 0x21a382, - 0x21b987, - 0x21bb48, - 0x235842, - 0x295682, - 0x22e142, - 0x201742, - 0x36d148, - 0x217543, - 0x268c88, - 0x2c780d, - 0x21a2c3, - 0x2f5fc8, - 0x230dcf, - 0x23118e, - 0x22410a, - 0x2a1591, - 0x2a1a10, - 0x2b218d, - 0x2b24cc, - 0x20bd07, - 0x3464c7, - 0x352b89, - 0x23d442, + 0x202f42, + 0x880c8, + 0x211302, + 0x211d42, + 0x273cc7, + 0x3a8ac7, + 0x21ed05, + 0x215802, + 0x220647, + 0x220808, + 0x279a82, + 0x293f02, + 0x22f802, + 0x202ec2, + 0x239c48, + 0x21abc3, + 0x267848, + 0x2cf4cd, + 0x215743, + 0x369908, + 0x234a4f, + 0x234e0e, + 0x223f8a, + 0x36a611, + 0x36aa90, + 0x2b348d, + 0x2b37cc, + 0x3b2447, + 0x348807, + 0x355409, + 0x23c302, 0x2004c2, - 0x24e74c, - 0x24ea4b, + 0x254c8c, + 0x254f8b, 0x2008c2, - 0x357906, - 0x205742, - 0x211a82, - 0x219fc2, - 0x204a82, - 0x381f44, - 0x235b47, - 0x207802, - 0x23a547, - 0x23b7c7, - 0x212182, - 0x206082, - 0x23de05, + 0x2dca86, + 0x206c02, + 0x2131c2, + 0x21dec2, + 0x216582, + 0x392904, + 0x23b147, + 0x200bc2, + 0x23f1c7, + 0x240447, + 0x214ec2, + 0x230542, + 0x242885, 0x200682, - 0x260fce, - 0x278b4d, - 0x230743, - 0x2842ce, - 0x3571cd, - 0x227283, - 0x204802, - 0x281b44, - 0x23fac2, - 0x2017c2, - 0x345485, - 0x34cb87, - 0x36e142, - 0x20bc82, - 0x243f47, - 0x247ec8, - 0x237842, - 0x2adb46, - 0x24e5cc, - 0x24e90b, - 0x205642, - 0x25a90f, - 0x25acd0, - 0x25b0cf, - 0x25b495, - 0x25b9d4, - 0x25bece, - 0x25c24e, - 0x25c5cf, - 0x25c98e, - 0x25cd14, - 0x25d213, - 0x25d6cd, - 0x273749, - 0x288603, + 0x26380e, + 0x27620d, + 0x2343c3, + 0x28268e, + 0x356b8d, + 0x2de803, + 0x2058c2, + 0x27cac4, + 0x2446c2, + 0x20ddc2, + 0x346905, + 0x34f587, + 0x372642, + 0x206ac2, + 0x246cc7, + 0x24c608, + 0x23aa82, + 0x2b5506, + 0x254b0c, + 0x254e4b, + 0x221842, + 0x25bccf, + 0x25c090, + 0x25c48f, + 0x25c855, + 0x25cd94, + 0x25d28e, + 0x25d60e, + 0x25d98f, + 0x25dd4e, + 0x25e0d4, + 0x25e5d3, + 0x25ea8d, + 0x271749, + 0x286d43, 0x2007c2, - 0x31b245, - 0x2099c6, - 0x2095c2, - 0x26d887, - 0x2d9d43, - 0x21a042, - 0x22cc08, - 0x2a17d1, - 0x2a1c10, + 0x20a805, + 0x208f46, + 0x201f82, + 0x26bdc7, + 0x21eb03, + 0x20b2c2, + 0x2c7448, + 0x36a851, + 0x36ac90, 0x200942, - 0x20f047, - 0x203dc2, - 0x30f787, - 0x20a482, - 0x24b949, - 0x372bc7, - 0x285b08, - 0x222446, - 0x261e43, - 0x261e45, - 0x22fdc2, + 0x22a647, + 0x2074c2, + 0x3328c7, + 0x209682, + 0x305dc9, + 0x3774c7, + 0x3615c8, + 0x228246, + 0x2daf83, + 0x34ad45, + 0x234642, 0x200402, 0x200405, - 0x22b385, - 0x20a902, - 0x2280c3, - 0x2321c7, - 0x3a3f87, - 0x201302, - 0x2ff804, - 0x23e383, - 0x2bfc09, - 0x2d9208, - 0x2120c2, - 0x2067c2, - 0x2164c7, - 0x21d1c5, - 0x2a4008, - 0x204b87, - 0x2037c3, - 0x2a1246, - 0x2b200d, - 0x2b238c, - 0x279346, - 0x209082, - 0x208a42, - 0x202242, - 0x230c4f, - 0x23104e, - 0x2e3587, + 0x399485, + 0x202102, + 0x24a503, + 0x2cfc47, + 0x208a07, + 0x203f42, + 0x2fec04, + 0x214803, + 0x2be489, + 0x2db488, + 0x20b402, + 0x2061c2, + 0x22f2c7, + 0x24bcc5, + 0x2a5f88, + 0x3b0e87, + 0x2047c3, + 0x27df86, + 0x2b330d, + 0x2b368c, + 0x276a06, + 0x203142, + 0x29a1c2, + 0x206742, + 0x2348cf, + 0x234cce, + 0x2d3847, 0x200342, - 0x309445, - 0x309446, - 0x253702, - 0x208f82, - 0x212946, - 0x2a0203, - 0x30f6c6, - 0x2c1285, - 0x2c128d, - 0x2c1dd5, - 0x2c258c, - 0x2c330d, - 0x2c39d2, - 0x20dc02, - 0x207a42, - 0x201082, - 0x2e0986, - 0x2abc86, - 0x201a82, - 0x209a46, - 0x202bc2, - 0x21ff85, - 0x203c42, - 0x261109, - 0x33d40c, - 0x33d74b, - 0x2016c2, - 0x248308, - 0x201342, - 0x200d82, - 0x224f46, - 0x366b45, - 0x21f387, - 0x247485, - 0x2a1405, - 0x23dfc2, - 0x352f42, + 0x39e205, + 0x39e206, + 0x250042, + 0x203042, + 0x217c86, + 0x2a9a83, + 0x332806, + 0x2bfb05, + 0x2bfb0d, + 0x2c00d5, + 0x2c0c0c, + 0x2c150d, + 0x2c18d2, + 0x20e842, + 0x200e02, 0x200ac2, - 0x277387, - 0x2d004d, - 0x2d03cc, - 0x234107, - 0x2adac2, - 0x21d302, - 0x22be08, - 0x258108, - 0x2d4148, - 0x2dd044, - 0x2e5407, - 0x2da3c3, - 0x2aed82, - 0x2137c2, - 0x2dd809, - 0x3a3107, - 0x205fc2, - 0x26f0c5, - 0x23c782, - 0x2768c2, - 0x2768c3, - 0x2768c6, - 0x2e4b42, - 0x2e63c2, - 0x2018c2, - 0x33e186, - 0x30f047, - 0x201702, - 0x2058c2, - 0x268acf, - 0x28410d, - 0x28668e, - 0x35704c, - 0x20cb82, - 0x2024c2, - 0x222285, - 0x3b2346, - 0x2135c2, - 0x20b942, - 0x203b82, - 0x204b04, - 0x2c7684, - 0x336d86, - 0x203182, - 0x277bc7, - 0x220a83, - 0x222988, - 0x2244c8, - 0x2c7e47, - 0x3a5fc6, - 0x21b842, - 0x234503, - 0x2413c7, - 0x2693c6, - 0x2e08c5, - 0x344808, - 0x2063c2, - 0x322587, - 0x210ec2, - 0x2e74c2, - 0x203e02, - 0x2bab89, + 0x2d6646, + 0x2ac506, + 0x2025c2, + 0x208fc6, + 0x203382, + 0x2249c5, + 0x204c02, + 0x263949, + 0x34700c, + 0x34734b, + 0x201502, + 0x24ca48, + 0x2042c2, + 0x207a82, + 0x219bc6, + 0x36c005, + 0x3a1687, + 0x24a385, + 0x28df05, + 0x242a42, + 0x202042, + 0x206d42, + 0x26e847, + 0x2d094d, + 0x2d0ccc, + 0x2229c7, + 0x2b5482, + 0x226282, + 0x36f088, + 0x22ce88, + 0x2d5b48, + 0x2dfd44, + 0x2ef207, + 0x2dbf83, + 0x280b82, + 0x2014c2, + 0x2e0489, + 0x3a3247, + 0x207442, + 0x26d485, + 0x241542, + 0x22ff42, + 0x297fc3, + 0x297fc6, + 0x2e6a82, + 0x2e8642, + 0x200c02, + 0x30f006, + 0x29dc87, + 0x200b82, + 0x208782, + 0x26768f, + 0x2824cd, + 0x284d8e, + 0x356a0c, + 0x20d342, + 0x207482, + 0x228085, + 0x3b3086, + 0x212182, + 0x208b02, + 0x204b42, + 0x282844, + 0x2cf344, + 0x338a86, + 0x201bc2, + 0x275247, + 0x214343, + 0x21cb88, + 0x224348, + 0x239247, + 0x33fbc6, + 0x2015c2, + 0x239bc3, + 0x35bf87, + 0x266c86, + 0x2d6585, + 0x2d8e88, + 0x208d82, + 0x3211c7, + 0x20dfc2, + 0x35b202, + 0x20ad82, + 0x2bf8c9, 0x200242, 0x200a02, - 0x234383, - 0x32a387, - 0x2013c2, - 0x33d58c, - 0x33d88b, - 0x2793c6, - 0x20b8c5, - 0x21f6c2, - 0x2020c2, - 0x2b1d06, - 0x22aa83, - 0x33f547, - 0x242c82, - 0x206882, - 0x250915, - 0x384495, - 0x25fc93, - 0x3849d3, - 0x26bf07, - 0x289688, - 0x289690, - 0x28af0f, - 0x28fd53, - 0x2914d2, - 0x29fb90, - 0x2a8bcf, - 0x336352, - 0x31f291, - 0x34ed13, - 0x2ba952, - 0x2c0ecf, - 0x2c944e, - 0x2cba12, - 0x2cc851, - 0x2cd84f, - 0x2ce5ce, - 0x2fa911, - 0x2d9e10, - 0x2dd392, - 0x2e1dd1, - 0x2e25c6, - 0x2e4bc7, - 0x2f7947, - 0x205542, - 0x27f985, - 0x35a847, - 0x21ce42, - 0x208d02, - 0x228f05, - 0x21c743, - 0x2741c6, - 0x2d020d, - 0x2d054c, - 0x201502, - 0x31d24b, - 0x22504a, - 0x2eaf4a, - 0x2b0fc9, - 0x2dbe4b, - 0x204ccd, - 0x36cb8c, - 0x21ce8a, - 0x220c0c, - 0x33940b, - 0x26dbcc, - 0x270c0b, - 0x33d383, - 0x289286, - 0x2e7a82, - 0x2e7242, - 0x21e383, - 0x203f02, - 0x2047c3, - 0x2498c6, - 0x25b647, - 0x273406, - 0x2e8ec8, - 0x257e08, - 0x2f0646, - 0x2049c2, - 0x2f378d, - 0x2f3acc, - 0x2afd47, - 0x2f8b87, - 0x20c702, - 0x236e02, - 0x241342, - 0x32bd42, - 0x204a82, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x2161c3, + 0x222c43, + 0x321887, + 0x201a02, + 0x34718c, + 0x34748b, + 0x276a86, + 0x20cdc5, + 0x224982, + 0x206ec2, + 0x2b3006, + 0x229083, + 0x340d07, + 0x246002, + 0x200cc2, + 0x248e15, + 0x32a415, + 0x24dd53, + 0x32a953, + 0x264dc7, + 0x288288, + 0x288290, + 0x289b0f, + 0x28bf13, + 0x2a3fd2, + 0x2a9410, + 0x2e79cf, + 0x2f14d2, + 0x351551, + 0x2afb13, + 0x2bf692, + 0x2c8d0f, + 0x2cb38e, + 0x2cc152, + 0x2cd191, + 0x2cdd8f, + 0x2ced4e, + 0x2d4c11, + 0x2e0090, + 0x2e4452, + 0x2e55d1, + 0x2e6b06, + 0x2e89c7, + 0x2f77c7, + 0x201582, + 0x27a485, + 0x2f2447, + 0x221e42, + 0x203c42, + 0x22c605, + 0x221303, + 0x26e246, + 0x2d0b0d, + 0x2d0e4c, + 0x203dc2, + 0x27fdcb, + 0x219cca, + 0x31b28a, + 0x2b22c9, + 0x2dd20b, + 0x3b0fcd, + 0x2f2b4c, + 0x2144ca, + 0x221e8c, + 0x24d10b, + 0x268e4c, + 0x26c10b, + 0x346f83, + 0x287e86, + 0x326e82, + 0x2e9202, + 0x208943, + 0x205882, + 0x205883, + 0x238406, + 0x25ca07, + 0x271406, + 0x2ea8c8, + 0x22cb88, + 0x2f0206, + 0x22d742, + 0x2f508d, + 0x2f53cc, + 0x22d747, + 0x2f8787, + 0x2156c2, + 0x21bf02, + 0x21eb82, + 0x24b982, + 0x216582, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x212444, + 0x238483, + 0x2264c3, + 0x217643, 0x200882, 0x200702, - 0x21a8d2c5, - 0x21e031c5, - 0x22309946, - 0x894c8, - 0x226ae205, - 0x204a82, - 0x201802, - 0x22b27605, - 0x22e7d805, - 0x2327ea47, - 0x23612609, - 0x23a57284, - 0x2095c2, - 0x21a042, - 0x23f808c5, - 0x2428f9c9, - 0x2470cf88, - 0x24aac305, - 0x24ebf387, - 0x25217788, - 0x256d6205, - 0x25a03606, - 0x25ed7ac9, - 0x26373f08, - 0x266b96c8, - 0x26a97d0a, - 0x26e457c4, - 0x272c9b05, - 0x276b4c88, - 0x27a67a05, - 0x2175c2, - 0x27e00343, - 0x282a0b86, - 0x28641bc8, - 0x28a087c6, - 0x28f0f188, - 0x2931d706, - 0x29701044, - 0x201cc2, - 0x29a404c7, - 0x29ea7ac4, - 0x2a276e47, - 0x2a79f6c7, - 0x2016c2, - 0x2aa98a85, - 0x2af2df84, - 0x2b3744c7, - 0x2b61c307, - 0x2ba81986, - 0x2be2af85, - 0x2c292307, - 0x2c6d0ec8, - 0x2cb1b5c7, - 0x2ceab1c9, - 0x2d38dd45, - 0x2d736047, - 0x2da8cb46, - 0x2de546c8, - 0x2c834d, - 0x23e149, - 0x2e0e0b, - 0x382f0b, - 0x27130b, - 0x2a380b, - 0x3006cb, - 0x30098b, - 0x300d89, - 0x301e4b, - 0x30210b, - 0x30268b, - 0x3035ca, - 0x303b0a, - 0x30410c, - 0x30764b, - 0x307a8a, - 0x31a60a, - 0x32b44e, - 0x32c04e, - 0x32c3ca, - 0x32e54a, - 0x32f08b, - 0x32f34b, - 0x32fecb, - 0x34960b, - 0x349c0a, - 0x34a8cb, - 0x34ab8a, - 0x34ae0a, - 0x34b08a, - 0x36fbcb, - 0x377d0b, - 0x37968e, - 0x379a0b, - 0x3831cb, - 0x38540b, - 0x3898ca, - 0x389b49, - 0x389d8a, - 0x38b40a, - 0x39cb4b, - 0x39e68b, - 0x39f00a, - 0x3a0e0b, - 0x3a590b, - 0x3b198b, - 0x2e280048, - 0x2e686b89, - 0x2eb5e8c9, - 0x2eecf548, - 0x336b05, - 0x202c83, - 0x20d2c4, - 0x2e7d45, - 0x256fc6, - 0x260585, - 0x285d04, - 0x26d788, - 0x21db45, - 0x28e684, - 0x201b07, - 0x29abca, - 0x35504a, - 0x35de07, + 0x2368c545, + 0x23a03985, + 0x23f0b146, + 0x880c8, + 0x242b0185, + 0x216582, + 0x201a42, + 0x24755c45, + 0x24a786c5, + 0x24e79547, + 0x2527b109, + 0x2564b084, + 0x201f82, + 0x20b2c2, + 0x25a43785, + 0x25e8bb89, + 0x26311f08, + 0x266abe45, + 0x26b0bc07, + 0x26e18948, + 0x272d8045, + 0x27604606, + 0x27b47b09, + 0x27f25348, + 0x282b8888, + 0x2869310a, + 0x28a48444, + 0x28ec9405, + 0x292b5dc8, + 0x29616c85, + 0x21ac42, + 0x29a00343, + 0x29ea2f86, + 0x2a233a88, + 0x2a69e2c6, + 0x2aa9ddc8, + 0x2ae09c86, + 0x2b2f6284, + 0x205902, + 0x2b73b7c7, + 0x2baa8444, + 0x2be746c7, + 0x2c333a07, + 0x201502, + 0x2c696ec5, + 0x2ca31504, + 0x2cf7fd07, + 0x2d211e47, + 0x2d67c906, + 0x2da29585, + 0x2de91bc7, + 0x2e2d1a48, + 0x2e60ab87, + 0x2eb12b09, + 0x2eec0f45, + 0x2f32bb87, + 0x2f68b886, + 0x2fa51008, + 0x225a4d, + 0x242bc9, + 0x2e4ccb, + 0x3726cb, + 0x26f30b, + 0x2a564b, + 0x2ffd0b, + 0x2fffcb, + 0x300849, + 0x30208b, + 0x30234b, + 0x30290b, + 0x30340a, + 0x30394a, + 0x303f4c, + 0x308e0b, + 0x30964a, + 0x31c18a, + 0x32734e, + 0x3282ce, + 0x32864a, + 0x32b14a, + 0x32cb4b, + 0x32ce0b, + 0x32dd0b, + 0x34c50b, + 0x34cb0a, + 0x34d7cb, + 0x34da8a, + 0x34dd0a, + 0x34df8a, + 0x373f4b, + 0x37c18b, + 0x37dace, + 0x37de4b, + 0x3849cb, + 0x38598b, + 0x3893ca, + 0x389649, + 0x38988a, + 0x38af0a, + 0x39c60b, + 0x39e64b, + 0x39f24a, + 0x3a02cb, + 0x3a4f0b, + 0x3b26cb, + 0x2fe7ab48, + 0x30285289, + 0x30626809, + 0x30acfe48, + 0x338805, + 0x203443, + 0x204204, + 0x327145, + 0x24adc6, + 0x259145, + 0x284404, + 0x26bcc8, + 0x3739c5, + 0x28d904, + 0x3b3f87, + 0x2996ca, + 0x3605ca, + 0x336947, + 0x203347, + 0x2f10c7, + 0x362607, + 0x2b9d05, + 0x306d46, + 0x2fb0c7, + 0x3a2784, + 0x376b06, + 0x376a06, + 0x3a3745, + 0x280584, + 0x2d3d46, + 0x298387, + 0x225d46, + 0x2c7ec7, + 0x28d6c3, + 0x268446, + 0x2328c5, + 0x279647, + 0x266fca, + 0x263204, + 0x2180c8, + 0x2fb649, + 0x2ce487, + 0x3aed06, + 0x29f988, + 0x306409, + 0x2e6244, + 0x35d804, + 0x2f9685, + 0x2fadc8, + 0x2bd1c7, + 0x2aa009, + 0x327c48, + 0x2fc706, + 0x379bc6, + 0x2943c8, + 0x375fc6, + 0x203985, + 0x27c9c6, + 0x274bc8, + 0x2347c6, + 0x25708b, + 0x233406, + 0x295d4d, + 0x358a45, + 0x2a8306, + 0x218a05, + 0x297c89, + 0x2f1d07, + 0x382048, + 0x2db2c6, + 0x294ac9, + 0x3a6246, + 0x266f45, + 0x29c1c6, + 0x2a8e86, + 0x2c2909, + 0x306206, + 0x279247, + 0x33cf05, + 0x205703, + 0x257205, + 0x296007, + 0x323446, + 0x358949, + 0x30b146, + 0x27cc06, + 0x365389, + 0x27c3c9, + 0x29ca07, + 0x369fc8, + 0x39ee89, + 0x27a108, + 0x31f686, + 0x2cc9c5, + 0x30a44a, + 0x27cc86, + 0x330bc6, + 0x2a3145, + 0x24d588, + 0x206847, + 0x2318ca, + 0x247786, + 0x243005, + 0x2a0e06, + 0x265b47, + 0x3aebc7, + 0x2bacc5, + 0x267105, + 0x2acf46, + 0x383446, + 0x2ad886, + 0x328cc4, + 0x27b489, + 0x286146, + 0x2a5a0a, + 0x214048, + 0x32b888, + 0x3605ca, + 0x202145, + 0x2982c5, + 0x323c48, + 0x2c9188, + 0x320d47, + 0x265146, + 0x315308, 0x202b87, - 0x2f16c7, - 0x364307, - 0x3af485, - 0x30fdc6, - 0x3287c7, - 0x247004, - 0x2fbe46, - 0x3a5246, - 0x3b31c5, - 0x305a04, - 0x2b8306, - 0x299fc7, - 0x2298c6, - 0x37c747, - 0x27a403, - 0x248f46, - 0x22f405, - 0x27eb47, - 0x2bde8a, - 0x22cd04, - 0x215988, - 0x2aac49, - 0x2c6c07, - 0x24b286, - 0x2de448, - 0x39fa49, - 0x234cc4, - 0x35e484, - 0x2fa145, - 0x2020c8, - 0x2be687, - 0x2a7149, - 0x23dc08, - 0x2fd446, - 0x23f046, - 0x295b48, - 0x372286, - 0x2031c5, - 0x281a46, - 0x277548, - 0x230b46, - 0x24d90b, - 0x233346, - 0x29788d, - 0x399e85, - 0x2a7986, - 0x2085c5, - 0x294709, - 0x341c87, - 0x37fd88, - 0x36d906, - 0x296249, - 0x2ee4c6, - 0x2bde05, - 0x27ba86, - 0x2a8646, - 0x2c4ec9, - 0x234ac6, - 0x36e4c7, - 0x2d71c5, - 0x204643, - 0x24da85, - 0x297b47, - 0x3274c6, - 0x399d89, - 0x309946, - 0x281c86, - 0x37d649, - 0x281449, - 0x29dd87, - 0x310e88, - 0x28f009, - 0x27f608, - 0x320146, - 0x2cd085, - 0x30888a, - 0x281d06, - 0x37df46, - 0x2a0d45, - 0x387ac8, - 0x20e647, - 0x3abe8a, - 0x244b06, - 0x2e7805, - 0x365bc6, - 0x326787, - 0x24b147, - 0x2bbb85, - 0x2bdfc5, - 0x29e106, - 0x2acd46, - 0x387106, - 0x330844, - 0x2809c9, - 0x287a46, - 0x28c58a, - 0x2171c8, - 0x335d48, - 0x35504a, - 0x359445, - 0x299f05, - 0x382a08, - 0x2c9888, - 0x332447, - 0x2023c6, - 0x313d48, - 0x2e1447, - 0x27ec88, - 0x368d46, - 0x282f08, - 0x2b2886, - 0x238847, - 0x296c86, - 0x2b8306, - 0x23280a, - 0x381fc6, - 0x2cd089, - 0x2ae506, - 0x2d180a, - 0x301049, - 0x2f0746, - 0x386bc4, - 0x31b30d, - 0x286e07, - 0x3163c6, - 0x2b9585, - 0x2ee545, - 0x31b806, - 0x26f609, - 0x2db807, - 0x278606, - 0x2c6606, - 0x285d89, - 0x2bf544, - 0x22a504, - 0x203888, - 0x249c86, - 0x26f188, - 0x27ba08, - 0x282987, + 0x279788, + 0x35f146, + 0x27dd08, + 0x2b3b86, + 0x2370c7, + 0x295506, + 0x2d3d46, + 0x23628a, + 0x392986, + 0x2cc9c9, + 0x2b0486, + 0x2d238a, + 0x2f6289, + 0x2f0306, + 0x37c504, + 0x20a8cd, + 0x285507, + 0x317906, + 0x2b8745, + 0x3a62c5, + 0x305546, + 0x26d9c9, + 0x3ad5c7, + 0x275cc6, + 0x2cd946, + 0x284489, + 0x212a44, + 0x228dc4, + 0x204308, + 0x2387c6, + 0x26d548, + 0x2d6b88, + 0x203ac7, 0x200849, - 0x387307, - 0x2ae0ca, - 0x27b3cf, - 0x243b4a, - 0x222085, - 0x277785, - 0x214cc5, - 0x2aeb07, - 0x205d83, - 0x311088, - 0x2f43c6, - 0x2f44c9, - 0x2af546, - 0x2c3807, - 0x296009, - 0x37fc88, - 0x2a0e07, - 0x2ffa83, - 0x336b85, + 0x2ada87, + 0x2b004a, + 0x22decf, + 0x2377ca, + 0x227e85, + 0x274e05, + 0x216005, + 0x334507, + 0x277283, + 0x36a1c8, + 0x334d86, + 0x334e89, + 0x2c6a06, + 0x2c2747, + 0x294889, + 0x381f48, + 0x2a3207, + 0x2fee83, + 0x338885, + 0x3b2005, + 0x328b0b, + 0x216d44, + 0x2c5044, + 0x273486, + 0x2ff447, + 0x39794a, + 0x245807, + 0x3b0407, + 0x2786c5, + 0x205285, + 0x2196c9, + 0x2d3d46, + 0x24568d, + 0x358045, + 0x2a2d43, + 0x205d03, + 0x349205, + 0x350005, + 0x29f988, + 0x276707, + 0x228b46, + 0x29a646, + 0x22d905, + 0x234687, + 0x2035c7, + 0x36ec47, + 0x2c948a, + 0x268508, + 0x328cc4, + 0x2ade47, + 0x277cc7, + 0x32d086, + 0x264607, + 0x2b2a08, + 0x226708, + 0x26b786, + 0x367f08, + 0x2c32c4, + 0x2fb0c6, + 0x3a9146, + 0x2c0a86, + 0x349c06, + 0x29abc4, + 0x3626c6, + 0x2b76c6, + 0x293606, + 0x2293c6, + 0x205bc6, + 0x2b2846, + 0x228a48, + 0x39de08, + 0x2c9cc8, + 0x259348, + 0x323bc6, + 0x210785, + 0x275386, + 0x2abec5, + 0x388807, + 0x28ae45, + 0x213d43, + 0x364605, + 0x22fd84, 0x205d05, - 0x33068b, - 0x267ac4, - 0x2d2d44, - 0x276106, - 0x2ffe07, - 0x39814a, - 0x242487, - 0x234d47, - 0x27d805, - 0x2041c5, - 0x224a49, - 0x2b8306, - 0x24230d, - 0x358585, - 0x3029c3, - 0x206c43, - 0x346ec5, - 0x34d7c5, - 0x2de448, - 0x279047, - 0x22a286, - 0x29b9c6, - 0x22a845, - 0x230a07, - 0x202e07, - 0x3627c7, - 0x2c9b8a, - 0x249008, - 0x330844, - 0x3876c7, - 0x27a547, - 0x32ed06, - 0x266307, - 0x2b1708, - 0x35e7c8, - 0x26d246, - 0x264788, - 0x234b44, - 0x3287c6, - 0x20f646, - 0x3658c6, - 0x3478c6, - 0x29bf44, - 0x3643c6, - 0x2b8506, - 0x294d86, - 0x22adc6, - 0x206b06, - 0x2b1546, - 0x22a188, - 0x2fbcc8, - 0x2ca688, - 0x260788, - 0x382986, - 0x20dd85, - 0x277d06, - 0x2ac385, - 0x388d07, - 0x23dcc5, - 0x213a43, - 0x200e85, - 0x22a744, - 0x206c45, - 0x212b83, - 0x2f2b47, - 0x31a8c8, - 0x37c806, - 0x36918d, - 0x277746, - 0x293ec5, - 0x2bab83, - 0x2b4649, - 0x2bf6c6, - 0x2944c6, - 0x29d644, - 0x243ac7, - 0x231e86, - 0x387905, - 0x2327c3, - 0x203d04, - 0x27a706, - 0x2d2f44, - 0x30bc88, - 0x397609, - 0x342189, - 0x29d44a, - 0x23ac0d, - 0x30ee07, - 0x37ddc6, - 0x20d9c4, - 0x212609, - 0x2851c8, - 0x286a06, - 0x261386, - 0x266307, - 0x2bff86, - 0x21b206, - 0x397906, - 0x39f74a, - 0x217788, - 0x22d785, - 0x2826c9, - 0x27f18a, - 0x369508, - 0x299548, - 0x294448, - 0x20320c, - 0x2e5085, - 0x29bc48, - 0x309346, - 0x2d1186, - 0x375e47, - 0x242385, - 0x281bc5, - 0x342049, - 0x212287, - 0x2b1bc5, - 0x21cc87, - 0x206c43, - 0x2bebc5, - 0x37eb08, - 0x2ce187, - 0x299409, - 0x2d4005, - 0x2fb844, - 0x29f308, - 0x20be47, - 0x2a0fc8, - 0x329fc8, - 0x2ebdc5, - 0x240dc6, - 0x264e46, - 0x2e3109, - 0x3145c7, - 0x2ac786, - 0x31c787, - 0x212a03, - 0x257284, - 0x29b305, - 0x257444, - 0x33e8c4, - 0x248687, - 0x206287, - 0x2787c4, - 0x299250, - 0x322187, - 0x2041c5, - 0x33df0c, - 0x2b77c4, - 0x2f9648, - 0x238749, - 0x300546, - 0x227d08, - 0x259404, - 0x259408, - 0x388046, - 0x22ac48, - 0x29b006, - 0x2c89cb, - 0x204645, - 0x2c4a08, - 0x216cc4, - 0x28074a, - 0x299409, - 0x227e86, - 0x2d6cc8, - 0x256405, - 0x2ff184, - 0x2f9546, - 0x362688, - 0x280048, - 0x344586, - 0x325944, - 0x308806, - 0x387387, - 0x276d47, - 0x26630f, + 0x210143, + 0x39a7c7, + 0x31c448, + 0x2c7f86, + 0x2c514d, + 0x274dc6, + 0x292b85, + 0x2afd43, + 0x2b5789, + 0x212bc6, + 0x231246, + 0x29c2c4, + 0x237747, + 0x235b06, + 0x243245, + 0x216ec3, + 0x378a44, + 0x277e86, + 0x2b15c4, + 0x30d748, + 0x324a89, + 0x2f2209, + 0x29c0ca, + 0x23f88d, + 0x29da47, + 0x330a46, + 0x20ec44, + 0x27b109, + 0x283588, + 0x285106, + 0x263bc6, + 0x264607, + 0x2c3c06, + 0x21b606, + 0x38c346, + 0x333a8a, + 0x218948, + 0x22bc45, + 0x27d649, + 0x279c8a, + 0x2c54c8, + 0x2979c8, + 0x292108, + 0x2a864c, + 0x2dc7c5, + 0x29a8c8, + 0x39e106, + 0x2d1d06, + 0x37af07, + 0x245705, + 0x27cb45, + 0x2f20c9, + 0x212747, + 0x2b2ec5, + 0x21e9c7, + 0x205d03, + 0x2bd705, + 0x366548, + 0x2d1687, + 0x297889, + 0x2d7985, + 0x2f4504, + 0x2a1788, + 0x2cf787, + 0x2a33c8, + 0x2740c8, + 0x32c005, + 0x334c86, + 0x257706, + 0x2e7649, + 0x315b87, + 0x2ac986, + 0x30e947, + 0x217d43, + 0x24b084, + 0x298c45, + 0x2ae0c4, + 0x236844, + 0x27adc7, + 0x3affc7, + 0x239a04, + 0x2976d0, + 0x3056c7, + 0x205285, + 0x22ae8c, + 0x2018c4, + 0x2bee08, + 0x236fc9, + 0x2ffb86, + 0x2a03c8, + 0x25a7c4, + 0x25a7c8, + 0x231ec6, + 0x229248, + 0x298946, + 0x2c828b, + 0x205705, + 0x2c3248, + 0x21a3c4, + 0x27c04a, + 0x297889, + 0x2e0d06, + 0x2160c8, + 0x258645, + 0x301944, + 0x2bed06, + 0x36eb08, + 0x27ab48, + 0x345d06, + 0x31d6c4, + 0x30a3c6, + 0x2adb07, + 0x2745c7, + 0x26460f, 0x2074c7, - 0x2f0807, - 0x2d1045, - 0x2ec8c5, - 0x29da49, - 0x28c246, - 0x27e005, - 0x281747, - 0x2d6f88, - 0x294e85, - 0x296c86, - 0x217008, - 0x2087ca, - 0x2845c8, - 0x3adfc7, - 0x27b806, - 0x282686, - 0x205303, - 0x20d383, - 0x27f349, - 0x28ee89, - 0x2ab0c6, - 0x2d4005, - 0x2a4188, - 0x2d6cc8, - 0x2b9ec8, - 0x39798b, - 0x3693c7, - 0x2fdd89, - 0x266588, + 0x2f03c7, + 0x2d1bc5, + 0x2ed845, + 0x29c6c9, + 0x28ae86, + 0x278fc5, + 0x27c6c7, + 0x37b188, + 0x293705, + 0x295506, + 0x213e88, + 0x29e2ca, + 0x282988, + 0x287947, + 0x22e306, + 0x27d606, + 0x21f283, + 0x2042c3, + 0x279e49, + 0x39ed09, + 0x2bec06, + 0x2d7985, + 0x2a84c8, + 0x2160c8, + 0x387808, + 0x38c3cb, + 0x2c5387, + 0x2fd189, + 0x264888, + 0x33c7c4, + 0x2c2a08, + 0x2895c9, + 0x2acc85, + 0x334407, + 0x24b105, + 0x27aa48, + 0x28c3cb, + 0x291910, + 0x2a8105, + 0x21a30c, + 0x228d05, + 0x2032c3, + 0x2a2c06, + 0x2b6e04, + 0x231606, + 0x298387, + 0x213f04, + 0x2415c8, + 0x36a08d, + 0x2d9685, + 0x23fd84, + 0x219904, + 0x27d0c9, + 0x297408, + 0x30afc7, + 0x231f48, + 0x27b548, + 0x275fc5, + 0x331547, + 0x275f47, + 0x20af07, + 0x267109, + 0x235989, + 0x23f346, + 0x2b39c6, + 0x264846, + 0x25b8c5, + 0x3af344, + 0x204506, + 0x204a46, + 0x276008, + 0x26580b, + 0x2630c7, + 0x20ec44, + 0x317d86, + 0x203107, + 0x348b45, + 0x318f05, + 0x201e84, + 0x235906, + 0x204588, + 0x27b109, + 0x257c86, + 0x282f08, + 0x243306, + 0x33ce48, + 0x2d8a8c, + 0x275e86, + 0x29284d, + 0x292ccb, + 0x279305, + 0x203707, + 0x306306, + 0x3aea88, + 0x23f3c9, + 0x2e7288, + 0x205285, + 0x2ecc07, + 0x27a208, + 0x384789, + 0x2a05c6, + 0x33bfca, + 0x3ae808, + 0x2e70cb, + 0x2c608c, + 0x25a8c8, + 0x277506, + 0x334708, + 0x29df47, + 0x2cfa09, + 0x28ba8d, + 0x2961c6, + 0x3017c8, + 0x39dcc9, + 0x2b6188, + 0x27de08, + 0x2b7f8c, + 0x2b9347, + 0x2b9f07, + 0x266f45, + 0x3a4d47, + 0x37b048, + 0x2bed86, + 0x257b0c, + 0x2e4988, + 0x2c44c8, + 0x24b5c6, + 0x3b1d87, + 0x23f544, + 0x259348, + 0x356e4c, + 0x3a1a0c, + 0x227f05, + 0x393d47, + 0x31d646, + 0x3b1d06, + 0x297e48, + 0x38c284, + 0x225d4b, + 0x22844b, + 0x22e306, + 0x369f07, + 0x307d45, + 0x26ca85, + 0x225e86, + 0x258605, + 0x216d05, + 0x3accc7, + 0x273a89, + 0x233504, + 0x2722c5, + 0x2d7645, + 0x254448, + 0x22b4c5, + 0x2a7809, + 0x2af2c7, + 0x2af2cb, + 0x2d1046, + 0x228789, + 0x2804c8, + 0x271c05, + 0x20b008, + 0x2359c8, + 0x207ec7, + 0x27d4c7, + 0x27ae49, + 0x229187, + 0x32d3c9, + 0x2aaf4c, + 0x312a08, + 0x2b9b49, + 0x2be7c7, + 0x27b609, + 0x3b0107, + 0x2c6188, + 0x3afac5, + 0x2fb046, + 0x2b8788, + 0x2f8b88, + 0x279b49, + 0x216d47, + 0x26cb45, + 0x20e3c9, + 0x2c4086, + 0x28b884, + 0x2e6f46, + 0x233908, + 0x2426c7, + 0x265a08, + 0x367fc9, + 0x261a47, + 0x299886, + 0x2037c4, + 0x364689, + 0x3313c8, + 0x24b487, + 0x306e46, + 0x3b20c6, + 0x330b44, + 0x27f886, + 0x205c83, + 0x308149, + 0x2056c6, + 0x2a61c5, + 0x29a646, + 0x2a3505, + 0x27a688, + 0x25a607, + 0x362446, + 0x355c86, + 0x32b888, + 0x29c847, + 0x296205, + 0x29ab48, + 0x39ea48, + 0x3ae808, + 0x228bc5, + 0x2fb0c6, + 0x2f1fc9, + 0x257584, + 0x3760cb, + 0x21b30b, + 0x22bb49, + 0x205d03, + 0x256385, + 0x205986, + 0x229908, + 0x22de44, + 0x2c7f86, + 0x2c95c9, + 0x2c5b05, + 0x3acc06, + 0x2cf786, + 0x2160c4, + 0x2a1b4a, + 0x2a6108, + 0x2f8b86, + 0x368a05, + 0x204887, + 0x301547, + 0x334c84, + 0x21b547, + 0x2b0044, + 0x2c0a06, + 0x202e03, + 0x267105, + 0x373445, + 0x207708, + 0x2ae005, + 0x275bc9, + 0x259187, + 0x25918b, + 0x2a2d8c, + 0x2a3a0a, + 0x30bc07, + 0x200a83, + 0x2d3948, + 0x228d85, + 0x293785, 0x338944, - 0x2c4fc8, - 0x28a9c9, - 0x2aca85, - 0x2aea07, - 0x2f49c5, - 0x27ff48, - 0x28d14b, - 0x292050, - 0x2a7785, - 0x216c0c, - 0x22a445, - 0x209203, - 0x2a6a46, - 0x2b6d84, - 0x32e086, - 0x299fc7, - 0x212a44, - 0x23c808, - 0x310f4d, - 0x2d6b85, - 0x23b104, - 0x221dc4, - 0x282149, - 0x2a06c8, - 0x3097c7, - 0x3880c8, - 0x280a88, - 0x278905, - 0x262a87, - 0x278887, - 0x2f5007, - 0x2bdfc9, - 0x231d09, - 0x23a6c6, - 0x2b26c6, - 0x266546, - 0x25a505, - 0x3b1504, - 0x203506, - 0x203a86, - 0x278948, - 0x32644b, - 0x267f07, - 0x20d9c4, - 0x316846, - 0x209047, - 0x346805, - 0x3179c5, - 0x204884, - 0x231c86, - 0x203588, - 0x212609, - 0x2559c6, - 0x284b48, - 0x3879c6, - 0x32f5c8, - 0x2b010c, - 0x2787c6, - 0x293b8d, - 0x29400b, - 0x36e585, - 0x202f47, - 0x234bc6, - 0x24b008, - 0x23a749, - 0x2e2d48, - 0x2041c5, - 0x2ed607, - 0x27f708, - 0x3a2509, - 0x240686, - 0x36e2ca, - 0x24ad88, - 0x2e2b8b, - 0x2cb44c, - 0x259508, - 0x279e46, - 0x262488, + 0x2c6086, + 0x236fc6, + 0x27f8c7, + 0x3656cb, + 0x29abc4, + 0x3821c4, + 0x26b904, + 0x2c25c6, + 0x213f04, + 0x2faec8, + 0x338745, + 0x23fec5, + 0x387747, + 0x203809, + 0x350005, + 0x375a4a, + 0x37b2c9, + 0x290f8a, + 0x333bc9, + 0x353144, + 0x2cda05, + 0x2c3d08, + 0x37fdcb, + 0x2f9685, + 0x38d4c6, + 0x2159c4, + 0x276106, + 0x2618c9, + 0x317e47, + 0x30b308, + 0x23fc06, + 0x2ada87, + 0x27ab48, + 0x38f586, + 0x280204, + 0x35eb87, + 0x34e905, + 0x360c07, + 0x204604, + 0x306286, + 0x218bc8, + 0x292e88, + 0x3a4ac7, + 0x217d88, + 0x2b3c45, + 0x205b44, + 0x3604c8, + 0x217e84, + 0x207ec5, + 0x2ed984, + 0x202c87, + 0x286207, + 0x27b748, + 0x2a3546, + 0x2adf85, + 0x2759c8, + 0x282b88, + 0x29c009, + 0x21b606, + 0x231948, + 0x27beca, + 0x348bc8, + 0x2d8045, + 0x275586, + 0x26d888, + 0x2eccca, + 0x341107, + 0x283985, + 0x28ef48, + 0x2b1184, + 0x24d606, + 0x2ba688, + 0x205bc6, + 0x380dc8, + 0x2573c7, + 0x3b3e86, + 0x37c504, + 0x29ce07, + 0x2fac04, + 0x261887, + 0x23108d, + 0x22bbc5, + 0x2d148b, + 0x298a46, + 0x24cb48, + 0x241584, + 0x272086, + 0x277e86, + 0x334a47, + 0x29250d, + 0x25fd07, + 0x300248, + 0x29fb05, + 0x284008, + 0x2bd146, + 0x2b3cc8, + 0x20e886, + 0x367707, + 0x368189, + 0x33f9c7, + 0x2853c8, + 0x26f705, + 0x21ed88, + 0x3b1c45, + 0x23b2c5, + 0x333e45, + 0x226743, + 0x27ca44, + 0x27d645, + 0x347b09, + 0x31b646, + 0x2b2b08, + 0x2ecec5, + 0x312447, + 0x249dca, + 0x3acb49, + 0x2a8d8a, + 0x2c9d48, + 0x21e80c, + 0x27c74d, + 0x2f86c3, + 0x380cc8, + 0x378a05, + 0x29e086, + 0x381dc6, + 0x2e3985, + 0x30ea49, + 0x310045, + 0x2759c8, + 0x279146, + 0x33f4c6, + 0x2a1649, + 0x38ed87, + 0x28c686, + 0x249d48, + 0x2c0988, + 0x2d0047, + 0x2293ce, + 0x2bd385, + 0x384685, + 0x205ac8, + 0x322d07, + 0x214782, + 0x2b7b04, + 0x23150a, + 0x24b548, + 0x203206, + 0x2949c8, + 0x257706, + 0x335988, + 0x2ac988, + 0x23b284, + 0x328945, + 0x683c04, + 0x683c04, + 0x683c04, + 0x203983, + 0x3b1f46, + 0x275e86, + 0x29924c, + 0x205b03, + 0x279c86, + 0x213f84, + 0x212b48, + 0x2c9405, + 0x231606, + 0x2b5ec8, + 0x2cb0c6, + 0x3623c6, + 0x29f788, + 0x298cc7, + 0x228f49, + 0x2e96ca, + 0x20abc4, + 0x28ae45, + 0x2a9fc5, + 0x2128c6, + 0x29da86, + 0x299c86, + 0x2ec386, + 0x229084, + 0x22908b, + 0x233904, + 0x204905, + 0x2ab5c5, + 0x203b86, + 0x359288, + 0x27c607, + 0x30b0c4, + 0x259cc3, + 0x2b0c85, + 0x2e6e07, + 0x2a4449, + 0x27c50b, + 0x27f8c7, 0x207607, - 0x231f89, - 0x28f8cd, - 0x29a486, - 0x3a5348, - 0x2fbb89, - 0x2b5048, - 0x283008, - 0x2b8dcc, - 0x2ba0c7, - 0x2badc7, - 0x2bde05, - 0x2e9d47, - 0x2d6e48, - 0x2f95c6, - 0x25584c, - 0x2e22c8, - 0x2c5f48, - 0x361fc6, - 0x205a87, - 0x23a8c4, - 0x260788, - 0x35748c, - 0x21f70c, - 0x222105, - 0x3943c7, - 0x3258c6, - 0x205a06, - 0x2948c8, - 0x3a3584, - 0x2298cb, - 0x22264b, - 0x27b806, - 0x310dc7, - 0x261f45, - 0x26e545, - 0x229a06, - 0x2563c5, - 0x267a85, - 0x376107, - 0x276709, - 0x233444, - 0x35ec85, - 0x2d53c5, - 0x24f708, - 0x229245, - 0x2a6549, - 0x2c2f87, - 0x2c2f8b, - 0x2d0746, - 0x229ec9, - 0x305948, - 0x27e545, - 0x2f5108, - 0x231d48, - 0x218687, - 0x282547, - 0x248709, - 0x22ab87, - 0x374bc9, - 0x2a910c, - 0x2ab0c8, - 0x3af2c9, - 0x2b5447, - 0x280b49, - 0x2063c7, - 0x2cb548, - 0x24fa45, - 0x328746, - 0x2b95c8, - 0x2d4d08, - 0x27f049, - 0x267ac7, - 0x26e605, - 0x2112c9, - 0x2c0406, - 0x28cb44, - 0x2e2a06, - 0x241a48, - 0x244507, - 0x326648, - 0x264849, - 0x361d47, - 0x29ad86, - 0x203004, - 0x200f09, - 0x262908, - 0x361e87, - 0x30fec6, - 0x205dc6, - 0x37dec4, - 0x2a7b86, - 0x206bc3, - 0x355e89, - 0x204606, - 0x29f785, - 0x29b9c6, - 0x2a1105, - 0x27fb88, - 0x259247, - 0x364146, - 0x327646, - 0x335d48, - 0x29dbc7, - 0x29a4c5, - 0x29bec8, - 0x38b7c8, - 0x24ad88, - 0x22a305, - 0x3287c6, - 0x341f49, - 0x264cc4, - 0x37238b, - 0x21af0b, - 0x22d689, - 0x206c43, - 0x250645, - 0x20dc46, - 0x2585c8, - 0x27b344, - 0x37c806, - 0x2c9cc9, - 0x2c5d45, - 0x376046, - 0x20be46, - 0x202344, - 0x2996ca, - 0x29f6c8, - 0x2d4d06, - 0x24c0c5, - 0x20c807, - 0x22ff87, - 0x240dc4, - 0x21b147, - 0x23dc84, - 0x23dc86, - 0x217143, - 0x2bdfc5, - 0x370105, - 0x20c1c8, - 0x257385, - 0x278509, - 0x2605c7, - 0x2605cb, - 0x2a098c, - 0x2a200a, - 0x2bf387, - 0x201043, - 0x2e3688, - 0x22a4c5, - 0x294f05, - 0x336c44, - 0x2cb446, - 0x238746, - 0x2a7bc7, - 0x38c5cb, - 0x29bf44, - 0x37ff04, - 0x26d3c4, - 0x2c4746, - 0x212a44, - 0x2021c8, - 0x336a45, - 0x23b245, - 0x2b9e07, - 0x203049, - 0x34d7c5, - 0x371d0a, - 0x2d70c9, - 0x299b0a, - 0x39f889, - 0x385304, - 0x2c66c5, - 0x2c0088, - 0x37458b, - 0x2fa145, - 0x27bb86, - 0x21a544, - 0x278a46, - 0x361bc9, - 0x316907, - 0x309b08, - 0x23af86, - 0x387307, - 0x280048, - 0x38f206, - 0x23e684, - 0x360487, - 0x3458c5, - 0x34ba07, - 0x203604, - 0x234b46, - 0x217a08, - 0x2941c8, - 0x2e9ac7, - 0x212a48, - 0x2b2945, - 0x206a84, - 0x354f48, - 0x212b44, - 0x214c45, - 0x2eca04, - 0x2e1547, - 0x287b07, - 0x280c88, - 0x2a1146, - 0x257305, - 0x278308, - 0x2847c8, - 0x29d389, - 0x21b206, - 0x3abf08, - 0x2805ca, - 0x346888, - 0x2d6205, - 0x277f06, - 0x26f4c8, - 0x2ed6ca, - 0x305b47, - 0x2855c5, - 0x292848, - 0x2ad704, - 0x387b46, - 0x2bb548, - 0x206b06, - 0x359748, - 0x264b07, - 0x201a06, - 0x386bc4, - 0x37bdc7, - 0x2fefc4, - 0x361b87, - 0x2de18d, - 0x22d705, - 0x2cdf8b, - 0x29b106, - 0x248408, - 0x23c7c4, - 0x275446, - 0x27a706, - 0x2627c7, - 0x29384d, - 0x2a9dc7, - 0x302908, - 0x247705, - 0x2a7d08, - 0x2be606, - 0x2b29c8, - 0x211dc6, - 0x263f87, - 0x281009, - 0x339b47, - 0x286cc8, - 0x271705, - 0x21a888, - 0x205945, - 0x235cc5, - 0x358e45, - 0x222383, - 0x281ac4, - 0x2826c5, - 0x2d7ac9, - 0x324e86, - 0x2b1808, - 0x3a9485, - 0x32c607, - 0x246e0a, - 0x375f89, - 0x2a854a, - 0x2ca708, - 0x21cacc, - 0x2817cd, - 0x304983, - 0x359648, - 0x203cc5, - 0x208586, - 0x37fb06, - 0x2d5d45, - 0x31c889, - 0x355305, - 0x278308, - 0x251a46, - 0x33a446, - 0x29f1c9, - 0x38ea07, - 0x28d406, - 0x246d88, - 0x3657c8, - 0x2cf747, - 0x22adce, - 0x2be845, - 0x3a2405, - 0x206a08, - 0x326d87, - 0x205e02, - 0x2b8944, - 0x32df8a, - 0x361f48, - 0x209146, - 0x296148, - 0x264e46, - 0x323348, - 0x2ac788, - 0x235c84, - 0x3304c5, - 0x685844, - 0x685844, - 0x685844, - 0x2031c3, - 0x205c46, - 0x2787c6, - 0x29a74c, - 0x201a43, - 0x27f186, - 0x217104, - 0x2bf648, - 0x2c9b05, - 0x32e086, - 0x2b4d88, - 0x2cb746, - 0x3640c6, - 0x323848, - 0x29b387, - 0x22a949, - 0x2c864a, - 0x26aa44, - 0x23dcc5, - 0x2a7105, - 0x212406, - 0x30ee46, - 0x2a4586, - 0x2eb986, - 0x22aa84, - 0x22aa8b, - 0x22ff84, - 0x20c885, - 0x2ab645, - 0x282a46, - 0x3aae88, - 0x281687, - 0x3098c4, - 0x258903, - 0x2ad205, - 0x2e28c7, - 0x2a2609, - 0x28158b, - 0x2a7bc7, - 0x20c0c7, - 0x2b4c88, - 0x32c747, - 0x2a2846, - 0x23e408, - 0x2a478b, - 0x2e7c86, - 0x212d09, - 0x2a4905, - 0x2ffa83, - 0x376046, - 0x264a08, - 0x211e83, - 0x234c83, - 0x280046, - 0x264e46, - 0x38b18a, - 0x279e85, - 0x27a54b, - 0x29b90b, - 0x23bf83, - 0x21b543, - 0x2ae044, - 0x2643c7, - 0x259504, - 0x203204, - 0x3091c4, - 0x346b88, - 0x24c008, - 0x31c1c9, - 0x38ddc8, - 0x39fc07, - 0x22adc6, - 0x2b144f, - 0x2be986, - 0x2c9a84, - 0x24be4a, - 0x2e27c7, - 0x3b3246, - 0x28cb89, - 0x31c145, - 0x20c305, - 0x31c286, - 0x21a9c3, - 0x2ad749, - 0x217906, - 0x264609, - 0x398146, - 0x2bdfc5, - 0x222505, - 0x205cc3, - 0x264508, - 0x228b07, - 0x2f43c4, - 0x2bf4c8, - 0x2b8084, - 0x2c6f86, - 0x2a6a46, - 0x239786, - 0x2c48c9, - 0x294e85, - 0x2b8306, - 0x2667c9, - 0x3ae786, - 0x2b1546, - 0x386f46, - 0x2104c5, - 0x2eca06, - 0x263f84, - 0x24fa45, - 0x2b95c4, - 0x3090c6, - 0x358544, - 0x2064c3, - 0x285285, - 0x231a48, - 0x223947, - 0x2b3249, - 0x2854c8, - 0x295911, - 0x20beca, - 0x27b747, - 0x2edf06, - 0x217104, - 0x2b96c8, - 0x283b88, - 0x295aca, - 0x2a630d, - 0x27ba86, - 0x323946, - 0x37be86, - 0x2bba07, - 0x3029c5, - 0x254587, - 0x2bf585, - 0x2c30c4, - 0x2a5d46, - 0x328607, - 0x2ad44d, - 0x26f407, - 0x26d688, - 0x278609, - 0x277e06, - 0x240605, - 0x2145c4, - 0x241b46, - 0x240cc6, - 0x3620c6, - 0x298c48, - 0x210383, - 0x24f943, - 0x30fb85, - 0x31e686, - 0x2ac745, - 0x23b188, - 0x29a18a, - 0x30f304, - 0x2bf648, - 0x294448, - 0x282887, - 0x3a9549, - 0x2b4988, - 0x212687, - 0x26c106, - 0x206b0a, - 0x241bc8, - 0x2cb289, - 0x2a0788, - 0x217f09, - 0x2e2e47, - 0x2eb385, - 0x35ea46, - 0x2f9448, - 0x323a48, - 0x24db48, - 0x214d88, - 0x20c885, + 0x2b5dc8, + 0x312587, + 0x2a4686, + 0x242e88, + 0x299e8b, + 0x327086, + 0x213a89, + 0x29a005, + 0x2fee83, + 0x3acc06, + 0x2572c8, + 0x20e943, + 0x2e6f03, + 0x27ab46, + 0x257706, + 0x38ac8a, + 0x277545, + 0x277ccb, + 0x29a58b, + 0x240a03, + 0x20f943, + 0x2affc4, + 0x367b47, + 0x257344, + 0x2039c4, + 0x39df84, + 0x348ec8, + 0x368948, + 0x30e389, + 0x2c0fc8, + 0x3065c7, + 0x2293c6, + 0x2b274f, + 0x2bd4c6, + 0x2c9384, + 0x36878a, + 0x2e6d07, + 0x3a37c6, + 0x28b8c9, + 0x30e305, + 0x207845, + 0x30e446, + 0x21eec3, + 0x2b11c9, + 0x218ac6, + 0x367d89, + 0x397946, + 0x267105, + 0x228305, + 0x2074c3, + 0x367c88, + 0x2df587, + 0x334d84, + 0x2129c8, + 0x2d3ac4, + 0x2d4646, + 0x2a2c06, + 0x23e7c6, + 0x2c3109, + 0x293705, + 0x2d3d46, + 0x264ac9, + 0x3ac846, + 0x2b2846, + 0x387c46, + 0x2119c5, + 0x2ed986, + 0x367704, + 0x3afac5, + 0x2b8784, + 0x309246, + 0x358004, + 0x202c83, + 0x283645, + 0x2356c8, + 0x21e007, + 0x2b4549, + 0x283888, + 0x294191, + 0x2cf80a, + 0x22e247, + 0x2ee8c6, + 0x213f84, + 0x2b8888, + 0x239748, + 0x29434a, + 0x2a75cd, + 0x29c1c6, + 0x29f886, + 0x29cec6, + 0x2bab47, + 0x300305, + 0x250ec7, + 0x212a85, + 0x2af404, + 0x2a7006, + 0x27f707, + 0x2b0ecd, + 0x26d7c7, + 0x26bbc8, + 0x275cc9, + 0x275486, + 0x2a0545, + 0x210184, + 0x233a06, + 0x334b86, + 0x24b6c6, + 0x297088, + 0x211883, + 0x203b43, + 0x323585, + 0x3112c6, + 0x2ac945, + 0x23fe08, + 0x29854a, + 0x2f5cc4, + 0x212b48, + 0x292108, + 0x2039c7, + 0x2ecf89, + 0x2b5ac8, + 0x27b187, + 0x264fc6, + 0x205bca, + 0x233a88, + 0x2c5ec9, + 0x2974c8, + 0x21adc9, + 0x2e7387, + 0x2d9005, + 0x226986, + 0x2bec08, + 0x24ccc8, + 0x30bec8, + 0x22e408, + 0x204905, 0x200884, - 0x228808, - 0x2bcbc4, - 0x39f684, - 0x2bdfc5, - 0x28e6c7, - 0x202e09, - 0x2625c7, - 0x280605, - 0x276306, - 0x33d146, - 0x208944, - 0x29f506, - 0x387644, - 0x283a86, - 0x3a3646, - 0x213106, - 0x2041c5, - 0x23b047, - 0x201043, - 0x33f949, - 0x335b48, - 0x212504, - 0x21250d, - 0x2942c8, - 0x381ac8, - 0x2cb206, - 0x281109, - 0x375f89, - 0x3618c5, - 0x29a28a, - 0x287cca, - 0x34c08c, - 0x34c206, - 0x276bc6, - 0x2beb06, - 0x26aa09, - 0x2087c6, - 0x2545c6, - 0x3553c6, - 0x260788, - 0x212a46, - 0x2c4c0b, - 0x28e845, - 0x23b245, - 0x276e45, - 0x2028c6, - 0x206ac3, - 0x239706, - 0x26f387, - 0x2b9585, - 0x23f105, - 0x2ee545, - 0x344986, - 0x30ce84, - 0x30ce86, - 0x293089, - 0x20274c, - 0x2c2e08, - 0x2931c4, - 0x2ec7c6, - 0x29b206, - 0x264a08, - 0x2d6cc8, - 0x202649, - 0x20c807, - 0x2499c9, - 0x247c06, - 0x22e244, - 0x20e304, - 0x27fe44, - 0x280048, - 0x202c4a, - 0x34d746, - 0x3514c7, - 0x22ce47, - 0x229fc5, - 0x2a70c4, - 0x28a986, - 0x302a06, - 0x231f43, - 0x335987, - 0x329ec8, - 0x361a0a, - 0x2cc1c8, - 0x30f188, - 0x358585, - 0x36e685, - 0x268005, - 0x22a386, - 0x37c246, - 0x2061c5, - 0x3560c9, - 0x2a6ecc, - 0x2680c7, - 0x295b48, - 0x2d6085, - 0x685844, - 0x20a104, - 0x2ce2c4, - 0x2c1786, - 0x29c48e, - 0x20c387, - 0x2bbc05, - 0x264c4c, - 0x2b7f47, - 0x328587, - 0x328f89, - 0x215a49, - 0x2855c5, - 0x335b48, - 0x341f49, - 0x2ea885, - 0x2b94c8, - 0x2c51c6, - 0x3551c6, - 0x301044, - 0x2a2408, - 0x245603, - 0x353b84, - 0x2ad285, - 0x31b807, - 0x209505, - 0x280489, - 0x38ba8d, - 0x2a53c6, - 0x35c244, - 0x202348, - 0x27654a, - 0x3b17c7, - 0x235385, - 0x208d03, - 0x29bace, - 0x264e4c, - 0x2fa487, - 0x29c647, - 0x203643, - 0x208805, - 0x2ce2c5, - 0x296508, - 0x292689, - 0x362506, - 0x259504, - 0x27b686, - 0x36558b, - 0x2eebcc, - 0x262347, - 0x2c97c5, - 0x38b6c8, - 0x2cf505, - 0x24be47, - 0x2404c7, - 0x245605, - 0x206ac3, - 0x36c2c4, - 0x20d285, - 0x2ace05, - 0x2ace06, - 0x2908c8, - 0x328607, - 0x37fe06, - 0x208486, - 0x358d86, - 0x3262c9, - 0x262b87, - 0x362386, - 0x2eed46, - 0x2456c6, - 0x2a7a85, - 0x20a206, - 0x399745, - 0x2292c8, - 0x291c8b, - 0x28a786, - 0x22ce84, - 0x2ed489, - 0x2605c4, - 0x2c5148, - 0x2f0e87, - 0x282f04, - 0x2b3b88, - 0x2ba684, - 0x2a7ac4, - 0x3a93c5, - 0x2d6bc6, - 0x346ac7, - 0x23b0c3, - 0x29ae45, - 0x2f4944, - 0x3a2446, - 0x361948, - 0x323745, - 0x28e149, - 0x2114c5, - 0x2f4bc8, - 0x326007, - 0x388e48, - 0x2b3087, - 0x2f08c9, - 0x364246, - 0x35aec6, - 0x28f144, - 0x26c045, - 0x2f300c, - 0x276e47, - 0x277647, - 0x22cd08, - 0x2a53c6, - 0x26f2c4, - 0x2eae44, - 0x248589, - 0x2bec06, - 0x224ac7, - 0x347844, - 0x324f86, - 0x328185, - 0x2a0c87, - 0x2c4b86, - 0x36e189, - 0x34bec7, - 0x266307, - 0x29f046, - 0x23ab05, - 0x27de88, - 0x217788, - 0x237a86, - 0x323785, - 0x255106, - 0x201b83, - 0x296389, - 0x2a430e, - 0x2b1e88, - 0x2b8188, - 0x23788b, - 0x28e386, - 0x30eac4, - 0x2813c4, - 0x2a440a, - 0x216b07, - 0x362445, - 0x212d09, - 0x2b85c5, - 0x39f6c7, - 0x300344, - 0x397787, - 0x27b908, - 0x2c6cc6, - 0x3a54c9, - 0x2b4a8a, - 0x216a86, - 0x293e06, - 0x2ab5c5, - 0x379fc5, - 0x333207, - 0x23f608, - 0x3280c8, - 0x235c86, - 0x222585, - 0x30ebce, - 0x330844, - 0x237a05, - 0x275c89, - 0x28c048, - 0x3adf06, - 0x2988cc, - 0x299d90, - 0x29c0cf, - 0x29d948, - 0x2bf387, + 0x2df288, + 0x20bdc4, + 0x3339c4, + 0x267105, + 0x28d947, + 0x2035c9, + 0x334847, + 0x231985, + 0x273686, + 0x346d46, + 0x213bc4, + 0x2a1986, + 0x2addc4, + 0x283f06, + 0x3b0586, + 0x2150c6, + 0x205285, + 0x23fcc7, + 0x200a83, + 0x3334c9, + 0x32b688, + 0x2129c4, + 0x27b00d, + 0x292f88, + 0x2f0848, + 0x2c5e46, + 0x368289, + 0x3acb49, + 0x2615c5, + 0x29864a, + 0x2863ca, + 0x28b24c, + 0x28b3c6, + 0x274446, + 0x2bd646, + 0x269509, + 0x29e2c6, + 0x250f06, + 0x310106, + 0x259348, + 0x217d86, + 0x2c344b, + 0x28dac5, + 0x23fec5, + 0x2746c5, + 0x202606, + 0x205b83, + 0x23e746, + 0x26d747, + 0x2b8745, + 0x379c85, + 0x3a62c5, + 0x2eb2c6, + 0x261684, + 0x311e06, + 0x28f789, + 0x20248c, + 0x2af148, + 0x28f8c4, + 0x2ed746, + 0x298b46, + 0x2572c8, + 0x2160c8, + 0x202389, + 0x204887, + 0x238509, + 0x24c346, + 0x22f904, + 0x20edc4, + 0x27a944, + 0x27ab48, + 0x20340a, + 0x34ff86, + 0x353d47, + 0x2c7687, + 0x228885, + 0x2a9f84, + 0x289586, + 0x300346, + 0x235bc3, + 0x32b4c7, + 0x273fc8, + 0x26170a, + 0x30fa88, + 0x29ddc8, + 0x358045, + 0x279405, + 0x2631c5, + 0x228c46, + 0x229d06, + 0x3aff05, + 0x308389, + 0x2a9d8c, + 0x263287, + 0x2943c8, + 0x258945, + 0x683c04, + 0x2e3d84, + 0x2d17c4, + 0x214b06, + 0x29b10e, + 0x2078c7, + 0x2bad45, + 0x25750c, + 0x2c0847, + 0x27f687, + 0x2806c9, + 0x218189, + 0x283985, + 0x32b688, + 0x2f1fc9, + 0x2f3d05, + 0x2b8688, + 0x2c2c06, + 0x360746, + 0x2f6284, + 0x33c1c8, + 0x248283, + 0x3630c4, + 0x2b0d05, + 0x305547, + 0x201ec5, + 0x27bd89, + 0x38040d, + 0x2a1f86, + 0x2e9644, + 0x2650c8, + 0x2738ca, + 0x21fe87, + 0x23a245, + 0x203c43, + 0x29a74e, + 0x25770c, + 0x2f99c7, + 0x29b2c7, + 0x204643, + 0x29e305, + 0x2d17c5, + 0x294d88, + 0x291f49, + 0x36e986, + 0x257344, + 0x22e186, + 0x32ffcb, + 0x3a694c, + 0x35dc47, + 0x2c90c5, + 0x39e948, + 0x2cfe05, + 0x368787, + 0x33b7c7, + 0x248285, + 0x205b83, + 0x371284, 0x2041c5, - 0x2826c5, - 0x346949, - 0x292a49, - 0x308906, - 0x2fa1c7, - 0x394345, - 0x332449, - 0x32ed86, - 0x20860d, - 0x27fd09, - 0x203204, - 0x2b1c08, - 0x2288c9, - 0x34d906, - 0x276405, - 0x35aec6, - 0x3099c9, - 0x27c808, - 0x20dd85, - 0x2806c4, - 0x298a8b, - 0x34d7c5, - 0x258646, - 0x281b06, - 0x265cc6, - 0x397b8b, - 0x28e249, - 0x206505, - 0x388c07, - 0x20be46, - 0x2de086, - 0x280348, - 0x26c209, - 0x26d44c, - 0x2e26c8, - 0x34da06, - 0x344583, - 0x2aec06, - 0x282385, - 0x27a888, - 0x221f86, - 0x2a0ec8, - 0x242505, - 0x212785, - 0x2998c8, - 0x2300c7, - 0x37fa47, - 0x2a7bc7, - 0x227d08, - 0x28cd48, - 0x26a386, - 0x308f07, - 0x257147, - 0x28224a, - 0x247b03, - 0x2028c6, + 0x383505, + 0x383506, + 0x28e848, + 0x27f707, + 0x3820c6, + 0x200a06, + 0x333d86, + 0x265689, + 0x331647, + 0x378186, + 0x3a6ac6, + 0x248346, + 0x2a8405, + 0x399a86, + 0x398f45, + 0x22b548, + 0x29154b, + 0x289386, + 0x2c76c4, + 0x2eca89, + 0x259184, + 0x2c2b88, + 0x2aab47, + 0x27dd04, + 0x2b4e88, + 0x2b9904, + 0x2a8444, + 0x3a26c5, + 0x2d96c6, + 0x348e07, + 0x23fd43, + 0x299945, + 0x316144, + 0x3846c6, + 0x261648, + 0x323ac5, + 0x28d3c9, + 0x20e5c5, + 0x2d6288, + 0x34a5c7, + 0x388948, + 0x2b4387, + 0x2f0489, + 0x362546, + 0x336186, + 0x310104, + 0x264f05, + 0x2f490c, + 0x2746c7, + 0x274cc7, + 0x2c7548, + 0x2a1f86, + 0x26d684, + 0x31b184, + 0x27acc9, + 0x2bd746, + 0x219747, + 0x349b84, + 0x31b746, + 0x27f285, + 0x2a3087, + 0x2c33c6, + 0x33be89, + 0x28b087, + 0x264607, + 0x2a14c6, + 0x23f785, + 0x278e48, + 0x218948, + 0x23acc6, + 0x323b05, + 0x251a46, + 0x206583, + 0x294c09, + 0x299a0e, + 0x2b3188, + 0x2d3bc8, + 0x23aacb, + 0x28d606, + 0x209c84, + 0x27c344, + 0x299b0a, + 0x21a207, + 0x378245, + 0x213a89, + 0x2b7785, + 0x333a07, + 0x2ff984, + 0x324c07, + 0x2d6a88, + 0x2ce546, + 0x34a889, + 0x2b5bca, + 0x21a186, + 0x292ac6, + 0x2ab545, + 0x37e405, + 0x3261c7, + 0x244208, + 0x27f1c8, + 0x23b286, + 0x228385, + 0x29d80e, + 0x328cc4, + 0x23ac45, + 0x273009, + 0x28ac88, + 0x287886, + 0x296d0c, + 0x298150, + 0x29ad4f, + 0x29c5c8, + 0x30bc07, + 0x205285, + 0x27d645, + 0x348c89, + 0x28f149, + 0x30a4c6, + 0x2f9707, + 0x393cc5, + 0x320d49, + 0x32d106, + 0x29e10d, + 0x27a809, + 0x2039c4, + 0x2b2f08, + 0x2df349, + 0x350146, + 0x273785, + 0x336186, + 0x30b1c9, + 0x38e148, + 0x210785, + 0x27bfc4, + 0x296ecb, + 0x350005, + 0x226786, + 0x27ca86, + 0x25f1c6, + 0x38c5cb, + 0x28d4c9, + 0x3b0245, + 0x388707, + 0x2cf786, + 0x231346, + 0x27bc48, + 0x2d97c9, + 0x26b98c, + 0x2e6c08, + 0x350246, + 0x345d03, + 0x334606, + 0x27d305, + 0x278008, + 0x227d86, + 0x2a32c8, + 0x245885, + 0x294505, + 0x2a1d48, + 0x301687, + 0x381d07, + 0x27f8c7, + 0x2a03c8, + 0x30bd48, + 0x262286, + 0x309087, + 0x24af47, + 0x27d1ca, + 0x24c243, + 0x202606, + 0x203545, + 0x231504, + 0x275cc9, + 0x2f0404, + 0x21e084, + 0x2989c4, + 0x29b2cb, + 0x2df4c7, + 0x29da45, + 0x2913c8, + 0x273686, + 0x273688, + 0x277486, + 0x287d45, + 0x288685, + 0x28a0c6, + 0x28b548, + 0x28b808, + 0x275e86, + 0x29120f, + 0x2946d0, + 0x358a45, + 0x200a83, + 0x24a985, + 0x2fd0c8, + 0x28f049, + 0x3ae808, + 0x34a708, + 0x330608, + 0x2df587, + 0x273349, + 0x2a34c8, + 0x2785c4, + 0x298848, + 0x254509, + 0x30aac7, + 0x296144, + 0x334908, + 0x23fa8a, + 0x2c2446, + 0x29c1c6, + 0x21b4c9, + 0x298387, + 0x2c2f88, + 0x332348, + 0x349a08, + 0x353885, + 0x37f385, + 0x23fec5, + 0x2d1785, + 0x371dc7, + 0x205b85, + 0x2b8745, + 0x36fd86, + 0x3ae747, + 0x37fd07, + 0x23fd86, + 0x2ca285, + 0x226786, + 0x25a685, + 0x2c06c8, + 0x31b5c4, + 0x3ac8c6, + 0x358844, + 0x301948, + 0x22534a, + 0x27670c, + 0x3658c5, + 0x2bac06, + 0x26bb46, + 0x323946, + 0x2fd2c4, + 0x27f545, + 0x2772c7, + 0x298409, + 0x2a4547, + 0x683c04, + 0x683c04, + 0x30af45, + 0x20f5c4, + 0x2966ca, + 0x273506, + 0x2e7044, + 0x3a3745, + 0x2eee85, + 0x300244, + 0x27c6c7, + 0x20e547, + 0x2c25c8, + 0x319188, + 0x210789, + 0x2994c8, + 0x29688b, + 0x2128c4, + 0x35d745, + 0x279045, + 0x27f849, + 0x2d97c9, + 0x2ec988, + 0x327ac8, + 0x203b84, + 0x298b85, + 0x203443, + 0x212885, + 0x2d3dc6, + 0x291d8c, + 0x2189c6, + 0x25a6c6, + 0x287b05, + 0x2eb348, + 0x3a6bc6, + 0x2eea46, + 0x29c1c6, + 0x21f40c, + 0x24b884, + 0x333eca, + 0x287a48, + 0x291bc7, + 0x316046, + 0x36ea47, + 0x2e12c5, + 0x306e46, + 0x352386, + 0x381bc7, + 0x21e0c4, 0x202d85, - 0x32df84, - 0x278609, - 0x2f0844, - 0x2239c4, - 0x29b084, - 0x29c64b, - 0x228a47, - 0x30ee05, - 0x291b08, - 0x276306, - 0x276308, - 0x279dc6, - 0x289145, - 0x289a85, - 0x28b4c6, - 0x28c808, - 0x28cac8, - 0x2787c6, - 0x29194f, - 0x295e50, - 0x399e85, - 0x201043, - 0x247645, - 0x2fdcc8, - 0x292949, - 0x24ad88, - 0x326148, - 0x37d988, - 0x228b07, - 0x275fc9, - 0x2a10c8, - 0x2d3d44, - 0x29af08, - 0x24f7c9, - 0x30d4c7, - 0x297c84, - 0x262688, - 0x23ae0a, - 0x2c45c6, - 0x27ba86, - 0x21b0c9, - 0x299fc7, - 0x2c5548, - 0x3999c8, - 0x3476c8, - 0x351005, - 0x37af45, - 0x23b245, - 0x2ce285, - 0x32b287, - 0x206ac5, - 0x2b9585, - 0x3a8606, - 0x24acc7, - 0x3744c7, - 0x23b106, - 0x2cac45, - 0x258646, - 0x2592c5, - 0x2b7dc8, - 0x324e04, - 0x3ae806, - 0x2e4684, - 0x2ff188, - 0x3ae90a, - 0x27904c, - 0x38c7c5, - 0x2bbac6, - 0x26d606, - 0x3297c6, - 0x2fdec4, - 0x328445, - 0x279c07, - 0x29a049, - 0x2a2707, - 0x685844, - 0x685844, - 0x309745, - 0x227084, - 0x29828a, - 0x276186, - 0x2e2b04, - 0x3b31c5, - 0x2f8f45, - 0x302904, - 0x281747, - 0x211447, - 0x2c4748, - 0x317c48, - 0x20dd89, - 0x32ee88, - 0x29844b, - 0x212404, - 0x35e3c5, - 0x27e085, - 0x2a7b49, - 0x26c209, - 0x2ed388, - 0x23da88, - 0x282a44, - 0x29b245, - 0x202c83, - 0x2123c5, - 0x2b8386, - 0x2924cc, - 0x217806, - 0x259306, - 0x292685, - 0x344a08, - 0x2eee46, - 0x2ee086, - 0x27ba86, - 0x2260cc, - 0x362284, - 0x358eca, - 0x3ae0c8, - 0x292307, - 0x23e586, - 0x3625c7, - 0x2de9c5, - 0x30fec6, - 0x34fbc6, - 0x37f907, - 0x223a04, - 0x2e1645, - 0x275c84, - 0x2c3147, - 0x275ec8, - 0x276a4a, - 0x27f587, - 0x237c07, - 0x2bf307, - 0x2cf649, - 0x2924ca, - 0x22aa43, - 0x223905, - 0x213143, - 0x309209, - 0x22e988, - 0x2d1047, - 0x24ae89, - 0x217886, - 0x2af648, - 0x2f2ac5, - 0x2848ca, - 0x321f89, - 0x26d109, - 0x375e47, - 0x283c89, - 0x213008, - 0x2ecb86, - 0x2bbc88, - 0x2104c7, - 0x22ab87, - 0x2d70c7, - 0x2d0ec8, - 0x2ec646, - 0x23abc5, - 0x279c07, - 0x293908, - 0x358d04, - 0x28c444, - 0x28d307, - 0x2acb07, - 0x341dca, - 0x2ecb06, - 0x2fa30a, - 0x2b8887, - 0x330607, - 0x235d84, - 0x374c84, - 0x22c5c6, - 0x3558c4, - 0x3558cc, - 0x3a8d05, - 0x214bc9, - 0x2f4d44, - 0x3029c5, - 0x2764c8, - 0x28cb85, - 0x31b806, - 0x20f544, - 0x298fca, - 0x2d2e46, - 0x28ceca, - 0x31b5c7, - 0x2c8ac5, - 0x21a9c5, - 0x22a00a, - 0x29f605, - 0x29d446, - 0x2bcbc4, - 0x2ae1c6, - 0x3332c5, - 0x222046, - 0x2e9acc, - 0x2c56ca, - 0x26c104, - 0x22adc6, - 0x299fc7, - 0x2c8e84, - 0x260788, - 0x38dc46, - 0x30ea49, - 0x2c2949, - 0x2ab1c9, - 0x372546, - 0x2105c6, - 0x2bbdc7, - 0x356008, - 0x2103c9, - 0x228a47, - 0x2b27c6, - 0x387387, - 0x37bd45, - 0x330844, - 0x2bb987, - 0x2f49c5, - 0x285fc5, - 0x33b2c7, - 0x2454c8, - 0x38b646, - 0x294bcd, - 0x29670f, - 0x29b90d, - 0x20bf44, - 0x231b46, - 0x2cc508, - 0x355385, - 0x282408, - 0x21854a, - 0x203204, - 0x3a5686, - 0x28bbc7, - 0x3a6207, - 0x29b449, - 0x2bbc45, - 0x302904, - 0x33040a, - 0x2b4549, - 0x283d87, - 0x269846, - 0x34d906, - 0x29b186, - 0x360546, - 0x2cbe8f, - 0x2cc3c9, - 0x212a46, - 0x3a6606, - 0x274d09, - 0x309007, - 0x214603, - 0x226246, - 0x20d383, - 0x2d5c08, - 0x3871c7, - 0x29db49, - 0x2a68c8, - 0x37fb88, - 0x267c06, - 0x240b09, - 0x2c7ac5, - 0x23e584, - 0x2eb447, - 0x26aa85, - 0x20bf44, - 0x30eec8, - 0x216dc4, - 0x3078c7, - 0x31a846, - 0x29e1c5, - 0x2a0788, - 0x34d7cb, - 0x336047, - 0x22a286, - 0x2bea04, - 0x31d686, - 0x2bdfc5, - 0x2f49c5, - 0x27dc09, - 0x281349, - 0x22abc4, - 0x22ac05, - 0x22ae05, - 0x284746, - 0x335c48, - 0x2b7106, - 0x329d0b, - 0x3003ca, - 0x2ff0c5, - 0x289b06, - 0x2f40c5, - 0x2065c5, - 0x2945c7, - 0x203888, - 0x2499c4, - 0x3617c6, - 0x28cb46, - 0x2131c7, - 0x2ffa44, - 0x27a706, - 0x36d285, - 0x36d289, - 0x2107c4, - 0x2a7249, - 0x2787c6, - 0x2ba188, - 0x22ae05, - 0x22cf45, - 0x222046, - 0x26d349, - 0x215a49, - 0x259386, - 0x28c148, - 0x264d48, - 0x2f4084, - 0x360a44, - 0x360a48, - 0x3164c8, - 0x249ac9, - 0x2b8306, - 0x27ba86, - 0x313c0d, - 0x37c806, - 0x2affc9, - 0x202a85, - 0x31c286, - 0x2546c8, - 0x30cdc5, - 0x257184, - 0x2bdfc5, - 0x280e88, - 0x298049, - 0x275d44, - 0x234b46, - 0x2e2f8a, - 0x369508, - 0x341f49, - 0x2de5ca, - 0x24ae06, - 0x2968c8, - 0x24bc05, - 0x321e08, - 0x2b3185, - 0x217749, - 0x366f89, - 0x228c42, - 0x2a4905, - 0x26e286, - 0x278707, - 0x3ace45, - 0x2e7706, - 0x2f7f88, - 0x2a53c6, - 0x2bff49, - 0x277746, - 0x2801c8, - 0x2a8885, - 0x246546, - 0x264088, - 0x280048, - 0x3a36c8, - 0x2fd4c8, - 0x20a204, - 0x22a803, - 0x2c0184, - 0x27b606, - 0x37bd84, - 0x2b80c7, - 0x2edf89, - 0x2be205, - 0x3999c6, - 0x226246, - 0x29070b, - 0x2ff006, - 0x317006, - 0x2c3688, - 0x23f046, - 0x2a6603, - 0x209fc3, - 0x330844, - 0x3abe05, - 0x387807, - 0x275ec8, - 0x275ecf, - 0x279b0b, - 0x335a48, - 0x234bc6, - 0x335d4e, - 0x222043, - 0x2db944, - 0x2fef85, - 0x300c06, - 0x28aa8b, - 0x28e786, - 0x217089, - 0x29e1c5, - 0x38a288, - 0x20d588, - 0x21590c, - 0x29c686, - 0x212406, - 0x2d4005, - 0x286a88, - 0x24b145, - 0x338948, - 0x29bd4a, - 0x35e8c9, - 0x685844, - 0x2f604a82, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x323743, - 0x258403, - 0x230743, - 0x2d9d43, - 0x201104, - 0x249943, - 0x2257c3, - 0x224283, - 0x224284, - 0x258403, - 0x232ec4, - 0x230743, - 0x2afc84, - 0x2d9d43, - 0x3ad107, - 0x219bc3, - 0x202883, - 0x251b48, - 0x2257c3, - 0x2db58b, - 0x2df103, - 0x23d1c6, - 0x201582, - 0x385c4b, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x2257c3, - 0x29ca03, - 0x206883, + 0x273004, + 0x2af487, + 0x273248, + 0x2742ca, + 0x27a087, + 0x23ae47, + 0x30bb87, + 0x2cff49, + 0x291d8a, + 0x229043, + 0x21dfc5, + 0x215103, + 0x39dfc9, + 0x24b308, + 0x2d1bc7, + 0x3ae909, + 0x218a46, + 0x2c6b08, + 0x39a745, + 0x282c8a, + 0x216249, + 0x26b649, + 0x37af07, + 0x239849, + 0x214fc8, + 0x2edb06, + 0x2badc8, + 0x2119c7, + 0x229187, + 0x37b2c7, + 0x2d1a48, + 0x2ed5c6, + 0x23f845, + 0x2772c7, + 0x2925c8, + 0x3587c4, + 0x2a58c4, + 0x28c587, + 0x2acd07, + 0x2f1e4a, + 0x2eda86, + 0x2f984a, + 0x2b7a47, + 0x328a87, + 0x23b384, + 0x32d484, + 0x2272c6, + 0x30ed84, + 0x30ed8c, + 0x3a2005, + 0x215f09, + 0x2d6404, + 0x300305, + 0x273848, + 0x28b8c5, + 0x305546, + 0x207c84, + 0x29044a, + 0x2b14c6, + 0x29228a, + 0x20ab87, + 0x265b45, + 0x21eec5, + 0x2288ca, + 0x2a1a85, + 0x29c0c6, + 0x20bdc4, + 0x2b0146, + 0x326285, + 0x227e46, + 0x3a4acc, + 0x2cba4a, + 0x264fc4, + 0x2293c6, + 0x298387, + 0x2c8744, + 0x259348, + 0x38d3c6, + 0x29d689, + 0x2c4b89, + 0x312b09, + 0x376286, + 0x211ac6, + 0x2baf07, + 0x3082c8, + 0x2118c9, + 0x2df4c7, + 0x2b3ac6, + 0x2adb07, + 0x29cd85, + 0x328cc4, + 0x2baac7, + 0x24b105, + 0x2846c5, + 0x2fe0c7, + 0x248148, + 0x39e8c6, + 0x29344d, + 0x294f8f, + 0x29a58d, + 0x21b3c4, + 0x2357c6, + 0x2cbe08, + 0x3100c5, + 0x27d388, + 0x207d8a, + 0x2039c4, + 0x330206, + 0x27e487, + 0x33fe07, + 0x298d89, + 0x2bad85, + 0x300244, + 0x32888a, + 0x2b5689, + 0x239947, + 0x268206, + 0x350146, + 0x298ac6, + 0x35ec46, + 0x2cb70f, + 0x2cbcc9, + 0x217d86, + 0x239646, + 0x29ed49, + 0x309187, + 0x2101c3, + 0x21f586, + 0x2042c3, + 0x2e3848, + 0x2ad947, + 0x29c7c9, + 0x2a2a88, + 0x381e48, + 0x216e86, + 0x331209, + 0x33b905, + 0x2a33c4, + 0x2d90c7, + 0x269585, + 0x21b3c4, + 0x29db08, + 0x21a4c4, + 0x302b87, + 0x31c3c6, + 0x2ad005, + 0x2974c8, + 0x35000b, + 0x32bb87, + 0x228b46, + 0x2bd544, + 0x209c06, + 0x267105, + 0x24b105, + 0x278bc9, + 0x27c2c9, + 0x2291c4, + 0x229205, + 0x229405, + 0x282b06, + 0x32b788, + 0x2b7186, + 0x273e0b, + 0x2ffa0a, + 0x2fad05, + 0x288706, + 0x2f59c5, + 0x3b2585, + 0x297b47, + 0x204308, + 0x238504, + 0x2614c6, + 0x28b886, + 0x215187, + 0x2fee44, + 0x277e86, + 0x239d85, + 0x239d89, + 0x211cc4, + 0x2aa109, + 0x275e86, + 0x2b9408, + 0x229405, + 0x2c7785, + 0x227e46, + 0x26b889, + 0x218189, + 0x25a746, + 0x28ad88, + 0x257608, + 0x2f5984, + 0x32e244, + 0x32e248, + 0x317a08, + 0x238609, + 0x2d3d46, + 0x29c1c6, + 0x3151cd, + 0x2c7f86, + 0x2d8949, + 0x254785, + 0x30e446, + 0x251008, + 0x311d45, + 0x24af84, + 0x267105, + 0x27b948, + 0x296489, + 0x2730c4, + 0x306286, + 0x2e74ca, + 0x2c54c8, + 0x2f1fc9, + 0x2d114a, + 0x3ae886, + 0x295148, + 0x368545, + 0x30f908, + 0x2b4485, + 0x218909, + 0x36c449, + 0x228e82, + 0x29a005, + 0x26c7c6, + 0x275dc7, + 0x3aacc5, + 0x2f8a86, + 0x2f7e08, + 0x2a1f86, + 0x2c3bc9, + 0x274dc6, + 0x27bac8, + 0x2a90c5, + 0x244046, + 0x367808, + 0x27ab48, + 0x3b0608, + 0x2fc788, + 0x399a84, + 0x22d8c3, + 0x2c3e04, + 0x22e106, + 0x29cdc4, + 0x2d3b07, + 0x2ee949, + 0x2bcd45, + 0x332346, + 0x21f586, + 0x28e68b, + 0x2fac46, + 0x318546, + 0x3ac9c8, + 0x379bc6, + 0x265943, + 0x396f83, + 0x328cc4, + 0x231845, + 0x243147, + 0x273248, + 0x27324f, + 0x2771cb, + 0x32b588, + 0x306306, + 0x32b88e, + 0x227e43, + 0x2430c4, + 0x2fabc5, + 0x33db46, + 0x28968b, + 0x28da06, + 0x213f09, + 0x2ad005, + 0x389d88, + 0x206408, + 0x21804c, + 0x29b306, + 0x2128c6, + 0x2d7985, + 0x285188, + 0x276705, + 0x33c7c8, + 0x29a9ca, + 0x226809, + 0x683c04, + 0x31216582, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x323ac3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x201604, + 0x238483, + 0x2264c3, + 0x224103, + 0x224104, + 0x22d183, + 0x2374c4, + 0x2343c3, + 0x22d684, + 0x21eb03, + 0x3aaf87, + 0x211003, + 0x2025c3, + 0x32d208, + 0x2264c3, + 0x2aeecb, + 0x2e1a03, + 0x241f86, + 0x203e42, + 0x38660b, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x2264c3, + 0x280ec3, + 0x200cc3, 0x200882, - 0x894c8, - 0x354045, - 0x2d3b88, - 0x2d88c8, - 0x204a82, - 0x365cc5, - 0x33f707, + 0x880c8, + 0x281045, + 0x2db108, + 0x2e7e08, + 0x216582, + 0x2a0f05, + 0x340ec7, 0x200202, - 0x23ca07, - 0x2095c2, - 0x237647, - 0x265389, - 0x3173c8, - 0x347549, - 0x331282, - 0x2672c7, - 0x259104, - 0x33f7c7, - 0x3002c7, - 0x23f402, - 0x219bc3, - 0x20dc02, - 0x201cc2, - 0x2016c2, - 0x200ac2, - 0x2058c2, - 0x2057c2, - 0x2a8405, - 0x20a045, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, + 0x2417c7, + 0x201f82, + 0x23a887, + 0x36b2c9, + 0x318908, + 0x349889, + 0x32ed82, + 0x266707, + 0x25a4c4, + 0x340f87, + 0x2ff907, + 0x233e42, + 0x211003, + 0x20e842, + 0x205902, + 0x201502, + 0x206d42, + 0x208782, + 0x217642, + 0x2a8c45, + 0x2e3cc5, + 0x16582, + 0x343c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x12003, 0x481, - 0x258403, - 0x230743, - 0x2d9d43, - 0x201104, - 0x202503, - 0x249943, - 0x2257c3, - 0x20f0c3, - 0x3216cdc6, - 0x110083, - 0x7efc5, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x204a82, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x9f82, - 0x894c8, - 0x3f5c4, - 0xcf905, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x201604, + 0x202243, + 0x238483, + 0x2264c3, + 0x21ca03, + 0x340f2d86, + 0x107003, + 0x79ac5, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x216582, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x9502, + 0x880c8, + 0x441c4, + 0xd0205, 0x200882, - 0x2bb244, - 0x258403, - 0x230743, - 0x2d9d43, - 0x268583, - 0x2a8f85, - 0x202503, - 0x332283, - 0x249943, - 0x209583, - 0x2257c3, - 0x2161c3, - 0x224303, - 0x224043, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x204a82, - 0x2257c3, - 0x894c8, - 0x2d9d43, - 0x894c8, - 0x2c69c3, - 0x258403, - 0x22ec84, - 0x230743, - 0x2d9d43, - 0x20b9c2, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x20b9c2, - 0x230c43, - 0x249943, - 0x2257c3, - 0x2d8843, - 0x2161c3, + 0x2ba384, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x35bb03, + 0x2a9c05, + 0x202243, + 0x332683, + 0x238483, + 0x201f43, + 0x2264c3, + 0x217643, + 0x224183, + 0x223ec3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x216582, + 0x2264c3, + 0x880c8, + 0x21eb03, + 0x880c8, + 0x316403, + 0x22d183, + 0x232144, + 0x2343c3, + 0x21eb03, + 0x2082c2, + 0x211003, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x2082c2, + 0x2348c3, + 0x238483, + 0x2264c3, + 0x2db083, + 0x217643, 0x200882, - 0x204a82, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x23d1c5, - 0xacec6, - 0x224284, - 0x201582, - 0x894c8, + 0x216582, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x241f85, + 0x1835c6, + 0x224104, + 0x203e42, + 0x880c8, 0x200882, - 0x1b788, - 0x204a82, - 0xe386, - 0x63604, - 0x11bb0b, - 0x1d786, - 0x63007, - 0x230743, - 0x2d9d43, - 0x158485, - 0x127784, - 0x262383, - 0x47ac7, - 0xcdec4, - 0x249943, - 0x132d84, - 0x2257c3, - 0x2dfdc4, - 0x1473c8, - 0x152dc6, - 0x204a82, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x202883, - 0x2257c3, - 0x2df103, - 0x201582, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x201103, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2afc84, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x23d1c6, - 0x230743, - 0x2d9d43, - 0x175583, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x63007, - 0x894c8, - 0x2d9d43, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x38a58403, - 0x230743, - 0x249943, - 0x2257c3, - 0x894c8, + 0x20448, + 0x216582, + 0xee46, + 0x167404, + 0x10f2cb, + 0x173606, + 0x131ac7, + 0x2343c3, + 0x21eb03, + 0x157f45, + 0x155dc4, + 0x202c43, + 0x4c207, + 0xcd884, + 0x238483, + 0x133184, + 0x2264c3, + 0x2e26c4, + 0x149708, + 0x155646, + 0x216582, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x2025c3, + 0x2264c3, + 0x2e1a03, + 0x203e42, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x201603, + 0x212444, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x22d684, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x241f86, + 0x2343c3, + 0x21eb03, + 0x179ac3, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x131ac7, + 0x880c8, + 0x21eb03, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x3aa2d183, + 0x2343c3, + 0x238483, + 0x2264c3, + 0x880c8, 0x200882, - 0x204a82, - 0x258403, - 0x2d9d43, - 0x249943, - 0x2016c2, - 0x2257c3, - 0x308207, - 0x2f538b, - 0x206603, - 0x22c1c8, - 0x355d87, - 0x2b76c6, - 0x2bc8c5, - 0x2f7b09, - 0x23cf48, - 0x311cc9, - 0x311cd0, - 0x35a5cb, - 0x2e8b89, - 0x204903, - 0x3a8809, - 0x22f786, - 0x22f78c, - 0x311ec8, - 0x3ae5c8, - 0x274009, - 0x29ce4e, - 0x37880b, - 0x27c20c, - 0x203803, - 0x25dfcc, + 0x216582, + 0x22d183, + 0x21eb03, + 0x238483, + 0x201502, + 0x2264c3, + 0x309dc7, + 0x20b28b, + 0x200b03, + 0x2a06c8, + 0x308047, + 0x2017c6, + 0x2bba05, + 0x2f7989, + 0x20bc48, + 0x20bc49, + 0x20bc50, + 0x359fcb, + 0x2ea589, + 0x20c783, + 0x221749, + 0x232c46, + 0x232c4c, + 0x20be48, + 0x3ac688, + 0x26e089, + 0x29bace, + 0x37cc4b, + 0x38db4c, + 0x204803, + 0x2582cc, 0x207209, - 0x3736c7, - 0x23068c, - 0x39baca, - 0x2054c4, - 0x3a398d, - 0x25de88, - 0x22830d, - 0x2692c6, - 0x2975cb, - 0x3532c9, - 0x316ec7, + 0x2de107, + 0x23430c, + 0x39b60a, + 0x245dc4, + 0x3b08cd, + 0x258188, + 0x2ded8d, + 0x266b86, + 0x28a70b, + 0x209dc9, + 0x318407, 0x31d846, - 0x322309, - 0x33264a, - 0x301708, - 0x2ded04, - 0x35eb47, - 0x275547, - 0x347a44, - 0x226d04, - 0x2615c9, - 0x2e7ac9, - 0x3114c8, - 0x20ffc5, - 0x392805, - 0x20cc06, - 0x3a3849, - 0x2187cd, - 0x27bc88, - 0x20cb07, - 0x2bc948, - 0x27d286, - 0x3a2044, - 0x37b205, - 0x204506, - 0x206704, + 0x320f49, + 0x332a4a, + 0x302708, + 0x2e1604, + 0x272187, + 0x226a87, + 0x349d84, + 0x20f244, + 0x27e989, + 0x326ec9, + 0x20a588, + 0x2114c5, + 0x392785, + 0x20d3c6, + 0x3b0789, + 0x20800d, + 0x38d5c8, + 0x20d2c7, + 0x2bba88, + 0x22eec6, + 0x3a1504, + 0x37f645, + 0x2055c6, + 0x206104, 0x207107, - 0x209bca, - 0x212f44, - 0x2169c6, - 0x2173c9, - 0x2173cf, - 0x217c0d, - 0x218146, - 0x21b390, + 0x20914a, + 0x2139c4, + 0x21a0c6, + 0x21aa49, + 0x21aa4f, + 0x21b00d, 0x21b786, - 0x21bec7, - 0x21c4c7, - 0x21c4cf, - 0x21dc89, - 0x221946, - 0x2246c7, - 0x2246c8, - 0x225449, - 0x28e488, - 0x2d5747, - 0x20b803, - 0x375746, - 0x2e1788, - 0x29d10a, - 0x21a2c9, - 0x20d883, - 0x33f606, - 0x36160a, - 0x2f6307, - 0x37350a, - 0x3a9dce, - 0x21ddc6, - 0x2a4b07, - 0x212046, + 0x220050, + 0x220446, + 0x220b87, + 0x221087, + 0x22108f, + 0x222309, + 0x227746, + 0x229747, + 0x229748, + 0x229b09, + 0x28d708, + 0x2d7d07, + 0x20cd03, + 0x3852c6, + 0x204008, + 0x29bd8a, + 0x215749, + 0x20bd83, + 0x340dc6, + 0x26130a, + 0x2ef8c7, + 0x2ddf4a, + 0x377e0e, + 0x222446, + 0x29a207, + 0x214d86, 0x2072c6, - 0x37ad4b, - 0x3b058a, - 0x2232cd, - 0x210687, - 0x355548, - 0x355549, - 0x35554f, - 0x205e8c, - 0x27ab09, - 0x3772ce, - 0x3ad20a, - 0x24c486, - 0x2ff406, - 0x30238c, - 0x3043cc, - 0x30e188, - 0x339a47, - 0x211a85, - 0x208a84, - 0x2531ce, - 0x3328c4, - 0x22b747, - 0x25f88a, - 0x369f14, - 0x36f74f, - 0x21c688, - 0x375608, - 0x36becd, - 0x36bece, - 0x380289, - 0x392988, - 0x39298f, - 0x23038c, - 0x23038f, - 0x231887, - 0x2336ca, - 0x21ac8b, - 0x235208, - 0x236407, - 0x259ccd, - 0x20ab46, - 0x3a3b46, - 0x239589, - 0x306248, - 0x23d548, - 0x23d54e, - 0x2f5487, - 0x2a9985, - 0x23ee45, - 0x20a884, - 0x2b7986, - 0x3113c8, - 0x2527c3, - 0x20524e, - 0x25a088, - 0x22784b, - 0x33fd07, - 0x3a3085, - 0x25e146, - 0x2aa9c7, - 0x2e6888, - 0x24ab09, - 0x292f85, - 0x2852c8, - 0x218ac6, - 0x37b9ca, - 0x2530c9, - 0x230749, - 0x23074b, - 0x323fc8, - 0x347909, - 0x210086, - 0x3591ca, - 0x2b5b8a, - 0x2338cc, - 0x340647, - 0x2a010a, - 0x35ef4b, - 0x35ef59, - 0x2dc808, - 0x23d245, - 0x259e86, - 0x2d9949, - 0x3178c6, - 0x2156ca, - 0x262e86, - 0x213544, - 0x2c0bcd, - 0x305d07, - 0x213549, - 0x241585, - 0x2416c8, - 0x242009, - 0x242244, - 0x242947, - 0x242948, - 0x2432c7, - 0x265948, - 0x2480c7, - 0x240845, - 0x25118c, - 0x251849, - 0x35b0ca, - 0x38e889, - 0x3a8909, - 0x26f90c, - 0x2587cb, - 0x258a88, - 0x25a708, - 0x25dac4, - 0x282bc8, - 0x283f49, - 0x39bb87, - 0x217606, - 0x23bb87, - 0x377089, - 0x34028b, - 0x327f47, - 0x36c507, - 0x2f4dc7, - 0x228284, - 0x228285, - 0x2a7845, - 0x3355cb, - 0x3989c4, - 0x318a88, - 0x2a958a, - 0x218b87, - 0x34d287, - 0x28a312, - 0x283986, - 0x2e0006, - 0x32704e, - 0x285a46, - 0x28f748, - 0x29020f, - 0x2286c8, - 0x286508, - 0x2b400a, - 0x2b4011, - 0x2a038e, - 0x23670a, - 0x23670c, - 0x2348c7, - 0x392b90, - 0x203b08, - 0x2a0585, - 0x2aae8a, - 0x20674c, - 0x2b2b0d, - 0x2abb46, - 0x2abb47, - 0x2abb4c, - 0x2f00cc, - 0x2d814c, - 0x28d70b, - 0x284c84, - 0x21b244, - 0x372689, - 0x2daac7, - 0x2e58c9, - 0x2b59c9, - 0x366687, - 0x39b946, - 0x39b949, - 0x3a51c3, - 0x2a54ca, - 0x208cc7, - 0x309ecb, - 0x22314a, - 0x237784, - 0x351606, - 0x27f809, - 0x31ca44, - 0x3a8dca, - 0x2e78c5, - 0x2b5e05, - 0x2b5e0d, - 0x2b614e, - 0x28f285, - 0x315286, - 0x23cdc7, - 0x2688ca, - 0x2e6a86, - 0x319bc4, - 0x314e87, - 0x219a8b, - 0x27d347, - 0x359404, - 0x24fdc6, - 0x24fdcd, - 0x23478c, - 0x325dc6, - 0x27be8a, - 0x20c646, - 0x2146c8, - 0x21e447, - 0x26834a, - 0x37c606, - 0x210583, - 0x254846, - 0x2015c8, - 0x29864a, - 0x268fc7, - 0x268fc8, - 0x26e6c4, - 0x283187, - 0x2c0488, - 0x2127c8, - 0x3a6708, - 0x28810a, - 0x2cf185, - 0x2c7707, - 0x236553, - 0x258486, - 0x2d2fc8, - 0x21fcc9, - 0x23c8c8, - 0x267c8b, - 0x2b8688, - 0x219bc4, - 0x2999c6, - 0x3b23c6, - 0x2d6a09, - 0x385687, - 0x251288, - 0x3ae246, - 0x21f4c4, - 0x2c5405, - 0x2bf148, - 0x2bfa0a, - 0x2c0848, - 0x2c5b46, - 0x298d4a, - 0x2334c8, - 0x2c8c88, - 0x2ca008, - 0x2ca906, - 0x2cc706, - 0x31dd4c, - 0x2ccc90, - 0x288885, - 0x2284c8, - 0x2f8490, - 0x2284d0, - 0x311b4e, - 0x31d9ce, - 0x31d9d4, - 0x32418f, - 0x324546, - 0x347e51, - 0x306413, - 0x306888, - 0x31d1c5, - 0x3587c8, - 0x20e545, - 0x228fcc, - 0x249d89, - 0x22b589, - 0x23b907, - 0x21a5c9, - 0x305f47, - 0x3af506, - 0x37b007, - 0x253945, - 0x2e5ac3, - 0x252989, - 0x223689, - 0x375583, - 0x3acd44, - 0x325a0d, - 0x37e40f, - 0x33b205, - 0x3194c6, - 0x213807, - 0x3b09c7, - 0x287686, - 0x28768b, - 0x2a21c5, - 0x256946, - 0x20bb87, - 0x26ed49, - 0x328c86, - 0x200d85, - 0x22020b, - 0x268606, - 0x242fc5, - 0x28b888, - 0x2b5248, - 0x2b66cc, - 0x2b66d0, - 0x2cae09, - 0x2f6b87, - 0x2d480b, - 0x2d4346, - 0x2d560a, - 0x2d678b, - 0x2d730a, - 0x2d7586, - 0x2d8705, - 0x355c86, - 0x277908, - 0x23b9ca, - 0x36bb5c, - 0x2df1cc, - 0x2df4c8, - 0x23d1c5, - 0x2e1c47, - 0x29ca86, - 0x399805, - 0x219e86, - 0x287848, - 0x2b47c7, - 0x29cd48, - 0x2a4c0a, - 0x32268c, - 0x322909, - 0x399b47, - 0x204b04, - 0x23f786, - 0x28608a, - 0x2b5ac5, - 0x364b4c, - 0x37d1c8, - 0x34bb08, - 0x20558c, - 0x20f98c, - 0x210949, - 0x210b87, - 0x2af94c, - 0x377784, - 0x339d4a, - 0x31cd4c, - 0x27018b, - 0x23588b, - 0x236286, - 0x238247, - 0x238dc7, - 0x392dcf, - 0x2f1211, - 0x3b2cd2, - 0x238dcd, - 0x238dce, - 0x23910e, - 0x324348, - 0x324352, - 0x23c4c8, - 0x2fb047, - 0x245f4a, - 0x20d0c8, - 0x285a05, - 0x32b0ca, - 0x21bcc7, - 0x2e1944, - 0x2636c3, - 0x31e545, - 0x2b4287, - 0x2f2187, - 0x2b2d0e, - 0x35db8d, - 0x36abc9, - 0x210ec5, - 0x39c543, - 0x252106, - 0x36aa45, - 0x273a48, - 0x2b1149, - 0x259ec5, - 0x259ecf, - 0x2d8547, - 0x2f7a45, - 0x3a058a, - 0x39a146, - 0x239c09, - 0x2e878c, - 0x2eab49, - 0x203d46, - 0x2a938c, - 0x2eb806, - 0x2eefc8, - 0x2ef1c6, - 0x2dc986, - 0x305a84, - 0x258e03, - 0x2ec3ca, - 0x321651, - 0x27acca, - 0x3644c5, - 0x38e287, - 0x24d547, - 0x2c0584, - 0x2c058b, - 0x317248, - 0x2b1d06, - 0x22cd85, - 0x25f344, - 0x26bd09, - 0x275284, - 0x3b0e87, - 0x2efd05, - 0x2efd07, - 0x327285, - 0x2a84c3, - 0x2faf08, - 0x32820a, - 0x23b0c3, - 0x35408a, - 0x26f786, - 0x259c4f, - 0x356e89, - 0x2051d0, - 0x2df9c8, - 0x2c6049, - 0x297e87, - 0x24fd4f, - 0x24b244, - 0x2afd04, - 0x21b606, - 0x2342c6, - 0x314bca, - 0x380786, - 0x3450c7, - 0x2f7148, - 0x2f7347, - 0x2f7d47, - 0x348a4a, - 0x2fad4b, - 0x27ce85, - 0x3b2908, - 0x22b843, - 0x36d5cc, - 0x21180f, - 0x26090d, - 0x2bc047, - 0x36ad09, - 0x22ca87, - 0x258ec8, - 0x36a10c, - 0x26b0c8, - 0x24cbc8, - 0x30a7ce, - 0x3202d4, - 0x3207e4, - 0x33cf0a, - 0x35aa0b, - 0x306004, - 0x306009, - 0x3a5708, - 0x23f945, - 0x2522ca, - 0x265247, - 0x2ee604, - 0x323743, - 0x258403, - 0x232ec4, - 0x230743, - 0x2d9d43, - 0x201104, - 0x202503, - 0x219bc3, - 0x2ccc86, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x219683, + 0x37f18b, + 0x21d18a, + 0x21768d, + 0x211b87, + 0x310288, + 0x310289, + 0x31028f, + 0x3b218c, + 0x278289, + 0x33948e, + 0x3ab08a, + 0x368dc6, + 0x37bf86, + 0x30420c, + 0x31370c, + 0x327688, + 0x33f8c7, + 0x2131c5, + 0x29e584, + 0x24fb0e, + 0x332cc4, + 0x238a87, + 0x26274a, + 0x382554, + 0x3839cf, + 0x221248, + 0x385188, + 0x370e8d, + 0x370e8e, + 0x38fec9, + 0x22fe88, + 0x22fe8f, + 0x23400c, + 0x23400f, + 0x235507, + 0x237bca, + 0x21f18b, + 0x23a0c8, + 0x23bb47, + 0x25b08d, + 0x252506, + 0x3b0a86, + 0x23e5c9, + 0x215d48, + 0x242188, + 0x24218e, + 0x20b387, + 0x25f8c5, + 0x243a85, + 0x202084, + 0x201a86, + 0x20a488, + 0x24f103, + 0x3b154e, + 0x25b448, + 0x29ff0b, + 0x366947, + 0x3a31c5, + 0x239506, + 0x2aa947, + 0x39a248, + 0x27efc9, + 0x28f685, + 0x283688, + 0x213446, + 0x38b30a, + 0x24fa09, + 0x2343c9, + 0x2343cb, + 0x364b88, + 0x349c49, + 0x211586, + 0x2b074a, + 0x35904a, + 0x237dcc, + 0x367287, + 0x2a998a, + 0x27258b, + 0x272599, + 0x2da488, + 0x242005, + 0x25b246, + 0x2ed389, + 0x318e06, + 0x21250a, + 0x2f31c6, + 0x212104, + 0x2bf38d, + 0x3412c7, + 0x212109, + 0x244d45, + 0x244e88, + 0x245389, + 0x2455c4, + 0x245cc7, + 0x245cc8, + 0x246347, + 0x263e88, + 0x24c807, + 0x36f505, + 0x2567cc, + 0x256e89, + 0x2d9a8a, + 0x38ec09, + 0x221849, + 0x26b00c, + 0x259b8b, + 0x259e48, + 0x25bac8, + 0x25ee84, + 0x27d9c8, + 0x282309, + 0x39b6c7, + 0x21ac86, + 0x399907, + 0x325e89, + 0x366ecb, + 0x324907, + 0x3714c7, + 0x20acc7, + 0x2ded04, + 0x2ded05, + 0x2a81c5, + 0x337ecb, + 0x3981c4, + 0x319fc8, + 0x25f4ca, + 0x213507, + 0x346547, + 0x288f12, + 0x283e06, + 0x231ac6, + 0x322fce, + 0x361506, + 0x28edc8, + 0x28ff4f, + 0x2df148, + 0x284c08, + 0x35f54a, + 0x35f551, + 0x2a274e, + 0x23be4a, + 0x23be4c, + 0x230087, + 0x230090, + 0x204ac8, + 0x2a2945, + 0x2aad0a, + 0x20614c, + 0x2b3e0d, + 0x2ac3c6, + 0x2ac3c7, + 0x2ac3cc, + 0x2efc8c, + 0x2da98c, + 0x28c98b, + 0x283044, + 0x21b644, + 0x3741c9, + 0x2d72c7, + 0x2e94c9, + 0x358e89, + 0x36bb47, + 0x39b486, + 0x39b489, + 0x3a4a43, + 0x2a208a, + 0x29e7c7, + 0x30b6cb, + 0x21750a, + 0x23a9c4, + 0x353e86, + 0x27a309, + 0x30ec04, + 0x3a20ca, + 0x228e45, + 0x2b6485, + 0x2b648d, + 0x2b67ce, + 0x39f105, + 0x3167c6, + 0x241b87, + 0x26748a, + 0x39a446, + 0x35a2c4, + 0x35e2c7, + 0x210ecb, + 0x22ef87, + 0x202104, + 0x265d46, + 0x265d4d, + 0x325b4c, + 0x32fd86, + 0x38d7ca, + 0x225806, + 0x210288, + 0x263507, + 0x23660a, + 0x23c3c6, + 0x211a83, + 0x251186, + 0x203e88, + 0x296a8a, + 0x24aa47, + 0x24aa48, + 0x267b84, + 0x27b2c7, + 0x2c4108, + 0x2a3648, + 0x286808, + 0x27fa0a, + 0x2cf145, + 0x2cf3c7, + 0x23bc93, + 0x22d206, + 0x2b1648, + 0x224709, + 0x241688, + 0x216f0b, + 0x2b7848, + 0x211004, + 0x2a1e46, + 0x3b3106, + 0x2d9509, + 0x385c07, + 0x2568c8, + 0x287bc6, + 0x3a17c4, + 0x2c2e45, + 0x2bdc88, + 0x2be28a, + 0x2bf008, + 0x2c3906, + 0x29718a, + 0x233588, + 0x2c8548, + 0x2c9908, + 0x2c9f46, + 0x2cc006, + 0x31098c, + 0x2cc5d0, + 0x286fc5, + 0x2def48, + 0x2f8310, + 0x2def50, + 0x20bace, + 0x31060e, + 0x310614, + 0x31d9cf, + 0x31dd86, + 0x342211, + 0x349e53, + 0x34a2c8, + 0x27fd45, + 0x358288, + 0x20f985, + 0x22b24c, + 0x24bf89, + 0x2388c9, + 0x399687, + 0x240589, + 0x215a47, + 0x2b9d86, + 0x37f447, + 0x20c185, + 0x212043, + 0x24f2c9, + 0x217a49, + 0x379ac3, + 0x3aabc4, + 0x34ae4d, + 0x3558cf, + 0x2fe005, + 0x31aa06, + 0x20cfc7, + 0x21d5c7, + 0x285d86, + 0x285d8b, + 0x2a3bc5, + 0x258ac6, + 0x208487, + 0x26d109, + 0x2de6c6, + 0x364505, + 0x21c08b, + 0x22e946, + 0x246045, + 0x27e148, + 0x2d8748, + 0x2ca44c, + 0x2ca450, + 0x2ce7c9, + 0x2d5587, + 0x2f6c4b, + 0x2d5d46, + 0x2d7bca, + 0x2d928b, + 0x2d9d0a, + 0x2d9f86, + 0x2daf45, + 0x307f46, + 0x274f88, + 0x39974a, + 0x370b1c, + 0x2e1acc, + 0x2e1dc8, + 0x241f85, + 0x2e42c7, + 0x29b706, + 0x273c45, + 0x21dd86, + 0x285f48, + 0x2b5907, + 0x29b9c8, + 0x29a30a, + 0x3212cc, + 0x321549, + 0x224a87, + 0x282844, + 0x244386, + 0x28478a, + 0x358f85, + 0x3637cc, + 0x364f08, + 0x360d08, + 0x3b188c, + 0x20c8cc, + 0x20da49, + 0x20dc87, + 0x22d34c, + 0x29d284, + 0x2e83ca, + 0x2ad2cc, + 0x26eb4b, + 0x39070b, + 0x3a5946, + 0x23c107, + 0x2302c7, + 0x2302cf, + 0x2f0c11, + 0x3b3a12, + 0x23c90d, + 0x23c90e, + 0x23cc4e, + 0x31db88, + 0x31db92, + 0x23ea88, + 0x201407, + 0x248bca, + 0x20d888, + 0x3614c5, + 0x371c0a, + 0x220987, + 0x2da0c4, + 0x202b43, + 0x311185, + 0x35f7c7, + 0x39fe87, + 0x2b400e, + 0x3366cd, + 0x338149, + 0x20dfc5, + 0x35d103, + 0x24ea46, + 0x36fb85, + 0x271a48, + 0x2b2449, + 0x25b285, + 0x25b28f, + 0x2dad87, + 0x2f78c5, + 0x306b0a, + 0x27fc06, + 0x23dd09, + 0x2ea18c, + 0x2ebe09, + 0x378a86, + 0x25f2cc, + 0x2ec206, + 0x2ef3c8, + 0x2ef5c6, + 0x2da606, + 0x280604, + 0x25a1c3, + 0x35760a, + 0x369111, + 0x38c04a, + 0x3627c5, + 0x2a64c7, + 0x253647, + 0x2c4204, + 0x2c420b, + 0x318788, + 0x2b3006, + 0x2c75c5, + 0x38b604, + 0x262b49, + 0x29f2c4, + 0x21da87, + 0x322045, + 0x322047, + 0x323205, + 0x2a8d03, + 0x2012c8, + 0x27f30a, + 0x23fd43, + 0x28108a, + 0x26db46, + 0x25b00f, + 0x356849, + 0x3b14d0, + 0x2e22c8, + 0x2c45c9, + 0x293287, + 0x265ccf, + 0x3aecc4, + 0x22d704, + 0x219f46, + 0x222b86, + 0x3a5dca, + 0x3903c6, + 0x33eb87, + 0x2f6fc8, + 0x2f71c7, + 0x2f7bc7, + 0x34b94a, + 0x2fa14b, + 0x38e7c5, + 0x3b3648, + 0x238b83, + 0x261d0c, + 0x212f4f, + 0x2594cd, + 0x2bb187, + 0x338289, + 0x22f4c7, + 0x25a288, + 0x38274c, + 0x2a6c48, + 0x252cc8, + 0x30c28e, + 0x31f814, + 0x31fd24, + 0x33f28a, + 0x35a54b, + 0x215b04, + 0x215b09, + 0x330288, + 0x244545, + 0x24ec0a, + 0x36b187, + 0x307e44, + 0x323ac3, + 0x22d183, + 0x2374c4, + 0x2343c3, + 0x21eb03, + 0x201604, + 0x202243, + 0x211003, + 0x2cc5c6, + 0x212444, + 0x238483, + 0x2264c3, + 0x21bd03, 0x200882, - 0x323743, - 0x204a82, - 0x258403, - 0x232ec4, - 0x230743, - 0x2d9d43, - 0x202503, - 0x2ccc86, - 0x249943, - 0x2257c3, - 0x894c8, - 0x258403, - 0x230743, - 0x2095c3, - 0x249943, - 0x2257c3, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x7112c8, - 0x201742, + 0x323ac3, + 0x216582, + 0x22d183, + 0x2374c4, + 0x2343c3, + 0x21eb03, + 0x202243, + 0x2cc5c6, + 0x238483, + 0x2264c3, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x211cc3, + 0x238483, + 0x2264c3, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x212444, + 0x238483, + 0x2264c3, + 0x200882, + 0x2f5003, + 0x216582, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x202ec2, 0x200482, - 0x204a82, - 0x258403, - 0x201e02, - 0x201042, - 0x201104, - 0x30ac84, - 0x218f82, - 0x2021c4, - 0x2016c2, - 0x2257c3, - 0x219683, - 0x236286, - 0x21ce42, - 0x203d02, - 0x21a642, - 0x3b21fc03, - 0x3b606343, - 0x4df06, - 0x4df06, - 0x224284, - 0xf5dcc, - 0x18ce0c, - 0x7edcd, - 0xd9547, - 0x182c8, - 0x1e808, - 0x1a7e8a, - 0x3c2fc045, - 0x11fe09, - 0x153b08, - 0x19ec8a, - 0x190d0e, - 0x143c6cb, - 0x63604, - 0x1702c8, - 0x7a287, - 0x1a8387, - 0x10d109, - 0x11cac7, - 0x132948, - 0x1a2e49, - 0x12ba85, - 0x53e0e, - 0xa88cd, - 0x62e88, - 0x3c665e86, - 0x5ec87, - 0x5f747, - 0x68787, - 0x6df87, - 0xcbc2, - 0x122d07, - 0x1b074c, - 0xe94c7, - 0x8eb46, - 0xa3609, - 0xa5ec8, - 0xd4c2, - 0x1042, - 0x17dc0b, - 0x13349, - 0x3f209, - 0x295c8, - 0xaf102, - 0x40ec9, - 0xcd649, - 0xce408, - 0xce947, - 0xcf109, - 0xd1dc5, - 0xd21d0, - 0x19a286, - 0x555c5, - 0x23ccd, - 0x11c686, - 0xda487, - 0xdfdd8, - 0x156288, - 0x1a080a, - 0x162d0d, - 0x3e42, - 0x7e246, - 0x8ad48, - 0x174a08, - 0x89389, - 0x42b08, - 0x4e10e, - 0xe6f85, - 0x4a148, - 0x35c2, - 0x152dc6, + 0x216582, + 0x22d183, + 0x22b782, + 0x200a82, + 0x201604, + 0x307b04, + 0x219382, + 0x212444, + 0x201502, + 0x2264c3, + 0x21bd03, + 0x3a5946, + 0x221e42, + 0x206202, + 0x224dc2, + 0x3d224643, + 0x3d626703, + 0x53d46, + 0x53d46, + 0x224104, + 0x140a30a, + 0x16970c, + 0x165f0c, + 0x798cd, + 0xdb7c7, + 0x1b908, + 0x22f08, + 0x1a7eca, + 0x3e31f345, + 0x11f349, + 0x163048, + 0x1ac10a, + 0x16348e, + 0x144148b, + 0x167404, + 0x2988, + 0x16e847, + 0x178587, + 0x112089, + 0x10ec87, + 0x132d48, + 0x1a2f89, + 0x17a845, + 0x5074e, + 0xa910d, + 0x131948, + 0x3e6d7e86, + 0x60c47, + 0x62607, + 0x67347, + 0x6c4c7, + 0xd382, + 0x141807, + 0x1d34c, + 0xeaec7, + 0x8ddc6, + 0xa5449, + 0xa7188, + 0xf1c2, + 0xa82, + 0x13088b, + 0x15309, + 0x33c49, + 0x2b848, + 0xb09c2, + 0x1afb89, + 0xccf89, + 0xcdbc8, + 0xce147, + 0xcf0c9, + 0xd2905, + 0xd2d10, + 0x164d46, + 0x51f05, + 0x23b4d, + 0x10e846, + 0xdc047, + 0xe26d8, + 0x108548, + 0x19104a, + 0x4114d, + 0x1402, + 0x161186, + 0x89948, + 0x180248, + 0x87f89, + 0x45e88, + 0x4da0e, + 0xe8f85, + 0x539c8, + 0x3282, + 0x155646, 0x6c2, - 0xc01, - 0x3cae0644, - 0x3ce91043, + 0xb81, + 0x3eae2f44, + 0x3ee90c43, 0x141, - 0x17d386, + 0x1650c6, 0x141, 0x1, - 0x17d386, - 0x1564a45, - 0x2054c4, - 0x258403, - 0x2446c4, - 0x201104, - 0x249943, - 0x21fb85, - 0x20f0c3, - 0x244443, - 0x2e82c5, - 0x224043, - 0x3de58403, - 0x230743, - 0x2d9d43, + 0x1650c6, + 0x14f60c5, + 0x245dc4, + 0x22d183, + 0x247344, + 0x201604, + 0x238483, + 0x2245c5, + 0x21ca03, + 0x215cc3, + 0x2e9cc5, + 0x223ec3, + 0x3fe2d183, + 0x2343c3, + 0x21eb03, 0x200041, - 0x219bc3, - 0x30ac84, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x2161c3, - 0x894c8, + 0x211003, + 0x307b04, + 0x212444, + 0x238483, + 0x2264c3, + 0x217643, + 0x880c8, 0x200882, - 0x323743, - 0x204a82, - 0x258403, - 0x230743, - 0x2095c3, - 0x201042, - 0x201104, - 0x202503, - 0x219bc3, - 0x249943, - 0x202883, - 0x2257c3, - 0x224043, - 0x894c8, - 0x38c082, - 0x4a82, - 0xf750e, - 0x3ee00142, - 0x274948, - 0x2221c6, - 0x2634c6, - 0x221b47, - 0x3f207d42, - 0x3f756d08, - 0x20828a, - 0x25e708, - 0x200dc2, - 0x208b09, - 0x27cec7, - 0x217586, - 0x207c49, - 0x24f9c4, - 0x2b75c6, - 0x2d7804, - 0x276684, - 0x250689, - 0x354786, - 0x20a105, - 0x380a85, - 0x383a87, - 0x2b8b07, - 0x3809c4, - 0x221d86, - 0x2fe205, - 0x2e13c5, - 0x2f4005, - 0x3925c7, - 0x33fb45, - 0x307409, - 0x30f905, - 0x2cfec4, - 0x2e69c7, - 0x24b3ce, - 0x261c49, - 0x326f09, - 0x346646, - 0x33c4c8, - 0x2ae2cb, - 0x2d158c, - 0x25a586, - 0x3786c7, - 0x20a605, - 0x226d0a, - 0x31b0c9, - 0x24a909, - 0x295506, - 0x2edd05, - 0x34bf85, - 0x363c49, - 0x2f418b, - 0x279f46, - 0x330ac6, - 0x20cb04, - 0x289fc6, - 0x2a9a08, - 0x201446, - 0x3a3e46, - 0x209648, - 0x209e47, - 0x20a389, - 0x20b085, - 0x894c8, - 0x3a8304, - 0x37c344, - 0x211605, - 0x395c09, - 0x21ef07, - 0x21ef0b, - 0x22108a, - 0x226a05, - 0x3fa0b802, - 0x223007, - 0x3fe28d88, - 0x285007, - 0x354ac5, - 0x23458a, - 0x4a82, - 0x3aa0cb, - 0x3874ca, - 0x21fe86, - 0x3a3083, - 0x32dc0d, - 0x363e4c, - 0x3a214d, - 0x3828c5, - 0x238985, - 0x252807, - 0x201e09, - 0x208186, - 0x380605, - 0x2f1bc8, - 0x289ec3, - 0x2d8bc8, - 0x289ec8, - 0x2bd3c7, - 0x3b1588, - 0x200b09, - 0x232687, - 0x2f4f07, - 0x2f4688, - 0x3a9944, - 0x3a9947, - 0x2691c8, - 0x204786, - 0x37e78f, - 0x221407, - 0x2d58c6, - 0x259045, - 0x220803, - 0x36dd07, - 0x368c83, - 0x243486, - 0x245306, - 0x2466c6, - 0x28df45, - 0x265943, - 0x388ac8, - 0x36b4c9, - 0x37ef8b, - 0x246848, - 0x247d85, - 0x248d45, - 0x40237842, - 0x37b0c9, - 0x201187, - 0x2569c5, - 0x250587, - 0x255b46, - 0x360405, - 0x36a88b, - 0x258a84, - 0x25e2c5, - 0x25e407, - 0x273986, - 0x275385, - 0x282dc7, - 0x283347, - 0x26f744, - 0x288a8a, - 0x288f48, - 0x24bc89, - 0x2ee845, - 0x332f86, - 0x2a9bca, - 0x3aa306, - 0x20c4c7, - 0x31754d, - 0x22c6c9, - 0x24c745, - 0x253647, - 0x2637c8, - 0x263e48, - 0x311807, - 0x323086, - 0x2101c7, - 0x244c03, - 0x3355c4, - 0x35ce05, - 0x38d347, - 0x391fc9, - 0x21a048, - 0x22a6c5, - 0x2e62c4, - 0x36a3c5, - 0x23fccd, - 0x204042, - 0x302d86, - 0x27e186, - 0x2a3a8a, - 0x363386, - 0x374405, - 0x317d45, - 0x317d47, - 0x37b80c, - 0x271b8a, - 0x289c86, - 0x208945, - 0x289e06, - 0x28a147, - 0x28bd86, - 0x28de4c, - 0x207d89, - 0x4077d807, - 0x2905c5, - 0x2905c6, - 0x290ac8, - 0x2b0c05, - 0x2a29c5, - 0x2a2c08, - 0x2a2e0a, - 0x40a6b682, - 0x40e0f402, - 0x37ff85, - 0x2d5843, - 0x2e5c88, - 0x21d543, - 0x2a3084, - 0x239d4b, - 0x35edc8, - 0x2a6d08, - 0x41329249, - 0x2a8109, - 0x2a87c6, - 0x2aa648, - 0x2aa849, - 0x2ab406, - 0x2ab585, - 0x381146, - 0x2ac0c9, - 0x31b987, - 0x246406, - 0x2d9007, - 0x208007, - 0x240204, - 0x416fb349, - 0x2c4408, - 0x356c08, - 0x33e947, - 0x2bedc6, - 0x33b409, - 0x263487, - 0x341a8a, - 0x381908, - 0x3231c7, - 0x3330c6, - 0x260c0a, - 0x2488c8, - 0x28bec5, - 0x225b85, - 0x2d38c7, - 0x2d4fc9, - 0x2d64cb, - 0x2e9908, - 0x30f989, - 0x246b47, - 0x3aef0c, - 0x2b07cc, - 0x2b0aca, - 0x2b0d4c, - 0x2bc388, - 0x2bc588, - 0x2bc784, - 0x2bcb49, - 0x2bcd89, - 0x2bcfca, - 0x2bd249, - 0x2bd587, + 0x323ac3, + 0x216582, + 0x22d183, + 0x2343c3, + 0x211cc3, + 0x200a82, + 0x201604, + 0x202243, + 0x211003, + 0x238483, + 0x2025c3, + 0x2264c3, + 0x223ec3, + 0x880c8, + 0x38bcc2, + 0x16582, + 0x1462d48, + 0xf738e, + 0x40e00142, + 0x29e988, + 0x227fc6, + 0x2bb546, + 0x227947, + 0x41201102, + 0x417566c8, + 0x3af8ca, + 0x2606c8, + 0x201002, + 0x29e609, + 0x38e807, + 0x21ac06, + 0x201009, + 0x254704, + 0x2f5fc6, + 0x2d5fc4, + 0x273a04, + 0x2563c9, + 0x281786, + 0x2e3d85, + 0x220e45, + 0x3a5287, + 0x2b7cc7, + 0x243884, + 0x227b86, + 0x39fac5, + 0x202b05, + 0x2f5905, + 0x392547, + 0x366785, + 0x308bc9, + 0x2808c5, + 0x2d07c4, + 0x39a387, + 0x30584e, + 0x30fc49, + 0x322e89, + 0x348986, + 0x31e708, + 0x2b024b, + 0x2d210c, + 0x25b946, + 0x37cb07, + 0x209805, + 0x20f24a, + 0x20a689, + 0x252249, + 0x293d86, + 0x2ee6c5, + 0x28b145, + 0x361f09, + 0x2f5a8b, + 0x277606, + 0x32e5c6, + 0x20d2c4, + 0x288bc6, + 0x25f948, + 0x203d06, + 0x3a82c6, + 0x208bc8, + 0x2093c7, + 0x209589, + 0x20c445, + 0x880c8, + 0x378504, + 0x229e04, + 0x212d45, + 0x395589, + 0x223707, + 0x22370b, + 0x2255ca, + 0x22b185, + 0x41a0b602, + 0x2173c7, + 0x41e2c488, + 0x2833c7, + 0x281ac5, + 0x32594a, + 0x16582, + 0x24b90b, + 0x2adc4a, + 0x2248c6, + 0x3a31c3, + 0x230dcd, + 0x3320cc, + 0x36210d, + 0x3845c5, + 0x237205, + 0x24f147, + 0x3a8e89, + 0x3af7c6, + 0x390245, + 0x2ee3c8, + 0x288ac3, + 0x2e8108, + 0x288ac8, + 0x2bc507, + 0x2e62c8, + 0x3af3c9, + 0x236107, + 0x20ae07, + 0x335048, + 0x253384, + 0x253387, + 0x266a88, + 0x205846, + 0x3661cf, + 0x215507, + 0x2e3506, + 0x25a405, + 0x224f43, + 0x372207, + 0x36e143, + 0x246506, + 0x247f86, + 0x249686, + 0x28d1c5, + 0x263e83, + 0x3885c8, + 0x370489, + 0x38124b, + 0x249808, + 0x24c4c5, + 0x24d4c5, + 0x4223aa82, + 0x37f509, + 0x201687, + 0x258b45, + 0x2562c7, + 0x257e06, + 0x35eb05, + 0x36f9cb, + 0x259e44, + 0x260285, + 0x2603c7, + 0x271986, + 0x271fc5, + 0x27dbc7, + 0x27e647, + 0x26db04, + 0x2871ca, + 0x287688, + 0x3685c9, + 0x3a65c5, + 0x333386, + 0x25fb0a, + 0x220d46, + 0x24bb47, + 0x318a8d, + 0x2273c9, + 0x30ff45, + 0x24ff87, + 0x335608, + 0x3675c8, + 0x341b87, + 0x34a486, + 0x2116c7, + 0x247883, + 0x337ec4, + 0x35c385, + 0x38cac7, + 0x391f49, + 0x21a6c8, + 0x22fd05, + 0x382a04, + 0x240e85, + 0x2448cd, + 0x201142, + 0x3006c6, + 0x3610c6, + 0x2bde4a, + 0x3791c6, + 0x37fc45, + 0x319285, + 0x319287, + 0x38b14c, + 0x26fb8a, + 0x288886, + 0x29e445, + 0x288a06, + 0x288d47, + 0x28a9c6, + 0x28d0cc, + 0x201149, + 0x42765547, + 0x290305, + 0x290306, + 0x2906c8, + 0x2b1f05, + 0x2a4805, + 0x2a4a48, + 0x2a4c4a, + 0x42a6a242, + 0x42e0ff82, + 0x382245, + 0x29cdc3, + 0x37a688, + 0x21d083, + 0x2a4ec4, + 0x23de4b, + 0x272408, + 0x2d77c8, + 0x433255c9, + 0x2a8949, + 0x2a9006, + 0x2aa5c8, + 0x2aa7c9, + 0x2ab386, + 0x2ab505, + 0x383086, + 0x2abc09, + 0x2802c7, + 0x243f06, + 0x235c47, + 0x3af647, + 0x33b504, + 0x43743909, + 0x2c2288, + 0x3565c8, + 0x2368c7, + 0x2bd906, + 0x2fe209, + 0x331f47, + 0x2f1b0a, + 0x376848, + 0x3237c7, + 0x326086, + 0x33aa0a, + 0x249fc8, + 0x28ab05, + 0x21bf85, + 0x2bcb87, + 0x2d26c9, + 0x2d6e0b, + 0x2dd8c8, + 0x280949, + 0x249b07, + 0x3ad20c, + 0x2b1acc, + 0x2b1dca, + 0x2b204c, + 0x2bb4c8, + 0x2bb6c8, + 0x2bb8c4, + 0x2bbc89, + 0x2bbec9, + 0x2bc10a, + 0x2bc389, + 0x2bc6c7, 0x20010c, - 0x22bd06, - 0x273dc8, - 0x3aa3c6, + 0x36ef86, + 0x26de48, + 0x220e06, + 0x387346, + 0x30fe47, + 0x341d08, + 0x25180b, + 0x283287, + 0x2aeb49, + 0x2474c9, + 0x255f87, + 0x2d6204, + 0x35efc7, + 0x29f606, + 0x219006, + 0x38d985, + 0x2ccd88, + 0x20ef04, + 0x20ef06, + 0x26fa4b, + 0x2a2389, + 0x364086, + 0x3a8409, + 0x3926c6, + 0x2fec08, + 0x214803, + 0x2083c5, + 0x219149, + 0x21fe05, + 0x3a6084, + 0x270fc6, + 0x3a5a85, + 0x2e6846, + 0x2fbc07, + 0x367186, + 0x2952cb, + 0x2b0647, + 0x2d2586, + 0x374346, + 0x3a5346, + 0x243849, + 0x26238a, + 0x2b6045, + 0x21f68d, + 0x2a4d46, + 0x391246, + 0x2e21c6, + 0x210205, + 0x2d3007, + 0x2962c7, + 0x23b68e, + 0x211003, + 0x2bd8c9, + 0x318fc9, + 0x20f647, + 0x276b87, + 0x299d85, + 0x306f45, + 0x43a7eacf, + 0x2c4807, + 0x2c49c8, + 0x2c5a44, + 0x2c5d06, + 0x43e43b02, + 0x2ca1c6, + 0x2cc5c6, + 0x251b4e, + 0x2e7f4a, + 0x21cd06, + 0x33fcca, + 0x3b4089, + 0x316fc5, + 0x393b48, + 0x3ad0c6, + 0x34ab88, + 0x30f788, + 0x25ab8b, + 0x227a45, + 0x366808, + 0x208d0c, + 0x281987, + 0x248b06, + 0x22f108, + 0x201948, + 0x44208382, + 0x362b0b, + 0x280bc9, + 0x363e89, + 0x209987, + 0x30e688, + 0x4460c648, + 0x3a8c0b, + 0x22b6c9, + 0x20870d, + 0x217e88, + 0x22c288, + 0x44a02282, + 0x31d784, + 0x44e23b42, + 0x2ebc06, + 0x452016c2, + 0x3a180a, + 0x201fc6, + 0x225f08, + 0x31ea08, + 0x2b7546, 0x386986, - 0x24c647, - 0x311988, - 0x254ecb, - 0x284ec7, - 0x2ed9c9, - 0x244849, - 0x250247, - 0x2d7a44, - 0x3608c7, - 0x329b86, - 0x216386, - 0x27c045, - 0x2cd448, - 0x20e444, - 0x20e446, - 0x271a4b, - 0x2a57c9, - 0x261a86, - 0x31bf49, - 0x392746, - 0x2ff808, - 0x23e383, - 0x20bac5, - 0x3aa509, - 0x3b1745, - 0x2f2904, - 0x272fc6, - 0x221805, - 0x2da246, - 0x2fc947, - 0x340546, - 0x296a4b, - 0x3590c7, - 0x2d0846, - 0x372806, - 0x383b46, - 0x380989, - 0x26a48a, - 0x2b4f05, - 0x22634d, - 0x2a2f06, - 0x3a0a06, - 0x2df8c6, - 0x214645, - 0x2d24c7, - 0x29a587, - 0x29e54e, - 0x219bc3, - 0x2bed89, - 0x317a89, - 0x227107, - 0x2794c7, - 0x2a4685, - 0x30ffc5, - 0x41a6170f, - 0x2c6287, - 0x2c6448, - 0x2c6b44, - 0x2c6e46, - 0x41e272c2, - 0x2cab86, - 0x2ccc86, - 0x25520e, - 0x2d8a0a, - 0x222b06, - 0x3a60ca, - 0x201c09, - 0x315a85, - 0x3941c8, - 0x3aedc6, - 0x31bd88, - 0x321c88, - 0x2597cb, - 0x221c45, - 0x33fbc8, - 0x20978c, - 0x354987, - 0x245e86, - 0x27d4c8, - 0x2b7848, - 0x4220ba82, - 0x36480b, - 0x2aedc9, - 0x365209, - 0x20a787, - 0x31c4c8, - 0x4260b288, - 0x3aab8b, - 0x229449, - 0x21e14d, - 0x212b48, - 0x29a9c8, - 0x42a02542, - 0x3a4104, - 0x42e05842, - 0x2ea586, - 0x432011c2, - 0x21f50a, - 0x352ec6, - 0x229a88, - 0x33c7c8, - 0x2b74c6, - 0x385fc6, - 0x2e4906, - 0x227a05, - 0x235b84, - 0x436ff784, - 0x336c86, - 0x26ddc7, - 0x43a2e647, - 0x2ebbcb, - 0x24b789, - 0x2389ca, - 0x254ac4, - 0x317e88, - 0x2461cd, - 0x2ddb49, - 0x2ddd88, - 0x2de849, - 0x2dfdc4, - 0x207b44, - 0x26ad85, - 0x309c8b, - 0x35ed46, - 0x336ac5, - 0x354c49, - 0x221e48, - 0x29de04, - 0x226e89, - 0x2ae605, - 0x2b8b48, - 0x2f55c7, - 0x327308, - 0x27fa06, - 0x222ec7, - 0x28f509, - 0x220389, - 0x243045, - 0x32dec5, - 0x43e24902, - 0x2e6784, - 0x22e005, - 0x29fec6, - 0x2e7645, - 0x248e07, - 0x269945, - 0x2699c4, - 0x346706, - 0x380687, - 0x23ef06, - 0x376fc5, - 0x31d008, - 0x2223c5, - 0x332207, - 0x39a449, - 0x2a590a, - 0x27afc7, - 0x27afcc, - 0x20a0c6, - 0x225649, - 0x377bc5, - 0x32b8c8, - 0x210043, - 0x210045, - 0x2e5805, - 0x251687, - 0x442121c2, - 0x2385c7, - 0x2e0ac6, - 0x2fb286, - 0x2e7086, - 0x2b7786, - 0x2d1bc8, - 0x358905, - 0x2d5987, - 0x2d598d, - 0x2636c3, - 0x3a3485, - 0x3a0347, - 0x385b08, - 0x39ff05, - 0x340048, - 0x22e446, - 0x31ffc7, - 0x2be3c5, - 0x221cc6, - 0x36c205, - 0x2bb2ca, - 0x2eb286, - 0x232a07, - 0x2c5e05, - 0x2fe5c7, - 0x314e04, - 0x2f2886, - 0x300f85, - 0x35458b, - 0x329a09, - 0x23ebca, - 0x2430c8, - 0x3312c8, - 0x333b0c, - 0x334047, - 0x335848, - 0x3507c8, - 0x35adc5, - 0x2bd80a, - 0x39c549, - 0x44601d42, - 0x204386, - 0x204f44, - 0x204f49, - 0x220e49, - 0x339607, - 0x270e07, - 0x2b5849, - 0x214848, - 0x21484f, - 0x33dbc6, - 0x3535cb, - 0x2e8105, - 0x2e8107, - 0x2e8549, - 0x226e06, - 0x226e07, - 0x3b3045, - 0x22f2c4, - 0x268206, - 0x200c44, - 0x30d607, - 0x2eb608, - 0x44aedc08, - 0x2ee205, - 0x2ee347, - 0x249749, - 0x2a4384, - 0x3b3308, - 0x44f8c408, - 0x2c0584, - 0x22fc08, + 0x2e6606, + 0x2a00c5, + 0x23b184, + 0x456feb84, + 0x338986, + 0x269047, + 0x45a2ab47, + 0x32be0b, + 0x305c09, + 0x23724a, + 0x251404, + 0x3193c8, + 0x243ccd, + 0x2e07c9, + 0x2e0a08, + 0x2e1149, + 0x2e26c4, + 0x200f04, + 0x269885, + 0x30b48b, + 0x272386, + 0x3387c5, + 0x281c49, + 0x227c48, + 0x29ca84, + 0x20f3c9, + 0x2b0585, + 0x2b7d08, + 0x20b4c7, + 0x323288, + 0x27a506, + 0x217287, + 0x28eb89, + 0x21c209, + 0x2460c5, + 0x231445, + 0x45e25242, + 0x39a144, + 0x2fd585, + 0x2a9746, + 0x2f89c5, + 0x268307, + 0x243405, + 0x243484, + 0x348a46, + 0x3902c7, + 0x243b46, + 0x325dc5, + 0x31d488, + 0x2281c5, + 0x332607, + 0x397409, + 0x2a24ca, + 0x22dac7, + 0x22dacc, + 0x2e3d46, + 0x226349, + 0x2ad585, + 0x2c6e08, + 0x211543, + 0x211545, + 0x2e9405, + 0x256cc7, + 0x46214f02, + 0x236e47, + 0x2d6786, + 0x343846, + 0x2e8cc6, + 0x201886, + 0x347e88, + 0x3583c5, + 0x2e35c7, + 0x2e35cd, + 0x202b43, + 0x3a35c5, + 0x3068c7, + 0x3864c8, + 0x386085, + 0x366c88, + 0x22a946, + 0x31f507, + 0x2bcf05, + 0x227ac6, + 0x3711c5, + 0x2ba40a, + 0x2eb1c6, + 0x236487, + 0x2c5bc5, + 0x35a387, + 0x35e244, + 0x3a6006, + 0x2f61c5, + 0x28158b, + 0x29f489, + 0x37a20a, + 0x246148, + 0x2ff148, + 0x300a4c, + 0x3047c7, + 0x32b388, + 0x32edc8, + 0x336085, + 0x2bc94a, + 0x35d109, + 0x46601082, + 0x205446, + 0x214684, + 0x3b1249, + 0x2220c9, + 0x24d307, + 0x26c307, + 0x358d09, + 0x210408, + 0x21040f, + 0x3477c6, + 0x20a0cb, + 0x2e9b05, + 0x2e9b07, + 0x2e9f49, + 0x20f346, + 0x20f347, + 0x3b3d85, + 0x232784, + 0x2633c6, + 0x201284, + 0x30ac07, + 0x345e08, + 0x46aee5c8, + 0x2eebc5, + 0x2eed07, + 0x238289, + 0x2740c4, + 0x3a3888, + 0x46f20b88, + 0x2c4204, + 0x2330c8, 0x31d904, - 0x21e9c9, - 0x35c705, - 0x45201582, - 0x33dc05, - 0x21bfc5, - 0x247888, - 0x2316c7, - 0x45606882, - 0x2c8905, - 0x24e446, - 0x266ac6, - 0x2e6748, - 0x32e888, - 0x2e7606, - 0x2ead46, - 0x20ee89, - 0x2fb1c6, - 0x30564b, - 0x24ddc5, - 0x20d006, - 0x380448, - 0x20ac46, - 0x292e06, - 0x21938a, - 0x25784a, - 0x23ffc5, - 0x3589c7, - 0x344786, - 0x45a01502, - 0x3a0487, - 0x22d205, - 0x2a9b44, - 0x2a9b45, - 0x2549c6, - 0x272447, - 0x204cc5, - 0x220f04, - 0x2732c8, - 0x292ec5, - 0x291347, - 0x2cefc5, - 0x215305, - 0x244e84, - 0x28d949, - 0x2fe048, - 0x30f506, - 0x3a8546, - 0x2c0286, - 0x45fa6b08, - 0x2f2007, - 0x2f234d, - 0x2f2d0c, - 0x2f3309, - 0x2f3549, - 0x4634f642, - 0x3a4f83, - 0x2049c3, - 0x329c45, - 0x38d44a, - 0x319a06, - 0x2f98c5, - 0x2fce84, - 0x2fce8b, - 0x30b64c, - 0x30be8c, - 0x30c195, - 0x30cb4d, - 0x31244f, - 0x312812, - 0x312c8f, - 0x313052, - 0x3134d3, - 0x31398d, - 0x313f4d, - 0x3142ce, - 0x31478e, - 0x31504c, - 0x31540c, - 0x31584b, - 0x315bce, - 0x318c92, - 0x3197cc, - 0x319d50, - 0x32bbd2, - 0x32cb8c, - 0x32d24d, - 0x32d58c, - 0x32fa91, - 0x330c4d, - 0x33420d, - 0x33480a, - 0x334a8c, - 0x33538c, - 0x3367cc, - 0x33704c, - 0x339fd3, - 0x33a5d0, - 0x33a9d0, - 0x33b64d, - 0x33bc4c, - 0x33cc49, - 0x33eb0d, - 0x33ee53, - 0x340f91, - 0x3413d3, - 0x3423cf, - 0x34278c, - 0x342a8f, - 0x342e4d, - 0x34344f, - 0x343810, - 0x34428e, - 0x34858e, - 0x348cd0, - 0x3498cd, - 0x34a24e, - 0x34a5cc, - 0x34b593, - 0x34d44e, - 0x34db90, - 0x34df91, - 0x34e3cf, - 0x34e793, - 0x34f1cd, - 0x34f50f, - 0x34f8ce, - 0x350010, - 0x350409, - 0x351150, - 0x35178f, - 0x351e0f, - 0x3521d2, - 0x35650e, - 0x357dcd, - 0x359f8d, - 0x35a2cd, - 0x35b34d, - 0x35b68d, - 0x35b9d0, - 0x35bdcb, - 0x35cbcc, - 0x35cf4c, - 0x35d24c, - 0x35d54e, - 0x36e7d0, - 0x370952, - 0x370dcb, - 0x37138e, - 0x37170e, - 0x371f8e, - 0x37298b, - 0x46772f56, - 0x37410d, - 0x374e14, - 0x3758cd, - 0x378215, - 0x37934d, - 0x379ccf, - 0x37a50f, - 0x37f24f, - 0x37f60e, - 0x380bcd, - 0x382451, - 0x38614c, - 0x38644c, - 0x38674b, - 0x386d0c, - 0x3882cf, - 0x388692, - 0x38904d, - 0x38a00c, - 0x38a48c, - 0x38a78d, - 0x38aacf, - 0x38ae8e, - 0x38d10c, - 0x38d6cd, - 0x38da0b, - 0x38e64c, - 0x38ebcd, - 0x38ef0e, - 0x38f389, - 0x38fd93, - 0x39144d, - 0x39178d, - 0x391d8c, - 0x39220e, - 0x39318f, - 0x39354c, - 0x39384d, - 0x393b8f, - 0x393f4c, - 0x39464c, - 0x394acc, - 0x394dcc, - 0x39548d, - 0x3957d2, - 0x395e4c, - 0x39614c, - 0x396451, - 0x39688f, - 0x396c4f, - 0x397013, - 0x397e4e, - 0x3983cf, - 0x39878c, - 0x46b98ace, - 0x398e4f, - 0x399216, - 0x39a692, - 0x39bd4c, - 0x39c78f, - 0x39ce0d, - 0x39d14f, - 0x39d50c, - 0x39d80d, - 0x39db4d, - 0x39f28e, - 0x3a10cc, - 0x3a13cc, - 0x3a16d0, - 0x3a4211, - 0x3a464b, - 0x3a4b8c, - 0x3a4e8e, - 0x3a7011, - 0x3a744e, - 0x3a77cd, - 0x3aeb8b, - 0x3af9cf, - 0x3b1054, - 0x220442, - 0x220442, - 0x201cc3, - 0x220442, - 0x201cc3, - 0x220442, - 0x204f02, - 0x381185, - 0x3a6d0c, - 0x220442, - 0x220442, - 0x204f02, - 0x220442, - 0x291145, - 0x2a5905, - 0x220442, - 0x220442, - 0x210842, - 0x291145, - 0x30d7c9, - 0x340c8c, - 0x220442, - 0x220442, - 0x220442, - 0x220442, - 0x381185, - 0x220442, - 0x220442, - 0x220442, - 0x220442, - 0x210842, - 0x30d7c9, - 0x220442, - 0x220442, - 0x220442, - 0x2a5905, - 0x220442, - 0x2a5905, - 0x340c8c, - 0x3a6d0c, - 0x323743, - 0x258403, - 0x230743, - 0x2d9d43, - 0x201104, - 0x249943, - 0x2257c3, - 0x105dc8, - 0x4e244, - 0x1a97c8, + 0x21f989, + 0x2230c5, + 0x47203e42, + 0x347805, + 0x220c85, + 0x29fc88, + 0x235347, + 0x47600cc2, + 0x2c81c5, + 0x246b46, + 0x256646, + 0x39a108, + 0x2ec008, + 0x2f8986, + 0x31b086, + 0x22a489, + 0x343786, + 0x37870b, + 0x30c145, + 0x20d7c6, + 0x390088, + 0x252606, + 0x28f506, + 0x21c64a, + 0x2ae4ca, + 0x24ce85, + 0x358487, + 0x2d8e06, + 0x47a03dc2, + 0x306a07, + 0x2c7a45, + 0x25fa84, + 0x25fa85, + 0x251306, + 0x270447, + 0x2144c5, + 0x222184, + 0x2712c8, + 0x28f5c5, + 0x2cebc7, + 0x39c105, + 0x216805, + 0x247b04, + 0x28cbc9, + 0x39f908, + 0x2f5ec6, + 0x36fcc6, + 0x2c3f06, + 0x47ef3648, + 0x2f3847, + 0x2f3fcd, + 0x2f460c, + 0x2f4c09, + 0x2f4e49, + 0x48351e02, + 0x3a4803, + 0x24cf03, + 0x29f6c5, + 0x38cbca, + 0x31af46, + 0x2f8e05, + 0x2fc144, + 0x2fc14b, + 0x30d10c, + 0x30d94c, + 0x30dc55, + 0x311acd, + 0x313a0f, + 0x313dd2, + 0x31424f, + 0x314612, + 0x314a93, + 0x314f4d, + 0x31550d, + 0x31588e, + 0x315d4e, + 0x31658c, + 0x31694c, + 0x316d8b, + 0x31710e, + 0x31a1d2, + 0x31ad0c, + 0x31b8d0, + 0x327e52, + 0x328dcc, + 0x32948d, + 0x3297cc, + 0x32d8d1, + 0x32e74d, + 0x336b0d, + 0x33710a, + 0x33738c, + 0x337c8c, + 0x3384cc, + 0x338d4c, + 0x33c9d3, + 0x33d050, + 0x33d450, + 0x33dccd, + 0x33e2cc, + 0x33efc9, + 0x3402cd, + 0x340613, + 0x342e51, + 0x343293, + 0x343b4f, + 0x343f0c, + 0x34420f, + 0x3445cd, + 0x344bcf, + 0x344f90, + 0x345a0e, + 0x34b48e, + 0x34bbd0, + 0x34c7cd, + 0x34d14e, + 0x34d4cc, + 0x34e493, + 0x34fc8e, + 0x3503d0, + 0x3507d1, + 0x350c0f, + 0x350fd3, + 0x35198d, + 0x351ccf, + 0x35208e, + 0x352990, + 0x352d89, + 0x3539d0, + 0x35400f, + 0x35468f, + 0x354a52, + 0x355ece, + 0x35788d, + 0x35998d, + 0x359ccd, + 0x35ac4d, + 0x35af8d, + 0x35b2d0, + 0x35b6cb, + 0x35c14c, + 0x35c4cc, + 0x35c7cc, + 0x35cace, + 0x372990, + 0x3744d2, + 0x37494b, + 0x3750ce, + 0x37544e, + 0x375cce, + 0x37728b, + 0x48777856, + 0x378ecd, + 0x379354, + 0x37a98d, + 0x37c655, + 0x37d78d, + 0x37e10f, + 0x37e94f, + 0x38150f, + 0x3818ce, + 0x382b0d, + 0x384151, + 0x386b0c, + 0x386e0c, + 0x38710b, + 0x387a0c, + 0x387dcf, + 0x388192, + 0x388b4d, + 0x389b0c, + 0x389f8c, + 0x38a28d, + 0x38a5cf, + 0x38a98e, + 0x38c88c, + 0x38ce4d, + 0x38d18b, + 0x38e9cc, + 0x38ef4d, + 0x38f28e, + 0x38f709, + 0x3909d3, + 0x3913cd, + 0x39170d, + 0x391d0c, + 0x39218e, + 0x392b0f, + 0x392ecc, + 0x3931cd, + 0x39350f, + 0x3938cc, + 0x393fcc, + 0x39444c, + 0x39474c, + 0x394e0d, + 0x395152, + 0x3957cc, + 0x395acc, + 0x395dd1, + 0x39620f, + 0x3965cf, + 0x396993, + 0x39764e, + 0x397bcf, + 0x397f8c, + 0x48b982ce, + 0x39864f, + 0x398a16, + 0x399c12, + 0x39b88c, + 0x39c24f, + 0x39c8cd, + 0x39cc0f, + 0x39cfcc, + 0x39d2cd, + 0x39d60d, + 0x39f4ce, + 0x3a058c, + 0x3a088c, + 0x3a0b90, + 0x3a3a91, + 0x3a3ecb, + 0x3a440c, + 0x3a470e, + 0x3a7051, + 0x3a748e, + 0x3a780d, + 0x3ace8b, + 0x3adbcf, + 0x3aee94, + 0x21c2c2, + 0x21c2c2, + 0x205903, + 0x21c2c2, + 0x205903, + 0x21c2c2, + 0x205e02, + 0x3830c5, + 0x3a6d4c, + 0x21c2c2, + 0x21c2c2, + 0x205e02, + 0x21c2c2, + 0x290d45, + 0x2a24c5, + 0x21c2c2, + 0x21c2c2, + 0x211d42, + 0x290d45, + 0x312d49, + 0x342b4c, + 0x21c2c2, + 0x21c2c2, + 0x21c2c2, + 0x21c2c2, + 0x3830c5, + 0x21c2c2, + 0x21c2c2, + 0x21c2c2, + 0x21c2c2, + 0x211d42, + 0x312d49, + 0x21c2c2, + 0x21c2c2, + 0x21c2c2, + 0x2a24c5, + 0x21c2c2, + 0x2a24c5, + 0x342b4c, + 0x3a6d4c, + 0x323ac3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x201604, + 0x238483, + 0x2264c3, + 0x141388, + 0x4db44, + 0xed208, 0x200882, - 0x47a04a82, - 0x23b383, - 0x2296c4, - 0x2099c3, - 0x2d9d44, - 0x2e0006, - 0x230243, - 0x230204, - 0x276f85, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x24388a, - 0x236286, - 0x371a8c, - 0x894c8, - 0x204a82, - 0x258403, - 0x230743, - 0x2d9d43, - 0x230c43, - 0x2ccc86, - 0x249943, - 0x2257c3, - 0x219683, - 0x7982, - 0xd9547, - 0xb6b88, - 0xf20e, - 0x87092, - 0x8e0b, - 0x486fc045, - 0x48afc04c, - 0x40907, - 0x11864a, - 0x370d0, - 0x1702c8, - 0x7a287, - 0x574cb, - 0x10d109, - 0x1701c7, - 0x11cac7, - 0x7a187, - 0x1d6c6, - 0x132948, - 0x4901f186, - 0xa88cd, - 0x118010, - 0x494079c2, - 0x62e88, - 0x69707, - 0xa7e09, - 0x4dfc6, - 0x90cc8, - 0x6dc2, - 0x9d6ca, - 0xef947, - 0xe94c7, - 0xa3609, - 0xa5ec8, - 0x158485, - 0xded8e, - 0xd74e, - 0x11f0f, - 0x13349, - 0x3f209, - 0x6c9cb, - 0x81e4f, - 0x8db4c, - 0xac48b, - 0x15b008, - 0xebac7, - 0xf0ac8, - 0x13c2cb, - 0x144e8c, - 0x14cf8c, - 0x14fd0c, - 0x16efcd, - 0x295c8, - 0x40ec9, - 0x14934b, - 0xbefc6, - 0xceb05, - 0xd21d0, - 0x126a46, - 0x555c5, - 0xd4b88, - 0xda487, - 0xdac87, - 0x153d47, - 0xea3ca, - 0xb6a0a, - 0x7e246, - 0x8e90d, - 0x174a08, - 0x42b08, - 0x44dc9, - 0xe9f0c, - 0x16f1cb, - 0x12af84, - 0xf1dc9, - 0x126906, - 0x3d02, - 0x152dc6, + 0x49a16582, + 0x240003, + 0x22b944, + 0x208f43, + 0x21eb04, + 0x231ac6, + 0x31d243, + 0x34aa44, + 0x26cc05, + 0x211003, + 0x238483, + 0x2264c3, + 0x24690a, + 0x3a5946, + 0x3757cc, + 0x880c8, + 0x216582, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x2348c3, + 0x2cc5c6, + 0x238483, + 0x2264c3, + 0x21bd03, + 0xd42, + 0xdb7c7, + 0xca908, + 0xfd8e, + 0x85792, + 0x2ecb, + 0x4a71f345, + 0x4ab76d0c, + 0x131007, + 0x16e747, + 0x119b8a, + 0x3c550, + 0x2988, + 0x16e847, + 0xae14b, + 0x112089, + 0x173507, + 0x10ec87, + 0x77847, + 0x169c6, + 0x132d48, + 0x4b01e1c6, + 0xa910d, + 0x119550, + 0x4b400d82, + 0x131948, + 0x680c7, + 0x84109, + 0x53e06, + 0x908c8, + 0x5e82, + 0x9c34a, + 0x8e507, + 0xeaec7, + 0xa5449, + 0xa7188, + 0x157f45, + 0xe168e, + 0xe9ce, + 0x14c4f, + 0x15309, + 0x33c49, + 0x6528b, + 0x7cdcf, + 0x8cdcc, + 0xdcbcb, + 0xd99c8, + 0x12bd07, + 0xede48, + 0x11e50b, + 0x13e94c, + 0x14624c, + 0x14f98c, + 0x1524cd, + 0x2b848, + 0x30cc2, + 0x1afb89, + 0x14c24b, + 0xbdb06, + 0xce6c5, + 0xd2d10, + 0x1229c6, + 0x51f05, + 0xd6908, + 0xdc047, + 0xdc307, + 0x163287, + 0xeba4a, + 0xca78a, + 0x161186, + 0x8db8d, + 0x180248, + 0x45e88, + 0x47a49, + 0xeb58c, + 0x1526cb, + 0x171ac4, + 0xf3109, + 0x44bc6, + 0x6202, + 0x155646, + 0xfefc7, 0x6c2, - 0xc35c5, + 0xc0e85, 0x481, - 0x35f83, - 0x48f8b906, - 0x91043, - 0x95c2, - 0x35604, - 0xdc2, - 0x24284, + 0x3b583, + 0x4af9eb86, + 0x90c43, + 0x1f82, + 0x3a4c4, + 0x1002, + 0x24104, 0x9c2, - 0x7dc2, - 0x6442, - 0x52f42, - 0x1742, - 0xfc042, + 0x1182, + 0x3182, + 0x4f882, + 0x2ec2, + 0x104e82, 0x8c2, - 0x19fc2, - 0x33942, + 0x1dec2, + 0x37e42, 0x682, - 0x1842, - 0xb0a82, - 0x30743, - 0x3f42, + 0xf82, + 0xb1d82, + 0x343c3, + 0x8042, 0x202, - 0xbc82, - 0x5642, - 0x1a042, - 0x2f542, - 0xd4c2, + 0x6ac2, + 0x21842, + 0xb2c2, + 0x32a02, + 0xf1c2, 0x42, - 0x4542, - 0x1042, - 0x2503, - 0x3dc2, - 0x2602, - 0xaf102, - 0xa482, - 0x120c2, - 0x67c2, - 0x326c2, - 0x8a42, - 0x2242, - 0x16ecc2, - 0x7a42, - 0x2c902, - 0x49943, - 0x1ec2, - 0xba82, - 0x1a82, - 0x10342, - 0x42fc5, - 0x9d02, - 0x3c782, - 0x394c3, - 0x3b82, - 0xb482, - 0x3e42, - 0x1b842, - 0x14202, - 0x6882, - 0x35c2, - 0x3d02, - 0x6fb47, - 0x2115c3, + 0x5602, + 0xa82, + 0x2243, + 0x74c2, + 0x1982, + 0xb09c2, + 0x9682, + 0xb402, + 0x61c2, + 0xa242, + 0x9a1c2, + 0x6742, + 0x172e82, + 0xe02, + 0x9f82, + 0x38483, + 0x1dc2, + 0x8382, + 0x25c2, + 0x2182, + 0x46045, + 0x6a42, + 0x41542, + 0x3e503, + 0x4b42, + 0x7982, + 0x1402, + 0x15c2, + 0x1882, + 0xcc2, + 0x3282, + 0x6202, + 0x6b247, + 0x212d03, 0x200882, - 0x258403, - 0x230743, - 0x2095c3, - 0x213ac3, - 0x230c43, - 0x249943, - 0x202883, - 0x2257c3, - 0x291083, - 0x894c8, - 0x258403, - 0x230743, - 0x2095c3, - 0x219bc3, - 0x249943, - 0x202883, - 0x2257c3, - 0x258403, - 0x230743, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, + 0x22d183, + 0x2343c3, + 0x211cc3, + 0x201d83, + 0x2348c3, + 0x238483, + 0x2025c3, + 0x2264c3, + 0x290c83, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x211cc3, + 0x211003, + 0x238483, + 0x2025c3, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, 0x200041, - 0x219bc3, - 0x249943, - 0x209583, - 0x2257c3, - 0x323743, - 0x258403, - 0x230743, - 0x262e83, - 0x2095c3, - 0x31e683, - 0x281c83, - 0x2a2283, - 0x24c2c3, - 0x2d9d43, - 0x201104, - 0x249943, - 0x2257c3, - 0x224043, - 0x262044, - 0x223a83, - 0x3803, - 0x201543, - 0x365a88, - 0x260c44, - 0x316a4a, - 0x37db06, - 0xdc784, - 0x3a2d07, - 0x21c7ca, - 0x33da89, - 0x3b27c7, + 0x211003, + 0x238483, + 0x201f43, + 0x2264c3, + 0x323ac3, + 0x22d183, + 0x2343c3, + 0x25f643, + 0x211cc3, + 0x3112c3, + 0x27cc03, + 0x201f83, + 0x25a603, + 0x21eb03, + 0x201604, + 0x238483, + 0x2264c3, + 0x223ec3, + 0x305fc4, + 0x21e143, + 0x4803, + 0x203e03, + 0x2a0cc8, + 0x332a44, + 0x317f8a, + 0x330786, + 0xda404, + 0x3a2e47, + 0x22138a, + 0x347689, + 0x3b3507, 0x20054a, - 0x323743, - 0x38000b, - 0x24c209, - 0x2c0385, - 0x2ca9c7, - 0x4a82, - 0x258403, - 0x333687, - 0x20ebc5, - 0x2d7909, - 0x230743, - 0x221a46, - 0x2baf83, - 0xe0b43, - 0xfba46, - 0x52b86, - 0x106a47, - 0x3aa706, - 0x216fc5, - 0x20b147, - 0x336e87, - 0x4b6d9d43, - 0x32cdc7, - 0x3607c3, - 0x27cdc5, - 0x201104, - 0x226808, - 0x2add4c, - 0x2ad045, - 0x364f86, - 0x333547, - 0x399c07, - 0x214247, - 0x2167c8, - 0x29ec8f, - 0x2aed05, - 0x23b487, - 0x28ba87, - 0x2a31ca, - 0x2f1a09, - 0x2da985, - 0x2db14a, - 0x274c6, - 0x2bb005, - 0x371004, - 0x2b7406, - 0x36d007, - 0x236ac7, - 0x353008, - 0x3a9ac5, - 0x20eac6, - 0x3a3dc5, - 0x2212c5, - 0x221744, - 0x33c6c7, - 0x2d1a0a, - 0x38c948, - 0x2ecc06, - 0x30c43, - 0x2cf185, - 0x22b9c6, + 0x323ac3, + 0x3822cb, + 0x368b49, + 0x2c4005, + 0x2ca007, + 0x16582, + 0x22d183, + 0x326647, + 0x22a1c5, + 0x2d60c9, + 0x2343c3, + 0x227846, + 0x2ba0c3, + 0x9f543, + 0xfaa86, + 0x4f4c6, + 0x11d1c7, + 0x3a8786, + 0x213e45, + 0x20c507, + 0x338b87, + 0x4d61eb03, + 0x329007, + 0x35eec3, + 0x38e705, + 0x201604, + 0x221c08, + 0x2af6cc, + 0x2ad6c5, + 0x363c06, + 0x326507, + 0x224b47, + 0x205087, + 0x206e48, + 0x2597cf, + 0x280b05, + 0x240107, + 0x27e347, + 0x2a500a, + 0x2ee209, + 0x2d7185, + 0x2d830a, + 0xdea46, + 0x2ba145, + 0x374b84, + 0x2b7486, + 0x2fe5c7, + 0x230bc7, + 0x2a0a08, + 0x214805, + 0x22a0c6, + 0x3a8245, + 0x37a445, + 0x21fd44, + 0x31e907, + 0x347cca, + 0x365a48, + 0x2edb86, + 0x348c3, + 0x2cf145, + 0x238d06, 0x200346, - 0x2554c6, - 0x219bc3, - 0x3892c7, - 0x28ba05, - 0x249943, - 0x3b2a4d, - 0x202883, - 0x353108, - 0x3acdc4, - 0x206f05, - 0x2a30c6, - 0x232c46, - 0x20cf07, - 0x2a22c7, - 0x267785, - 0x2257c3, - 0x326c87, - 0x338ec9, - 0x256dc9, - 0x269a0a, - 0x23dfc2, - 0x27cd84, - 0x2d5504, - 0x219947, - 0x238488, - 0x2dbac9, - 0x3a3349, - 0x2dcb07, - 0x2ae806, - 0xdeb06, - 0x2dfdc4, - 0x2e03ca, - 0x2e40c8, - 0x2e47c9, - 0x294a46, - 0x302a85, - 0x38c808, - 0x2c094a, - 0x25a383, - 0x234a06, - 0x2dcc07, - 0x20f545, - 0x3acc85, - 0x23d2c3, - 0x24ccc4, - 0x225b45, - 0x283447, - 0x2fe185, - 0x2e97c6, - 0x12e785, - 0x222bc3, - 0x222bc9, - 0x22ba8c, - 0x2aa18c, - 0x2c7348, - 0x2931c7, - 0x2ef348, - 0x2efeca, - 0x2f104b, - 0x24c348, - 0x365088, - 0x362a06, - 0x322e85, - 0x323dca, - 0x216005, - 0x201582, - 0x2be287, - 0x26cc46, - 0x350c85, - 0x3418c9, - 0x27c585, - 0x381845, - 0x27c989, - 0x22b846, - 0x36d448, - 0x261483, - 0x3aa846, - 0x272f06, - 0x2fed85, - 0x2fed89, - 0x2dc209, - 0x23e307, - 0xfec04, - 0x2fec07, - 0x3a3249, - 0x21c9c5, - 0x2bf88, - 0x352cc5, - 0x3529c5, - 0x22b209, - 0x20e3c2, - 0x223884, - 0x205e42, - 0x203dc2, - 0x2953c5, - 0x2dc508, - 0x377f85, - 0x2bd743, - 0x2bd745, - 0x2cad83, - 0x20fcc2, - 0x266704, - 0x233443, - 0x200d82, - 0x358c44, - 0x2d61c3, - 0x2137c2, - 0x295443, - 0x28acc4, - 0x2b51c3, - 0x2375c4, - 0x203182, - 0x270583, - 0x22e443, - 0x2063c2, - 0x2e74c2, - 0x2dc049, - 0x2030c2, - 0x287c04, - 0x207a02, - 0x38c684, - 0x2ae7c4, - 0x2e2484, - 0x203d02, - 0x2397c2, - 0x210b03, - 0x2f04c3, - 0x23aa84, - 0x261504, - 0x2c5c84, - 0x2dc404, - 0x2fdc83, - 0x346e83, - 0x227444, - 0x2ffa04, - 0x2ffd06, - 0x242f82, - 0x204a82, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, + 0x251e06, + 0x211003, + 0x388dc7, + 0x27e2c5, + 0x238483, + 0x3b378d, + 0x2025c3, + 0x2a0b08, + 0x3aac44, + 0x205fc5, + 0x2a4f06, + 0x236b06, + 0x20d6c7, + 0x355747, + 0x2641c5, + 0x2264c3, + 0x322c07, + 0x33b009, + 0x258f49, + 0x2434ca, + 0x242a42, + 0x38e6c4, + 0x2d7ac4, + 0x210d87, + 0x236d08, + 0x2dce89, + 0x3a3489, + 0x2df807, + 0x334206, + 0xe1406, + 0x2e26c4, + 0x2e2cca, + 0x2e5c88, + 0x2e64c9, + 0x2b6306, + 0x3003c5, + 0x365908, + 0x2bf10a, + 0x25b743, + 0x306146, + 0x2df907, + 0x207c85, + 0x3aab05, + 0x242083, + 0x252dc4, + 0x21bf45, + 0x27e747, + 0x39fa45, + 0x2f3bc6, + 0xfa705, + 0x212a43, + 0x21cdc9, + 0x238dcc, + 0x2ab90c, + 0x2c65c8, + 0x28f8c7, + 0x2ef748, + 0x2efa8a, + 0x2f0a4b, + 0x368c88, + 0x363d08, + 0x36ee86, + 0x341985, + 0x36498a, + 0x21ebc5, + 0x203e42, + 0x2bcdc7, + 0x26a8c6, + 0x353505, + 0x2f1949, + 0x38dec5, + 0x376785, + 0x38e2c9, + 0x238b86, + 0x261b88, + 0x2d1343, + 0x3a88c6, + 0x270f06, + 0x2fdcc5, + 0x2fdcc9, + 0x2dd5c9, + 0x242d87, + 0xfdb44, + 0x2fdb47, + 0x3a3389, + 0x221585, + 0x16f208, + 0x355545, + 0x355245, + 0x399309, + 0x201482, + 0x21df44, + 0x202e82, + 0x2074c2, + 0x293c45, + 0x2da188, + 0x374e45, + 0x2bc883, + 0x2bc885, + 0x2ca3c3, + 0x2111c2, + 0x264a04, + 0x233503, + 0x207a82, + 0x358704, + 0x2d8003, + 0x2014c2, + 0x293cc3, + 0x2898c4, + 0x2d7703, + 0x23a804, + 0x201bc2, + 0x21bc03, + 0x219283, + 0x208d82, + 0x35b202, + 0x2dd409, + 0x2011c2, + 0x286304, + 0x200dc2, + 0x365784, + 0x3341c4, + 0x3a1cc4, + 0x206202, + 0x23e802, + 0x20dc03, + 0x2f0083, + 0x23f704, + 0x27e8c4, + 0x2d13c4, + 0x2dd7c4, + 0x2fd083, + 0x3491c3, + 0x2de9c4, + 0x2fee04, + 0x2ff346, + 0x260dc2, + 0x216582, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, 0x200882, - 0x323743, - 0x258403, - 0x230743, - 0x201d03, - 0x2d9d43, - 0x201104, - 0x2dc304, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x219683, - 0x2e0c44, - 0x274903, - 0x2b2483, - 0x341804, - 0x352ac6, - 0x203403, - 0x224f03, - 0x218903, - 0x2b0703, - 0x206f43, - 0x230c43, - 0x2fc2c5, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x2d91c3, - 0x2a3e03, - 0x894c8, - 0x258403, + 0x323ac3, + 0x22d183, + 0x2343c3, + 0x205403, + 0x21eb03, + 0x201604, + 0x2dd6c4, + 0x212444, + 0x238483, + 0x2264c3, + 0x21bd03, + 0x2e3444, + 0x29e943, + 0x2b3783, + 0x3436c4, + 0x355346, + 0x20ca03, + 0x16e747, + 0x219b83, + 0x208143, + 0x2b1a03, + 0x206003, + 0x2348c3, + 0x376f85, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x2db443, 0x230743, - 0x2d9d43, - 0x202503, - 0x249943, - 0x231344, - 0x2257c3, - 0x29ca84, - 0x2b7205, - 0x204a82, - 0x201802, - 0x2095c2, - 0x201cc2, - 0x2016c2, - 0x258403, - 0x232ec4, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x2161c3, - 0x224284, - 0x894c8, - 0x258403, - 0x202883, - 0x2054c4, - 0x894c8, - 0x258403, - 0x2446c4, - 0x201104, - 0x202883, - 0x202542, - 0x2257c3, - 0x244443, - 0x2e82c5, - 0x201582, - 0x2ffb43, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x202243, + 0x238483, + 0x234fc4, + 0x2264c3, + 0x29b704, + 0x2b7285, + 0x16e747, + 0x216582, + 0x201a42, + 0x201f82, + 0x205902, + 0x201502, + 0x22d183, + 0x2374c4, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x212444, + 0x238483, + 0x2264c3, + 0x217643, + 0x224104, + 0x880c8, + 0x22d183, + 0x2025c3, + 0x245dc4, + 0x880c8, + 0x22d183, + 0x247344, + 0x201604, + 0x2025c3, + 0x202282, + 0x2264c3, + 0x215cc3, + 0x52dc4, + 0x2e9cc5, + 0x203e42, + 0x2fef43, 0x200882, - 0x894c8, - 0x204a82, - 0x230743, - 0x2d9d43, - 0x201042, - 0x2257c3, + 0x880c8, + 0x216582, + 0x2343c3, + 0x21eb03, + 0x200a82, + 0x2264c3, 0x200882, 0x200707, - 0x24f9c5, - 0x2b9f84, - 0x385a06, - 0x33fe0b, - 0x261209, - 0x364ec6, - 0x33f2c9, - 0x2b1988, + 0x254705, + 0x29f844, + 0x385f86, + 0x366a4b, + 0x263a49, + 0x363b46, + 0x340a89, + 0x2b2c88, 0x207103, - 0x894c8, - 0x225a07, - 0x370548, - 0x252f03, - 0x337784, - 0x33778b, - 0x260585, - 0x2f4a48, - 0x2e7289, - 0x258e43, - 0x258403, - 0x204288, - 0x2eddc7, - 0x253506, - 0x230743, - 0x253007, - 0x2d9d43, - 0x337f06, - 0x202503, - 0x22e307, - 0x233d47, - 0x390247, - 0x33c645, - 0x209e83, - 0x206d0b, - 0x265588, - 0x22c848, - 0x339086, - 0x264209, - 0x3234c7, - 0x2f9c05, - 0x377284, - 0x33dcc8, - 0x236c4a, - 0x236e89, - 0x33d303, - 0x26abc5, - 0x2aabc3, - 0x22a586, - 0x2b9dc4, - 0x33b0c8, - 0x3903cb, - 0x33d1c5, - 0x2b6f86, - 0x2b9cc5, - 0x2ba388, - 0x2bb147, - 0x365407, - 0x316647, - 0x2127c4, - 0x308a07, - 0x295cc6, - 0x219bc3, - 0x2c4208, - 0x248e83, - 0x2cb048, - 0x2d31c5, - 0x373d88, - 0x230947, - 0x249943, - 0x23fbc3, - 0x2891c4, - 0x30fc47, - 0x209a43, - 0x233e0b, - 0x2141c3, - 0x248e44, - 0x2e8348, - 0x2257c3, - 0x2ea8c5, - 0x31e505, - 0x373c86, - 0x2102c5, - 0x2d3584, - 0x20bb42, - 0x2e4a83, - 0x37108a, - 0x3a20c3, - 0x39fd49, - 0x308706, - 0x214008, - 0x28a806, - 0x220a87, - 0x2e4ec8, - 0x2ea6c8, - 0x319c83, - 0x295483, - 0x275889, - 0x2f3383, - 0x344686, - 0x24f646, - 0x314a86, - 0x3a8b09, - 0x2eaac4, - 0x2112c3, - 0x2da885, - 0x347249, - 0x2249c3, - 0x319b44, - 0x36cb04, - 0x39e084, - 0x2b43c6, - 0x20b4c3, - 0x20b4c8, - 0x2513c8, - 0x2f8e06, - 0x2f9a0b, - 0x2f9d48, - 0x2f9f4b, - 0x2fc689, - 0x2fb947, - 0x2fcb08, - 0x2fd6c3, - 0x22e886, - 0x20f747, - 0x2969c5, - 0x348889, - 0x263b4d, - 0x213e51, - 0x232d85, + 0x880c8, + 0x22a807, + 0x364288, + 0x24f843, + 0x21d184, + 0x2226cb, + 0x259145, + 0x24b188, + 0x2f2ec9, + 0x25a203, + 0x22d183, + 0x205348, + 0x2ee787, + 0x24fe46, + 0x2343c3, + 0x24f947, + 0x21eb03, + 0x339b06, + 0x202243, + 0x22f9c7, + 0x33a6c7, + 0x390e87, + 0x31e885, + 0x209403, + 0x205dcb, + 0x36b4c8, + 0x227548, + 0x33b1c6, + 0x367989, + 0x335b07, + 0x2f9145, + 0x339444, + 0x3478c8, + 0x23d54a, + 0x23d789, + 0x346f03, + 0x2696c5, + 0x21bb83, + 0x3ad706, + 0x387704, + 0x2fdec8, + 0x38748b, + 0x346dc5, + 0x2b7006, + 0x2b8e85, + 0x2b9608, + 0x2ba287, + 0x206cc7, + 0x317b87, + 0x294544, + 0x30a5c7, + 0x294546, + 0x211003, + 0x2c2088, + 0x268383, + 0x2cab08, + 0x2d3f45, + 0x3251c8, + 0x2345c7, + 0x238483, + 0x2447c3, + 0x287dc4, + 0x323647, + 0x208fc3, + 0x33a78b, + 0x205003, + 0x268344, + 0x2e9d48, + 0x2264c3, + 0x2f3d45, + 0x311145, + 0x3250c6, + 0x2117c5, + 0x2d4304, + 0x202002, + 0x2e69c3, + 0x374c0a, + 0x3a1583, + 0x306709, + 0x30a2c6, + 0x204e48, + 0x289406, + 0x214347, + 0x2db948, + 0x39a588, + 0x2ebd43, + 0x293d03, + 0x272c09, + 0x2f4c83, + 0x2d8d06, + 0x254386, + 0x39f7c6, + 0x3a1e09, + 0x2fd784, + 0x20e3c3, + 0x2d6d05, + 0x349589, + 0x206dc3, + 0x35a244, + 0x2f2ac4, + 0x36fc84, + 0x35f906, + 0x3b4303, + 0x3b4308, + 0x256a08, + 0x39db86, + 0x2f8f4b, + 0x2f9288, + 0x2f948b, + 0x2fb949, + 0x2fa987, + 0x2fbdc8, + 0x2fc983, + 0x22ad86, + 0x3a9247, + 0x295245, + 0x34b789, + 0x33530d, + 0x204c91, + 0x22eb85, 0x200882, - 0x204a82, - 0x258403, - 0x230743, - 0x2afc84, - 0x2d9d43, - 0x202503, - 0x219bc3, - 0x249943, - 0x258403, - 0x230743, - 0x2d9d43, - 0x230c43, - 0x249943, - 0x2257c3, - 0x29ca83, - 0x2161c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x201104, - 0x230c43, - 0x249943, - 0x2257c3, - 0x21ce42, + 0x216582, + 0x22d183, + 0x2343c3, + 0x22d684, + 0x21eb03, + 0x202243, + 0x211003, + 0x238483, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x2348c3, + 0x238483, + 0x2264c3, + 0x265903, + 0x217643, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x201604, + 0x2348c3, + 0x238483, + 0x2264c3, + 0x221e42, 0x200141, 0x200882, 0x200001, - 0x312542, - 0x894c8, - 0x21b385, + 0x313b02, + 0x880c8, + 0x220045, 0x200481, - 0x58403, + 0x2d183, 0x200741, 0x200081, - 0x201181, - 0x233302, - 0x368c84, - 0x381103, + 0x200c81, + 0x2333c2, + 0x36e144, + 0x383043, 0x2007c1, 0x200901, 0x200041, 0x2001c1, - 0x390647, - 0x2bda4f, - 0x2d0986, + 0x2dda87, + 0x2b8f8f, + 0x2cacc6, 0x2000c1, - 0x25a446, + 0x25b806, 0x200341, - 0x200cc1, - 0x347b0e, - 0x200e81, - 0x2257c3, 0x200ac1, - 0x26c8c5, - 0x20bb42, - 0x23d1c5, - 0x200c01, + 0x341ece, + 0x201501, + 0x2264c3, + 0x2014c1, + 0x260e05, + 0x202002, + 0x241f85, + 0x200b81, 0x200241, 0x200a01, - 0x201582, + 0x203e42, 0x2002c1, - 0x203701, - 0x203fc1, + 0x204701, + 0x20dec1, 0x200781, 0x200641, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x20f0c3, - 0x258403, - 0x2d9d43, - 0x8b2c8, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x14d7f48, - 0x894c8, - 0x3f5c4, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x249943, - 0x2257c3, - 0x203803, - 0x894c8, - 0x258403, - 0x230743, - 0x2afc84, - 0x2257c3, - 0x293485, - 0x328204, - 0x258403, - 0x249943, - 0x2257c3, - 0x27a8a, - 0x204a82, - 0x258403, - 0x22f209, - 0x230743, - 0x237cc9, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x2dfbc8, - 0x214507, - 0x2e82c5, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x21ca03, + 0x22d183, + 0x21eb03, + 0x89ec8, + 0x211003, + 0x238483, + 0x2264c3, + 0x14da788, + 0x880c8, + 0x441c4, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x238483, + 0x2264c3, + 0x204803, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x22d684, + 0x2264c3, + 0x28fb85, + 0x27f304, + 0x22d183, + 0x238483, + 0x2264c3, + 0xa014a, + 0x216582, + 0x22d183, + 0x2326c9, + 0x2343c3, + 0x23af09, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x2e24c8, + 0x2100c7, + 0x2e9cc5, 0x200707, - 0x33fe0b, - 0x37d448, - 0x33f2c9, - 0x225a07, - 0x204288, - 0x337f06, - 0x233d47, - 0x22c848, - 0x339086, - 0x3234c7, - 0x236e89, - 0x386ac9, - 0x2b6f86, - 0x2b8c85, - 0x2c4208, - 0x248e83, - 0x2cb048, - 0x230947, - 0x209a43, - 0x3333c7, - 0x2102c5, - 0x2daf88, - 0x3554c5, - 0x295483, - 0x2c7b89, - 0x2aaa47, - 0x319b44, - 0x36cb04, - 0x2f9a0b, - 0x2f9d48, - 0x2fb947, - 0x258403, - 0x230743, - 0x2095c3, - 0x2257c3, - 0x225dc3, - 0x2d9d43, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, + 0x366a4b, + 0x365188, + 0x340a89, + 0x22a807, + 0x205348, + 0x339b06, + 0x33a6c7, + 0x227548, + 0x33b1c6, + 0x335b07, + 0x23d789, + 0x37c409, + 0x2b7006, + 0x2b7e45, + 0x2c2088, + 0x268383, + 0x2cab08, + 0x2345c7, + 0x208fc3, + 0x326387, + 0x2117c5, + 0x2dc608, + 0x310205, + 0x293d03, + 0x33b9c9, + 0x2aa9c7, + 0x35a244, + 0x2f2ac4, + 0x2f8f4b, + 0x2f9288, + 0x2fa987, + 0x22d183, + 0x2343c3, + 0x211cc3, + 0x2264c3, + 0x21e503, + 0x21eb03, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x653cb, 0x200882, - 0x204a82, - 0x2257c3, - 0x894c8, + 0x216582, + 0x2264c3, + 0x880c8, 0x200882, - 0x204a82, - 0x2095c2, - 0x201042, + 0x216582, + 0x201f82, + 0x200a82, 0x200342, - 0x249943, - 0x2016c2, + 0x238483, + 0x201502, 0x200882, - 0x323743, - 0x204a82, - 0x258403, - 0x230743, - 0x2095c2, - 0x2d9d43, - 0x202503, - 0x219bc3, - 0x2021c4, - 0x249943, - 0x2174c3, - 0x2257c3, - 0x2eaac4, - 0x224043, - 0x2d9d43, - 0x204a82, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x202883, - 0x2257c3, - 0x39c207, - 0x258403, - 0x251547, - 0x2f0c46, - 0x219443, - 0x20e8c3, - 0x2d9d43, - 0x21bbc3, - 0x201104, - 0x286104, - 0x2d3646, - 0x2284c3, - 0x249943, - 0x2257c3, - 0x293485, - 0x20cd04, - 0x318b43, - 0x223643, - 0x2be287, - 0x2f5545, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x21fd82, - 0x374b43, - 0x27bc83, - 0x323743, - 0x55e58403, - 0x201e02, - 0x230743, - 0x2099c3, - 0x2d9d43, - 0x201104, - 0x265743, - 0x2aed03, - 0x219bc3, - 0x2021c4, - 0x56205702, - 0x249943, - 0x2257c3, - 0x22f903, - 0x242103, - 0x21ce42, - 0x224043, - 0x894c8, - 0x2d9d43, - 0x2ee604, - 0x323743, - 0x204a82, - 0x258403, - 0x232ec4, - 0x230743, - 0x2d9d43, - 0x201104, - 0x202503, - 0x30f384, - 0x30ac84, - 0x2ccc86, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x219683, - 0x26cc46, - 0x1d94b, - 0x1f186, - 0x23e8a, - 0xfd78a, - 0x894c8, - 0x3a3d84, - 0x258403, - 0x323704, - 0x230743, - 0x244f04, - 0x2d9d43, - 0x254943, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x32538b, - 0x39de8a, - 0x3b1c4c, + 0x323ac3, + 0x216582, + 0x22d183, + 0x2343c3, + 0x201f82, + 0x21eb03, + 0x202243, + 0x211003, + 0x212444, + 0x238483, + 0x21ab43, + 0x2264c3, + 0x2fd784, + 0x223ec3, + 0x21eb03, + 0x216582, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2025c3, + 0x2264c3, + 0x39bd47, + 0x22d183, + 0x256b87, + 0x2edfc6, + 0x219203, + 0x206ac3, + 0x21eb03, + 0x220883, + 0x201604, + 0x284804, + 0x2d43c6, + 0x20bac3, + 0x238483, + 0x2264c3, + 0x28fb85, + 0x20d4c4, + 0x31a083, + 0x217a03, + 0x2bcdc7, + 0x20b445, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x219f02, + 0x380383, + 0x2b2c83, + 0x323ac3, + 0x5822d183, + 0x22b782, + 0x2343c3, + 0x208f43, + 0x21eb03, + 0x201604, + 0x36b683, + 0x280b03, + 0x211003, + 0x212444, + 0x58606bc2, + 0x238483, + 0x2264c3, + 0x232dc3, + 0x245483, + 0x221e42, + 0x223ec3, + 0x880c8, + 0x21eb03, + 0x307e44, + 0x323ac3, + 0x216582, + 0x22d183, + 0x2374c4, + 0x2343c3, + 0x21eb03, + 0x201604, + 0x202243, + 0x2f5d44, + 0x307b04, + 0x2cc5c6, + 0x212444, + 0x238483, + 0x2264c3, + 0x21bd03, + 0x26a8c6, + 0x1737cb, + 0x1e1c6, + 0x23d0a, + 0xfcb8a, + 0x880c8, + 0x3a8204, + 0x22d183, + 0x323a84, + 0x2343c3, + 0x247b84, + 0x21eb03, + 0x251283, + 0x211003, + 0x238483, + 0x2264c3, + 0x32248b, + 0x39d94a, + 0x3b298c, 0x200882, - 0x204a82, - 0x2095c2, - 0x2a8f85, - 0x201104, - 0x202242, - 0x219bc3, - 0x30ac84, - 0x201cc2, - 0x2016c2, - 0x2057c2, - 0x21ce42, - 0x123743, - 0x2ec0c9, - 0x24f4c8, - 0x35c349, - 0x233b89, - 0x2411ca, - 0x24954a, - 0x20b782, - 0x219fc2, - 0x4a82, - 0x258403, - 0x207802, - 0x23b646, - 0x351c82, - 0x200d02, - 0x3a004e, - 0x2705ce, - 0x27a987, - 0x325e87, - 0x26fc02, - 0x230743, - 0x2d9d43, - 0x203542, - 0x201042, - 0x29e90f, - 0x214082, - 0x2400c7, - 0x339287, - 0x2503c7, - 0x26a14c, - 0x27090c, - 0x204704, - 0x26abca, - 0x2953c2, - 0x20a482, - 0x2b1384, - 0x222942, - 0x2bc382, - 0x270b44, - 0x2175c2, - 0x2120c2, - 0x339107, - 0x224945, - 0x2326c2, - 0x29e884, - 0x36ecc2, - 0x2cee08, - 0x249943, - 0x3a9008, - 0x208fc2, - 0x231c05, - 0x3a92c6, - 0x2257c3, - 0x209d02, - 0x2dbd07, - 0xbb42, - 0x26ff05, - 0x394505, - 0x203ec2, - 0x225742, - 0x31710a, - 0x26760a, - 0x219b82, - 0x2fbf44, - 0x2013c2, - 0x27cc48, + 0x216582, + 0x201f82, + 0x2a9c05, + 0x201604, + 0x206742, + 0x211003, + 0x307b04, + 0x205902, + 0x201502, + 0x217642, + 0x221e42, + 0x123ac3, + 0x357309, + 0x254208, + 0x301189, + 0x33a509, + 0x35bd8a, + 0x23808a, + 0x20cc82, + 0x21dec2, + 0x16582, + 0x22d183, + 0x200bc2, + 0x2402c6, + 0x354502, + 0x202982, + 0x3861ce, + 0x21bc4e, + 0x278107, + 0x32fe47, + 0x26b302, + 0x2343c3, + 0x21eb03, + 0x202842, + 0x200a82, + 0x23d1cf, + 0x204ec2, + 0x33b3c7, + 0x24cf87, + 0x256107, + 0x26204c, + 0x268b4c, + 0x2057c4, + 0x2696ca, + 0x21bb82, + 0x209682, + 0x2b2684, + 0x215bc2, + 0x2bb4c2, + 0x268d84, + 0x21ac42, + 0x20b402, + 0x33b247, + 0x233285, 0x20a242, - 0x22dec8, - 0x2f61c7, - 0x2f64c9, - 0x26ff82, - 0x2fc8c5, - 0x24f985, - 0x2c154b, - 0x2c228c, - 0x22e188, - 0x2fcc88, - 0x242f82, - 0x20cfc2, + 0x23d144, + 0x372e82, + 0x2cea08, + 0x238483, + 0x3a2308, + 0x203082, + 0x235885, + 0x3a25c6, + 0x2264c3, + 0x206a42, + 0x2dd0c7, + 0x2002, + 0x26ccc5, + 0x393e85, + 0x2166c2, + 0x226442, + 0x31864a, + 0x26404a, + 0x210fc2, + 0x376c04, + 0x201a02, + 0x38e588, + 0x204cc2, + 0x2fd448, + 0x2f64c7, + 0x2f67c9, + 0x26cd42, + 0x2fbb85, + 0x2546c5, + 0x2148cb, + 0x2bfdcc, + 0x22f848, + 0x2fbf48, + 0x260dc2, + 0x20d782, 0x200882, - 0x894c8, - 0x204a82, - 0x258403, - 0x2095c2, - 0x201cc2, - 0x2016c2, - 0x2257c3, - 0x2057c2, + 0x880c8, + 0x216582, + 0x22d183, + 0x201f82, + 0x205902, + 0x201502, + 0x2264c3, + 0x217642, 0x200882, - 0x58204a82, - 0x586d9d43, - 0x332283, - 0x202242, - 0x249943, - 0x39a3c3, - 0x2257c3, - 0x2d8843, - 0x26fc46, - 0x16161c3, - 0x894c8, - 0x555c5, - 0x65b07, - 0x58e00182, - 0x59200dc2, - 0x59603442, - 0x59a00f82, - 0x59e0dec2, - 0x5a201742, - 0x5a604a82, - 0x5aa06082, - 0x5ae1dd82, - 0x5b201842, - 0x2705c3, - 0xb444, - 0x2017c3, - 0x5b616342, - 0x5ba022c2, - 0x44c07, - 0x5be2c282, - 0x5c200902, - 0x5c60b642, - 0x5ca0b9c2, - 0x5ce04542, - 0x5d201042, - 0xba545, - 0x222383, - 0x31ca44, - 0x5d622942, - 0x5da34082, - 0x5de00102, - 0x77a0b, - 0x5e200982, - 0x5ea0a582, - 0x5ee02242, - 0x5f200342, - 0x5f653702, - 0x5fa08f82, - 0x5fe0dc02, - 0x60207a42, - 0x60605702, - 0x60a00cc2, - 0x60e01cc2, - 0x61227982, - 0x6160d302, - 0x61a3d982, - 0x132d84, - 0x319c43, - 0x61e092c2, - 0x62213e02, - 0x62601ac2, - 0x62a02102, - 0x62e016c2, - 0x63200d82, - 0xda747, - 0x63605fc2, - 0x63a024c2, - 0x63e057c2, - 0x64205202, - 0xe9f0c, - 0x6461f6c2, - 0x64a712c2, - 0x64e00f02, + 0x5a616582, + 0x5aa1eb03, + 0x332683, + 0x206742, + 0x238483, + 0x364e83, + 0x2264c3, + 0x2db083, + 0x26b346, + 0x1617643, + 0x880c8, + 0x51f05, + 0xa7dcd, + 0x5f007, + 0x5b200182, + 0x5b601002, + 0x5ba04802, + 0x5be01842, + 0x5c2108c2, + 0x5c602ec2, + 0x16e747, + 0x5ca16582, + 0x5ce30542, + 0x5d21e582, + 0x5d600f82, + 0x21bc43, + 0x1b4284, + 0x20ddc3, + 0x5da18fc2, + 0x5de038c2, + 0x47887, + 0x5e214b82, + 0x5e600902, + 0x5ea02ac2, + 0x5ee082c2, + 0x5f205602, + 0x5f600a82, + 0xb97c5, + 0x226743, + 0x30ec04, + 0x5fa15bc2, + 0x5fe16c82, + 0x60200102, + 0x7508b, + 0x60600982, + 0x60e09782, + 0x61206742, + 0x61600342, + 0x61a50042, + 0x61e03042, + 0x6220e842, + 0x62600e02, + 0x62a06bc2, + 0x62e01302, + 0x63205902, + 0x6361d302, + 0x63a04242, + 0x63e425c2, + 0x133184, + 0x371183, + 0x64206602, + 0x64613942, + 0x64a06942, + 0x64e03742, 0x65201502, - 0x656049c2, - 0x65a41342, - 0x65e03702, - 0x6620eb42, - 0x66673282, - 0x66a736c2, + 0x65607a82, + 0x65547, + 0x65a07442, + 0x65e07482, + 0x66217642, + 0x6660a442, + 0xeb58c, + 0x66a24982, + 0x66e6f2c2, + 0x6721dcc2, + 0x67603dc2, + 0x67a2d742, + 0x67e1eb82, + 0x68204702, + 0x68606f42, + 0x68a71282, + 0x68e15ac2, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x75803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x27da43, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x5e665743, - 0x27da43, - 0x2fc344, - 0x24f3c6, - 0x2e4b43, + 0x60b6b683, + 0x275803, + 0x377004, + 0x254106, + 0x2e6a83, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x27da43, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x27da43, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, - 0x265743, - 0x27da43, + 0x36b683, + 0x275803, 0x200482, 0x200482, - 0x265743, - 0x27da43, - 0x67258403, - 0x230743, - 0x365d83, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x894c8, - 0x204a82, - 0x258403, - 0x249943, - 0x2257c3, - 0x258403, - 0x230743, - 0x2d9d43, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x2054c4, - 0x204a82, - 0x258403, - 0x356443, - 0x230743, - 0x2446c4, - 0x2095c3, - 0x2d9d43, - 0x201104, - 0x202503, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x244443, - 0x2e82c5, - 0x27c343, - 0x224043, - 0x204a82, - 0x258403, - 0x265743, - 0x249943, - 0x2257c3, + 0x36b683, + 0x275803, + 0x6962d183, + 0x2343c3, + 0x2a0fc3, + 0x211003, + 0x238483, + 0x2264c3, + 0x880c8, + 0x216582, + 0x22d183, + 0x238483, + 0x2264c3, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x211003, + 0x238483, + 0x2264c3, + 0x245dc4, + 0x216582, + 0x22d183, + 0x308703, + 0x2343c3, + 0x247344, + 0x211cc3, + 0x21eb03, + 0x201604, + 0x202243, + 0x211003, + 0x238483, + 0x2264c3, + 0x215cc3, + 0x2e9cc5, + 0x241403, + 0x223ec3, + 0x216582, + 0x22d183, + 0x36b683, + 0x238483, + 0x2264c3, 0x200882, - 0x323743, - 0x894c8, - 0x258403, - 0x230743, - 0x2d9d43, - 0x2e0006, - 0x201104, - 0x202503, - 0x2021c4, - 0x249943, - 0x2257c3, - 0x219683, - 0x258403, - 0x230743, - 0x249943, - 0x2257c3, - 0x258403, - 0x1f186, - 0x230743, - 0x2d9d43, - 0xd0d86, - 0x249943, - 0x2257c3, - 0x307288, - 0x30a189, - 0x31a149, - 0x32adc8, - 0x37ab88, - 0x37ab89, - 0x33305, + 0x323ac3, + 0x880c8, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x231ac6, + 0x201604, + 0x202243, + 0x212444, + 0x238483, + 0x2264c3, + 0x21bd03, + 0x22d183, + 0x2343c3, + 0x238483, + 0x2264c3, + 0x22d183, + 0x1e1c6, + 0x2343c3, + 0x21eb03, + 0xd1906, + 0x238483, + 0x2264c3, + 0x308a48, + 0x30b989, + 0x31bcc9, + 0x326c48, + 0x37efc8, + 0x37efc9, + 0x333c5, 0x200882, - 0x2f5385, - 0x22eb43, - 0x69e04a82, - 0x230743, - 0x2d9d43, - 0x225847, - 0x206f43, - 0x219bc3, - 0x249943, - 0x209583, - 0x20dd83, - 0x202883, - 0x2257c3, - 0x236286, - 0x201582, - 0x224043, - 0x894c8, + 0x20b285, + 0x231b43, + 0x6c216582, + 0x2343c3, + 0x21eb03, + 0x22f647, + 0x206003, + 0x211003, + 0x238483, + 0x201f43, + 0x210783, + 0x2025c3, + 0x2264c3, + 0x3a5946, + 0x203e42, + 0x223ec3, + 0x880c8, 0x200882, - 0x323743, - 0x204a82, - 0x258403, - 0x230743, - 0x2d9d43, - 0x201104, - 0x219bc3, - 0x249943, - 0x2257c3, - 0x2161c3, + 0x323ac3, + 0x216582, + 0x22d183, + 0x2343c3, + 0x21eb03, + 0x201604, + 0x211003, + 0x238483, + 0x2264c3, + 0x217643, + 0x14fa806, } // children is the list of nodes' children, the parent's wildcard bit and the @@ -8562,429 +8636,439 @@ var children = [...]uint32{ 0x40000000, 0x50000000, 0x60000000, - 0x1858610, - 0x185c616, - 0x187c617, - 0x19d861f, - 0x19ec676, - 0x1a0067b, - 0x1a10680, - 0x1a2c684, - 0x1a3068b, - 0x1a4868c, - 0x1a6c692, - 0x1a7069b, - 0x1a8869c, - 0x1a8c6a2, - 0x1aa86a3, - 0x1aac6aa, - 0x1af46ab, - 0x1af86bd, - 0x1b186be, - 0x1b2c6c6, - 0x1b306cb, - 0x1b606cc, - 0x1b7c6d8, - 0x1ba46df, - 0x1bac6e9, - 0x1bb06eb, - 0x1c446ec, - 0x1c58711, - 0x1c6c716, - 0x1c9871b, - 0x1ca8726, - 0x1cbc72a, - 0x1ce072f, - 0x1df8738, - 0x1dfc77e, - 0x1e1077f, - 0x1e24784, - 0x1e2c789, - 0x1e3c78b, - 0x1e4078f, - 0x1e58790, - 0x1ea0796, - 0x1eb47a8, - 0x1eb87ad, - 0x1ebc7ae, - 0x1ec47af, - 0x1f007b1, - 0x61f047c0, - 0x1f187c1, - 0x1f1c7c6, - 0x1f2c7c7, - 0x1fdc7cb, - 0x1fe07f7, - 0x21fe87f8, - 0x21fec7fa, - 0x1ff07fb, - 0x20247fc, - 0x2028809, - 0x245880a, - 0x224a8916, - 0x224ac92a, - 0x24d492b, - 0x24dc935, - 0x224e0937, - 0x24e8938, - 0x224f893a, - 0x224fc93e, - 0x250893f, - 0x250c942, - 0x22510943, - 0x252c944, - 0x254494b, - 0x2548951, - 0x2558952, - 0x2560956, - 0x22594958, - 0x2598965, - 0x25a8966, - 0x25d496a, - 0x25ec975, - 0x260097b, - 0x2628980, - 0x264898a, - 0x2678992, - 0x26a099e, - 0x26a49a8, - 0x26c89a9, - 0x26cc9b2, - 0x26e09b3, - 0x26e49b8, - 0x26e89b9, - 0x27089ba, - 0x270c9c2, - 0x271c9c3, - 0x27909c7, - 0x27ac9e4, - 0x27b89eb, - 0x27cc9ee, - 0x27e49f3, - 0x27f89f9, - 0x28109fe, - 0x2828a04, - 0x2840a0a, - 0x285ca10, - 0x2874a17, - 0x28d4a1d, - 0x28eca35, - 0x2900a3b, - 0x2944a40, - 0x29c4a51, - 0x29f0a71, - 0x29f4a7c, - 0x29fca7d, - 0x2a1ca7f, - 0x2a20a87, - 0x2a3ca88, - 0x2a44a8f, - 0x2a78a91, - 0x2ab0a9e, - 0x2ab4aac, - 0x2af0aad, - 0x2b08abc, - 0x2b2cac2, - 0x2b4cacb, - 0x3110ad3, - 0x311cc44, - 0x313cc47, - 0x32f8c4f, - 0x33c8cbe, - 0x3438cf2, - 0x3490d0e, - 0x3578d24, - 0x35d0d5e, - 0x360cd74, - 0x3708d83, - 0x37d4dc2, - 0x386cdf5, - 0x38fce1b, - 0x3960e3f, - 0x3b98e58, - 0x3c50ee6, - 0x3d1cf14, - 0x3d68f47, - 0x3df0f5a, - 0x3e2cf7c, - 0x3e7cf8b, - 0x3ef4f9f, - 0x63ef8fbd, - 0x63efcfbe, - 0x63f00fbf, - 0x3f7cfc0, - 0x3fe0fdf, - 0x405cff8, - 0x40d5017, - 0x4155035, - 0x41c1055, - 0x42ed070, - 0x43450bb, - 0x643490d1, - 0x43e10d2, - 0x44690f8, - 0x44b511a, - 0x451d12d, - 0x45c5147, - 0x468d171, - 0x46f51a3, - 0x48091bd, - 0x6480d202, - 0x64811203, - 0x486d204, - 0x48c921b, - 0x4959232, - 0x49d5256, - 0x4a19275, - 0x4afd286, - 0x4b312bf, - 0x4b912cc, - 0x4c052e4, - 0x4c8d301, - 0x4ccd323, - 0x4d3d333, - 0x64d4134f, - 0x64d45350, - 0x24d49351, - 0x4d61352, - 0x4d7d358, - 0x4dc135f, - 0x4dd1370, - 0x4de9374, - 0x4e6137a, - 0x4e75398, - 0x4e8d39d, - 0x4eb13a3, - 0x4eb53ac, - 0x4ebd3ad, - 0x4ed13af, - 0x4eed3b4, - 0x4ef13bb, - 0x4ef93bc, - 0x4f353be, + 0x185c611, + 0x1860617, + 0x1880618, + 0x19dc620, + 0x19f0677, + 0x1a0467c, + 0x1a14681, + 0x1a30685, + 0x1a3468c, + 0x1a4c68d, + 0x1a70693, + 0x1a7469c, + 0x1a8c69d, + 0x1a906a3, + 0x1a946a4, + 0x1ab86a5, + 0x1abc6ae, + 0x21ac46af, + 0x1b0c6b1, + 0x1b106c3, + 0x1b306c4, + 0x1b446cc, + 0x1b486d1, + 0x1b786d2, + 0x1b946de, + 0x1bbc6e5, + 0x1bc86ef, + 0x1bcc6f2, + 0x1c606f3, + 0x1c74718, + 0x1c8871d, + 0x1cb8722, + 0x1cc872e, + 0x1cdc732, + 0x1d00737, + 0x1e18740, + 0x1e1c786, + 0x1e88787, + 0x1e9c7a2, + 0x1eb07a7, + 0x1eb87ac, + 0x1ec87ae, + 0x1ecc7b2, + 0x1ee47b3, + 0x1f2c7b9, + 0x1f447cb, + 0x1f487d1, + 0x1f4c7d2, + 0x1f547d3, + 0x1f907d5, + 0x61f947e4, + 0x1fa87e5, + 0x1fac7ea, + 0x1fb07eb, + 0x1fc07ec, + 0x20707f0, + 0x207481c, + 0x2207c81d, + 0x2208081f, + 0x2084820, + 0x20b8821, + 0x20bc82e, + 0x24f482f, + 0x2254493d, + 0x22548951, + 0x2570952, + 0x257895c, + 0x2257c95e, + 0x258495f, + 0x22594961, + 0x22598965, + 0x25a4966, + 0x225a8969, + 0x25ac96a, + 0x225b096b, + 0x25cc96c, + 0x25e4973, + 0x25e8979, + 0x25f897a, + 0x260097e, + 0x22634980, + 0x263898d, + 0x264898e, + 0x267c992, + 0x269499f, + 0x26a89a5, + 0x26d09aa, + 0x26f09b4, + 0x27209bc, + 0x27489c8, + 0x274c9d2, + 0x27709d3, + 0x27749dc, + 0x27889dd, + 0x278c9e2, + 0x27909e3, + 0x27b09e4, + 0x27c09ec, + 0x27d09f0, + 0x27d49f4, + 0x28489f5, + 0x2864a12, + 0x2870a19, + 0x2884a1c, + 0x289ca21, + 0x28b0a27, + 0x28c8a2c, + 0x28e0a32, + 0x28f8a38, + 0x2914a3e, + 0x292ca45, + 0x298ca4b, + 0x29a4a63, + 0x29a8a69, + 0x29bca6a, + 0x2a00a6f, + 0x2a80a80, + 0x2aacaa0, + 0x2ab0aab, + 0x2ab8aac, + 0x2ad8aae, + 0x2adcab6, + 0x2afcab7, + 0x2b04abf, + 0x2b3cac1, + 0x2b78acf, + 0x2b7cade, + 0x2bbcadf, + 0x2bd4aef, + 0x2bf8af5, + 0x2c18afe, + 0x31dcb06, + 0x31e8c77, + 0x3208c7a, + 0x33c4c82, + 0x3494cf1, + 0x3504d25, + 0x355cd41, + 0x3644d57, + 0x369cd91, + 0x36d8da7, + 0x37d4db6, + 0x38a0df5, + 0x3938e28, + 0x39c8e4e, + 0x3a2ce72, + 0x3c64e8b, + 0x3d1cf19, + 0x3de8f47, + 0x3e34f7a, + 0x3ebcf8d, + 0x3ef8faf, + 0x3f48fbe, + 0x3fc0fd2, + 0x63fc4ff0, + 0x63fc8ff1, + 0x63fccff2, + 0x4048ff3, + 0x40ad012, + 0x412902b, + 0x41a104a, + 0x4221068, + 0x428d088, + 0x43b90a3, + 0x44110ee, + 0x64415104, + 0x44ad105, + 0x453512b, + 0x458114d, + 0x45e9160, + 0x469117a, + 0x47591a4, + 0x47c11d6, + 0x48d51f0, + 0x648d9235, + 0x648dd236, + 0x4939237, + 0x499524e, + 0x4a25265, + 0x4aa1289, + 0x4ae52a8, + 0x4bc92b9, + 0x4bfd2f2, + 0x4c5d2ff, + 0x4cd1317, + 0x4d59334, + 0x4d99356, + 0x4e09366, + 0x64e0d382, + 0x64e11383, + 0x24e15384, + 0x4e2d385, + 0x4e4938b, + 0x4e8d392, + 0x4e9d3a3, + 0x4eb53a7, + 0x4f2d3ad, + 0x4f353cb, 0x4f493cd, - 0x4f513d2, - 0x4f593d4, - 0x4f5d3d6, - 0x4f813d7, - 0x4fa53e0, - 0x4fbd3e9, - 0x4fc13ef, - 0x4fc93f0, - 0x4fcd3f2, - 0x50213f3, - 0x5045408, - 0x5065411, - 0x5081419, - 0x5091420, - 0x50a5424, - 0x50a9429, - 0x50b142a, - 0x50c542c, - 0x50d5431, - 0x50d9435, - 0x50f5436, - 0x598543d, - 0x59bd661, - 0x59e966f, - 0x5a0167a, - 0x5a21680, - 0x65a25688, - 0x5a69689, - 0x5a7169a, - 0x25a7569c, - 0x25a7969d, - 0x5a7d69e, - 0x5b9d69f, - 0x25ba16e7, - 0x25ba96e8, - 0x25bb16ea, - 0x25bbd6ec, - 0x5bc16ef, - 0x5be96f0, - 0x5c116fa, - 0x5c15704, - 0x25c4d705, - 0x5c5d713, - 0x67b5717, - 0x67b99ed, - 0x67bd9ee, - 0x267c19ef, - 0x67c59f0, - 0x267c99f1, - 0x67cd9f2, - 0x267d99f3, - 0x67dd9f6, - 0x67e19f7, - 0x267e59f8, - 0x67e99f9, - 0x267f19fa, - 0x67f59fc, - 0x67f99fd, - 0x268099fe, - 0x680da02, - 0x6811a03, - 0x6815a04, - 0x6819a05, - 0x2681da06, - 0x6821a07, - 0x6825a08, - 0x6829a09, - 0x682da0a, - 0x26835a0b, - 0x6839a0d, - 0x683da0e, - 0x6841a0f, - 0x26845a10, - 0x6849a11, - 0x26851a12, - 0x26855a14, - 0x6871a15, - 0x687da1c, - 0x68bda1f, + 0x4f613d2, + 0x4f893d8, + 0x4f8d3e2, + 0x4f953e3, + 0x4fa93e5, + 0x4fc53ea, + 0x4fc93f1, + 0x4fd13f2, + 0x500d3f4, + 0x5021403, + 0x5029408, + 0x503140a, + 0x503540c, + 0x505940d, + 0x507d416, + 0x509541f, + 0x5099425, + 0x50a1426, + 0x50a5428, + 0x50f9429, + 0x511d43e, + 0x513d447, + 0x515944f, + 0x5169456, + 0x517d45a, + 0x518145f, + 0x5189460, + 0x519d462, + 0x51ad467, + 0x51b146b, + 0x51cd46c, + 0x5a5d473, + 0x5a95697, + 0x5ac16a5, + 0x5ad96b0, + 0x5af96b6, + 0x5b196be, + 0x5b5d6c6, + 0x5b656d7, + 0x25b696d9, + 0x25b6d6da, + 0x5b716db, + 0x5c956dc, + 0x25c99725, + 0x25ca1726, + 0x25ca9728, + 0x25cb572a, + 0x5cb972d, + 0x5ce172e, + 0x5d09738, + 0x5d0d742, + 0x25d45743, + 0x5d59751, + 0x68b1756, + 0x68b5a2c, + 0x68b9a2d, + 0x268bda2e, 0x68c1a2f, - 0x68e5a30, - 0x6a29a39, - 0x26a31a8a, - 0x26a35a8c, - 0x26a39a8d, - 0x6a41a8e, - 0x6b1da90, - 0x6b21ac7, - 0x6b4dac8, - 0x6b6dad3, - 0x6b79adb, - 0x6b99ade, - 0x6bd1ae6, - 0x6e69af4, - 0x6f25b9a, - 0x6f39bc9, - 0x6f6dbce, - 0x6f99bdb, - 0x6fb5be6, - 0x6fd9bed, - 0x6ff1bf6, - 0x700dbfc, - 0x7031c03, - 0x7041c0c, - 0x7071c10, - 0x708dc1c, - 0x7299c23, - 0x72bdca6, - 0x72ddcaf, - 0x72f1cb7, - 0x7305cbc, - 0x7325cc1, - 0x73c9cc9, - 0x73e5cf2, - 0x7401cf9, - 0x7405d00, - 0x7409d01, - 0x740dd02, - 0x7421d03, - 0x7441d08, - 0x744dd10, - 0x7451d13, - 0x7481d14, - 0x7501d20, - 0x7515d40, + 0x268c5a30, + 0x68c9a31, + 0x268d5a32, + 0x68d9a35, + 0x68dda36, + 0x268e1a37, + 0x68e5a38, + 0x268eda39, + 0x68f1a3b, + 0x68f5a3c, + 0x26905a3d, + 0x6909a41, + 0x690da42, + 0x6911a43, + 0x6915a44, + 0x26919a45, + 0x691da46, + 0x6921a47, + 0x6925a48, + 0x6929a49, + 0x26931a4a, + 0x6935a4c, + 0x6939a4d, + 0x693da4e, + 0x26941a4f, + 0x6945a50, + 0x2694da51, + 0x26951a53, + 0x696da54, + 0x6979a5b, + 0x69b9a5e, + 0x69bda6e, + 0x69e1a6f, + 0x6b31a78, + 0x26b39acc, + 0x26b3dace, + 0x26b41acf, + 0x6b49ad0, + 0x6c25ad2, + 0x6c29b09, + 0x6c55b0a, + 0x6c75b15, + 0x6c81b1d, + 0x6ca1b20, + 0x6cd9b28, + 0x6f71b36, + 0x702dbdc, + 0x7041c0b, + 0x7075c10, + 0x70a5c1d, + 0x70c1c29, + 0x70e5c30, + 0x7101c39, + 0x711dc40, + 0x7141c47, + 0x7151c50, + 0x7185c54, + 0x71a1c61, + 0x73adc68, + 0x73d1ceb, + 0x73f1cf4, + 0x7405cfc, + 0x7419d01, + 0x7439d06, + 0x74ddd0e, + 0x74f9d37, + 0x7515d3e, 0x7519d45, - 0x7531d46, - 0x753dd4c, - 0x7541d4f, - 0x755dd50, - 0x7599d57, - 0x759dd66, - 0x75bdd67, - 0x760dd6f, - 0x7625d83, - 0x7679d89, - 0x767dd9e, - 0x7681d9f, - 0x76c5da0, - 0x76d5db1, - 0x770ddb5, - 0x773ddc3, - 0x7879dcf, - 0x789de1e, - 0x78c9e27, - 0x78d1e32, - 0x78d5e34, - 0x79e1e35, + 0x751dd46, + 0x7521d47, + 0x7535d48, + 0x7555d4d, + 0x7561d55, + 0x7565d58, + 0x7595d59, + 0x7615d65, + 0x7629d85, + 0x762dd8a, + 0x7645d8b, + 0x7649d91, + 0x7655d92, + 0x7659d95, + 0x7675d96, + 0x76b1d9d, + 0x76b5dac, + 0x76d5dad, + 0x7725db5, + 0x773ddc9, + 0x7791dcf, + 0x7795de4, + 0x7799de5, + 0x77ddde6, + 0x77eddf7, + 0x7825dfb, + 0x7855e09, + 0x7991e15, + 0x79b5e64, + 0x79e1e6d, 0x79ede78, - 0x79f9e7b, - 0x7a05e7e, - 0x7a11e81, - 0x7a1de84, - 0x7a29e87, - 0x7a35e8a, - 0x7a41e8d, - 0x7a4de90, - 0x7a59e93, - 0x7a65e96, - 0x7a71e99, - 0x7a7de9c, - 0x7a85e9f, - 0x7a91ea1, - 0x7a9dea4, - 0x7aa9ea7, - 0x7ab5eaa, - 0x7ac1ead, - 0x7acdeb0, - 0x7ad9eb3, - 0x7ae5eb6, - 0x7af1eb9, - 0x7afdebc, - 0x7b09ebf, - 0x7b15ec2, - 0x7b21ec5, - 0x7b2dec8, - 0x7b39ecb, - 0x7b45ece, - 0x7b51ed1, - 0x7b59ed4, - 0x7b65ed6, - 0x7b71ed9, - 0x7b7dedc, - 0x7b89edf, - 0x7b95ee2, - 0x7ba1ee5, - 0x7badee8, - 0x7bb9eeb, - 0x7bc5eee, - 0x7bd1ef1, - 0x7bddef4, - 0x7be9ef7, - 0x7bf5efa, - 0x7bfdefd, - 0x7c09eff, - 0x7c15f02, - 0x7c21f05, - 0x7c2df08, - 0x7c39f0b, - 0x7c45f0e, - 0x7c51f11, - 0x7c5df14, - 0x7c61f17, - 0x7c6df18, - 0x7c85f1b, - 0x7c89f21, - 0x7c99f22, - 0x7cb1f26, - 0x7cf5f2c, - 0x7d09f3d, - 0x7d3df42, - 0x7d4df4f, - 0x7d69f53, - 0x7d81f5a, - 0x7d85f60, - 0x27dc9f61, - 0x7dcdf72, - 0x7df9f73, + 0x79f1e7b, + 0x7b01e7c, + 0x7b0dec0, + 0x7b19ec3, + 0x7b25ec6, + 0x7b31ec9, + 0x7b3decc, + 0x7b49ecf, + 0x7b55ed2, + 0x7b61ed5, + 0x7b6ded8, + 0x7b79edb, + 0x7b85ede, + 0x7b91ee1, + 0x7b9dee4, + 0x7ba5ee7, + 0x7bb1ee9, + 0x7bbdeec, + 0x7bc9eef, + 0x7bd5ef2, + 0x7be1ef5, + 0x7bedef8, + 0x7bf9efb, + 0x7c05efe, + 0x7c11f01, + 0x7c1df04, + 0x7c29f07, + 0x7c35f0a, + 0x7c41f0d, + 0x7c4df10, + 0x7c59f13, + 0x7c65f16, + 0x7c71f19, + 0x7c79f1c, + 0x7c85f1e, + 0x7c91f21, + 0x7c9df24, + 0x7ca9f27, + 0x7cb5f2a, + 0x7cc1f2d, + 0x7ccdf30, + 0x7cd9f33, + 0x7ce5f36, + 0x7cf1f39, + 0x7cfdf3c, + 0x7d09f3f, + 0x7d15f42, + 0x7d1df45, + 0x7d29f47, + 0x7d35f4a, + 0x7d41f4d, + 0x7d4df50, + 0x7d59f53, + 0x7d65f56, + 0x7d71f59, + 0x7d7df5c, + 0x7d81f5f, + 0x7d8df60, + 0x7da5f63, + 0x7da9f69, + 0x7db9f6a, + 0x7dd1f6e, + 0x7e15f74, + 0x7e29f85, + 0x7e5df8a, + 0x7e6df97, + 0x7e89f9b, + 0x7ea1fa2, + 0x7ea5fa8, + 0x27ee9fa9, + 0x7eedfba, + 0x7f19fbb, + 0x7f1dfc6, } -// max children 424 (capacity 511) -// max text offset 27866 (capacity 32767) +// max children 434 (capacity 511) +// max text offset 27930 (capacity 32767) // max text length 36 (capacity 63) -// max hi 8062 (capacity 16383) -// max lo 8051 (capacity 16383) +// max hi 8135 (capacity 16383) +// max lo 8134 (capacity 16383) diff --git a/vendor/golang.org/x/net/publicsuffix/table_test.go b/vendor/golang.org/x/net/publicsuffix/table_test.go index 9e921e718..5433f3b17 100644 --- a/vendor/golang.org/x/net/publicsuffix/table_test.go +++ b/vendor/golang.org/x/net/publicsuffix/table_test.go @@ -3914,8 +3914,15 @@ var rules = [...]string{ "edu.my", "mil.my", "name.my", - "*.mz", - "!teledata.mz", + "mz", + "ac.mz", + "adv.mz", + "co.mz", + "edu.mz", + "gov.mz", + "mil.mz", + "net.mz", + "org.mz", "na", "info.na", "pro.na", @@ -5842,7 +5849,6 @@ var rules = [...]string{ "lib.co.us", "lib.ct.us", "lib.dc.us", - "lib.de.us", "lib.fl.us", "lib.ga.us", "lib.gu.us", @@ -6080,7 +6086,6 @@ var rules = [...]string{ "afamilycompany", "afl", "africa", - "africamagic", "agakhan", "agency", "aig", @@ -6316,6 +6321,7 @@ var rules = [...]string{ "dabur", "dad", "dance", + "data", "date", "dating", "datsun", @@ -6348,6 +6354,7 @@ var rules = [...]string{ "diy", "dnp", "docs", + "doctor", "dodge", "dog", "doha", @@ -6355,7 +6362,6 @@ var rules = [...]string{ "dot", "download", "drive", - "dstv", "dtv", "dubai", "duck", @@ -6364,9 +6370,11 @@ var rules = [...]string{ "dupont", "durban", "dvag", + "dvr", "dwg", "earth", "eat", + "eco", "edeka", "education", "email", @@ -6428,7 +6436,6 @@ var rules = [...]string{ "flir", "florist", "flowers", - "flsmidth", "fly", "foo", "food", @@ -6493,12 +6500,12 @@ var rules = [...]string{ "google", "gop", "got", - "gotv", "grainger", "graphics", "gratis", "green", "gripe", + "grocery", "group", "guardian", "gucci", @@ -6620,7 +6627,6 @@ var rules = [...]string{ "krd", "kred", "kuokgroup", - "kyknet", "kyoto", "lacaixa", "ladbrokes", @@ -6689,6 +6695,7 @@ var rules = [...]string{ "man", "management", "mango", + "map", "market", "marketing", "markets", @@ -6709,6 +6716,7 @@ var rules = [...]string{ "men", "menu", "meo", + "merckmsd", "metlife", "miami", "microsoft", @@ -6719,7 +6727,7 @@ var rules = [...]string{ "mlb", "mls", "mma", - "mnet", + "mobile", "mobily", "moda", "moe", @@ -6742,14 +6750,11 @@ var rules = [...]string{ "mtn", "mtpc", "mtr", - "multichoice", "mutual", "mutuelle", - "mzansimagic", "nab", "nadex", "nagoya", - "naspers", "nationwide", "natura", "navy", @@ -6821,12 +6826,13 @@ var rules = [...]string{ "party", "passagens", "pay", - "payu", "pccw", "pet", "pfizer", "pharmacy", + "phd", "philips", + "phone", "photo", "photography", "photos", @@ -6872,6 +6878,7 @@ var rules = [...]string{ "quest", "qvc", "racing", + "radio", "raid", "read", "realestate", @@ -6946,6 +6953,7 @@ var rules = [...]string{ "scjohnson", "scor", "scot", + "search", "seat", "secure", "security", @@ -7017,7 +7025,6 @@ var rules = [...]string{ "study", "style", "sucks", - "supersport", "supplies", "supply", "support", @@ -7284,6 +7291,7 @@ var rules = [...]string{ "beep.pl", "*.compute.estate", "*.alces.network", + "*.alwaysdata.net", "cloudfront.net", "compute.amazonaws.com", "ap-northeast-1.compute.amazonaws.com", @@ -7330,6 +7338,7 @@ var rules = [...]string{ "myfritz.net", "backplaneapp.io", "betainabox.com", + "bnr.la", "boxfuse.io", "browsersafetymark.io", "mycd.eu", @@ -7379,6 +7388,17 @@ var rules = [...]string{ "r.cdn77.net", "rsc.cdn77.org", "ssl.origin.cdn77-secure.org", + "cloudns.asia", + "cloudns.biz", + "cloudns.club", + "cloudns.cc", + "cloudns.eu", + "cloudns.in", + "cloudns.info", + "cloudns.org", + "cloudns.pro", + "cloudns.pw", + "cloudns.us", "co.nl", "co.no", "*.platform.sh", @@ -7758,6 +7778,9 @@ var rules = [...]string{ "fbxos.fr", "freebox-os.fr", "freeboxos.fr", + "futuremailing.at", + "*.ex.ortsinfo.at", + "*.kunden.ortsinfo.at", "service.gov.uk", "github.io", "githubusercontent.com", @@ -7768,6 +7791,8 @@ var rules = [...]string{ "*.githubcloudusercontent.com", "gitlab.io", "ro.com", + "ro.im", + "shop.ro", "goip.de", "*.0emm.com", "appspot.com", @@ -7850,6 +7875,7 @@ var rules = [...]string{ "googleapis.com", "googlecode.com", "pagespeedmobilizer.com", + "publishproxy.com", "withgoogle.com", "withyoutube.com", "hashbang.sh", @@ -7860,6 +7886,40 @@ var rules = [...]string{ "iki.fi", "biz.at", "info.at", + "ac.leg.br", + "al.leg.br", + "am.leg.br", + "ap.leg.br", + "ba.leg.br", + "ce.leg.br", + "df.leg.br", + "es.leg.br", + "go.leg.br", + "ma.leg.br", + "mg.leg.br", + "ms.leg.br", + "mt.leg.br", + "pa.leg.br", + "pb.leg.br", + "pe.leg.br", + "pi.leg.br", + "pr.leg.br", + "rj.leg.br", + "rn.leg.br", + "ro.leg.br", + "rr.leg.br", + "rs.leg.br", + "sc.leg.br", + "se.leg.br", + "sp.leg.br", + "to.leg.br", + "*.triton.zone", + "*.cns.joyent.com", + "js.org", + "keymachine.de", + "knightpoint.systems", + "co.krd", + "edu.krd", "*.magentosite.cloud", "meteorapp.com", "eu.meteorapp.com", @@ -7960,6 +8020,7 @@ var rules = [...]string{ "zapto.org", "nyc.mn", "nid.io", + "opencraft.hosting", "operaunite.com", "outsystemscloud.com", "ownprovider.com", @@ -7977,6 +8038,7 @@ var rules = [...]string{ "mypep.link", "xen.prgmr.com", "priv.at", + "protonet.io", "chirurgiens-dentistes-en-france.fr", "qa2.com", "dev-myqnapcloud.com", @@ -7986,6 +8048,9 @@ var rules = [...]string{ "rackmaze.net", "rhcloud.com", "hzc.io", + "wellbeingzone.eu", + "ptplus.fit", + "wellbeingzone.co.uk", "sandcats.io", "logoip.de", "logoip.com", @@ -8017,6 +8082,7 @@ var rules = [...]string{ "i234.me", "myds.me", "synology.me", + "taifun-dns.de", "gda.pl", "gdansk.pl", "gdynia.pl", @@ -8024,12 +8090,17 @@ var rules = [...]string{ "sopot.pl", "bloxcms.com", "townnews-staging.com", + "*.transurl.be", + "*.transurl.eu", + "*.transurl.nl", "tuxfamily.org", "hk.com", "hk.org", "ltd.hk", "inc.hk", + "lib.de.us", "router.management", + "wmflabs.org", "yolasite.com", "za.net", "za.org", @@ -8066,7 +8137,6 @@ var nodeLabels = [...]string{ "afamilycompany", "afl", "africa", - "africamagic", "ag", "agakhan", "agency", @@ -8359,6 +8429,7 @@ var nodeLabels = [...]string{ "dabur", "dad", "dance", + "data", "date", "dating", "datsun", @@ -8396,6 +8467,7 @@ var nodeLabels = [...]string{ "dnp", "do", "docs", + "doctor", "dodge", "dog", "doha", @@ -8403,7 +8475,6 @@ var nodeLabels = [...]string{ "dot", "download", "drive", - "dstv", "dtv", "dubai", "duck", @@ -8412,11 +8483,13 @@ var nodeLabels = [...]string{ "dupont", "durban", "dvag", + "dvr", "dwg", "dz", "earth", "eat", "ec", + "eco", "edeka", "edu", "education", @@ -8488,7 +8561,6 @@ var nodeLabels = [...]string{ "flir", "florist", "flowers", - "flsmidth", "fly", "fm", "fo", @@ -8567,7 +8639,6 @@ var nodeLabels = [...]string{ "google", "gop", "got", - "gotv", "gov", "gp", "gq", @@ -8577,6 +8648,7 @@ var nodeLabels = [...]string{ "gratis", "green", "gripe", + "grocery", "group", "gs", "gt", @@ -8736,7 +8808,6 @@ var nodeLabels = [...]string{ "kuokgroup", "kw", "ky", - "kyknet", "kyoto", "kz", "la", @@ -8818,6 +8889,7 @@ var nodeLabels = [...]string{ "man", "management", "mango", + "map", "market", "marketing", "markets", @@ -8841,6 +8913,7 @@ var nodeLabels = [...]string{ "men", "menu", "meo", + "merckmsd", "metlife", "mg", "mh", @@ -8858,9 +8931,9 @@ var nodeLabels = [...]string{ "mm", "mma", "mn", - "mnet", "mo", "mobi", + "mobile", "mobily", "moda", "moe", @@ -8889,7 +8962,6 @@ var nodeLabels = [...]string{ "mtpc", "mtr", "mu", - "multichoice", "museum", "mutual", "mutuelle", @@ -8898,13 +8970,11 @@ var nodeLabels = [...]string{ "mx", "my", "mz", - "mzansimagic", "na", "nab", "nadex", "nagoya", "name", - "naspers", "nationwide", "natura", "navy", @@ -8991,7 +9061,6 @@ var nodeLabels = [...]string{ "party", "passagens", "pay", - "payu", "pccw", "pe", "pet", @@ -9000,7 +9069,9 @@ var nodeLabels = [...]string{ "pg", "ph", "pharmacy", + "phd", "philips", + "phone", "photo", "photography", "photos", @@ -9058,6 +9129,7 @@ var nodeLabels = [...]string{ "quest", "qvc", "racing", + "radio", "raid", "re", "read", @@ -9142,6 +9214,7 @@ var nodeLabels = [...]string{ "scot", "sd", "se", + "search", "seat", "secure", "security", @@ -9225,7 +9298,6 @@ var nodeLabels = [...]string{ "style", "su", "sucks", - "supersport", "supplies", "supply", "support", @@ -9735,14 +9807,19 @@ var nodeLabels = [...]string{ "uri", "urn", "gov", + "cloudns", "ac", "biz", "co", + "futuremailing", "gv", "info", "or", + "ortsinfo", "priv", "blogspot", + "ex", + "kunden", "act", "asn", "com", @@ -9807,6 +9884,7 @@ var nodeLabels = [...]string{ "tv", "ac", "blogspot", + "transurl", "gov", "0", "1", @@ -9855,6 +9933,7 @@ var nodeLabels = [...]string{ "edu", "or", "org", + "cloudns", "dscloud", "dyndns", "for-better", @@ -9955,6 +10034,33 @@ var nodeLabels = [...]string{ "wiki", "zlg", "blogspot", + "ac", + "al", + "am", + "ap", + "ba", + "ce", + "df", + "es", + "go", + "ma", + "mg", + "ms", + "mt", + "pa", + "pb", + "pe", + "pi", + "pr", + "rj", + "rn", + "ro", + "rr", + "rs", + "sc", + "se", + "sp", + "to", "com", "edu", "gov", @@ -9996,6 +10102,7 @@ var nodeLabels = [...]string{ "qc", "sk", "yk", + "cloudns", "fantasyleague", "ftpaccess", "game-server", @@ -10027,6 +10134,7 @@ var nodeLabels = [...]string{ "gov", "mil", "magentosite", + "cloudns", "co", "com", "gov", @@ -10287,6 +10395,7 @@ var nodeLabels = [...]string{ "isa-geek", "isa-hockeynut", "issmarterthanyou", + "joyent", "jpn", "kr", "likes-pie", @@ -10315,6 +10424,7 @@ var nodeLabels = [...]string{ "pgfog", "point2this", "prgmr", + "publishproxy", "qa2", "qc", "quicksytes", @@ -10406,6 +10516,7 @@ var nodeLabels = [...]string{ "api", "ext", "gist", + "cns", "eu", "xen", "ac", @@ -10453,9 +10564,11 @@ var nodeLabels = [...]string{ "goip", "isteingeek", "istmein", + "keymachine", "lebtimnetz", "leitungsen", "logoip", + "taifun-dns", "traeumtgerade", "biz", "blogspot", @@ -10534,11 +10647,15 @@ var nodeLabels = [...]string{ "name", "net", "org", + "cloudns", "mycd", + "transurl", + "wellbeingzone", "aland", "blogspot", "dy", "iki", + "ptplus", "aeroport", "assedic", "asso", @@ -10655,6 +10772,7 @@ var nodeLabels = [...]string{ "mil", "net", "org", + "opencraft", "blogspot", "com", "from", @@ -10737,12 +10855,14 @@ var nodeLabels = [...]string{ "com", "net", "org", + "ro", "tt", "tv", "ltd", "plc", "ac", "blogspot", + "cloudns", "co", "edu", "firm", @@ -10756,6 +10876,7 @@ var nodeLabels = [...]string{ "res", "barrel-of-knowledge", "barrell-of-knowledge", + "cloudns", "dvrcam", "dyndns", "for-our", @@ -10782,6 +10903,7 @@ var nodeLabels = [...]string{ "ngrok", "nid", "pantheonsite", + "protonet", "sandcats", "spacekit", "com", @@ -13052,6 +13174,8 @@ var nodeLabels = [...]string{ "sc", "seoul", "ulsan", + "co", + "edu", "com", "edu", "gov", @@ -13063,6 +13187,7 @@ var nodeLabels = [...]string{ "mil", "net", "org", + "bnr", "c", "com", "edu", @@ -13804,7 +13929,14 @@ var nodeLabels = [...]string{ "name", "net", "org", - "teledata", + "ac", + "adv", + "co", + "edu", + "gov", + "mil", + "net", + "org", "ca", "cc", "co", @@ -13827,6 +13959,7 @@ var nodeLabels = [...]string{ "forgot", "forgot", "asso", + "alwaysdata", "at-band-camp", "azure-mobile", "azurewebsites", @@ -13946,6 +14079,7 @@ var nodeLabels = [...]string{ "blogspot", "bv", "co", + "transurl", "virtueeldomein", "aa", "aarborte", @@ -14758,6 +14892,7 @@ var nodeLabels = [...]string{ "cdn77", "cdn77-secure", "certmgr", + "cloudns", "collegefan", "couchpotatofries", "dnsalias", @@ -14803,6 +14938,7 @@ var nodeLabels = [...]string{ "is-very-nice", "is-very-sweet", "isa-geek", + "js", "kicks-ass", "misconfused", "mlbfan", @@ -14828,6 +14964,7 @@ var nodeLabels = [...]string{ "ufcfan", "us", "webhop", + "wmflabs", "za", "zapto", "c", @@ -15172,6 +15309,7 @@ var nodeLabels = [...]string{ "acct", "avocat", "bar", + "cloudns", "cpa", "eng", "jur", @@ -15195,6 +15333,7 @@ var nodeLabels = [...]string{ "org", "publ", "belau", + "cloudns", "co", "ed", "go", @@ -15229,6 +15368,7 @@ var nodeLabels = [...]string{ "nt", "org", "rec", + "shop", "store", "tm", "www", @@ -15536,6 +15676,7 @@ var nodeLabels = [...]string{ "mil", "net", "org", + "knightpoint", "ac", "co", "org", @@ -15768,6 +15909,7 @@ var nodeLabels = [...]string{ "sch", "blogspot", "no-ip", + "wellbeingzone", "service", "ak", "al", @@ -15775,6 +15917,7 @@ var nodeLabels = [...]string{ "as", "az", "ca", + "cloudns", "co", "ct", "dc", @@ -16098,4 +16241,5 @@ var nodeLabels = [...]string{ "net", "org", "sch", + "triton", } diff --git a/vendor/golang.org/x/net/trace/trace.go b/vendor/golang.org/x/net/trace/trace.go index d860fccf9..ecd766eb7 100644 --- a/vendor/golang.org/x/net/trace/trace.go +++ b/vendor/golang.org/x/net/trace/trace.go @@ -91,7 +91,7 @@ var DebugUseAfterFinish = false // It returns two bools; the first indicates whether the page may be viewed at all, // and the second indicates whether sensitive events will be shown. // -// AuthRequest may be replaced by a program to customise its authorisation requirements. +// AuthRequest may be replaced by a program to customize its authorization requirements. // // The default AuthRequest function returns (true, true) if and only if the request // comes from localhost/127.0.0.1/[::1]. @@ -333,7 +333,8 @@ func New(family, title string) Trace { tr.ref() tr.Family, tr.Title = family, title tr.Start = time.Now() - tr.events = make([]event, 0, maxEventsPerTrace) + tr.maxEvents = maxEventsPerTrace + tr.events = tr.eventsBuf[:0] activeMu.RLock() s := activeTraces[tr.Family] @@ -650,8 +651,8 @@ type event struct { Elapsed time.Duration // since previous event in trace NewDay bool // whether this event is on a different day to the previous event Recyclable bool // whether this event was passed via LazyLog - What interface{} // string or fmt.Stringer Sensitive bool // whether this event contains sensitive information + What interface{} // string or fmt.Stringer } // WhenString returns a string representation of the elapsed time of the event. @@ -692,14 +693,17 @@ type trace struct { IsError bool // Append-only sequence of events (modulo discards). - mu sync.RWMutex - events []event + mu sync.RWMutex + events []event + maxEvents int refs int32 // how many buckets this is in recycler func(interface{}) disc discarded // scratch space to avoid allocation finishStack []byte // where finish was called, if DebugUseAfterFinish is set + + eventsBuf [4]event // preallocated buffer in case we only log a few events } func (tr *trace) reset() { @@ -711,11 +715,15 @@ func (tr *trace) reset() { tr.traceID = 0 tr.spanID = 0 tr.IsError = false + tr.maxEvents = 0 tr.events = nil tr.refs = 0 tr.recycler = nil tr.disc = 0 tr.finishStack = nil + for i := range tr.eventsBuf { + tr.eventsBuf[i] = event{} + } } // delta returns the elapsed time since the last event or the trace start, @@ -744,7 +752,7 @@ func (tr *trace) addEvent(x interface{}, recyclable, sensitive bool) { and very unlikely to be the fault of this code. The most likely scenario is that some code elsewhere is using - a requestz.Trace after its Finish method is called. + a trace.Trace after its Finish method is called. You can temporarily set the DebugUseAfterFinish var to help discover where that is; do not leave that var set, since it makes this package much less efficient. @@ -753,11 +761,11 @@ func (tr *trace) addEvent(x interface{}, recyclable, sensitive bool) { e := event{When: time.Now(), What: x, Recyclable: recyclable, Sensitive: sensitive} tr.mu.Lock() e.Elapsed, e.NewDay = tr.delta(e.When) - if len(tr.events) < cap(tr.events) { + if len(tr.events) < tr.maxEvents { tr.events = append(tr.events, e) } else { // Discard the middle events. - di := int((cap(tr.events) - 1) / 2) + di := int((tr.maxEvents - 1) / 2) if d, ok := tr.events[di].What.(*discarded); ok { (*d)++ } else { @@ -777,7 +785,7 @@ func (tr *trace) addEvent(x interface{}, recyclable, sensitive bool) { go tr.recycler(tr.events[di+1].What) } copy(tr.events[di+1:], tr.events[di+2:]) - tr.events[cap(tr.events)-1] = e + tr.events[tr.maxEvents-1] = e } tr.mu.Unlock() } @@ -803,7 +811,7 @@ func (tr *trace) SetTraceInfo(traceID, spanID uint64) { func (tr *trace) SetMaxEvents(m int) { // Always keep at least three events: first, discarded count, last. if len(tr.events) == 0 && m > 3 { - tr.events = make([]event, 0, m) + tr.maxEvents = m } } diff --git a/vendor/golang.org/x/net/trace/trace_test.go b/vendor/golang.org/x/net/trace/trace_test.go index 14d7c237a..c6aad86c2 100644 --- a/vendor/golang.org/x/net/trace/trace_test.go +++ b/vendor/golang.org/x/net/trace/trace_test.go @@ -69,3 +69,96 @@ func TestAuthRequest(t *testing.T) { } } } + +func benchmarkTrace(b *testing.B, maxEvents, numEvents int) { + numSpans := (b.N + numEvents + 1) / numEvents + + for i := 0; i < numSpans; i++ { + tr := New("test", "test") + tr.SetMaxEvents(maxEvents) + for j := 0; j < numEvents; j++ { + tr.LazyPrintf("%d", j) + } + tr.Finish() + } +} + +func BenchmarkTrace_Default_2(b *testing.B) { + benchmarkTrace(b, 0, 2) +} + +func BenchmarkTrace_Default_10(b *testing.B) { + benchmarkTrace(b, 0, 10) +} + +func BenchmarkTrace_Default_100(b *testing.B) { + benchmarkTrace(b, 0, 100) +} + +func BenchmarkTrace_Default_1000(b *testing.B) { + benchmarkTrace(b, 0, 1000) +} + +func BenchmarkTrace_Default_10000(b *testing.B) { + benchmarkTrace(b, 0, 10000) +} + +func BenchmarkTrace_10_2(b *testing.B) { + benchmarkTrace(b, 10, 2) +} + +func BenchmarkTrace_10_10(b *testing.B) { + benchmarkTrace(b, 10, 10) +} + +func BenchmarkTrace_10_100(b *testing.B) { + benchmarkTrace(b, 10, 100) +} + +func BenchmarkTrace_10_1000(b *testing.B) { + benchmarkTrace(b, 10, 1000) +} + +func BenchmarkTrace_10_10000(b *testing.B) { + benchmarkTrace(b, 10, 10000) +} + +func BenchmarkTrace_100_2(b *testing.B) { + benchmarkTrace(b, 100, 2) +} + +func BenchmarkTrace_100_10(b *testing.B) { + benchmarkTrace(b, 100, 10) +} + +func BenchmarkTrace_100_100(b *testing.B) { + benchmarkTrace(b, 100, 100) +} + +func BenchmarkTrace_100_1000(b *testing.B) { + benchmarkTrace(b, 100, 1000) +} + +func BenchmarkTrace_100_10000(b *testing.B) { + benchmarkTrace(b, 100, 10000) +} + +func BenchmarkTrace_1000_2(b *testing.B) { + benchmarkTrace(b, 1000, 2) +} + +func BenchmarkTrace_1000_10(b *testing.B) { + benchmarkTrace(b, 1000, 10) +} + +func BenchmarkTrace_1000_100(b *testing.B) { + benchmarkTrace(b, 1000, 100) +} + +func BenchmarkTrace_1000_1000(b *testing.B) { + benchmarkTrace(b, 1000, 1000) +} + +func BenchmarkTrace_1000_10000(b *testing.B) { + benchmarkTrace(b, 1000, 10000) +} diff --git a/vendor/golang.org/x/net/webdav/file.go b/vendor/golang.org/x/net/webdav/file.go index 3d95c6cba..748118dd3 100644 --- a/vendor/golang.org/x/net/webdav/file.go +++ b/vendor/golang.org/x/net/webdav/file.go @@ -14,6 +14,8 @@ import ( "strings" "sync" "time" + + "golang.org/x/net/context" ) // slashClean is equivalent to but slightly more efficient than @@ -36,11 +38,11 @@ func slashClean(name string) string { // might apply". In particular, whether or not renaming a file or directory // overwriting another existing file or directory is an error is OS-dependent. type FileSystem interface { - Mkdir(name string, perm os.FileMode) error - OpenFile(name string, flag int, perm os.FileMode) (File, error) - RemoveAll(name string) error - Rename(oldName, newName string) error - Stat(name string) (os.FileInfo, error) + Mkdir(ctx context.Context, name string, perm os.FileMode) error + OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) + RemoveAll(ctx context.Context, name string) error + Rename(ctx context.Context, oldName, newName string) error + Stat(ctx context.Context, name string) (os.FileInfo, error) } // A File is returned by a FileSystem's OpenFile method and can be served by a @@ -76,14 +78,14 @@ func (d Dir) resolve(name string) string { return filepath.Join(dir, filepath.FromSlash(slashClean(name))) } -func (d Dir) Mkdir(name string, perm os.FileMode) error { +func (d Dir) Mkdir(ctx context.Context, name string, perm os.FileMode) error { if name = d.resolve(name); name == "" { return os.ErrNotExist } return os.Mkdir(name, perm) } -func (d Dir) OpenFile(name string, flag int, perm os.FileMode) (File, error) { +func (d Dir) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { if name = d.resolve(name); name == "" { return nil, os.ErrNotExist } @@ -94,7 +96,7 @@ func (d Dir) OpenFile(name string, flag int, perm os.FileMode) (File, error) { return f, nil } -func (d Dir) RemoveAll(name string) error { +func (d Dir) RemoveAll(ctx context.Context, name string) error { if name = d.resolve(name); name == "" { return os.ErrNotExist } @@ -105,7 +107,7 @@ func (d Dir) RemoveAll(name string) error { return os.RemoveAll(name) } -func (d Dir) Rename(oldName, newName string) error { +func (d Dir) Rename(ctx context.Context, oldName, newName string) error { if oldName = d.resolve(oldName); oldName == "" { return os.ErrNotExist } @@ -119,7 +121,7 @@ func (d Dir) Rename(oldName, newName string) error { return os.Rename(oldName, newName) } -func (d Dir) Stat(name string) (os.FileInfo, error) { +func (d Dir) Stat(ctx context.Context, name string) (os.FileInfo, error) { if name = d.resolve(name); name == "" { return nil, os.ErrNotExist } @@ -237,7 +239,7 @@ func (fs *memFS) find(op, fullname string) (parent *memFSNode, frag string, err return parent, frag, err } -func (fs *memFS) Mkdir(name string, perm os.FileMode) error { +func (fs *memFS) Mkdir(ctx context.Context, name string, perm os.FileMode) error { fs.mu.Lock() defer fs.mu.Unlock() @@ -260,7 +262,7 @@ func (fs *memFS) Mkdir(name string, perm os.FileMode) error { return nil } -func (fs *memFS) OpenFile(name string, flag int, perm os.FileMode) (File, error) { +func (fs *memFS) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { fs.mu.Lock() defer fs.mu.Unlock() @@ -314,7 +316,7 @@ func (fs *memFS) OpenFile(name string, flag int, perm os.FileMode) (File, error) }, nil } -func (fs *memFS) RemoveAll(name string) error { +func (fs *memFS) RemoveAll(ctx context.Context, name string) error { fs.mu.Lock() defer fs.mu.Unlock() @@ -330,7 +332,7 @@ func (fs *memFS) RemoveAll(name string) error { return nil } -func (fs *memFS) Rename(oldName, newName string) error { +func (fs *memFS) Rename(ctx context.Context, oldName, newName string) error { fs.mu.Lock() defer fs.mu.Unlock() @@ -381,7 +383,7 @@ func (fs *memFS) Rename(oldName, newName string) error { return nil } -func (fs *memFS) Stat(name string) (os.FileInfo, error) { +func (fs *memFS) Stat(ctx context.Context, name string) (os.FileInfo, error) { fs.mu.Lock() defer fs.mu.Unlock() @@ -599,9 +601,9 @@ func (f *memFile) Write(p []byte) (int, error) { // moveFiles moves files and/or directories from src to dst. // // See section 9.9.4 for when various HTTP status codes apply. -func moveFiles(fs FileSystem, src, dst string, overwrite bool) (status int, err error) { +func moveFiles(ctx context.Context, fs FileSystem, src, dst string, overwrite bool) (status int, err error) { created := false - if _, err := fs.Stat(dst); err != nil { + if _, err := fs.Stat(ctx, dst); err != nil { if !os.IsNotExist(err) { return http.StatusForbidden, err } @@ -611,13 +613,13 @@ func moveFiles(fs FileSystem, src, dst string, overwrite bool) (status int, err // and the Overwrite header is "T", then prior to performing the move, // the server must perform a DELETE with "Depth: infinity" on the // destination resource. - if err := fs.RemoveAll(dst); err != nil { + if err := fs.RemoveAll(ctx, dst); err != nil { return http.StatusForbidden, err } } else { return http.StatusPreconditionFailed, os.ErrExist } - if err := fs.Rename(src, dst); err != nil { + if err := fs.Rename(ctx, src, dst); err != nil { return http.StatusForbidden, err } if created { @@ -650,7 +652,7 @@ func copyProps(dst, src File) error { // copyFiles copies files and/or directories from src to dst. // // See section 9.8.5 for when various HTTP status codes apply. -func copyFiles(fs FileSystem, src, dst string, overwrite bool, depth int, recursion int) (status int, err error) { +func copyFiles(ctx context.Context, fs FileSystem, src, dst string, overwrite bool, depth int, recursion int) (status int, err error) { if recursion == 1000 { return http.StatusInternalServerError, errRecursionTooDeep } @@ -659,7 +661,7 @@ func copyFiles(fs FileSystem, src, dst string, overwrite bool, depth int, recurs // TODO: section 9.8.3 says that "Note that an infinite-depth COPY of /A/ // into /A/B/ could lead to infinite recursion if not handled correctly." - srcFile, err := fs.OpenFile(src, os.O_RDONLY, 0) + srcFile, err := fs.OpenFile(ctx, src, os.O_RDONLY, 0) if err != nil { if os.IsNotExist(err) { return http.StatusNotFound, err @@ -677,7 +679,7 @@ func copyFiles(fs FileSystem, src, dst string, overwrite bool, depth int, recurs srcPerm := srcStat.Mode() & os.ModePerm created := false - if _, err := fs.Stat(dst); err != nil { + if _, err := fs.Stat(ctx, dst); err != nil { if os.IsNotExist(err) { created = true } else { @@ -687,13 +689,13 @@ func copyFiles(fs FileSystem, src, dst string, overwrite bool, depth int, recurs if !overwrite { return http.StatusPreconditionFailed, os.ErrExist } - if err := fs.RemoveAll(dst); err != nil && !os.IsNotExist(err) { + if err := fs.RemoveAll(ctx, dst); err != nil && !os.IsNotExist(err) { return http.StatusForbidden, err } } if srcStat.IsDir() { - if err := fs.Mkdir(dst, srcPerm); err != nil { + if err := fs.Mkdir(ctx, dst, srcPerm); err != nil { return http.StatusForbidden, err } if depth == infiniteDepth { @@ -705,7 +707,7 @@ func copyFiles(fs FileSystem, src, dst string, overwrite bool, depth int, recurs name := c.Name() s := path.Join(src, name) d := path.Join(dst, name) - cStatus, cErr := copyFiles(fs, s, d, overwrite, depth, recursion) + cStatus, cErr := copyFiles(ctx, fs, s, d, overwrite, depth, recursion) if cErr != nil { // TODO: MultiStatus. return cStatus, cErr @@ -714,7 +716,7 @@ func copyFiles(fs FileSystem, src, dst string, overwrite bool, depth int, recurs } } else { - dstFile, err := fs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, srcPerm) + dstFile, err := fs.OpenFile(ctx, dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, srcPerm) if err != nil { if os.IsNotExist(err) { return http.StatusConflict, err @@ -747,7 +749,7 @@ func copyFiles(fs FileSystem, src, dst string, overwrite bool, depth int, recurs // Allowed values for depth are 0, 1 or infiniteDepth. For each visited node, // walkFS calls walkFn. If a visited file system node is a directory and // walkFn returns filepath.SkipDir, walkFS will skip traversal of this node. -func walkFS(fs FileSystem, depth int, name string, info os.FileInfo, walkFn filepath.WalkFunc) error { +func walkFS(ctx context.Context, fs FileSystem, depth int, name string, info os.FileInfo, walkFn filepath.WalkFunc) error { // This implementation is based on Walk's code in the standard path/filepath package. err := walkFn(name, info, nil) if err != nil { @@ -764,7 +766,7 @@ func walkFS(fs FileSystem, depth int, name string, info os.FileInfo, walkFn file } // Read directory names. - f, err := fs.OpenFile(name, os.O_RDONLY, 0) + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) if err != nil { return walkFn(name, info, err) } @@ -776,13 +778,13 @@ func walkFS(fs FileSystem, depth int, name string, info os.FileInfo, walkFn file for _, fileInfo := range fileInfos { filename := path.Join(name, fileInfo.Name()) - fileInfo, err := fs.Stat(filename) + fileInfo, err := fs.Stat(ctx, filename) if err != nil { if err := walkFn(filename, fileInfo, err); err != nil && err != filepath.SkipDir { return err } } else { - err = walkFS(fs, depth, filename, fileInfo, walkFn) + err = walkFS(ctx, fs, depth, filename, fileInfo, walkFn) if err != nil { if !fileInfo.IsDir() || err != filepath.SkipDir { return err diff --git a/vendor/golang.org/x/net/webdav/file_go1.6.go b/vendor/golang.org/x/net/webdav/file_go1.6.go new file mode 100644 index 000000000..fa387700d --- /dev/null +++ b/vendor/golang.org/x/net/webdav/file_go1.6.go @@ -0,0 +1,17 @@ +// 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 !go1.7 + +package webdav + +import ( + "net/http" + + "golang.org/x/net/context" +) + +func getContext(r *http.Request) context.Context { + return context.Background() +} diff --git a/vendor/golang.org/x/net/webdav/file_go1.7.go b/vendor/golang.org/x/net/webdav/file_go1.7.go new file mode 100644 index 000000000..d1c3de832 --- /dev/null +++ b/vendor/golang.org/x/net/webdav/file_go1.7.go @@ -0,0 +1,16 @@ +// 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 go1.7 + +package webdav + +import ( + "context" + "net/http" +) + +func getContext(r *http.Request) context.Context { + return r.Context() +} diff --git a/vendor/golang.org/x/net/webdav/file_test.go b/vendor/golang.org/x/net/webdav/file_test.go index cbd0240ab..bfd96e193 100644 --- a/vendor/golang.org/x/net/webdav/file_test.go +++ b/vendor/golang.org/x/net/webdav/file_test.go @@ -18,6 +18,8 @@ import ( "strconv" "strings" "testing" + + "golang.org/x/net/context" ) func TestSlashClean(t *testing.T) { @@ -195,13 +197,15 @@ func TestWalk(t *testing.T) { }}, } + ctx := context.Background() + for _, tc := range testCases { fs := NewMemFS().(*memFS) parts := strings.Split(tc.dir, "/") for p := 2; p < len(parts); p++ { d := strings.Join(parts[:p], "/") - if err := fs.Mkdir(d, 0666); err != nil { + if err := fs.Mkdir(ctx, d, 0666); err != nil { t.Errorf("tc.dir=%q: mkdir: %q: %v", tc.dir, d, err) } } @@ -231,14 +235,14 @@ func TestWalk(t *testing.T) { // analogous to the Unix find command. // // The returned strings are not guaranteed to be in any particular order. -func find(ss []string, fs FileSystem, name string) ([]string, error) { - stat, err := fs.Stat(name) +func find(ctx context.Context, ss []string, fs FileSystem, name string) ([]string, error) { + stat, err := fs.Stat(ctx, name) if err != nil { return nil, err } ss = append(ss, name) if stat.IsDir() { - f, err := fs.OpenFile(name, os.O_RDONLY, 0) + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) if err != nil { return nil, err } @@ -248,7 +252,7 @@ func find(ss []string, fs FileSystem, name string) ([]string, error) { return nil, err } for _, c := range children { - ss, err = find(ss, fs, path.Join(name, c.Name())) + ss, err = find(ctx, ss, fs, path.Join(name, c.Name())) if err != nil { return nil, err } @@ -403,6 +407,8 @@ func testFS(t *testing.T, fs FileSystem) { "copy__ o=F d=∞ /d/y /d/x want errExist", } + ctx := context.Background() + for i, tc := range testCases { tc = strings.TrimSpace(tc) j := strings.IndexByte(tc, ' ') @@ -420,7 +426,7 @@ func testFS(t *testing.T, fs FileSystem) { if len(parts) != 4 || parts[2] != "want" { t.Fatalf("test case #%d %q: invalid write", i, tc) } - f, opErr := fs.OpenFile(parts[0], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + f, opErr := fs.OpenFile(ctx, parts[0], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if got := errStr(opErr); got != parts[3] { t.Fatalf("test case #%d %q: OpenFile: got %q (%v), want %q", i, tc, got, opErr, parts[3]) } @@ -434,7 +440,7 @@ func testFS(t *testing.T, fs FileSystem) { } case "find": - got, err := find(nil, fs, "/") + got, err := find(ctx, nil, fs, "/") if err != nil { t.Fatalf("test case #%d %q: find: %v", i, tc, err) } @@ -464,17 +470,17 @@ func testFS(t *testing.T, fs FileSystem) { if parts[1] == "d=∞" { depth = infiniteDepth } - _, opErr = copyFiles(fs, parts[2], parts[3], parts[0] == "o=T", depth, 0) + _, opErr = copyFiles(ctx, fs, parts[2], parts[3], parts[0] == "o=T", depth, 0) case "mk-dir": - opErr = fs.Mkdir(parts[0], 0777) + opErr = fs.Mkdir(ctx, parts[0], 0777) case "move__": - _, opErr = moveFiles(fs, parts[1], parts[2], parts[0] == "o=T") + _, opErr = moveFiles(ctx, fs, parts[1], parts[2], parts[0] == "o=T") case "rm-all": - opErr = fs.RemoveAll(parts[0]) + opErr = fs.RemoveAll(ctx, parts[0]) case "stat": var stat os.FileInfo fileName := parts[0] - if stat, opErr = fs.Stat(fileName); opErr == nil { + if stat, opErr = fs.Stat(ctx, fileName); opErr == nil { if stat.IsDir() { got = "dir" } else { @@ -526,9 +532,10 @@ func TestMemFS(t *testing.T) { } func TestMemFSRoot(t *testing.T) { + ctx := context.Background() fs := NewMemFS() for i := 0; i < 5; i++ { - stat, err := fs.Stat("/") + stat, err := fs.Stat(ctx, "/") if err != nil { t.Fatalf("i=%d: Stat: %v", i, err) } @@ -536,7 +543,7 @@ func TestMemFSRoot(t *testing.T) { t.Fatalf("i=%d: Stat.IsDir is false, want true", i) } - f, err := fs.OpenFile("/", os.O_RDONLY, 0) + f, err := fs.OpenFile(ctx, "/", os.O_RDONLY, 0) if err != nil { t.Fatalf("i=%d: OpenFile: %v", i, err) } @@ -553,19 +560,20 @@ func TestMemFSRoot(t *testing.T) { t.Fatalf("i=%d: Write: got nil error, want non-nil", i) } - if err := fs.Mkdir(fmt.Sprintf("/dir%d", i), 0777); err != nil { + if err := fs.Mkdir(ctx, fmt.Sprintf("/dir%d", i), 0777); err != nil { t.Fatalf("i=%d: Mkdir: %v", i, err) } } } func TestMemFileReaddir(t *testing.T) { + ctx := context.Background() fs := NewMemFS() - if err := fs.Mkdir("/foo", 0777); err != nil { + if err := fs.Mkdir(ctx, "/foo", 0777); err != nil { t.Fatalf("Mkdir: %v", err) } readdir := func(count int) ([]os.FileInfo, error) { - f, err := fs.OpenFile("/foo", os.O_RDONLY, 0) + f, err := fs.OpenFile(ctx, "/foo", os.O_RDONLY, 0) if err != nil { t.Fatalf("OpenFile: %v", err) } @@ -649,9 +657,11 @@ func TestMemFile(t *testing.T) { "seek cur -99 want err", } + ctx := context.Background() + const filename = "/foo" fs := NewMemFS() - f, err := fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + f, err := fs.OpenFile(ctx, filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { t.Fatalf("OpenFile: %v", err) } @@ -745,7 +755,7 @@ func TestMemFile(t *testing.T) { } case "wantData": - g, err := fs.OpenFile(filename, os.O_RDONLY, 0666) + g, err := fs.OpenFile(ctx, filename, os.O_RDONLY, 0666) if err != nil { t.Fatalf("test case #%d %q: OpenFile: %v", i, tc, err) } @@ -771,7 +781,7 @@ func TestMemFile(t *testing.T) { if err != nil { t.Fatalf("test case #%d %q: invalid size %q", i, tc, arg) } - fi, err := fs.Stat(filename) + fi, err := fs.Stat(ctx, filename) if err != nil { t.Fatalf("test case #%d %q: Stat: %v", i, tc, err) } @@ -789,8 +799,9 @@ func TestMemFileWriteAllocs(t *testing.T) { if runtime.Compiler == "gccgo" { t.Skip("gccgo allocates here") } + ctx := context.Background() fs := NewMemFS() - f, err := fs.OpenFile("/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + f, err := fs.OpenFile(ctx, "/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { t.Fatalf("OpenFile: %v", err) } @@ -812,6 +823,7 @@ func TestMemFileWriteAllocs(t *testing.T) { } func BenchmarkMemFileWrite(b *testing.B) { + ctx := context.Background() fs := NewMemFS() xxx := make([]byte, 1024) for i := range xxx { @@ -820,7 +832,7 @@ func BenchmarkMemFileWrite(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - f, err := fs.OpenFile("/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + f, err := fs.OpenFile(ctx, "/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { b.Fatalf("OpenFile: %v", err) } @@ -830,16 +842,17 @@ func BenchmarkMemFileWrite(b *testing.B) { if err := f.Close(); err != nil { b.Fatalf("Close: %v", err) } - if err := fs.RemoveAll("/xxx"); err != nil { + if err := fs.RemoveAll(ctx, "/xxx"); err != nil { b.Fatalf("RemoveAll: %v", err) } } } func TestCopyMoveProps(t *testing.T) { + ctx := context.Background() fs := NewMemFS() create := func(name string) error { - f, err := fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + f, err := fs.OpenFile(ctx, name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { return err } @@ -851,7 +864,7 @@ func TestCopyMoveProps(t *testing.T) { return cErr } patch := func(name string, patches ...Proppatch) error { - f, err := fs.OpenFile(name, os.O_RDWR, 0666) + f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0666) if err != nil { return err } @@ -863,7 +876,7 @@ func TestCopyMoveProps(t *testing.T) { return cErr } props := func(name string) (map[xml.Name]Property, error) { - f, err := fs.OpenFile(name, os.O_RDWR, 0666) + f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0666) if err != nil { return nil, err } @@ -901,10 +914,10 @@ func TestCopyMoveProps(t *testing.T) { if err := patch("/src", Proppatch{Props: []Property{p0, p1}}); err != nil { t.Fatalf("patch /src +p0 +p1: %v", err) } - if _, err := copyFiles(fs, "/src", "/tmp", true, infiniteDepth, 0); err != nil { + if _, err := copyFiles(ctx, fs, "/src", "/tmp", true, infiniteDepth, 0); err != nil { t.Fatalf("copyFiles /src /tmp: %v", err) } - if _, err := moveFiles(fs, "/tmp", "/dst", true); err != nil { + if _, err := moveFiles(ctx, fs, "/tmp", "/dst", true); err != nil { t.Fatalf("moveFiles /tmp /dst: %v", err) } if err := patch("/src", Proppatch{Props: []Property{p0}, Remove: true}); err != nil { @@ -1099,6 +1112,7 @@ func TestWalkFS(t *testing.T) { "/a/b/z", }, }} + ctx := context.Background() for _, tc := range testCases { fs, err := buildTestFS(tc.buildfs) if err != nil { @@ -1115,11 +1129,11 @@ func TestWalkFS(t *testing.T) { got = append(got, path) return nil } - fi, err := fs.Stat(tc.startAt) + fi, err := fs.Stat(ctx, tc.startAt) if err != nil { t.Fatalf("%s: cannot stat: %v", tc.desc, err) } - err = walkFS(fs, tc.depth, tc.startAt, fi, traceFn) + err = walkFS(ctx, fs, tc.depth, tc.startAt, fi, traceFn) if err != nil { t.Errorf("%s:\ngot error %v, want nil", tc.desc, err) continue @@ -1136,23 +1150,24 @@ func TestWalkFS(t *testing.T) { func buildTestFS(buildfs []string) (FileSystem, error) { // TODO: Could this be merged with the build logic in TestFS? + ctx := context.Background() fs := NewMemFS() for _, b := range buildfs { op := strings.Split(b, " ") switch op[0] { case "mkdir": - err := fs.Mkdir(op[1], os.ModeDir|0777) + err := fs.Mkdir(ctx, op[1], os.ModeDir|0777) if err != nil { return nil, err } case "touch": - f, err := fs.OpenFile(op[1], os.O_RDWR|os.O_CREATE, 0666) + f, err := fs.OpenFile(ctx, op[1], os.O_RDWR|os.O_CREATE, 0666) if err != nil { return nil, err } f.Close() case "write": - f, err := fs.OpenFile(op[1], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + f, err := fs.OpenFile(ctx, op[1], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { return nil, err } diff --git a/vendor/golang.org/x/net/webdav/internal/xml/example_test.go b/vendor/golang.org/x/net/webdav/internal/xml/example_test.go index becedd583..21b48dea5 100644 --- a/vendor/golang.org/x/net/webdav/internal/xml/example_test.go +++ b/vendor/golang.org/x/net/webdav/internal/xml/example_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go b/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go index 5dc78e748..226cfd013 100644 --- a/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go +++ b/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go @@ -1868,7 +1868,7 @@ func TestRace9796(t *testing.T) { for i := 0; i < 2; i++ { wg.Add(1) go func() { - Marshal(B{[]A{A{}}}) + Marshal(B{[]A{{}}}) wg.Done() }() } diff --git a/vendor/golang.org/x/net/webdav/internal/xml/read.go b/vendor/golang.org/x/net/webdav/internal/xml/read.go index 75b9f2ba1..3ece08c49 100644 --- a/vendor/golang.org/x/net/webdav/internal/xml/read.go +++ b/vendor/golang.org/x/net/webdav/internal/xml/read.go @@ -1,4 +1,4 @@ -// Copyright 2009 The Go Authors. All rights reserved. +// Copyright 2009 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. diff --git a/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go b/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go index c9a6421f2..fdde288bc 100644 --- a/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go +++ b/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go @@ -1,4 +1,4 @@ -// Copyright 2011 The Go Authors. All rights reserved. +// Copyright 2011 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. diff --git a/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go b/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go index 312a7c98a..af4cf8ea8 100644 --- a/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go +++ b/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go @@ -1,4 +1,4 @@ -// Copyright 2009 The Go Authors. All rights reserved. +// Copyright 2009 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. diff --git a/vendor/golang.org/x/net/webdav/prop.go b/vendor/golang.org/x/net/webdav/prop.go index 145946637..e36a3b31d 100644 --- a/vendor/golang.org/x/net/webdav/prop.go +++ b/vendor/golang.org/x/net/webdav/prop.go @@ -5,6 +5,7 @@ package webdav import ( + "bytes" "encoding/xml" "fmt" "io" @@ -13,6 +14,8 @@ import ( "os" "path/filepath" "strconv" + + "golang.org/x/net/context" ) // Proppatch describes a property update instruction as defined in RFC 4918. @@ -100,23 +103,23 @@ type DeadPropsHolder interface { var liveProps = map[xml.Name]struct { // findFn implements the propfind function of this property. If nil, // it indicates a hidden property. - findFn func(FileSystem, LockSystem, string, os.FileInfo) (string, error) + findFn func(context.Context, FileSystem, LockSystem, string, os.FileInfo) (string, error) // dir is true if the property applies to directories. dir bool }{ - xml.Name{Space: "DAV:", Local: "resourcetype"}: { + {Space: "DAV:", Local: "resourcetype"}: { findFn: findResourceType, dir: true, }, - xml.Name{Space: "DAV:", Local: "displayname"}: { + {Space: "DAV:", Local: "displayname"}: { findFn: findDisplayName, dir: true, }, - xml.Name{Space: "DAV:", Local: "getcontentlength"}: { + {Space: "DAV:", Local: "getcontentlength"}: { findFn: findContentLength, dir: false, }, - xml.Name{Space: "DAV:", Local: "getlastmodified"}: { + {Space: "DAV:", Local: "getlastmodified"}: { findFn: findLastModified, // http://webdav.org/specs/rfc4918.html#PROPERTY_getlastmodified // suggests that getlastmodified should only apply to GETable @@ -127,19 +130,19 @@ var liveProps = map[xml.Name]struct { // See golang.org/issue/15334. dir: true, }, - xml.Name{Space: "DAV:", Local: "creationdate"}: { + {Space: "DAV:", Local: "creationdate"}: { findFn: nil, dir: false, }, - xml.Name{Space: "DAV:", Local: "getcontentlanguage"}: { + {Space: "DAV:", Local: "getcontentlanguage"}: { findFn: nil, dir: false, }, - xml.Name{Space: "DAV:", Local: "getcontenttype"}: { + {Space: "DAV:", Local: "getcontenttype"}: { findFn: findContentType, dir: false, }, - xml.Name{Space: "DAV:", Local: "getetag"}: { + {Space: "DAV:", Local: "getetag"}: { findFn: findETag, // findETag implements ETag as the concatenated hex values of a file's // modification time and size. This is not a reliable synchronization @@ -150,8 +153,8 @@ var liveProps = map[xml.Name]struct { // TODO: The lockdiscovery property requires LockSystem to list the // active locks on a resource. - xml.Name{Space: "DAV:", Local: "lockdiscovery"}: {}, - xml.Name{Space: "DAV:", Local: "supportedlock"}: { + {Space: "DAV:", Local: "lockdiscovery"}: {}, + {Space: "DAV:", Local: "supportedlock"}: { findFn: findSupportedLock, dir: true, }, @@ -163,8 +166,8 @@ var liveProps = map[xml.Name]struct { // // Each Propstat has a unique status and each property name will only be part // of one Propstat element. -func props(fs FileSystem, ls LockSystem, name string, pnames []xml.Name) ([]Propstat, error) { - f, err := fs.OpenFile(name, os.O_RDONLY, 0) +func props(ctx context.Context, fs FileSystem, ls LockSystem, name string, pnames []xml.Name) ([]Propstat, error) { + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) if err != nil { return nil, err } @@ -193,7 +196,7 @@ func props(fs FileSystem, ls LockSystem, name string, pnames []xml.Name) ([]Prop } // Otherwise, it must either be a live property or we don't know it. if prop := liveProps[pn]; prop.findFn != nil && (prop.dir || !isDir) { - innerXML, err := prop.findFn(fs, ls, name, fi) + innerXML, err := prop.findFn(ctx, fs, ls, name, fi) if err != nil { return nil, err } @@ -211,8 +214,8 @@ func props(fs FileSystem, ls LockSystem, name string, pnames []xml.Name) ([]Prop } // Propnames returns the property names defined for resource name. -func propnames(fs FileSystem, ls LockSystem, name string) ([]xml.Name, error) { - f, err := fs.OpenFile(name, os.O_RDONLY, 0) +func propnames(ctx context.Context, fs FileSystem, ls LockSystem, name string) ([]xml.Name, error) { + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) if err != nil { return nil, err } @@ -251,8 +254,8 @@ func propnames(fs FileSystem, ls LockSystem, name string) ([]xml.Name, error) { // returned if they are named in 'include'. // // See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND -func allprop(fs FileSystem, ls LockSystem, name string, include []xml.Name) ([]Propstat, error) { - pnames, err := propnames(fs, ls, name) +func allprop(ctx context.Context, fs FileSystem, ls LockSystem, name string, include []xml.Name) ([]Propstat, error) { + pnames, err := propnames(ctx, fs, ls, name) if err != nil { return nil, err } @@ -266,12 +269,12 @@ func allprop(fs FileSystem, ls LockSystem, name string, include []xml.Name) ([]P pnames = append(pnames, pn) } } - return props(fs, ls, name, pnames) + return props(ctx, fs, ls, name, pnames) } // Patch patches the properties of resource name. The return values are // constrained in the same manner as DeadPropsHolder.Patch. -func patch(fs FileSystem, ls LockSystem, name string, patches []Proppatch) ([]Propstat, error) { +func patch(ctx context.Context, fs FileSystem, ls LockSystem, name string, patches []Proppatch) ([]Propstat, error) { conflict := false loop: for _, patch := range patches { @@ -302,7 +305,7 @@ loop: return makePropstats(pstatForbidden, pstatFailedDep), nil } - f, err := fs.OpenFile(name, os.O_RDWR, 0) + f, err := fs.OpenFile(ctx, name, os.O_RDWR, 0) if err != nil { return nil, err } @@ -333,31 +336,51 @@ loop: return []Propstat{pstat}, nil } -func findResourceType(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { +func escapeXML(s string) string { + for i := 0; i < len(s); i++ { + // As an optimization, if s contains only ASCII letters, digits or a + // few special characters, the escaped value is s itself and we don't + // need to allocate a buffer and convert between string and []byte. + switch c := s[i]; { + case c == ' ' || c == '_' || + ('+' <= c && c <= '9') || // Digits as well as + , - . and / + ('A' <= c && c <= 'Z') || + ('a' <= c && c <= 'z'): + continue + } + // Otherwise, go through the full escaping process. + var buf bytes.Buffer + xml.EscapeText(&buf, []byte(s)) + return buf.String() + } + return s +} + +func findResourceType(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { if fi.IsDir() { return `<D:collection xmlns:D="DAV:"/>`, nil } return "", nil } -func findDisplayName(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { +func findDisplayName(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { if slashClean(name) == "/" { // Hide the real name of a possibly prefixed root directory. return "", nil } - return fi.Name(), nil + return escapeXML(fi.Name()), nil } -func findContentLength(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { +func findContentLength(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { return strconv.FormatInt(fi.Size(), 10), nil } -func findLastModified(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { +func findLastModified(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { return fi.ModTime().Format(http.TimeFormat), nil } -func findContentType(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - f, err := fs.OpenFile(name, os.O_RDONLY, 0) +func findContentType(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { + f, err := fs.OpenFile(ctx, name, os.O_RDONLY, 0) if err != nil { return "", err } @@ -379,14 +402,14 @@ func findContentType(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) return ctype, err } -func findETag(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { +func findETag(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { // The Apache http 2.4 web server by default concatenates the // modification time and size of a file. We replicate the heuristic // with nanosecond granularity. return fmt.Sprintf(`"%x%x"`, fi.ModTime().UnixNano(), fi.Size()), nil } -func findSupportedLock(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { +func findSupportedLock(ctx context.Context, fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { return `` + `<D:lockentry xmlns:D="DAV:">` + `<D:lockscope><D:exclusive/></D:lockscope>` + diff --git a/vendor/golang.org/x/net/webdav/prop_test.go b/vendor/golang.org/x/net/webdav/prop_test.go index 0834dc9f1..57d0e826f 100644 --- a/vendor/golang.org/x/net/webdav/prop_test.go +++ b/vendor/golang.org/x/net/webdav/prop_test.go @@ -12,13 +12,16 @@ import ( "reflect" "sort" "testing" + + "golang.org/x/net/context" ) func TestMemPS(t *testing.T) { + ctx := context.Background() // calcProps calculates the getlastmodified and getetag DAV: property // values in pstats for resource name in file-system fs. calcProps := func(name string, fs FileSystem, ls LockSystem, pstats []Propstat) error { - fi, err := fs.Stat(name) + fi, err := fs.Stat(ctx, name) if err != nil { return err } @@ -32,7 +35,7 @@ func TestMemPS(t *testing.T) { if fi.IsDir() { continue } - etag, err := findETag(fs, ls, name, fi) + etag, err := findETag(ctx, fs, ls, name, fi) if err != nil { return err } @@ -519,7 +522,7 @@ func TestMemPS(t *testing.T) { var propstats []Propstat switch op.op { case "propname": - pnames, err := propnames(fs, ls, op.name) + pnames, err := propnames(ctx, fs, ls, op.name) if err != nil { t.Errorf("%s: got error %v, want nil", desc, err) continue @@ -531,11 +534,11 @@ func TestMemPS(t *testing.T) { } continue case "allprop": - propstats, err = allprop(fs, ls, op.name, op.pnames) + propstats, err = allprop(ctx, fs, ls, op.name, op.pnames) case "propfind": - propstats, err = props(fs, ls, op.name, op.pnames) + propstats, err = props(ctx, fs, ls, op.name, op.pnames) case "proppatch": - propstats, err = patch(fs, ls, op.name, op.patches) + propstats, err = patch(ctx, fs, ls, op.name, op.patches) default: t.Fatalf("%s: %s not implemented", desc, op.op) } @@ -588,8 +591,8 @@ type noDeadPropsFS struct { FileSystem } -func (fs noDeadPropsFS) OpenFile(name string, flag int, perm os.FileMode) (File, error) { - f, err := fs.FileSystem.OpenFile(name, flag, perm) +func (fs noDeadPropsFS) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (File, error) { + f, err := fs.FileSystem.OpenFile(ctx, name, flag, perm) if err != nil { return nil, err } diff --git a/vendor/golang.org/x/net/webdav/webdav.go b/vendor/golang.org/x/net/webdav/webdav.go index 4ce09728b..7b56687fc 100644 --- a/vendor/golang.org/x/net/webdav/webdav.go +++ b/vendor/golang.org/x/net/webdav/webdav.go @@ -174,8 +174,9 @@ func (h *Handler) handleOptions(w http.ResponseWriter, r *http.Request) (status if err != nil { return status, err } + ctx := getContext(r) allow := "OPTIONS, LOCK, PUT, MKCOL" - if fi, err := h.FileSystem.Stat(reqPath); err == nil { + if fi, err := h.FileSystem.Stat(ctx, reqPath); err == nil { if fi.IsDir() { allow = "OPTIONS, LOCK, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND" } else { @@ -196,7 +197,8 @@ func (h *Handler) handleGetHeadPost(w http.ResponseWriter, r *http.Request) (sta return status, err } // TODO: check locks for read-only access?? - f, err := h.FileSystem.OpenFile(reqPath, os.O_RDONLY, 0) + ctx := getContext(r) + f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDONLY, 0) if err != nil { return http.StatusNotFound, err } @@ -208,7 +210,7 @@ func (h *Handler) handleGetHeadPost(w http.ResponseWriter, r *http.Request) (sta if fi.IsDir() { return http.StatusMethodNotAllowed, nil } - etag, err := findETag(h.FileSystem, h.LockSystem, reqPath, fi) + etag, err := findETag(ctx, h.FileSystem, h.LockSystem, reqPath, fi) if err != nil { return http.StatusInternalServerError, err } @@ -229,18 +231,20 @@ func (h *Handler) handleDelete(w http.ResponseWriter, r *http.Request) (status i } defer release() + ctx := getContext(r) + // TODO: return MultiStatus where appropriate. // "godoc os RemoveAll" says that "If the path does not exist, RemoveAll // returns nil (no error)." WebDAV semantics are that it should return a // "404 Not Found". We therefore have to Stat before we RemoveAll. - if _, err := h.FileSystem.Stat(reqPath); err != nil { + if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { if os.IsNotExist(err) { return http.StatusNotFound, err } return http.StatusMethodNotAllowed, err } - if err := h.FileSystem.RemoveAll(reqPath); err != nil { + if err := h.FileSystem.RemoveAll(ctx, reqPath); err != nil { return http.StatusMethodNotAllowed, err } return http.StatusNoContent, nil @@ -258,8 +262,9 @@ func (h *Handler) handlePut(w http.ResponseWriter, r *http.Request) (status int, defer release() // TODO(rost): Support the If-Match, If-None-Match headers? See bradfitz' // comments in http.checkEtag. + ctx := getContext(r) - f, err := h.FileSystem.OpenFile(reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { return http.StatusNotFound, err } @@ -276,7 +281,7 @@ func (h *Handler) handlePut(w http.ResponseWriter, r *http.Request) (status int, if closeErr != nil { return http.StatusMethodNotAllowed, closeErr } - etag, err := findETag(h.FileSystem, h.LockSystem, reqPath, fi) + etag, err := findETag(ctx, h.FileSystem, h.LockSystem, reqPath, fi) if err != nil { return http.StatusInternalServerError, err } @@ -295,10 +300,12 @@ func (h *Handler) handleMkcol(w http.ResponseWriter, r *http.Request) (status in } defer release() + ctx := getContext(r) + if r.ContentLength > 0 { return http.StatusUnsupportedMediaType, nil } - if err := h.FileSystem.Mkdir(reqPath, 0777); err != nil { + if err := h.FileSystem.Mkdir(ctx, reqPath, 0777); err != nil { if os.IsNotExist(err) { return http.StatusConflict, err } @@ -337,6 +344,8 @@ func (h *Handler) handleCopyMove(w http.ResponseWriter, r *http.Request) (status return http.StatusForbidden, errDestinationEqualsSource } + ctx := getContext(r) + if r.Method == "COPY" { // Section 7.5.1 says that a COPY only needs to lock the destination, // not both destination and source. Strictly speaking, this is racy, @@ -360,7 +369,7 @@ func (h *Handler) handleCopyMove(w http.ResponseWriter, r *http.Request) (status return http.StatusBadRequest, errInvalidDepth } } - return copyFiles(h.FileSystem, src, dst, r.Header.Get("Overwrite") != "F", depth, 0) + return copyFiles(ctx, h.FileSystem, src, dst, r.Header.Get("Overwrite") != "F", depth, 0) } release, status, err := h.confirmLocks(r, src, dst) @@ -377,7 +386,7 @@ func (h *Handler) handleCopyMove(w http.ResponseWriter, r *http.Request) (status return http.StatusBadRequest, errInvalidDepth } } - return moveFiles(h.FileSystem, src, dst, r.Header.Get("Overwrite") == "T") + return moveFiles(ctx, h.FileSystem, src, dst, r.Header.Get("Overwrite") == "T") } func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus int, retErr error) { @@ -390,6 +399,7 @@ func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus return status, err } + ctx := getContext(r) token, ld, now, created := "", LockDetails{}, time.Now(), false if li == (lockInfo{}) { // An empty lockInfo means to refresh the lock. @@ -447,8 +457,8 @@ func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus }() // Create the resource if it didn't previously exist. - if _, err := h.FileSystem.Stat(reqPath); err != nil { - f, err := h.FileSystem.OpenFile(reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) + if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { + f, err := h.FileSystem.OpenFile(ctx, reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) if err != nil { // TODO: detect missing intermediate dirs and return http.StatusConflict? return http.StatusInternalServerError, err @@ -501,7 +511,8 @@ func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) (status if err != nil { return status, err } - fi, err := h.FileSystem.Stat(reqPath) + ctx := getContext(r) + fi, err := h.FileSystem.Stat(ctx, reqPath) if err != nil { if os.IsNotExist(err) { return http.StatusNotFound, err @@ -528,7 +539,7 @@ func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) (status } var pstats []Propstat if pf.Propname != nil { - pnames, err := propnames(h.FileSystem, h.LockSystem, reqPath) + pnames, err := propnames(ctx, h.FileSystem, h.LockSystem, reqPath) if err != nil { return err } @@ -538,9 +549,9 @@ func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) (status } pstats = append(pstats, pstat) } else if pf.Allprop != nil { - pstats, err = allprop(h.FileSystem, h.LockSystem, reqPath, pf.Prop) + pstats, err = allprop(ctx, h.FileSystem, h.LockSystem, reqPath, pf.Prop) } else { - pstats, err = props(h.FileSystem, h.LockSystem, reqPath, pf.Prop) + pstats, err = props(ctx, h.FileSystem, h.LockSystem, reqPath, pf.Prop) } if err != nil { return err @@ -548,7 +559,7 @@ func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) (status return mw.write(makePropstatResponse(path.Join(h.Prefix, reqPath), pstats)) } - walkErr := walkFS(h.FileSystem, depth, reqPath, fi, walkFn) + walkErr := walkFS(ctx, h.FileSystem, depth, reqPath, fi, walkFn) closeErr := mw.close() if walkErr != nil { return http.StatusInternalServerError, walkErr @@ -570,7 +581,9 @@ func (h *Handler) handleProppatch(w http.ResponseWriter, r *http.Request) (statu } defer release() - if _, err := h.FileSystem.Stat(reqPath); err != nil { + ctx := getContext(r) + + if _, err := h.FileSystem.Stat(ctx, reqPath); err != nil { if os.IsNotExist(err) { return http.StatusNotFound, err } @@ -580,7 +593,7 @@ func (h *Handler) handleProppatch(w http.ResponseWriter, r *http.Request) (statu if err != nil { return status, err } - pstats, err := patch(h.FileSystem, h.LockSystem, reqPath, patches) + pstats, err := patch(ctx, h.FileSystem, h.LockSystem, reqPath, patches) if err != nil { return http.StatusInternalServerError, err } diff --git a/vendor/golang.org/x/net/webdav/webdav_test.go b/vendor/golang.org/x/net/webdav/webdav_test.go index b068aab32..25e0d5421 100644 --- a/vendor/golang.org/x/net/webdav/webdav_test.go +++ b/vendor/golang.org/x/net/webdav/webdav_test.go @@ -18,6 +18,8 @@ import ( "sort" "strings" "testing" + + "golang.org/x/net/context" ) // TODO: add tests to check XML responses with the expected prefix path @@ -48,7 +50,7 @@ func TestPrefix(t *testing.T) { req.Header.Add(headers[0], headers[1]) headers = headers[2:] } - res, err := http.DefaultClient.Do(req) + res, err := http.DefaultTransport.RoundTrip(req) if err != nil { return nil, err } @@ -65,6 +67,7 @@ func TestPrefix(t *testing.T) { "/a/b/", "/a/b/c/", } + ctx := context.Background() for _, prefix := range prefixes { fs := NewMemFS() h := &Handler{ @@ -183,7 +186,7 @@ func TestPrefix(t *testing.T) { continue } - got, err := find(nil, fs, "/") + got, err := find(ctx, nil, fs, "/") if err != nil { t.Errorf("prefix=%-9q find: %v", prefix, err) continue @@ -202,57 +205,110 @@ func TestPrefix(t *testing.T) { } } +func TestEscapeXML(t *testing.T) { + // These test cases aren't exhaustive, and there is more than one way to + // escape e.g. a quot (as """ or """) or an apos. We presume that + // the encoding/xml package tests xml.EscapeText more thoroughly. This test + // here is just a sanity check for this package's escapeXML function, and + // its attempt to provide a fast path (and avoid a bytes.Buffer allocation) + // when escaping filenames is obviously a no-op. + testCases := map[string]string{ + "": "", + " ": " ", + "&": "&", + "*": "*", + "+": "+", + ",": ",", + "-": "-", + ".": ".", + "/": "/", + "0": "0", + "9": "9", + ":": ":", + "<": "<", + ">": ">", + "A": "A", + "_": "_", + "a": "a", + "~": "~", + "\u0201": "\u0201", + "&": "&amp;", + "foo&<b/ar>baz": "foo&<b/ar>baz", + } + + for in, want := range testCases { + if got := escapeXML(in); got != want { + t.Errorf("in=%q: got %q, want %q", in, got, want) + } + } +} + func TestFilenameEscape(t *testing.T) { - re := regexp.MustCompile(`<D:href>([^<]*)</D:href>`) - do := func(method, urlStr string) (string, error) { + hrefRe := regexp.MustCompile(`<D:href>([^<]*)</D:href>`) + displayNameRe := regexp.MustCompile(`<D:displayname>([^<]*)</D:displayname>`) + do := func(method, urlStr string) (string, string, error) { req, err := http.NewRequest(method, urlStr, nil) if err != nil { - return "", err + return "", "", err } res, err := http.DefaultClient.Do(req) if err != nil { - return "", err + return "", "", err } defer res.Body.Close() b, err := ioutil.ReadAll(res.Body) if err != nil { - return "", err + return "", "", err + } + hrefMatch := hrefRe.FindStringSubmatch(string(b)) + if len(hrefMatch) != 2 { + return "", "", errors.New("D:href not found") } - m := re.FindStringSubmatch(string(b)) - if len(m) != 2 { - return "", errors.New("D:href not found") + displayNameMatch := displayNameRe.FindStringSubmatch(string(b)) + if len(displayNameMatch) != 2 { + return "", "", errors.New("D:displayname not found") } - return m[1], nil + return hrefMatch[1], displayNameMatch[1], nil } testCases := []struct { - name, want string + name, wantHref, wantDisplayName string }{{ - name: `/foo%bar`, - want: `/foo%25bar`, + name: `/foo%bar`, + wantHref: `/foo%25bar`, + wantDisplayName: `foo%bar`, }, { - name: `/こんにちわ世界`, - want: `/%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%82%8F%E4%B8%96%E7%95%8C`, + name: `/こんにちわ世界`, + wantHref: `/%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%82%8F%E4%B8%96%E7%95%8C`, + wantDisplayName: `こんにちわ世界`, }, { - name: `/Program Files/`, - want: `/Program%20Files`, + name: `/Program Files/`, + wantHref: `/Program%20Files`, + wantDisplayName: `Program Files`, }, { - name: `/go+lang`, - want: `/go+lang`, + name: `/go+lang`, + wantHref: `/go+lang`, + wantDisplayName: `go+lang`, }, { - name: `/go&lang`, - want: `/go&lang`, + name: `/go&lang`, + wantHref: `/go&lang`, + wantDisplayName: `go&lang`, + }, { + name: `/go<lang`, + wantHref: `/go%3Clang`, + wantDisplayName: `go<lang`, }} + ctx := context.Background() fs := NewMemFS() for _, tc := range testCases { if strings.HasSuffix(tc.name, "/") { - if err := fs.Mkdir(tc.name, 0755); err != nil { + if err := fs.Mkdir(ctx, tc.name, 0755); err != nil { t.Fatalf("name=%q: Mkdir: %v", tc.name, err) } } else { - f, err := fs.OpenFile(tc.name, os.O_CREATE, 0644) + f, err := fs.OpenFile(ctx, tc.name, os.O_CREATE, 0644) if err != nil { t.Fatalf("name=%q: OpenFile: %v", tc.name, err) } @@ -273,13 +329,16 @@ func TestFilenameEscape(t *testing.T) { for _, tc := range testCases { u.Path = tc.name - got, err := do("PROPFIND", u.String()) + gotHref, gotDisplayName, err := do("PROPFIND", u.String()) if err != nil { t.Errorf("name=%q: PROPFIND: %v", tc.name, err) continue } - if got != tc.want { - t.Errorf("name=%q: got %q, want %q", tc.name, got, tc.want) + if gotHref != tc.wantHref { + t.Errorf("name=%q: got href %q, want %q", tc.name, gotHref, tc.wantHref) + } + if gotDisplayName != tc.wantDisplayName { + t.Errorf("name=%q: got dispayname %q, want %q", tc.name, gotDisplayName, tc.wantDisplayName) } } } diff --git a/vendor/golang.org/x/net/websocket/client.go b/vendor/golang.org/x/net/websocket/client.go index 20d1e1e38..69a4ac7ee 100644 --- a/vendor/golang.org/x/net/websocket/client.go +++ b/vendor/golang.org/x/net/websocket/client.go @@ -6,7 +6,6 @@ package websocket import ( "bufio" - "crypto/tls" "io" "net" "net/http" @@ -87,20 +86,14 @@ func DialConfig(config *Config) (ws *Conn, err error) { if config.Origin == nil { return nil, &DialError{config, ErrBadWebSocketOrigin} } - switch config.Location.Scheme { - case "ws": - client, err = net.Dial("tcp", parseAuthority(config.Location)) - - case "wss": - client, err = tls.Dial("tcp", parseAuthority(config.Location), config.TlsConfig) - - default: - err = ErrBadScheme + dialer := config.Dialer + if dialer == nil { + dialer = &net.Dialer{} } + client, err = dialWithDialer(dialer, config) if err != nil { goto Error } - ws, err = NewClient(config, client) if err != nil { client.Close() diff --git a/vendor/golang.org/x/net/websocket/dial.go b/vendor/golang.org/x/net/websocket/dial.go new file mode 100644 index 000000000..2dab943a4 --- /dev/null +++ b/vendor/golang.org/x/net/websocket/dial.go @@ -0,0 +1,24 @@ +// Copyright 2015 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. + +package websocket + +import ( + "crypto/tls" + "net" +) + +func dialWithDialer(dialer *net.Dialer, config *Config) (conn net.Conn, err error) { + switch config.Location.Scheme { + case "ws": + conn, err = dialer.Dial("tcp", parseAuthority(config.Location)) + + case "wss": + conn, err = tls.DialWithDialer(dialer, "tcp", parseAuthority(config.Location), config.TlsConfig) + + default: + err = ErrBadScheme + } + return +} diff --git a/vendor/golang.org/x/net/websocket/dial_test.go b/vendor/golang.org/x/net/websocket/dial_test.go new file mode 100644 index 000000000..aa03e30dd --- /dev/null +++ b/vendor/golang.org/x/net/websocket/dial_test.go @@ -0,0 +1,43 @@ +// Copyright 2015 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. + +package websocket + +import ( + "crypto/tls" + "fmt" + "log" + "net" + "net/http/httptest" + "testing" + "time" +) + +// This test depend on Go 1.3+ because in earlier versions the Dialer won't be +// used in TLS connections and a timeout won't be triggered. +func TestDialConfigTLSWithDialer(t *testing.T) { + tlsServer := httptest.NewTLSServer(nil) + tlsServerAddr := tlsServer.Listener.Addr().String() + log.Print("Test TLS WebSocket server listening on ", tlsServerAddr) + defer tlsServer.Close() + config, _ := NewConfig(fmt.Sprintf("wss://%s/echo", tlsServerAddr), "http://localhost") + config.Dialer = &net.Dialer{ + Deadline: time.Now().Add(-time.Minute), + } + config.TlsConfig = &tls.Config{ + InsecureSkipVerify: true, + } + _, err := DialConfig(config) + dialerr, ok := err.(*DialError) + if !ok { + t.Fatalf("DialError expected, got %#v", err) + } + neterr, ok := dialerr.Err.(*net.OpError) + if !ok { + t.Fatalf("net.OpError error expected, got %#v", dialerr.Err) + } + if !neterr.Timeout() { + t.Fatalf("expected timeout error, got %#v", neterr) + } +} diff --git a/vendor/golang.org/x/net/websocket/websocket.go b/vendor/golang.org/x/net/websocket/websocket.go index 9412191de..a7731d9c9 100644 --- a/vendor/golang.org/x/net/websocket/websocket.go +++ b/vendor/golang.org/x/net/websocket/websocket.go @@ -32,6 +32,8 @@ const ( PingFrame = 9 PongFrame = 10 UnknownFrame = 255 + + DefaultMaxPayloadBytes = 32 << 20 // 32MB ) // ProtocolError represents WebSocket protocol errors. @@ -58,6 +60,10 @@ var ( ErrNotSupported = &ProtocolError{"not supported"} ) +// ErrFrameTooLarge is returned by Codec's Receive method if payload size +// exceeds limit set by Conn.MaxPayloadBytes +var ErrFrameTooLarge = errors.New("websocket: frame payload size exceeds limit") + // Addr is an implementation of net.Addr for WebSocket. type Addr struct { *url.URL @@ -86,6 +92,9 @@ type Config struct { // Additional header fields to be sent in WebSocket opening handshake. Header http.Header + // Dialer used when opening websocket connections. + Dialer *net.Dialer + handshakeData map[string]string } @@ -163,6 +172,10 @@ type Conn struct { frameHandler PayloadType byte defaultCloseStatus int + + // MaxPayloadBytes limits the size of frame payload received over Conn + // by Codec's Receive method. If zero, DefaultMaxPayloadBytes is used. + MaxPayloadBytes int } // Read implements the io.Reader interface: @@ -299,7 +312,12 @@ func (cd Codec) Send(ws *Conn, v interface{}) (err error) { return err } -// Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores in v. +// Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores +// in v. The whole frame payload is read to an in-memory buffer; max size of +// payload is defined by ws.MaxPayloadBytes. If frame payload size exceeds +// limit, ErrFrameTooLarge is returned; in this case frame is not read off wire +// completely. The next call to Receive would read and discard leftover data of +// previous oversized frame before processing next frame. func (cd Codec) Receive(ws *Conn, v interface{}) (err error) { ws.rio.Lock() defer ws.rio.Unlock() @@ -322,6 +340,19 @@ again: if frame == nil { goto again } + maxPayloadBytes := ws.MaxPayloadBytes + if maxPayloadBytes == 0 { + maxPayloadBytes = DefaultMaxPayloadBytes + } + if hf, ok := frame.(*hybiFrameReader); ok && hf.header.Length > int64(maxPayloadBytes) { + // payload size exceeds limit, no need to call Unmarshal + // + // set frameReader to current oversized frame so that + // the next call to this function can drain leftover + // data before processing the next frame + ws.frameReader = frame + return ErrFrameTooLarge + } payloadType := frame.PayloadType() data, err := ioutil.ReadAll(frame) if err != nil { diff --git a/vendor/golang.org/x/net/websocket/websocket_test.go b/vendor/golang.org/x/net/websocket/websocket_test.go index 05b7e5356..2054ce85a 100644 --- a/vendor/golang.org/x/net/websocket/websocket_test.go +++ b/vendor/golang.org/x/net/websocket/websocket_test.go @@ -6,6 +6,7 @@ package websocket import ( "bytes" + "crypto/rand" "fmt" "io" "log" @@ -357,6 +358,26 @@ func TestDialConfigBadVersion(t *testing.T) { } } +func TestDialConfigWithDialer(t *testing.T) { + once.Do(startServer) + config := newConfig(t, "/echo") + config.Dialer = &net.Dialer{ + Deadline: time.Now().Add(-time.Minute), + } + _, err := DialConfig(config) + dialerr, ok := err.(*DialError) + if !ok { + t.Fatalf("DialError expected, got %#v", err) + } + neterr, ok := dialerr.Err.(*net.OpError) + if !ok { + t.Fatalf("net.OpError error expected, got %#v", dialerr.Err) + } + if !neterr.Timeout() { + t.Fatalf("expected timeout error, got %#v", neterr) + } +} + func TestSmallBuffer(t *testing.T) { // http://code.google.com/p/go/issues/detail?id=1145 // Read should be able to handle reading a fragment of a frame. @@ -585,3 +606,60 @@ func TestCtrlAndData(t *testing.T) { } } } + +func TestCodec_ReceiveLimited(t *testing.T) { + const limit = 2048 + var payloads [][]byte + for _, size := range []int{ + 1024, + 2048, + 4096, // receive of this message would be interrupted due to limit + 2048, // this one is to make sure next receive recovers discarding leftovers + } { + b := make([]byte, size) + rand.Read(b) + payloads = append(payloads, b) + } + handlerDone := make(chan struct{}) + limitedHandler := func(ws *Conn) { + defer close(handlerDone) + ws.MaxPayloadBytes = limit + defer ws.Close() + for i, p := range payloads { + t.Logf("payload #%d (size %d, exceeds limit: %v)", i, len(p), len(p) > limit) + var recv []byte + err := Message.Receive(ws, &recv) + switch err { + case nil: + case ErrFrameTooLarge: + if len(p) <= limit { + t.Fatalf("unexpected frame size limit: expected %d bytes of payload having limit at %d", len(p), limit) + } + continue + default: + t.Fatalf("unexpected error: %v (want either nil or ErrFrameTooLarge)", err) + } + if len(recv) > limit { + t.Fatalf("received %d bytes of payload having limit at %d", len(recv), limit) + } + if !bytes.Equal(p, recv) { + t.Fatalf("received payload differs:\ngot:\t%v\nwant:\t%v", recv, p) + } + } + } + server := httptest.NewServer(Handler(limitedHandler)) + defer server.CloseClientConnections() + defer server.Close() + addr := server.Listener.Addr().String() + ws, err := Dial("ws://"+addr+"/", "", "http://localhost/") + if err != nil { + t.Fatal(err) + } + defer ws.Close() + for i, p := range payloads { + if err := Message.Send(ws, p); err != nil { + t.Fatalf("payload #%d (size %d): %v", i, len(p), err) + } + } + <-handlerDone +} diff --git a/vendor/golang.org/x/net/xsrftoken/xsrf.go b/vendor/golang.org/x/net/xsrftoken/xsrf.go index 8d2187872..881bf199f 100644 --- a/vendor/golang.org/x/net/xsrftoken/xsrf.go +++ b/vendor/golang.org/x/net/xsrftoken/xsrf.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. diff --git a/vendor/golang.org/x/net/xsrftoken/xsrf_test.go b/vendor/golang.org/x/net/xsrftoken/xsrf_test.go index 9933f8671..6c8e7d9b5 100644 --- a/vendor/golang.org/x/net/xsrftoken/xsrf_test.go +++ b/vendor/golang.org/x/net/xsrftoken/xsrf_test.go @@ -1,4 +1,4 @@ -// Copyright 2012 The Go Authors. All rights reserved. +// Copyright 2012 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. |