From c281ee3b61e8ab53ff118866d72618ae8cce582b Mon Sep 17 00:00:00 2001 From: Christopher Speller Date: Mon, 13 Mar 2017 12:54:22 -0400 Subject: [PATCH] Updating server dependancies. Also adding github.com/jaytaylor/html2text and gopkg.in/gomail.v2 (#5748) --- glide.lock | 40 +- glide.yaml | 4 + vendor/github.com/goamz/goamz/aws/aws.go | 1 + vendor/github.com/goamz/goamz/aws/regions.go | 23 + vendor/github.com/goamz/goamz/sqs/sqs.go | 2 + .../golang/protobuf/descriptor/descriptor.go | 2 +- .../protobuf/descriptor/descriptor_test.go | 2 +- .../protobuf/protoc-gen-go/testdata/Makefile | 6 +- .../protoc-gen-go/testdata/my_test/test.pb.go | 7 +- .../testdata/my_test/test.pb.go.golden | 7 +- .../github.com/jaytaylor/html2text/.gitignore | 24 + .../jaytaylor/html2text/.travis.yml | 14 + vendor/github.com/jaytaylor/html2text/LICENSE | 22 + .../github.com/jaytaylor/html2text/README.md | 116 + .../jaytaylor/html2text/html2text.go | 312 + .../jaytaylor/html2text/html2text_test.go | 674 + .../jaytaylor/html2text/testdata/utf8.html | 22 + .../html2text/testdata/utf8_with_bom.xhtml | 24 + vendor/github.com/lib/pq/README.md | 2 +- vendor/github.com/lib/pq/conn.go | 92 +- vendor/github.com/lib/pq/conn_go18.go | 35 +- vendor/github.com/lib/pq/conn_test.go | 108 +- vendor/github.com/lib/pq/go18_test.go | 15 +- .../github.com/lib/pq/listen_example/doc.go | 24 +- vendor/github.com/lib/pq/notify_test.go | 24 +- vendor/github.com/lib/pq/oid/types.go | 12 + vendor/github.com/lib/pq/ssl.go | 123 +- vendor/github.com/lib/pq/ssl_permissions.go | 16 +- vendor/github.com/lib/pq/ssl_test.go | 198 +- vendor/github.com/lib/pq/ssl_windows.go | 10 +- vendor/github.com/miekg/dns/README.md | 4 + vendor/github.com/miekg/dns/client.go | 20 +- vendor/github.com/miekg/dns/client_test.go | 63 +- vendor/github.com/miekg/dns/clientconfig.go | 32 + .../github.com/miekg/dns/clientconfig_test.go | 37 + .../github.com/miekg/dns/compress_generate.go | 184 + vendor/github.com/miekg/dns/dane.go | 9 +- vendor/github.com/miekg/dns/dns_test.go | 17 + vendor/github.com/miekg/dns/dnssec.go | 21 +- vendor/github.com/miekg/dns/dnssec_keygen.go | 16 +- vendor/github.com/miekg/dns/dnssec_keyscan.go | 2 +- vendor/github.com/miekg/dns/edns.go | 12 +- vendor/github.com/miekg/dns/idn/punycode.go | 3 - vendor/github.com/miekg/dns/msg.go | 188 +- vendor/github.com/miekg/dns/nsecx.go | 11 +- vendor/github.com/miekg/dns/parse_test.go | 6 +- vendor/github.com/miekg/dns/reverse.go | 4 +- vendor/github.com/miekg/dns/scan.go | 8 +- vendor/github.com/miekg/dns/scan_rr.go | 116 +- vendor/github.com/miekg/dns/server_test.go | 4 +- vendor/github.com/miekg/dns/sig0.go | 5 +- vendor/github.com/miekg/dns/smimea.go | 8 +- vendor/github.com/miekg/dns/tsig.go | 3 +- vendor/github.com/miekg/dns/types.go | 2 +- vendor/github.com/miekg/dns/types_generate.go | 2 +- vendor/github.com/miekg/dns/udp.go | 26 +- vendor/github.com/miekg/dns/udp_linux.go | 25 +- vendor/github.com/miekg/dns/udp_other.go | 6 +- vendor/github.com/miekg/dns/udp_plan9.go | 34 - vendor/github.com/miekg/dns/udp_windows.go | 9 +- vendor/github.com/miekg/dns/update_test.go | 36 +- vendor/github.com/miekg/dns/zcompress.go | 119 + vendor/github.com/miekg/dns/ztypes.go | 58 +- .../prometheus/client_model/AUTHORS.md | 13 - .../prometheus/client_model/CONTRIBUTING.md | 8 +- .../prometheus/client_model/MAINTAINERS.md | 1 + .../github.com/prometheus/common/AUTHORS.md | 11 - .../prometheus/common/CONTRIBUTING.md | 6 +- .../prometheus/common/MAINTAINERS.md | 1 + .../prometheus/common/model/value.go | 5 +- .../prometheus/common/model/value_test.go | 53 +- .../github.com/prometheus/procfs/AUTHORS.md | 21 - .../prometheus/procfs/CONTRIBUTING.md | 6 +- .../prometheus/procfs/MAINTAINERS.md | 1 + vendor/github.com/prometheus/procfs/README.md | 1 + .../github.com/prometheus/procfs/buddyinfo.go | 95 + .../prometheus/procfs/buddyinfo_test.go | 64 + .../procfs/fixtures/buddyinfo/short/buddyinfo | 3 + .../fixtures/buddyinfo/sizemismatch/buddyinfo | 3 + .../procfs/fixtures/buddyinfo/valid/buddyinfo | 3 + .../prometheus/procfs/fixtures/fs/xfs/stat | 23 + vendor/github.com/prometheus/procfs/fs.go | 13 + .../github.com/prometheus/procfs/fs_test.go | 13 + .../github.com/prometheus/procfs/ipvs_test.go | 16 +- .../prometheus/procfs/mdstat_test.go | 14 +- .../prometheus/procfs/mountstats.go | 4 +- .../prometheus/procfs/mountstats_test.go | 9 +- .../github.com/prometheus/procfs/xfs/parse.go | 361 + .../prometheus/procfs/xfs/parse_test.go | 446 + .../github.com/prometheus/procfs/xfs/xfs.go | 158 + vendor/github.com/spf13/cobra/.travis.yml | 5 +- vendor/github.com/spf13/cobra/README.md | 3 +- vendor/github.com/spf13/cobra/command.go | 62 +- vendor/github.com/spf13/cobra/doc/man_docs.go | 4 +- vendor/github.com/spf13/cobra/doc/md_docs.go | 4 +- vendor/github.com/spf13/cobra/doc/util.go | 2 +- .../github.com/spf13/cobra/doc/yaml_docs.go | 4 +- vendor/github.com/tylerb/graceful/README.md | 5 + vendor/github.com/tylerb/graceful/graceful.go | 1 + vendor/github.com/xenolf/lego/README.md | 6 +- vendor/github.com/xenolf/lego/acme/client.go | 9 + .../xenolf/lego/acme/client_test.go | 71 + vendor/github.com/xenolf/lego/acme/error.go | 15 +- vendor/github.com/xenolf/lego/acme/http.go | 10 +- vendor/github.com/xenolf/lego/acme/jws.go | 105 +- .../providers/http/memcached/memcached.go | 3 +- vendor/golang.org/x/crypto/acme/acme.go | 119 +- vendor/golang.org/x/crypto/acme/acme_test.go | 117 +- .../x/crypto/acme/autocert/autocert_test.go | 41 +- .../x/crypto/acme/autocert/renewal_test.go | 2 +- .../x/crypto/blake2b/blake2bAVX2_amd64.s | 688 +- .../golang.org/x/crypto/blake2b/register.go | 32 + .../golang.org/x/crypto/blake2s/register.go | 21 + vendor/golang.org/x/crypto/cryptobyte/asn1.go | 604 + .../x/crypto/cryptobyte/asn1_test.go | 285 + .../golang.org/x/crypto/cryptobyte/builder.go | 255 + .../x/crypto/cryptobyte/cryptobyte_test.go | 379 + .../x/crypto/cryptobyte/example_test.go | 120 + .../golang.org/x/crypto/cryptobyte/string.go | 157 + .../x/crypto/curve25519/const_amd64.h | 8 + .../x/crypto/curve25519/const_amd64.s | 4 +- .../x/crypto/curve25519/freeze_amd64.s | 4 +- .../x/crypto/curve25519/ladderstep_amd64.s | 20 +- .../x/crypto/curve25519/mul_amd64.s | 4 +- .../x/crypto/curve25519/square_amd64.s | 4 +- vendor/golang.org/x/crypto/ocsp/ocsp_test.go | 6 +- .../x/crypto/poly1305/poly1305_test.go | 37 + .../golang.org/x/crypto/poly1305/sum_ref.go | 1614 +- .../x/crypto/ssh/agent/client_test.go | 2 +- vendor/golang.org/x/crypto/ssh/cipher.go | 64 +- vendor/golang.org/x/crypto/ssh/cipher_test.go | 62 +- .../x/crypto/ssh/client_auth_test.go | 4 +- vendor/golang.org/x/crypto/ssh/common.go | 2 +- vendor/golang.org/x/crypto/ssh/handshake.go | 49 +- .../golang.org/x/crypto/ssh/handshake_test.go | 61 +- vendor/golang.org/x/crypto/ssh/mac.go | 10 +- vendor/golang.org/x/crypto/ssh/mux_test.go | 3 + vendor/golang.org/x/crypto/ssh/server.go | 27 +- vendor/golang.org/x/crypto/ssh/transport.go | 32 +- vendor/golang.org/x/image/draw/draw.go | 42 +- vendor/golang.org/x/image/draw/gen.go | 2 +- vendor/golang.org/x/image/draw/go1_8.go | 49 + vendor/golang.org/x/image/draw/go1_9.go | 57 + vendor/golang.org/x/image/draw/impl.go | 96 +- vendor/golang.org/x/image/draw/stdlib_test.go | 6 +- vendor/golang.org/x/image/font/sfnt/cmap.go | 269 + vendor/golang.org/x/image/font/sfnt/data.go | 68 + .../x/image/font/sfnt/example_test.go | 128 + vendor/golang.org/x/image/font/sfnt/gen.go | 321 + .../x/image/font/sfnt/postscript.go | 117 +- .../x/image/font/sfnt/proprietary_test.go | 479 + vendor/golang.org/x/image/font/sfnt/sfnt.go | 571 +- .../golang.org/x/image/font/sfnt/sfnt_test.go | 370 +- .../golang.org/x/image/font/sfnt/truetype.go | 29 +- .../x/image/font/testdata/cmapTest.sfd | 265 + .../x/image/font/testdata/cmapTest.ttf | Bin 0 -> 2528 bytes .../x/image/testdata/go-turns-two-down-ab.png | Bin 21338 -> 21092 bytes .../x/image/testdata/go-turns-two-down-bl.png | Bin 18581 -> 18169 bytes .../x/image/testdata/go-turns-two-down-cr.png | Bin 19519 -> 19141 bytes .../x/image/testdata/go-turns-two-down-nn.png | Bin 21504 -> 21320 bytes .../image/testdata/go-turns-two-rotate-ab.png | Bin 7654 -> 7417 bytes .../image/testdata/go-turns-two-rotate-bl.png | Bin 7653 -> 7421 bytes .../image/testdata/go-turns-two-rotate-cr.png | Bin 7808 -> 7544 bytes .../image/testdata/go-turns-two-rotate-nn.png | Bin 4915 -> 5128 bytes .../x/image/testdata/go-turns-two-up-ab.png | Bin 9633 -> 9427 bytes .../x/image/testdata/go-turns-two-up-bl.png | Bin 9639 -> 9427 bytes .../x/image/testdata/go-turns-two-up-cr.png | Bin 10987 -> 10694 bytes .../x/image/testdata/go-turns-two-up-nn.png | Bin 1368 -> 1369 bytes .../x/image/testdata/tux-rotate-ab.png | Bin 3237 -> 3340 bytes .../x/image/testdata/tux-rotate-bl.png | Bin 3751 -> 3836 bytes .../x/image/testdata/tux-rotate-cr.png | Bin 3753 -> 3841 bytes .../x/image/testdata/tux-rotate-nn.png | Bin 3055 -> 3159 bytes vendor/golang.org/x/net/bpf/vm_bpf_test.go | 7 +- vendor/golang.org/x/net/context/context.go | 30 +- .../x/net/context/ctxhttp/ctxhttp_17_test.go | 1 + vendor/golang.org/x/net/context/go17.go | 4 +- vendor/golang.org/x/net/context/pre_go17.go | 18 +- .../x/net/dns/dnsmessage/message.go | 1418 ++ .../x/net/dns/dnsmessage/message_test.go | 575 + .../x/net/http2/client_conn_pool.go | 2 +- vendor/golang.org/x/net/http2/databuffer.go | 146 + .../golang.org/x/net/http2/databuffer_test.go | 155 + vendor/golang.org/x/net/http2/fixed_buffer.go | 60 - .../x/net/http2/fixed_buffer_test.go | 128 - vendor/golang.org/x/net/http2/frame.go | 81 +- vendor/golang.org/x/net/http2/frame_test.go | 91 +- vendor/golang.org/x/net/http2/go18.go | 6 +- vendor/golang.org/x/net/http2/go18_test.go | 13 + vendor/golang.org/x/net/http2/hpack/encode.go | 29 +- .../x/net/http2/hpack/encode_test.go | 70 +- vendor/golang.org/x/net/http2/hpack/hpack.go | 104 +- .../x/net/http2/hpack/hpack_test.go | 146 +- vendor/golang.org/x/net/http2/hpack/tables.go | 250 +- .../x/net/http2/hpack/tables_test.go | 188 + vendor/golang.org/x/net/http2/pipe.go | 2 +- vendor/golang.org/x/net/http2/server.go | 199 +- vendor/golang.org/x/net/http2/server_test.go | 155 +- vendor/golang.org/x/net/http2/transport.go | 9 +- .../golang.org/x/net/http2/transport_test.go | 2 +- .../x/net/internal/netreflect/socket.go | 4 + .../x/net/internal/netreflect/socket_19.go | 37 + .../x/net/internal/netreflect/socket_posix.go | 1 + .../x/net/internal/netreflect/socket_stub.go | 1 + .../x/net/internal/netreflect/socket_test.go | 3 + .../x/net/internal/timeseries/timeseries.go | 2 +- vendor/golang.org/x/net/ipv4/doc.go | 12 +- vendor/golang.org/x/net/ipv4/endpoint.go | 8 +- vendor/golang.org/x/net/ipv4/go19_test.go | 11 + vendor/golang.org/x/net/ipv4/ipv4_test.go | 22 + vendor/golang.org/x/net/ipv4/packet.go | 6 +- vendor/golang.org/x/net/ipv4/payload_cmsg.go | 8 +- .../golang.org/x/net/ipv4/payload_nocmsg.go | 8 +- vendor/golang.org/x/net/ipv6/control.go | 2 +- .../golang.org/x/net/ipv6/dgramopt_posix.go | 4 +- vendor/golang.org/x/net/ipv6/dgramopt_stub.go | 4 +- vendor/golang.org/x/net/ipv6/doc.go | 12 +- vendor/golang.org/x/net/ipv6/endpoint.go | 4 +- vendor/golang.org/x/net/ipv6/go19_test.go | 11 + vendor/golang.org/x/net/ipv6/ipv6_test.go | 22 + vendor/golang.org/x/net/ipv6/payload_cmsg.go | 8 +- .../golang.org/x/net/ipv6/payload_nocmsg.go | 8 +- vendor/golang.org/x/net/lif/address.go | 4 +- vendor/golang.org/x/net/lif/binary.go | 49 +- vendor/golang.org/x/net/lif/link.go | 12 +- vendor/golang.org/x/net/lif/sys.go | 21 + .../golang.org/x/net/lif/sys_solaris_amd64.s | 3 - vendor/golang.org/x/net/lif/syscall.go | 5 - vendor/golang.org/x/net/proxy/socks5.go | 59 +- vendor/golang.org/x/net/publicsuffix/table.go | 17943 ++++++++-------- .../x/net/publicsuffix/table_test.go | 563 +- vendor/golang.org/x/net/route/address.go | 152 +- vendor/golang.org/x/net/route/binary.go | 2 +- vendor/golang.org/x/net/route/defs_darwin.go | 8 + .../golang.org/x/net/route/defs_dragonfly.go | 8 + vendor/golang.org/x/net/route/defs_freebsd.go | 8 + vendor/golang.org/x/net/route/defs_netbsd.go | 8 + vendor/golang.org/x/net/route/defs_openbsd.go | 12 + vendor/golang.org/x/net/route/message.go | 8 +- vendor/golang.org/x/net/route/message_test.go | 129 +- vendor/golang.org/x/net/route/route.go | 59 +- .../golang.org/x/net/route/route_classic.go | 36 + .../golang.org/x/net/route/route_openbsd.go | 35 +- vendor/golang.org/x/net/route/sys.go | 7 +- vendor/golang.org/x/net/route/sys_darwin.go | 45 +- .../golang.org/x/net/route/sys_dragonfly.go | 39 +- vendor/golang.org/x/net/route/sys_freebsd.go | 39 +- vendor/golang.org/x/net/route/sys_netbsd.go | 34 +- vendor/golang.org/x/net/route/sys_openbsd.go | 39 +- vendor/golang.org/x/net/route/syscall.go | 5 - vendor/golang.org/x/net/route/syscall.s | 8 - vendor/golang.org/x/net/route/zsys_darwin.go | 6 + .../golang.org/x/net/route/zsys_dragonfly.go | 6 + .../x/net/route/zsys_freebsd_386.go | 6 + .../x/net/route/zsys_freebsd_amd64.go | 6 + .../x/net/route/zsys_freebsd_arm.go | 6 + vendor/golang.org/x/net/route/zsys_netbsd.go | 6 + vendor/golang.org/x/net/route/zsys_openbsd.go | 10 + .../x/net/webdav/internal/xml/marshal.go | 8 +- .../x/net/webdav/internal/xml/read.go | 8 +- .../x/net/webdav/internal/xml/xml.go | 6 +- vendor/golang.org/x/sys/unix/asm.s | 10 - vendor/golang.org/x/sys/unix/mkall.sh | 4 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 18 +- vendor/golang.org/x/sys/unix/mksyscall.pl | 25 +- .../x/sys/unix/mksyscall_solaris.pl | 23 +- .../golang.org/x/sys/unix/mksysnum_linux.pl | 12 +- vendor/golang.org/x/sys/unix/syscall.go | 7 - .../golang.org/x/sys/unix/syscall_darwin.go | 2 - .../x/sys/unix/syscall_dragonfly.go | 1 - .../golang.org/x/sys/unix/syscall_freebsd.go | 1 - vendor/golang.org/x/sys/unix/syscall_linux.go | 150 +- .../x/sys/unix/syscall_linux_mipsx.go | 2 - .../x/sys/unix/syscall_linux_s390x.go | 1 - .../golang.org/x/sys/unix/syscall_openbsd.go | 1 - vendor/golang.org/x/sys/unix/types_linux.go | 8 + .../x/sys/unix/zerrors_linux_386.go | 49 + .../x/sys/unix/zerrors_linux_amd64.go | 56 + .../x/sys/unix/zerrors_linux_arm.go | 53 + .../x/sys/unix/zerrors_linux_arm64.go | 51 + .../x/sys/unix/zerrors_linux_mips.go | 55 + .../x/sys/unix/zerrors_linux_mips64.go | 48 + .../x/sys/unix/zerrors_linux_mips64le.go | 48 + .../x/sys/unix/zerrors_linux_mipsle.go | 46 + .../x/sys/unix/zerrors_linux_ppc64.go | 51 + .../x/sys/unix/zerrors_linux_ppc64le.go | 48 + .../x/sys/unix/zerrors_linux_s390x.go | 47 + .../x/sys/unix/zerrors_linux_sparc64.go | 46 + .../x/sys/unix/zsyscall_darwin_386.go | 37 +- .../x/sys/unix/zsyscall_darwin_amd64.go | 38 +- .../x/sys/unix/zsyscall_darwin_arm.go | 51 +- .../x/sys/unix/zsyscall_darwin_arm64.go | 37 +- .../x/sys/unix/zsyscall_dragonfly_amd64.go | 35 +- .../x/sys/unix/zsyscall_freebsd_386.go | 52 +- .../x/sys/unix/zsyscall_freebsd_amd64.go | 52 +- .../x/sys/unix/zsyscall_freebsd_arm.go | 52 +- .../x/sys/unix/zsyscall_linux_386.go | 60 +- .../x/sys/unix/zsyscall_linux_amd64.go | 61 +- .../x/sys/unix/zsyscall_linux_arm.go | 59 +- .../x/sys/unix/zsyscall_linux_arm64.go | 58 +- .../x/sys/unix/zsyscall_linux_mips.go | 60 +- .../x/sys/unix/zsyscall_linux_mips64.go | 61 +- .../x/sys/unix/zsyscall_linux_mips64le.go | 61 +- .../x/sys/unix/zsyscall_linux_mipsle.go | 60 +- .../x/sys/unix/zsyscall_linux_ppc64.go | 61 +- .../x/sys/unix/zsyscall_linux_ppc64le.go | 61 +- .../x/sys/unix/zsyscall_linux_s390x.go | 61 +- .../x/sys/unix/zsyscall_linux_sparc64.go | 61 +- .../x/sys/unix/zsyscall_netbsd_386.go | 32 +- .../x/sys/unix/zsyscall_netbsd_amd64.go | 32 +- .../x/sys/unix/zsyscall_netbsd_arm.go | 32 +- .../x/sys/unix/zsyscall_openbsd_386.go | 34 +- .../x/sys/unix/zsyscall_openbsd_amd64.go | 34 +- .../x/sys/unix/zsyscall_solaris_amd64.go | 41 +- .../x/sys/unix/zsysnum_linux_386.go | 37 +- .../x/sys/unix/zsysnum_linux_amd64.go | 22 +- .../x/sys/unix/zsysnum_linux_arm.go | 35 +- .../x/sys/unix/zsysnum_linux_arm64.go | 15 +- .../x/sys/unix/zsysnum_linux_mips.go | 25 +- .../x/sys/unix/zsysnum_linux_mips64.go | 9 +- .../x/sys/unix/zsysnum_linux_mips64le.go | 9 +- .../x/sys/unix/zsysnum_linux_mipsle.go | 25 +- .../x/sys/unix/zsysnum_linux_ppc64.go | 11 +- .../x/sys/unix/zsysnum_linux_ppc64le.go | 18 +- .../x/sys/unix/zsysnum_linux_s390x.go | 5 +- .../x/sys/unix/zsysnum_linux_sparc64.go | 2 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 18 + .../x/sys/unix/ztypes_linux_amd64.go | 18 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 18 + .../x/sys/unix/ztypes_linux_arm64.go | 18 + .../x/sys/unix/ztypes_linux_mips.go | 18 + .../x/sys/unix/ztypes_linux_mips64.go | 18 + .../x/sys/unix/ztypes_linux_mips64le.go | 18 + .../x/sys/unix/ztypes_linux_mipsle.go | 18 + .../x/sys/unix/ztypes_linux_ppc64.go | 18 + .../x/sys/unix/ztypes_linux_ppc64le.go | 18 + .../x/sys/unix/ztypes_linux_s390x.go | 18 + .../x/sys/unix/ztypes_linux_sparc64.go | 18 + vendor/gopkg.in/gomail.v2/.travis.yml | 8 + vendor/gopkg.in/gomail.v2/CHANGELOG.md | 20 + vendor/gopkg.in/gomail.v2/CONTRIBUTING.md | 20 + vendor/gopkg.in/gomail.v2/LICENSE | 20 + vendor/gopkg.in/gomail.v2/README.md | 97 + vendor/gopkg.in/gomail.v2/auth.go | 67 + vendor/gopkg.in/gomail.v2/auth_test.go | 156 + vendor/gopkg.in/gomail.v2/doc.go | 5 + vendor/gopkg.in/gomail.v2/example_test.go | 215 + vendor/gopkg.in/gomail.v2/message.go | 302 + vendor/gopkg.in/gomail.v2/message_test.go | 630 + vendor/gopkg.in/gomail.v2/mime.go | 19 + vendor/gopkg.in/gomail.v2/mime_go14.go | 16 + vendor/gopkg.in/gomail.v2/send.go | 117 + vendor/gopkg.in/gomail.v2/send_test.go | 80 + vendor/gopkg.in/gomail.v2/smtp.go | 175 + vendor/gopkg.in/gomail.v2/smtp_test.go | 254 + vendor/gopkg.in/gomail.v2/writeto.go | 242 + vendor/gopkg.in/yaml.v2/scannerc.go | 2 +- 356 files changed, 26671 insertions(+), 14262 deletions(-) create mode 100644 vendor/github.com/jaytaylor/html2text/.gitignore create mode 100644 vendor/github.com/jaytaylor/html2text/.travis.yml create mode 100644 vendor/github.com/jaytaylor/html2text/LICENSE create mode 100644 vendor/github.com/jaytaylor/html2text/README.md create mode 100644 vendor/github.com/jaytaylor/html2text/html2text.go create mode 100644 vendor/github.com/jaytaylor/html2text/html2text_test.go create mode 100755 vendor/github.com/jaytaylor/html2text/testdata/utf8.html create mode 100755 vendor/github.com/jaytaylor/html2text/testdata/utf8_with_bom.xhtml create mode 100644 vendor/github.com/miekg/dns/compress_generate.go delete mode 100644 vendor/github.com/miekg/dns/udp_plan9.go create mode 100644 vendor/github.com/miekg/dns/zcompress.go delete mode 100644 vendor/github.com/prometheus/client_model/AUTHORS.md create mode 100644 vendor/github.com/prometheus/client_model/MAINTAINERS.md delete mode 100644 vendor/github.com/prometheus/common/AUTHORS.md create mode 100644 vendor/github.com/prometheus/common/MAINTAINERS.md delete mode 100644 vendor/github.com/prometheus/procfs/AUTHORS.md create mode 100644 vendor/github.com/prometheus/procfs/MAINTAINERS.md create mode 100644 vendor/github.com/prometheus/procfs/buddyinfo.go create mode 100644 vendor/github.com/prometheus/procfs/buddyinfo_test.go create mode 100644 vendor/github.com/prometheus/procfs/fixtures/buddyinfo/short/buddyinfo create mode 100644 vendor/github.com/prometheus/procfs/fixtures/buddyinfo/sizemismatch/buddyinfo create mode 100644 vendor/github.com/prometheus/procfs/fixtures/buddyinfo/valid/buddyinfo create mode 100644 vendor/github.com/prometheus/procfs/fixtures/fs/xfs/stat create mode 100644 vendor/github.com/prometheus/procfs/xfs/parse.go create mode 100644 vendor/github.com/prometheus/procfs/xfs/parse_test.go create mode 100644 vendor/github.com/prometheus/procfs/xfs/xfs.go create mode 100644 vendor/golang.org/x/crypto/blake2b/register.go create mode 100644 vendor/golang.org/x/crypto/blake2s/register.go create mode 100644 vendor/golang.org/x/crypto/cryptobyte/asn1.go create mode 100644 vendor/golang.org/x/crypto/cryptobyte/asn1_test.go create mode 100644 vendor/golang.org/x/crypto/cryptobyte/builder.go create mode 100644 vendor/golang.org/x/crypto/cryptobyte/cryptobyte_test.go create mode 100644 vendor/golang.org/x/crypto/cryptobyte/example_test.go create mode 100644 vendor/golang.org/x/crypto/cryptobyte/string.go create mode 100644 vendor/golang.org/x/crypto/curve25519/const_amd64.h create mode 100644 vendor/golang.org/x/image/draw/go1_8.go create mode 100644 vendor/golang.org/x/image/draw/go1_9.go create mode 100644 vendor/golang.org/x/image/font/sfnt/cmap.go create mode 100644 vendor/golang.org/x/image/font/sfnt/data.go create mode 100644 vendor/golang.org/x/image/font/sfnt/example_test.go create mode 100644 vendor/golang.org/x/image/font/sfnt/gen.go create mode 100644 vendor/golang.org/x/image/font/sfnt/proprietary_test.go create mode 100644 vendor/golang.org/x/image/font/testdata/cmapTest.sfd create mode 100644 vendor/golang.org/x/image/font/testdata/cmapTest.ttf create mode 100644 vendor/golang.org/x/net/dns/dnsmessage/message.go create mode 100644 vendor/golang.org/x/net/dns/dnsmessage/message_test.go create mode 100644 vendor/golang.org/x/net/http2/databuffer.go create mode 100644 vendor/golang.org/x/net/http2/databuffer_test.go delete mode 100644 vendor/golang.org/x/net/http2/fixed_buffer.go delete mode 100644 vendor/golang.org/x/net/http2/fixed_buffer_test.go create mode 100644 vendor/golang.org/x/net/http2/hpack/tables_test.go create mode 100644 vendor/golang.org/x/net/internal/netreflect/socket_19.go create mode 100644 vendor/golang.org/x/net/ipv4/go19_test.go create mode 100644 vendor/golang.org/x/net/ipv4/ipv4_test.go create mode 100644 vendor/golang.org/x/net/ipv6/go19_test.go create mode 100644 vendor/golang.org/x/net/ipv6/ipv6_test.go create mode 100644 vendor/golang.org/x/net/lif/sys.go delete mode 100644 vendor/golang.org/x/net/route/syscall.s delete mode 100644 vendor/golang.org/x/sys/unix/asm.s create mode 100644 vendor/gopkg.in/gomail.v2/.travis.yml create mode 100644 vendor/gopkg.in/gomail.v2/CHANGELOG.md create mode 100644 vendor/gopkg.in/gomail.v2/CONTRIBUTING.md create mode 100644 vendor/gopkg.in/gomail.v2/LICENSE create mode 100644 vendor/gopkg.in/gomail.v2/README.md create mode 100644 vendor/gopkg.in/gomail.v2/auth.go create mode 100644 vendor/gopkg.in/gomail.v2/auth_test.go create mode 100644 vendor/gopkg.in/gomail.v2/doc.go create mode 100644 vendor/gopkg.in/gomail.v2/example_test.go create mode 100644 vendor/gopkg.in/gomail.v2/message.go create mode 100644 vendor/gopkg.in/gomail.v2/message_test.go create mode 100644 vendor/gopkg.in/gomail.v2/mime.go create mode 100644 vendor/gopkg.in/gomail.v2/mime_go14.go create mode 100644 vendor/gopkg.in/gomail.v2/send.go create mode 100644 vendor/gopkg.in/gomail.v2/send_test.go create mode 100644 vendor/gopkg.in/gomail.v2/smtp.go create mode 100644 vendor/gopkg.in/gomail.v2/smtp_test.go create mode 100644 vendor/gopkg.in/gomail.v2/writeto.go diff --git a/glide.lock b/glide.lock index edc45220e3..f84f12affd 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: 42839eb256dd5b5607d93cd50372cf55881de6e874a63525862ed3f0ac47682b -updated: 2017-02-01T10:22:19.702548922-05:00 +hash: 978c0474f3432a26942e213ca1ba8e957fa5a34ee4652d736dae152fbd6d5384 +updated: 2017-03-13T11:12:52.056509274-04:00 imports: - name: github.com/alecthomas/log4go version: e5dc62318d9bd58682f1dceb53a4b24e8253682f @@ -22,7 +22,7 @@ imports: - name: github.com/go-sql-driver/mysql version: a0583e0143b1624142adab07e0e97fe106d99561 - name: github.com/goamz/goamz - version: b2c2eaf25cbb87f41087aa796facf82113809ed5 + version: c35091c30f44b7f151ec9028b895465a191d1ea7 subpackages: - aws - s3 @@ -32,7 +32,7 @@ imports: - raster - truetype - name: github.com/golang/protobuf - version: 8ee79997227bf9b34611aee7946ae64735e6fd93 + version: c9c7427a2a70d2eb3bafa0ab2dc163e45f143317 subpackages: - proto - name: github.com/gorilla/context @@ -49,10 +49,12 @@ imports: - simplelru - name: github.com/inconshreveable/mousetrap version: 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75 +- name: github.com/jaytaylor/html2text + version: f3b8a7ca0a23f0a806b2e1ad1247de39ecde54bf - name: github.com/jehiah/go-strftime version: 834e15c05a45371503440cc195bbd05c9a0968d9 - name: github.com/lib/pq - version: a6657b2386e9b8be76484c08711b02c7cf867ead + version: e4af84aab01e159ca479940dbde304519e8e8811 subpackages: - oid - name: github.com/mattermost/rsc @@ -66,7 +68,7 @@ imports: subpackages: - pbutil - name: github.com/miekg/dns - version: 99f84ae56e75126dd77e5de4fae2ea034a468ca1 + version: c862b7e359850847d4945cce311db2ea90cab7c0 - name: github.com/minio/minio-go version: 52cc94e879db78c2e2c6e160869df943137ec4cd subpackages: @@ -84,7 +86,7 @@ imports: - i18n/language - i18n/translation - name: github.com/NYTimes/gziphandler - version: 6710af535839f57c687b62c4c23d649f9545d885 + version: fb3533722e14198abe471546c9798fd556531451 - name: github.com/pborman/uuid version: a97ce2ca70fa5a848076093f05e639a89ca34d06 - name: github.com/prometheus/client_golang @@ -92,15 +94,15 @@ imports: subpackages: - prometheus - name: github.com/prometheus/client_model - version: fa8ad6fec33561be4280a8f0514318c79d7f6cb6 + version: 6f3806018612930941127f2a7c6c453ba2c527d2 subpackages: - go - name: github.com/prometheus/common - version: dd2f054febf4a6c00f2343686efb775948a8bff4 + version: 49fee292b27bfff7f354ee0f64e1bc4850462edf subpackages: - expfmt - name: github.com/prometheus/procfs - version: 1878d9fbb537119d24b21ca07effd591627cd160 + version: a1dba9ce8baed984a2495b658c82687f8157b98f - name: github.com/rsc/letsencrypt version: 76104d26167d38b6a0010f42bfc8ec5487742e8b - name: github.com/rwcarlsen/goexif @@ -113,25 +115,25 @@ imports: - name: github.com/segmentio/backo-go version: 204274ad699c0983a70203a566887f17a717fef4 - name: github.com/spf13/cobra - version: 35136c09d8da66b901337c6e86fd8e88a1a255bd + version: 16c014f1a19d865b765b420e74508f80eb831ada - name: github.com/spf13/pflag version: 9ff6c6923cfffbcd502984b8e0c80539a94968b7 - name: github.com/tylerb/graceful - version: 0e9129e9c6d47da90dc0c188b26bd7bb1dab53cd + version: d72b0151351a13d0421b763b88f791469c4f5dc7 - name: github.com/xenolf/lego - version: f5d538caab6dc0c167d4e32990c79bbf9eff578c + version: 6cac0ea7d8b28c889f709ec7fa92e92b82f490dd subpackages: - acme - name: github.com/xtgo/uuid version: a0b114877d4caeffbd7f87e3757c17fce570fea7 - name: golang.org/x/crypto - version: dc137beb6cce2043eb6b5f223ab8bf51c32459f4 + version: 728b753d0135da6801d45a38e6f43ff55779c5c2 subpackages: - bcrypt - blowfish - ocsp - name: golang.org/x/image - version: 83686c547965220f8b5d75e83ddc67d73420a89f + version: 793f3be7dac93749dec06ae3fbe7d0ded4bdcf3d subpackages: - bmp - font @@ -139,14 +141,14 @@ imports: - tiff - tiff/lzw - name: golang.org/x/net - version: f2499483f923065a842d38eb4c7f1927e6fc6e6d + version: a6577fac2d73be281a500b310739095313165611 subpackages: - context - html - html/atom - publicsuffix - name: golang.org/x/sys - version: 7a6e5648d140666db5d920909e082ca00a87ba2c + version: 99f16d856c9836c42d24e7ab64ea72916925fa97 subpackages: - unix - name: golang.org/x/time @@ -157,6 +159,8 @@ imports: version: 4e86f4367175e39f69d9358a5f17b4dda270378d - name: gopkg.in/fsnotify.v1 version: 629574ca2a5df945712d3079857300b5e4da0236 +- name: gopkg.in/gomail.v2 + version: 41f3572897373c5538c50a2402db15db079fa4fd - name: gopkg.in/square/go-jose.v1 version: aa2e30fdd1fe9dd3394119af66451ae790d50e0d subpackages: @@ -168,5 +172,5 @@ imports: - store - store/memstore - name: gopkg.in/yaml.v2 - version: 4c78c975fe7c825c6d1466c42be594d1d6f3aba6 + version: a3f3340b5840cee44f372bddb5880fcbc419b46a testImports: [] diff --git a/glide.yaml b/glide.yaml index 07b5be25e2..a3c317855a 100644 --- a/glide.yaml +++ b/glide.yaml @@ -4,6 +4,7 @@ import: - package: github.com/alecthomas/log4go - package: github.com/dgryski/dgoogauth - package: github.com/disintegration/imaging + version: v1.0.0 - package: github.com/go-gorp/gorp version: 0c9bc0918534d133cedb439a24adc7cbe66e4a9d - package: github.com/go-ldap/ldap @@ -79,3 +80,6 @@ import: - package: github.com/dyatlov/go-opengraph subpackages: - opengraph +- package: github.com/jaytaylor/html2text +- package: gopkg.in/gomail.v2 + version: 2.0.0 diff --git a/vendor/github.com/goamz/goamz/aws/aws.go b/vendor/github.com/goamz/goamz/aws/aws.go index 49eed632e5..a4d3591603 100644 --- a/vendor/github.com/goamz/goamz/aws/aws.go +++ b/vendor/github.com/goamz/goamz/aws/aws.go @@ -71,6 +71,7 @@ var Regions = map[string]Region{ EUCentral.Name: EUCentral, EUWest.Name: EUWest, USEast.Name: USEast, + USEast2.Name: USEast2, USWest.Name: USWest, USWest2.Name: USWest2, USGovWest.Name: USGovWest, diff --git a/vendor/github.com/goamz/goamz/aws/regions.go b/vendor/github.com/goamz/goamz/aws/regions.go index 94d79d46d9..c75d41e11e 100644 --- a/vendor/github.com/goamz/goamz/aws/regions.go +++ b/vendor/github.com/goamz/goamz/aws/regions.go @@ -46,6 +46,29 @@ var USEast = Region{ "https://streams.dynamodb.us-east-1.amazonaws.com", } +var USEast2 = Region{ + "us-east-2", + "https://ec2.us-east-2.amazonaws.com", + "https://s3.amazonaws.com", + "", + true, + true, + "", + "", + "https://sns.us-east-2.amazonaws.com", + "https://sqs.us-east-2.amazonaws.com", + "https://iam.amazonaws.com", + "https://elasticloadbalancing.us-east-2.amazonaws.com", + "https://dynamodb.us-east-2.amazonaws.com", + ServiceInfo{"https://monitoring.us-east-2.amazonaws.com", V2Signature}, + "https://autoscaling.us-east-1.amazonaws.com", + ServiceInfo{"https://rds.us-east-2.amazonaws.com", V2Signature}, + "https://sts.amazonaws.com", + "https://cloudformation.us-east-2.amazonaws.com", + "https://ecs.us-east-2.amazonaws.com", + "https://streams.dynamodb.us-east-2.amazonaws.com", +} + var USWest = Region{ "us-west-1", "https://ec2.us-west-1.amazonaws.com", diff --git a/vendor/github.com/goamz/goamz/sqs/sqs.go b/vendor/github.com/goamz/goamz/sqs/sqs.go index 23f1951ab1..b54b698a80 100644 --- a/vendor/github.com/goamz/goamz/sqs/sqs.go +++ b/vendor/github.com/goamz/goamz/sqs/sqs.go @@ -48,6 +48,8 @@ func NewFrom(accessKey, secretKey, region string) (*SQS, error) { switch region { case "us.east", "us.east.1": aws_region = aws.USEast + case "us.east.2": + aws_region = aws.USEast2 case "us.west", "us.west.1": aws_region = aws.USWest case "us.west.2": diff --git a/vendor/github.com/golang/protobuf/descriptor/descriptor.go b/vendor/github.com/golang/protobuf/descriptor/descriptor.go index 83607ff6c4..ac7e51bfb1 100644 --- a/vendor/github.com/golang/protobuf/descriptor/descriptor.go +++ b/vendor/github.com/golang/protobuf/descriptor/descriptor.go @@ -43,7 +43,7 @@ import ( "io/ioutil" "github.com/golang/protobuf/proto" - protobuf "google.golang.org/genproto/protobuf" + protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" ) // extractFile extracts a FileDescriptorProto from a gzip'd buffer. diff --git a/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go b/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go index 282a1e3a77..27b0729cbe 100644 --- a/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go +++ b/vendor/github.com/golang/protobuf/descriptor/descriptor_test.go @@ -6,7 +6,7 @@ import ( "github.com/golang/protobuf/descriptor" tpb "github.com/golang/protobuf/proto/testdata" - protobuf "google.golang.org/genproto/protobuf" + protobuf "github.com/golang/protobuf/protoc-gen-go/descriptor" ) func TestMessage(t *testing.T) { diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/Makefile b/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/Makefile index b1ac45c774..a0bf9fefd9 100644 --- a/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/Makefile +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/Makefile @@ -45,9 +45,9 @@ my_test/test.pb.go: my_test/test.proto golden: make -B my_test/test.pb.go - sed -i '/return.*fileDescriptor/d' my_test/test.pb.go - sed -i '/^var fileDescriptor/,/^}/d' my_test/test.pb.go - sed -i '/proto.RegisterFile.*fileDescriptor/d' my_test/test.pb.go + sed -i -e '/return.*fileDescriptor/d' my_test/test.pb.go + sed -i -e '/^var fileDescriptor/,/^}/d' my_test/test.pb.go + sed -i -e '/proto.RegisterFile.*fileDescriptor/d' my_test/test.pb.go gofmt -w my_test/test.pb.go diff -w my_test/test.pb.go my_test/test.pb.go.golden diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go b/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go index 9ec3e1292e..d8717d57d0 100644 --- a/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go @@ -319,7 +319,7 @@ func (m *Reply) GetCompactKeys() []int32 { type Reply_Entry struct { KeyThatNeeds_1234Camel_CasIng *int64 `protobuf:"varint,1,req,name=key_that_needs_1234camel_CasIng,json=keyThatNeeds1234camelCasIng" json:"key_that_needs_1234camel_CasIng,omitempty"` Value *int64 `protobuf:"varint,2,opt,name=value,def=7" json:"value,omitempty"` - XMyFieldName_2 *int64 `protobuf:"varint,3,opt,name=_my_field_name_2,json=myFieldName2" json:"_my_field_name_2,omitempty"` + XMyFieldName_2 *int64 `protobuf:"varint,3,opt,name=_my_field_name_2,json=MyFieldName2" json:"_my_field_name_2,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -389,6 +389,7 @@ var E_ReplyExtensions_Time = &proto.ExtensionDesc{ Field: 101, Name: "my.test.ReplyExtensions.time", Tag: "fixed64,101,opt,name=time", + Filename: "my_test/test.proto", } var E_ReplyExtensions_Carrot = &proto.ExtensionDesc{ @@ -397,6 +398,7 @@ var E_ReplyExtensions_Carrot = &proto.ExtensionDesc{ Field: 105, Name: "my.test.ReplyExtensions.carrot", Tag: "bytes,105,opt,name=carrot", + Filename: "my_test/test.proto", } var E_ReplyExtensions_Donut = &proto.ExtensionDesc{ @@ -405,6 +407,7 @@ var E_ReplyExtensions_Donut = &proto.ExtensionDesc{ Field: 101, Name: "my.test.ReplyExtensions.donut", Tag: "bytes,101,opt,name=donut", + Filename: "my_test/test.proto", } type OtherReplyExtensions struct { @@ -832,6 +835,7 @@ var E_Tag = &proto.ExtensionDesc{ Field: 103, Name: "my.test.tag", Tag: "bytes,103,opt,name=tag", + Filename: "my_test/test.proto", } var E_Donut = &proto.ExtensionDesc{ @@ -840,6 +844,7 @@ var E_Donut = &proto.ExtensionDesc{ Field: 106, Name: "my.test.donut", Tag: "bytes,106,opt,name=donut", + Filename: "my_test/test.proto", } func init() { diff --git a/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden b/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden index 9ec3e1292e..d8717d57d0 100644 --- a/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden +++ b/vendor/github.com/golang/protobuf/protoc-gen-go/testdata/my_test/test.pb.go.golden @@ -319,7 +319,7 @@ func (m *Reply) GetCompactKeys() []int32 { type Reply_Entry struct { KeyThatNeeds_1234Camel_CasIng *int64 `protobuf:"varint,1,req,name=key_that_needs_1234camel_CasIng,json=keyThatNeeds1234camelCasIng" json:"key_that_needs_1234camel_CasIng,omitempty"` Value *int64 `protobuf:"varint,2,opt,name=value,def=7" json:"value,omitempty"` - XMyFieldName_2 *int64 `protobuf:"varint,3,opt,name=_my_field_name_2,json=myFieldName2" json:"_my_field_name_2,omitempty"` + XMyFieldName_2 *int64 `protobuf:"varint,3,opt,name=_my_field_name_2,json=MyFieldName2" json:"_my_field_name_2,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -389,6 +389,7 @@ var E_ReplyExtensions_Time = &proto.ExtensionDesc{ Field: 101, Name: "my.test.ReplyExtensions.time", Tag: "fixed64,101,opt,name=time", + Filename: "my_test/test.proto", } var E_ReplyExtensions_Carrot = &proto.ExtensionDesc{ @@ -397,6 +398,7 @@ var E_ReplyExtensions_Carrot = &proto.ExtensionDesc{ Field: 105, Name: "my.test.ReplyExtensions.carrot", Tag: "bytes,105,opt,name=carrot", + Filename: "my_test/test.proto", } var E_ReplyExtensions_Donut = &proto.ExtensionDesc{ @@ -405,6 +407,7 @@ var E_ReplyExtensions_Donut = &proto.ExtensionDesc{ Field: 101, Name: "my.test.ReplyExtensions.donut", Tag: "bytes,101,opt,name=donut", + Filename: "my_test/test.proto", } type OtherReplyExtensions struct { @@ -832,6 +835,7 @@ var E_Tag = &proto.ExtensionDesc{ Field: 103, Name: "my.test.tag", Tag: "bytes,103,opt,name=tag", + Filename: "my_test/test.proto", } var E_Donut = &proto.ExtensionDesc{ @@ -840,6 +844,7 @@ var E_Donut = &proto.ExtensionDesc{ Field: 106, Name: "my.test.donut", Tag: "bytes,106,opt,name=donut", + Filename: "my_test/test.proto", } func init() { diff --git a/vendor/github.com/jaytaylor/html2text/.gitignore b/vendor/github.com/jaytaylor/html2text/.gitignore new file mode 100644 index 0000000000..daf913b1b3 --- /dev/null +++ b/vendor/github.com/jaytaylor/html2text/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof diff --git a/vendor/github.com/jaytaylor/html2text/.travis.yml b/vendor/github.com/jaytaylor/html2text/.travis.yml new file mode 100644 index 0000000000..6c7f48efd4 --- /dev/null +++ b/vendor/github.com/jaytaylor/html2text/.travis.yml @@ -0,0 +1,14 @@ +language: go +go: + - tip + - 1.8 + - 1.7 + - 1.6 + - 1.5 + - 1.4 + - 1.3 + - 1.2 +notifications: + email: + on_success: change + on_failure: always diff --git a/vendor/github.com/jaytaylor/html2text/LICENSE b/vendor/github.com/jaytaylor/html2text/LICENSE new file mode 100644 index 0000000000..24dc4abecc --- /dev/null +++ b/vendor/github.com/jaytaylor/html2text/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Jay Taylor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/vendor/github.com/jaytaylor/html2text/README.md b/vendor/github.com/jaytaylor/html2text/README.md new file mode 100644 index 0000000000..ac11247393 --- /dev/null +++ b/vendor/github.com/jaytaylor/html2text/README.md @@ -0,0 +1,116 @@ +# html2text + +[![Documentation](https://godoc.org/github.com/jaytaylor/html2text?status.svg)](https://godoc.org/github.com/jaytaylor/html2text) +[![Build Status](https://travis-ci.org/jaytaylor/html2text.svg?branch=master)](https://travis-ci.org/jaytaylor/html2text) +[![Report Card](https://goreportcard.com/badge/github.com/jaytaylor/html2text)](https://goreportcard.com/report/github.com/jaytaylor/html2text) + +### Converts HTML into text + + +## Introduction + +Ensure your emails are readable by all! + +Turns HTML into raw text, useful for sending fancy HTML emails with a equivalently nicely formatted TXT document as a fallback (e.g. for people who don't allow HTML emails or have other display issues). + +html2text is a simple golang package for rendering HTML into plaintext. + +There are still lots of improvements to be had, but FWIW this has worked fine for my [basic] HTML-2-text needs. + +It requires go 1.x or newer ;) + + +## Download the package + +```bash +go get github.com/jaytaylor/html2text +``` + +## Example usage + +```go +package main + +import ( + "fmt" + + "github.com/jaytaylor/html2text" +) + +func main() { + inputHtml := ` + + + My Mega Service + + + + + + + +

Welcome to your new account on my service!

+ +

+ Here is some more information: + +

+

+ + + ` + + text, err := html2text.FromString(inputHtml) + if err != nil { + panic(err) + } + fmt.Println(text) +} +``` + +Output: +``` +Mega Service ( http://mymegaservice.com/ ) + +****************************************** +Welcome to your new account on my service! +****************************************** + +Here is some more information: + +* Link 1: Example.com ( https://example.com ) +* Link 2: Example2.com ( https://example2.com ) +* Something else +``` + + +## Unit-tests + +Running the unit-tests is straightforward and standard: + +```bash +go test +``` + + +# License + +Permissive MIT license. + + +## Contact + +You are more than welcome to open issues and send pull requests if you find a bug or want a new feature. + +If you appreciate this library please feel free to drop me a line and tell me! It's always nice to hear from people who have benefitted from my work. + +Email: jay at (my github username).com + +Twitter: [@jtaylor](https://twitter.com/jtaylor) + diff --git a/vendor/github.com/jaytaylor/html2text/html2text.go b/vendor/github.com/jaytaylor/html2text/html2text.go new file mode 100644 index 0000000000..2a013a0395 --- /dev/null +++ b/vendor/github.com/jaytaylor/html2text/html2text.go @@ -0,0 +1,312 @@ +package html2text + +import ( + "bytes" + "io" + "regexp" + "strings" + "unicode" + + "github.com/ssor/bom" + + "golang.org/x/net/html" + "golang.org/x/net/html/atom" +) + +var ( + spacingRe = regexp.MustCompile(`[ \r\n\t]+`) + newlineRe = regexp.MustCompile(`\n\n+`) +) + +type textifyTraverseCtx struct { + Buf bytes.Buffer + + prefix string + blockquoteLevel int + lineLength int + endsWithSpace bool + endsWithNewline bool + justClosedDiv bool +} + +func (ctx *textifyTraverseCtx) traverse(node *html.Node) error { + switch node.Type { + default: + return ctx.traverseChildren(node) + + case html.TextNode: + data := strings.Trim(spacingRe.ReplaceAllString(node.Data, " "), " ") + return ctx.emit(data) + + case html.ElementNode: + return ctx.handleElementNode(node) + } +} + +func (ctx *textifyTraverseCtx) handleElementNode(node *html.Node) error { + ctx.justClosedDiv = false + switch node.DataAtom { + case atom.Br: + return ctx.emit("\n") + + case atom.H1, atom.H2, atom.H3: + subCtx := textifyTraverseCtx{} + if err := subCtx.traverseChildren(node); err != nil { + return err + } + + str := subCtx.Buf.String() + dividerLen := 0 + for _, line := range strings.Split(str, "\n") { + if lineLen := len([]rune(line)); lineLen-1 > dividerLen { + dividerLen = lineLen - 1 + } + } + divider := "" + if node.DataAtom == atom.H1 { + divider = strings.Repeat("*", dividerLen) + } else { + divider = strings.Repeat("-", dividerLen) + } + + if node.DataAtom == atom.H3 { + return ctx.emit("\n\n" + str + "\n" + divider + "\n\n") + } + return ctx.emit("\n\n" + divider + "\n" + str + "\n" + divider + "\n\n") + + case atom.Blockquote: + ctx.blockquoteLevel++ + ctx.prefix = strings.Repeat(">", ctx.blockquoteLevel) + " " + if err := ctx.emit("\n"); err != nil { + return err + } + if ctx.blockquoteLevel == 1 { + if err := ctx.emit("\n"); err != nil { + return err + } + } + if err := ctx.traverseChildren(node); err != nil { + return err + } + ctx.blockquoteLevel-- + ctx.prefix = strings.Repeat(">", ctx.blockquoteLevel) + if ctx.blockquoteLevel > 0 { + ctx.prefix += " " + } + return ctx.emit("\n\n") + + case atom.Div: + if ctx.lineLength > 0 { + if err := ctx.emit("\n"); err != nil { + return err + } + } + if err := ctx.traverseChildren(node); err != nil { + return err + } + var err error + if ctx.justClosedDiv == false { + err = ctx.emit("\n") + } + ctx.justClosedDiv = true + return err + + case atom.Li: + if err := ctx.emit("* "); err != nil { + return err + } + + if err := ctx.traverseChildren(node); err != nil { + return err + } + + return ctx.emit("\n") + + case atom.B, atom.Strong: + subCtx := textifyTraverseCtx{} + subCtx.endsWithSpace = true + if err := subCtx.traverseChildren(node); err != nil { + return err + } + str := subCtx.Buf.String() + return ctx.emit("*" + str + "*") + + case atom.A: + // If image is the only child, take its alt text as the link text + if img := node.FirstChild; img != nil && node.LastChild == img && img.DataAtom == atom.Img { + if altText := getAttrVal(img, "alt"); altText != "" { + ctx.emit(altText) + } + } else if err := ctx.traverseChildren(node); err != nil { + return err + } + + hrefLink := "" + if attrVal := getAttrVal(node, "href"); attrVal != "" { + attrVal = ctx.normalizeHrefLink(attrVal) + if attrVal != "" { + hrefLink = "( " + attrVal + " )" + } + } + + return ctx.emit(hrefLink) + + case atom.P, atom.Ul, atom.Table: + if err := ctx.emit("\n\n"); err != nil { + return err + } + + if err := ctx.traverseChildren(node); err != nil { + return err + } + + return ctx.emit("\n\n") + + case atom.Tr: + if err := ctx.traverseChildren(node); err != nil { + return err + } + + return ctx.emit("\n") + + case atom.Style, atom.Script, atom.Head: + // Ignore the subtree + return nil + + default: + return ctx.traverseChildren(node) + } +} +func (ctx *textifyTraverseCtx) traverseChildren(node *html.Node) error { + for c := node.FirstChild; c != nil; c = c.NextSibling { + if err := ctx.traverse(c); err != nil { + return err + } + } + + return nil +} + +func (ctx *textifyTraverseCtx) emit(data string) error { + if len(data) == 0 { + return nil + } + lines := ctx.breakLongLines(data) + var err error + for _, line := range lines { + runes := []rune(line) + startsWithSpace := unicode.IsSpace(runes[0]) + if !startsWithSpace && !ctx.endsWithSpace { + ctx.Buf.WriteByte(' ') + ctx.lineLength++ + } + ctx.endsWithSpace = unicode.IsSpace(runes[len(runes)-1]) + for _, c := range line { + _, err = ctx.Buf.WriteString(string(c)) + if err != nil { + return err + } + ctx.lineLength++ + if c == '\n' { + ctx.lineLength = 0 + if ctx.prefix != "" { + _, err = ctx.Buf.WriteString(ctx.prefix) + if err != nil { + return err + } + } + } + } + } + return nil +} + +func (ctx *textifyTraverseCtx) breakLongLines(data string) []string { + // only break lines when we are in blockquotes + if ctx.blockquoteLevel == 0 { + return []string{data} + } + var ret []string + runes := []rune(data) + l := len(runes) + existing := ctx.lineLength + if existing >= 74 { + ret = append(ret, "\n") + existing = 0 + } + for l+existing > 74 { + i := 74 - existing + for i >= 0 && !unicode.IsSpace(runes[i]) { + i-- + } + if i == -1 { + // no spaces, so go the other way + i = 74 - existing + for i < l && !unicode.IsSpace(runes[i]) { + i++ + } + } + ret = append(ret, string(runes[:i])+"\n") + for i < l && unicode.IsSpace(runes[i]) { + i++ + } + runes = runes[i:] + l = len(runes) + existing = 0 + } + if len(runes) > 0 { + ret = append(ret, string(runes)) + } + return ret +} + +func (ctx *textifyTraverseCtx) normalizeHrefLink(link string) string { + link = strings.TrimSpace(link) + link = strings.TrimPrefix(link, "mailto:") + return link +} + +func getAttrVal(node *html.Node, attrName string) string { + for _, attr := range node.Attr { + if attr.Key == attrName { + return attr.Val + } + } + + return "" +} + +func FromHtmlNode(doc *html.Node) (string, error) { + ctx := textifyTraverseCtx{ + Buf: bytes.Buffer{}, + } + if err := ctx.traverse(doc); err != nil { + return "", err + } + + text := strings.TrimSpace(newlineRe.ReplaceAllString( + strings.Replace(ctx.Buf.String(), "\n ", "\n", -1), "\n\n")) + return text, nil + +} + +func FromReader(reader io.Reader) (string, error) { + newReader, err := bom.NewReaderWithoutBom(reader) + if err != nil { + return "", err + } + doc, err := html.Parse(newReader) + if err != nil { + return "", err + } + return FromHtmlNode(doc) +} + +func FromString(input string) (string, error) { + bs := bom.CleanBom([]byte(input)) + text, err := FromReader(bytes.NewReader(bs)) + if err != nil { + return "", err + } + return text, nil +} diff --git a/vendor/github.com/jaytaylor/html2text/html2text_test.go b/vendor/github.com/jaytaylor/html2text/html2text_test.go new file mode 100644 index 0000000000..b30d68ac97 --- /dev/null +++ b/vendor/github.com/jaytaylor/html2text/html2text_test.go @@ -0,0 +1,674 @@ +package html2text + +import ( + "bytes" + "fmt" + "io/ioutil" + "path" + "regexp" + "strings" + "testing" +) + +const ( + destPath = "testdata" +) + +func TestParseUTF8(t *testing.T) { + htmlFiles := []struct { + file string + keywordShouldNotExist string + keywordShouldExist string + }{ + { + "utf8.html", + "学习之道:美国公认学习第一书title", + "次世界冠军赛上,我几近疯狂", + }, + { + "utf8_with_bom.xhtml", + "1892年波兰文版序言title", + "种新的波兰文本已成为必要", + }, + } + + for _, htmlFile := range htmlFiles { + bs, err := ioutil.ReadFile(path.Join(destPath, htmlFile.file)) + if err != nil { + t.Fatal(err) + } + text, err := FromReader(bytes.NewReader(bs)) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(text, htmlFile.keywordShouldExist) { + t.Fatalf("keyword %s should exists in file %s", htmlFile.keywordShouldExist, htmlFile.file) + } + if strings.Contains(text, htmlFile.keywordShouldNotExist) { + t.Fatalf("keyword %s should not exists in file %s", htmlFile.keywordShouldNotExist, htmlFile.file) + } + } +} + +func TestStrippingWhitespace(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + "test text", + "test text", + }, + { + " \ttext\ntext\n", + "text text", + }, + { + " \na \n\t \n \n a \t", + "a a", + }, + { + "test text", + "test text", + }, + { + "test    text ", + "test    text", + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } +} + +func TestParagraphsAndBreaks(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + "Test text", + "Test text", + }, + { + "Test text
", + "Test text", + }, + { + "Test text
Test", + "Test text\nTest", + }, + { + "

Test text

", + "Test text", + }, + { + "

Test text

Test text

", + "Test text\n\nTest text", + }, + { + "\n

Test text

\n\n\n\t

Test text

\n", + "Test text\n\nTest text", + }, + { + "\n

Test text
Test text

\n", + "Test text\nTest text", + }, + { + "\n

Test text
\tTest text

\n", + "Test text\nTest text", + }, + { + "Test text

Test text", + "Test text\n\nTest text", + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } +} + +func TestTables(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + "
", + "", + }, + { + "
cell1cell2
", + "cell1 cell2", + }, + { + "
row1
row2
", + "row1\nrow2", + }, + { + ` + + +
cell1-1cell1-2
cell2-1cell2-2
`, + "cell1-1 cell1-2\ncell2-1 cell2-2", + }, + { + "_
cell
_", + "_\n\ncell\n\n_", + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } +} + +func TestStrippingLists(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + "", + "", + }, + { + "_", + "* item\n\n_", + }, + { + "
  • item 1
  • item 2
  • \n_", + "* item 1\n* item 2\n_", + }, + { + "
  • item 1
  • \t\n
  • item 2
  • item 3
  • \n_", + "* item 1\n* item 2\n* item 3\n_", + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } +} + +func TestLinks(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + ``, + ``, + }, + { + ``, + ``, + }, + { + ``, + `( http://example.com/ )`, + }, + { + `Link`, + `Link`, + }, + { + `Link`, + `Link ( http://example.com/ )`, + }, + { + `Link`, + `Link ( http://example.com/ )`, + }, + { + "\n\tLink\n\t", + `Link ( http://example.com/ )`, + }, + { + "Contact Us", + `Contact Us ( contact@example.org )`, + }, + { + "Link", + `Link ( http://example.com:80/~user?aaa=bb&c=d,e,f#foo )`, + }, + { + "Link", + `Link ( http://example.com/ )`, + }, + { + " Link ", + `Link ( http://example.com/ )`, + }, + { + "Link A Link B", + `Link A ( http://example.com/a/ ) Link B ( http://example.com/b/ )`, + }, + { + "Link", + `Link ( %%LINK%% )`, + }, + { + "Link", + `Link ( [LINK] )`, + }, + { + "Link", + `Link ( {LINK} )`, + }, + { + "Link", + `Link ( [[!unsubscribe]] )`, + }, + { + "

    This is link1 and link2 is next.

    ", + `This is link1 ( http://www.google.com ) and link2 ( http://www.google.com ) is next.`, + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } +} + +func TestImageAltTags(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + ``, + ``, + }, + { + ``, + ``, + }, + { + `Example`, + ``, + }, + { + `Example`, + ``, + }, + // Images do matter if they are in a link + { + `Example`, + `Example ( http://example.com/ )`, + }, + { + `Example`, + `Example ( http://example.com/ )`, + }, + { + `Example`, + `Example ( http://example.com/ )`, + }, + { + `Example`, + `Example ( http://example.com/ )`, + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } +} + +func TestHeadings(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + "

    Test

    ", + "****\nTest\n****", + }, + { + "\t

    \nTest

    ", + "****\nTest\n****", + }, + { + "\t

    \nTest line 1
    Test 2

    ", + "***********\nTest line 1\nTest 2\n***********", + }, + { + "

    Test

    Test

    ", + "****\nTest\n****\n\n****\nTest\n****", + }, + { + "

    Test

    ", + "----\nTest\n----", + }, + { + "

    Test

    ", + "****************************\nTest ( http://example.com/ )\n****************************", + }, + { + "

    Test

    ", + "Test\n----", + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } + +} + +func TestBold(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + "Test", + "*Test*", + }, + { + "\tTest ", + "*Test*", + }, + { + "\tTest line 1
    Test 2
    ", + "*Test line 1\nTest 2*", + }, + { + "Test Test", + "*Test* *Test*", + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } + +} + +func TestDiv(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + "
    Test
    ", + "Test", + }, + { + "\t
    Test
    ", + "Test", + }, + { + "
    Test line 1
    Test 2
    ", + "Test line 1\nTest 2", + }, + { + "Test 1
    Test 2
    Test 3
    Test 4", + "Test 1\nTest 2\nTest 3\nTest 4", + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } + +} + +func TestBlockquotes(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + "
    level 0
    level 1
    level 2
    level 1
    level 0
    ", + "level 0\n> \n> level 1\n> \n>> level 2\n> \n> level 1\n\nlevel 0", + }, + { + "
    Test
    Test", + "> \n> Test\n\nTest", + }, + { + "\t
    \nTest
    ", + "> \n> Test\n>", + }, + { + "\t
    \nTest line 1
    Test 2
    ", + "> \n> Test line 1\n> Test 2", + }, + { + "
    Test
    Test
    Other Test", + "> \n> Test\n\n> \n> Test\n\nOther Test", + }, + { + "
    Lorem ipsum Commodo id consectetur pariatur ea occaecat minim aliqua ad sit consequat quis ex commodo Duis incididunt eu mollit consectetur fugiat voluptate dolore in pariatur in commodo occaecat Ut occaecat velit esse labore aute quis commodo non sit dolore officia Excepteur cillum amet cupidatat culpa velit labore ullamco dolore mollit elit in aliqua dolor irure do
    ", + "> \n> Lorem ipsum Commodo id consectetur pariatur ea occaecat minim aliqua ad\n> sit consequat quis ex commodo Duis incididunt eu mollit consectetur fugiat\n> voluptate dolore in pariatur in commodo occaecat Ut occaecat velit esse\n> labore aute quis commodo non sit dolore officia Excepteur cillum amet\n> cupidatat culpa velit labore ullamco dolore mollit elit in aliqua dolor\n> irure do", + }, + { + "
    LoremipsumCommodoidconsecteturpariatureaoccaecatminimaliquaadsitconsequatquisexcommodoDuisincididunteumollitconsecteturfugiatvoluptatedoloreinpariaturincommodooccaecatUtoccaecatvelitesselaboreautequiscommodononsitdoloreofficiaExcepteurcillumametcupidatatculpavelitlaboreullamcodoloremollitelitinaliquadoloriruredo
    ", + "> \n> Lorem *ipsum* *Commodo* *id* *consectetur* *pariatur* *ea* *occaecat* *minim*\n> *aliqua* *ad* *sit* *consequat* *quis* *ex* *commodo* *Duis* *incididunt* *eu*\n> *mollit* *consectetur* *fugiat* *voluptate* *dolore* *in* *pariatur* *in* *commodo*\n> *occaecat* *Ut* *occaecat* *velit* *esse* *labore* *aute* *quis* *commodo*\n> *non* *sit* *dolore* *officia* *Excepteur* *cillum* *amet* *cupidatat* *culpa*\n> *velit* *labore* *ullamco* *dolore* *mollit* *elit* *in* *aliqua* *dolor* *irure*\n> *do*", + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } + +} + +func TestIgnoreStylesScriptsHead(t *testing.T) { + testCases := []struct { + input string + output string + }{ + { + "", + "", + }, + { + "", + "", + }, + { + "", + "", + }, + { + "", + "", + }, + { + "", + "", + }, + { + "", + "", + }, + { + "", + "", + }, + { + "", + "", + }, + { + "", + "", + }, + { + `Title`, + "", + }, + } + + for _, testCase := range testCases { + assertString(t, testCase.input, testCase.output) + } +} + +func TestText(t *testing.T) { + testCases := []struct { + input string + expr string + }{ + { + `
  • + New repository +
  • `, + `\* New repository \( /new \)`, + }, + { + `hi + +
    + + hello google +

    + test

    List:

    + + +`, + `hi +hello google \( https://google.com \) + +test + +List: + +\* Foo \( foo \) +\* Barsoap \( http://www.microshwhat.com/bar/soapy \) +\* Baz`, + }, + // Malformed input html. + { + `hi + + hello google + + test

    List:

    + + + `, + `hi hello google \( https://google.com \) test + +List: + +\* Foo \( foo \) +\* Bar \( /\n[ \t]+bar/baz \) +\* Baz`, + }, + } + + for _, testCase := range testCases { + assertRegexp(t, testCase.input, testCase.expr) + } +} + +type StringMatcher interface { + MatchString(string) bool + String() string +} + +type RegexpStringMatcher string + +func (m RegexpStringMatcher) MatchString(str string) bool { + return regexp.MustCompile(string(m)).MatchString(str) +} +func (m RegexpStringMatcher) String() string { + return string(m) +} + +type ExactStringMatcher string + +func (m ExactStringMatcher) MatchString(str string) bool { + return string(m) == str +} +func (m ExactStringMatcher) String() string { + return string(m) +} + +func assertRegexp(t *testing.T, input string, outputRE string) { + assertPlaintext(t, input, RegexpStringMatcher(outputRE)) +} + +func assertString(t *testing.T, input string, output string) { + assertPlaintext(t, input, ExactStringMatcher(output)) +} + +func assertPlaintext(t *testing.T, input string, matcher StringMatcher) { + text, err := FromString(input) + if err != nil { + t.Error(err) + } + if !matcher.MatchString(text) { + t.Errorf("Input did not match expression\n"+ + "Input:\n>>>>\n%s\n<<<<\n\n"+ + "Output:\n>>>>\n%s\n<<<<\n\n"+ + "Expected output:\n>>>>\n%s\n<<<<\n\n", + input, text, matcher.String()) + } else { + t.Logf("input:\n\n%s\n\n\n\noutput:\n\n%s\n", input, text) + } +} + +func Example() { + inputHtml := ` + + + My Mega Service + + + + + + + +

    Welcome to your new account on my service!

    + +

    + Here is some more information: + +

    +

    + + + ` + + text, err := FromString(inputHtml) + if err != nil { + panic(err) + } + fmt.Println(text) + + // Output: + // Mega Service ( http://mymegaservice.com/ ) + // + // ****************************************** + // Welcome to your new account on my service! + // ****************************************** + // + // Here is some more information: + // + // * Link 1: Example.com ( https://example.com ) + // * Link 2: Example2.com ( https://example2.com ) + // * Something else +} diff --git a/vendor/github.com/jaytaylor/html2text/testdata/utf8.html b/vendor/github.com/jaytaylor/html2text/testdata/utf8.html new file mode 100755 index 0000000000..53d401ce91 --- /dev/null +++ b/vendor/github.com/jaytaylor/html2text/testdata/utf8.html @@ -0,0 +1,22 @@ + + + + + + 学习之道:美国公认学习第一书title + + + + + +

    写在前面的话 +

    +

    在台湾的那次世界冠军赛上,我几近疯狂,直至两年后的今天,我仍沉浸在这次的经历中。这是我生平第一次如此深入地审视我自己,甚至是第一次尝试审视自己。这个过程令人很是兴奋,同时也有点感觉怪异。我重新认识了自我,看到了自己的另外一面,自己从未发觉的另外一面。为了生存,为了取胜,我成了一名角斗士,彻头彻尾,简单纯粹。我并没有意识到这一角色早已在我的心中生根发芽,呼之欲出。也许,他的出现已是不可避免。

    +

    而我这全新的一面,与我一直熟识的那个乔希,那个曾经害怕黑暗的孩子,那个象棋手,那个狂热于雨水、反复诵读杰克·克鲁亚克作品的年轻人之间,又有什么样的联系呢?这些都是我正在努力弄清楚的问题。

    +

    自台湾赛事之后,我急切非常,一心想要回到训练中去,摆脱自己已经达到巅峰的想法。在过去的两年中,我已经重新开始。这是一个新的起点。前方的路还很长,有待进一步的探索。

    +

    这本书的创作耗费了相当多的时间和精力。在成长的过程中,我在我的小房间里从未想过等待我的会是这样的战斗。在创作中,我的思想逐渐成熟;爱恋从分崩离析,到失而复得,世界冠军头衔从失之交臂,到囊中取物。如果说在我人生的第一个二十九年中,我学到了什么,那就是,我们永远无法预测结局,无论是重要的比赛、冒险,还是轰轰烈烈的爱情。我们唯一可以肯定的只有,出乎意料。不管我们做了多么万全的准备,在生活的真实场景中,我们总是会处于陌生的境地。我们也许会无法冷静,失去理智,感觉似乎整个世界都在针对我们。在这个时候,我们所要做的是要付出加倍的努力,要表现得比预想得更好。我认为,关键在于准备好随机应变,准备好在所能想象的高压下发挥出创造力。

    +

    读者朋友们,我非常希望你们在读过这本书后,可以得到启发,甚至会得到触动,从而能够根据各自的天赋与特长,去实现自己的梦想。这就是我写作此书的目的。我在字里行间所传达的理念曾经使我受益匪浅,我很希望它们可以为大家提供一个基本的框架和方向。如果我的方法言之有理,那么就请接受它,琢磨它,并加之自己的见解。忘记我的那些数字。真正的掌握需要通过自己发现一些最能够引起共鸣的信息,并将其彻底地融合进来,直至成为一体,这样我们才能随心所欲地驾驭它。

    +
    + + + \ No newline at end of file diff --git a/vendor/github.com/jaytaylor/html2text/testdata/utf8_with_bom.xhtml b/vendor/github.com/jaytaylor/html2text/testdata/utf8_with_bom.xhtml new file mode 100755 index 0000000000..68f0ee707e --- /dev/null +++ b/vendor/github.com/jaytaylor/html2text/testdata/utf8_with_bom.xhtml @@ -0,0 +1,24 @@ + + + + + + 1892年波兰文版序言title + + + + +
    +

    1892年波兰文版序言[18]

    +

    出版共产主义宣言的一种新的波兰文本已成为必要,这一事实,引起了许多感想。

    +

    首先值得注意的是,近来宣言在一定程度上已成为欧洲大陆大工业发展的一种尺度。一个国家的大工业越发展,该国工人中想认清自己作为工人阶级在有产阶级面前所处地位的要求就越增加,他们中间的社会主义运动也越扩大,因而对宣言的需求也越增长。这样,根据宣言用某国文字销行的份数,不仅能够相当确切地断定该国工人运动的状况,而且还能够相当确切地断定该国大工业发展的程度。

    +

    因此,波兰文的新版本标志着波兰工业的决定性进步。从十年前发表的上一个版本以来确实有了这种进步,对此丝毫不容置疑。俄国的波兰,会议的波兰[19],成了俄罗斯帝国巨大的工业区。俄国大工业是零星分散的,一部分在芬兰湾沿岸,一部分在中央区(莫斯科和弗拉基米尔),第三部分在黑海和亚速海沿岸,还有另一些散布在别处;而波兰工业则紧缩于相对狭小的地区,享受到由这种积聚引起的长处与短处。这种长处是竞争着的俄罗斯工厂主所承认的,他们要求实行保护关税以对付波兰,尽管他们渴望使波兰人俄罗斯化。这种短处,对波兰工厂主与俄罗斯政府来说,表现在社会主义思想在波兰工人中间的迅速传播和对宣言需求的增长。

    +

    但是,波兰工业的迅速发展——它超过了俄国工业——本身是波兰人民的坚强生命力的一个新证明,是波兰人民临近的民族复兴的一个新保证。而一个独立强盛的波兰的复兴,不只是一件同波兰人有关、而且是同我们大家有关的事情。只有当每个民族在自己内部完全自主时,欧洲各民族间真诚的国际合作才是可能的。1848年革命在无产阶级旗帜下,使无产阶级的战士最终只作了资产阶级的工作,这次革命通过自己遗嘱的执行者路易·波拿巴和俾斯麦也实现了意大利、德国和匈牙利的独立。然而波兰,它从1792年以来为革命做的比所有这三个国家总共做的还要多,而当它1863年失败于强大十倍的俄军的时候,人们却把它抛弃不顾了。贵族既未能保持住、也未能重新争得波兰的独立;今天波兰的独立对资产阶级至少是无所谓的。然而波兰的独立对于欧洲各民族和谐的合作是必需的。这种独立只有年轻的波兰无产阶级才能争得,而且在它的手中会很好地保持住。因为欧洲所有其余的工人都象波兰工人自己一样也需要波兰的独立。

    +

    弗·恩格斯

    +

    1892年2月10日于伦敦

    +
    +
    [18] 恩格斯用德文为《宣言》新的波兰文本写了这篇序言。1892年由波兰社会主义者在伦敦办的《黎明》杂志社出版。序言寄出后,恩格斯写信给门德尔森(1892年2月11日),信中说,他很愿意学会波兰文,并且深入研究波兰工人运动的发展,以便能够为《宣言》的下一版写一篇更详细的序言。——第20页
    +
    [19] 指维也纳会议的波兰,即根据1814—1815年维也纳会议的决定,以波兰王国的正式名义割给俄国的那部分波兰土地。——第20页
    + + + \ No newline at end of file diff --git a/vendor/github.com/lib/pq/README.md b/vendor/github.com/lib/pq/README.md index 5eb9e14450..7670fc87a5 100644 --- a/vendor/github.com/lib/pq/README.md +++ b/vendor/github.com/lib/pq/README.md @@ -1,6 +1,6 @@ # pq - A pure Go postgres driver for Go's database/sql package -[![Build Status](https://travis-ci.org/lib/pq.png?branch=master)](https://travis-ci.org/lib/pq) +[![Build Status](https://travis-ci.org/lib/pq.svg?branch=master)](https://travis-ci.org/lib/pq) ## Install diff --git a/vendor/github.com/lib/pq/conn.go b/vendor/github.com/lib/pq/conn.go index 3c8f77cb6a..4b2fb4462c 100644 --- a/vendor/github.com/lib/pq/conn.go +++ b/vendor/github.com/lib/pq/conn.go @@ -133,7 +133,7 @@ type conn struct { // Handle driver-side settings in parsed connection string. func (c *conn) handleDriverSettings(o values) (err error) { boolSetting := func(key string, val *bool) error { - if value := o.Get(key); value != "" { + if value, ok := o[key]; ok { if value == "yes" { *val = true } else if value == "no" { @@ -158,8 +158,7 @@ func (c *conn) handleDriverSettings(o values) (err error) { func (c *conn) handlePgpass(o values) { // if a password was supplied, do not process .pgpass - _, ok := o["password"] - if ok { + if _, ok := o["password"]; ok { return } filename := os.Getenv("PGPASSFILE") @@ -187,11 +186,11 @@ func (c *conn) handlePgpass(o values) { } defer file.Close() scanner := bufio.NewScanner(io.Reader(file)) - hostname := o.Get("host") + hostname := o["host"] ntw, _ := network(o) - port := o.Get("port") - db := o.Get("dbname") - username := o.Get("user") + port := o["port"] + db := o["dbname"] + username := o["user"] // From: https://github.com/tg/pgpass/blob/master/reader.go getFields := func(s string) []string { fs := make([]string, 0, 5) @@ -256,13 +255,13 @@ func DialOpen(d Dialer, name string) (_ driver.Conn, err error) { // * Very low precedence defaults applied in every situation // * Environment variables // * Explicitly passed connection information - o.Set("host", "localhost") - o.Set("port", "5432") + o["host"] = "localhost" + o["port"] = "5432" // N.B.: Extra float digits should be set to 3, but that breaks // Postgres 8.4 and older, where the max is 2. - o.Set("extra_float_digits", "2") + o["extra_float_digits"] = "2" for k, v := range parseEnviron(os.Environ()) { - o.Set(k, v) + o[k] = v } if strings.HasPrefix(name, "postgres://") || strings.HasPrefix(name, "postgresql://") { @@ -277,9 +276,9 @@ func DialOpen(d Dialer, name string) (_ driver.Conn, err error) { } // Use the "fallback" application name if necessary - if fallback := o.Get("fallback_application_name"); fallback != "" { - if !o.Isset("application_name") { - o.Set("application_name", fallback) + if fallback, ok := o["fallback_application_name"]; ok { + if _, ok := o["application_name"]; !ok { + o["application_name"] = fallback } } @@ -290,29 +289,29 @@ func DialOpen(d Dialer, name string) (_ driver.Conn, err error) { // parsing its value is not worth it. Instead, we always explicitly send // client_encoding as a separate run-time parameter, which should override // anything set in options. - if enc := o.Get("client_encoding"); enc != "" && !isUTF8(enc) { + if enc, ok := o["client_encoding"]; ok && !isUTF8(enc) { return nil, errors.New("client_encoding must be absent or 'UTF8'") } - o.Set("client_encoding", "UTF8") + o["client_encoding"] = "UTF8" // DateStyle needs a similar treatment. - if datestyle := o.Get("datestyle"); datestyle != "" { + if datestyle, ok := o["datestyle"]; ok { if datestyle != "ISO, MDY" { panic(fmt.Sprintf("setting datestyle must be absent or %v; got %v", "ISO, MDY", datestyle)) } } else { - o.Set("datestyle", "ISO, MDY") + o["datestyle"] = "ISO, MDY" } // If a user is not provided by any other means, the last // resort is to use the current operating system provided user // name. - if o.Get("user") == "" { + if _, ok := o["user"]; !ok { u, err := userCurrent() if err != nil { return nil, err } else { - o.Set("user", u) + o["user"] = u } } @@ -335,7 +334,7 @@ func DialOpen(d Dialer, name string) (_ driver.Conn, err error) { cn.startup(o) // reset the deadline, in case one was set (see dial) - if timeout := o.Get("connect_timeout"); timeout != "" && timeout != "0" { + if timeout, ok := o["connect_timeout"]; ok && timeout != "0" { err = cn.c.SetDeadline(time.Time{}) } return cn, err @@ -349,7 +348,7 @@ func dial(d Dialer, o values) (net.Conn, error) { } // Zero or not specified means wait indefinitely. - if timeout := o.Get("connect_timeout"); timeout != "" && timeout != "0" { + if timeout, ok := o["connect_timeout"]; ok && timeout != "0" { seconds, err := strconv.ParseInt(timeout, 10, 0) if err != nil { return nil, fmt.Errorf("invalid value for parameter connect_timeout: %s", err) @@ -371,31 +370,18 @@ func dial(d Dialer, o values) (net.Conn, error) { } func network(o values) (string, string) { - host := o.Get("host") + host := o["host"] if strings.HasPrefix(host, "/") { - sockPath := path.Join(host, ".s.PGSQL."+o.Get("port")) + sockPath := path.Join(host, ".s.PGSQL."+o["port"]) return "unix", sockPath } - return "tcp", net.JoinHostPort(host, o.Get("port")) + return "tcp", net.JoinHostPort(host, o["port"]) } type values map[string]string -func (vs values) Set(k, v string) { - vs[k] = v -} - -func (vs values) Get(k string) (v string) { - return vs[k] -} - -func (vs values) Isset(k string) bool { - _, ok := vs[k] - return ok -} - // scanner implements a tokenizer for libpq-style option strings. type scanner struct { s []rune @@ -466,7 +452,7 @@ func parseOpts(name string, o values) error { // Skip any whitespace after the = if r, ok = s.SkipSpaces(); !ok { // If we reach the end here, the last value is just an empty string as per libpq. - o.Set(string(keyRunes), "") + o[string(keyRunes)] = "" break } @@ -501,7 +487,7 @@ func parseOpts(name string, o values) error { } } - o.Set(string(keyRunes), string(valRunes)) + o[string(keyRunes)] = string(valRunes) } return nil @@ -665,6 +651,12 @@ func (cn *conn) simpleQuery(q string) (res *rows, err error) { cn: cn, } } + // Set the result and tag to the last command complete if there wasn't a + // query already run. Although queries usually return from here and cede + // control to Next, a query with zero results does not. + if t == 'C' && res.colNames == nil { + res.result, res.tag = cn.parseComplete(r.string()) + } res.done = true case 'Z': cn.processReadyForQuery(r) @@ -1119,7 +1111,7 @@ func (cn *conn) auth(r *readBuf, o values) { // OK case 3: w := cn.writeBuf('p') - w.string(o.Get("password")) + w.string(o["password"]) cn.send(w) t, r := cn.recv() @@ -1133,7 +1125,7 @@ func (cn *conn) auth(r *readBuf, o values) { case 5: s := string(r.next(4)) w := cn.writeBuf('p') - w.string("md5" + md5s(md5s(o.Get("password")+o.Get("user"))+s)) + w.string("md5" + md5s(md5s(o["password"]+o["user"])+s)) cn.send(w) t, r := cn.recv() @@ -1333,6 +1325,8 @@ type rows struct { colFmts []format done bool rb readBuf + result driver.Result + tag string } func (rs *rows) Close() error { @@ -1356,6 +1350,17 @@ func (rs *rows) Columns() []string { return rs.colNames } +func (rs *rows) Result() driver.Result { + if rs.result == nil { + return emptyRows + } + return rs.result +} + +func (rs *rows) Tag() string { + return rs.tag +} + func (rs *rows) Next(dest []driver.Value) (err error) { if rs.done { return io.EOF @@ -1373,6 +1378,9 @@ func (rs *rows) Next(dest []driver.Value) (err error) { case 'E': err = parseError(&rs.rb) case 'C', 'I': + if t == 'C' { + rs.result, rs.tag = conn.parseComplete(rs.rb.string()) + } continue case 'Z': conn.processReadyForQuery(&rs.rb) diff --git a/vendor/github.com/lib/pq/conn_go18.go b/vendor/github.com/lib/pq/conn_go18.go index 0aca1d0027..43cc35f7b4 100644 --- a/vendor/github.com/lib/pq/conn_go18.go +++ b/vendor/github.com/lib/pq/conn_go18.go @@ -14,10 +14,7 @@ func (cn *conn) QueryContext(ctx context.Context, query string, args []driver.Na for i, nv := range args { list[i] = nv.Value } - var closed chan<- struct{} - if ctx.Done() != nil { - closed = watchCancel(ctx, cn.cancel) - } + closed := cn.watchCancel(ctx) r, err := cn.query(query, list) if err != nil { return nil, err @@ -33,8 +30,7 @@ func (cn *conn) ExecContext(ctx context.Context, query string, args []driver.Nam list[i] = nv.Value } - if ctx.Done() != nil { - closed := watchCancel(ctx, cn.cancel) + if closed := cn.watchCancel(ctx); closed != nil { defer close(closed) } @@ -53,22 +49,23 @@ func (cn *conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, if err != nil { return nil, err } - if ctx.Done() != nil { - cn.txnClosed = watchCancel(ctx, cn.cancel) - } + cn.txnClosed = cn.watchCancel(ctx) return tx, nil } -func watchCancel(ctx context.Context, cancel func()) chan<- struct{} { - closed := make(chan struct{}) - go func() { - select { - case <-ctx.Done(): - cancel() - case <-closed: - } - }() - return closed +func (cn *conn) watchCancel(ctx context.Context) chan<- struct{} { + if done := ctx.Done(); done != nil { + closed := make(chan struct{}) + go func() { + select { + case <-done: + cn.cancel() + case <-closed: + } + }() + return closed + } + return nil } func (cn *conn) cancel() { diff --git a/vendor/github.com/lib/pq/conn_test.go b/vendor/github.com/lib/pq/conn_test.go index 183e6dcd62..c9135b7274 100644 --- a/vendor/github.com/lib/pq/conn_test.go +++ b/vendor/github.com/lib/pq/conn_test.go @@ -191,7 +191,7 @@ localhost:*:*:*:pass_C pgpass.Close() assertPassword := func(extra values, expected string) { - o := &values{ + o := values{ "host": "localhost", "sslmode": "disable", "connect_timeout": "20", @@ -203,11 +203,11 @@ localhost:*:*:*:pass_C "datestyle": "ISO, MDY", } for k, v := range extra { - (*o)[k] = v + o[k] = v } - (&conn{}).handlePgpass(*o) - if o.Get("password") != expected { - t.Fatalf("For %v expected %s got %s", extra, expected, o.Get("password")) + (&conn{}).handlePgpass(o) + if pw := o["password"]; pw != expected { + t.Fatalf("For %v expected %s got %s", extra, expected, pw) } } // wrong permissions for the pgpass file means it should be ignored @@ -686,17 +686,28 @@ func TestCloseBadConn(t *testing.T) { if err := cn.Close(); err != nil { t.Fatal(err) } + + // During the Go 1.9 cycle, https://github.com/golang/go/commit/3792db5 + // changed this error from + // + // net.errClosing = errors.New("use of closed network connection") + // + // to + // + // internal/poll.ErrClosing = errors.New("use of closed file or network connection") + const errClosing = "use of closed" + // Verify write after closing fails. if _, err := nc.Write(nil); err == nil { t.Fatal("expected error") - } else if !strings.Contains(err.Error(), "use of closed network connection") { - t.Fatalf("expected use of closed network connection error, got %s", err) + } else if !strings.Contains(err.Error(), errClosing) { + t.Fatalf("expected %s error, got %s", errClosing, err) } // Verify second close fails. if err := cn.Close(); err == nil { t.Fatal("expected error") - } else if !strings.Contains(err.Error(), "use of closed network connection") { - t.Fatalf("expected use of closed network connection error, got %s", err) + } else if !strings.Contains(err.Error(), errClosing) { + t.Fatalf("expected %s error, got %s", errClosing, err) } } @@ -1493,3 +1504,82 @@ func TestQuoteIdentifier(t *testing.T) { } } } + +func TestRowsResultTag(t *testing.T) { + type ResultTag interface { + Result() driver.Result + Tag() string + } + + tests := []struct { + query string + tag string + ra int64 + }{ + { + query: "CREATE TEMP TABLE temp (a int)", + tag: "CREATE TABLE", + }, + { + query: "INSERT INTO temp VALUES (1), (2)", + tag: "INSERT", + ra: 2, + }, + { + query: "SELECT 1", + }, + // A SELECT anywhere should take precedent. + { + query: "SELECT 1; INSERT INTO temp VALUES (1), (2)", + }, + { + query: "INSERT INTO temp VALUES (1), (2); SELECT 1", + }, + // Multiple statements that don't return rows should return the last tag. + { + query: "CREATE TEMP TABLE t (a int); DROP TABLE t", + tag: "DROP TABLE", + }, + // Ensure a rows-returning query in any position among various tags-returing + // statements will prefer the rows. + { + query: "SELECT 1; CREATE TEMP TABLE t (a int); DROP TABLE t", + }, + { + query: "CREATE TEMP TABLE t (a int); SELECT 1; DROP TABLE t", + }, + { + query: "CREATE TEMP TABLE t (a int); DROP TABLE t; SELECT 1", + }, + // Verify that an no-results query doesn't set the tag. + { + query: "CREATE TEMP TABLE t (a int); SELECT 1 WHERE FALSE; DROP TABLE t;", + }, + } + + // If this is the only test run, this will correct the connection string. + openTestConn(t).Close() + + conn, err := Open("") + if err != nil { + t.Fatal(err) + } + defer conn.Close() + q := conn.(driver.Queryer) + + for _, test := range tests { + if rows, err := q.Query(test.query, nil); err != nil { + t.Fatalf("%s: %s", test.query, err) + } else { + r := rows.(ResultTag) + if tag := r.Tag(); tag != test.tag { + t.Fatalf("%s: unexpected tag %q", test.query, tag) + } + res := r.Result() + if ra, _ := res.RowsAffected(); ra != test.ra { + t.Fatalf("%s: unexpected rows affected: %d", test.query, ra) + } + rows.Close() + } + } +} diff --git a/vendor/github.com/lib/pq/go18_test.go b/vendor/github.com/lib/pq/go18_test.go index 15546d865b..5d17e4d92c 100644 --- a/vendor/github.com/lib/pq/go18_test.go +++ b/vendor/github.com/lib/pq/go18_test.go @@ -79,10 +79,7 @@ func TestContextCancelExec(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) // Delay execution for just a bit until db.ExecContext has begun. - go func() { - time.Sleep(time.Millisecond * 10) - cancel() - }() + defer time.AfterFunc(time.Millisecond*10, cancel).Stop() // Not canceled until after the exec has started. if _, err := db.ExecContext(ctx, "select pg_sleep(1)"); err == nil { @@ -106,10 +103,7 @@ func TestContextCancelQuery(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) // Delay execution for just a bit until db.QueryContext has begun. - go func() { - time.Sleep(time.Millisecond * 10) - cancel() - }() + defer time.AfterFunc(time.Millisecond*10, cancel).Stop() // Not canceled until after the exec has started. if _, err := db.QueryContext(ctx, "select pg_sleep(1)"); err == nil { @@ -137,10 +131,7 @@ func TestContextCancelBegin(t *testing.T) { } // Delay execution for just a bit until tx.Exec has begun. - go func() { - time.Sleep(time.Millisecond * 10) - cancel() - }() + defer time.AfterFunc(time.Millisecond*10, cancel).Stop() // Not canceled until after the exec has started. if _, err := tx.Exec("select pg_sleep(1)"); err == nil { diff --git a/vendor/github.com/lib/pq/listen_example/doc.go b/vendor/github.com/lib/pq/listen_example/doc.go index 5bc99f5c19..80f0a9b970 100644 --- a/vendor/github.com/lib/pq/listen_example/doc.go +++ b/vendor/github.com/lib/pq/listen_example/doc.go @@ -51,21 +51,15 @@ mechanism to avoid polling the database while waiting for more work to arrive. } func waitForNotification(l *pq.Listener) { - for { - select { - case <-l.Notify: - fmt.Println("received notification, new work available") - return - case <-time.After(90 * time.Second): - go func() { - l.Ping() - }() - // Check if there's more work available, just in case it takes - // a while for the Listener to notice connection loss and - // reconnect. - fmt.Println("received no work for 90 seconds, checking for new work") - return - } + select { + case <-l.Notify: + fmt.Println("received notification, new work available") + case <-time.After(90 * time.Second): + go l.Ping() + // Check if there's more work available, just in case it takes + // a while for the Listener to notice connection loss and + // reconnect. + fmt.Println("received no work for 90 seconds, checking for new work") } } diff --git a/vendor/github.com/lib/pq/notify_test.go b/vendor/github.com/lib/pq/notify_test.go index fe8941a4e0..82a77e1ebc 100644 --- a/vendor/github.com/lib/pq/notify_test.go +++ b/vendor/github.com/lib/pq/notify_test.go @@ -7,7 +7,6 @@ import ( "os" "runtime" "sync" - "sync/atomic" "testing" "time" ) @@ -235,15 +234,10 @@ func TestConnExecDeadlock(t *testing.T) { // calls Close on the net.Conn; equivalent to a network failure l.Close() - var done int32 = 0 - go func() { - time.Sleep(10 * time.Second) - if atomic.LoadInt32(&done) != 1 { - panic("timed out") - } - }() + defer time.AfterFunc(10*time.Second, func() { + panic("timed out") + }).Stop() wg.Wait() - atomic.StoreInt32(&done, 1) } // Test for ListenerConn being closed while a slow query is executing @@ -271,15 +265,11 @@ func TestListenerConnCloseWhileQueryIsExecuting(t *testing.T) { if err != nil { t.Fatal(err) } - var done int32 = 0 - go func() { - time.Sleep(10 * time.Second) - if atomic.LoadInt32(&done) != 1 { - panic("timed out") - } - }() + + defer time.AfterFunc(10*time.Second, func() { + panic("timed out") + }).Stop() wg.Wait() - atomic.StoreInt32(&done, 1) } func TestNotifyExtra(t *testing.T) { diff --git a/vendor/github.com/lib/pq/oid/types.go b/vendor/github.com/lib/pq/oid/types.go index 03df05a617..a3390c23a8 100644 --- a/vendor/github.com/lib/pq/oid/types.go +++ b/vendor/github.com/lib/pq/oid/types.go @@ -18,6 +18,7 @@ const ( T_xid Oid = 28 T_cid Oid = 29 T_oidvector Oid = 30 + T_pg_ddl_command Oid = 32 T_pg_type Oid = 71 T_pg_attribute Oid = 75 T_pg_proc Oid = 81 @@ -28,6 +29,7 @@ const ( T_pg_node_tree Oid = 194 T__json Oid = 199 T_smgr Oid = 210 + T_index_am_handler Oid = 325 T_point Oid = 600 T_lseg Oid = 601 T_path Oid = 602 @@ -133,6 +135,9 @@ const ( T__uuid Oid = 2951 T_txid_snapshot Oid = 2970 T_fdw_handler Oid = 3115 + T_pg_lsn Oid = 3220 + T__pg_lsn Oid = 3221 + T_tsm_handler Oid = 3310 T_anyenum Oid = 3500 T_tsvector Oid = 3614 T_tsquery Oid = 3615 @@ -144,6 +149,8 @@ const ( T__regconfig Oid = 3735 T_regdictionary Oid = 3769 T__regdictionary Oid = 3770 + T_jsonb Oid = 3802 + T__jsonb Oid = 3807 T_anyrange Oid = 3831 T_event_trigger Oid = 3838 T_int4range Oid = 3904 @@ -158,4 +165,9 @@ const ( T__daterange Oid = 3913 T_int8range Oid = 3926 T__int8range Oid = 3927 + T_pg_shseclabel Oid = 4066 + T_regnamespace Oid = 4089 + T__regnamespace Oid = 4090 + T_regrole Oid = 4096 + T__regrole Oid = 4097 ) diff --git a/vendor/github.com/lib/pq/ssl.go b/vendor/github.com/lib/pq/ssl.go index b282ebd926..7deb304366 100644 --- a/vendor/github.com/lib/pq/ssl.go +++ b/vendor/github.com/lib/pq/ssl.go @@ -15,7 +15,7 @@ import ( func ssl(o values) func(net.Conn) net.Conn { verifyCaOnly := false tlsConf := tls.Config{} - switch mode := o.Get("sslmode"); mode { + switch mode := o["sslmode"]; mode { // "require" is the default. case "", "require": // We must skip TLS's own verification since it requires full @@ -23,15 +23,19 @@ func ssl(o values) func(net.Conn) net.Conn { tlsConf.InsecureSkipVerify = true // From http://www.postgresql.org/docs/current/static/libpq-ssl.html: - // Note: For backwards compatibility with earlier versions of PostgreSQL, if a - // root CA file exists, the behavior of sslmode=require will be the same as - // that of verify-ca, meaning the server certificate is validated against the - // CA. Relying on this behavior is discouraged, and applications that need - // certificate validation should always use verify-ca or verify-full. - if _, err := os.Stat(o.Get("sslrootcert")); err == nil { - verifyCaOnly = true - } else { - o.Set("sslrootcert", "") + // + // Note: For backwards compatibility with earlier versions of + // PostgreSQL, if a root CA file exists, the behavior of + // sslmode=require will be the same as that of verify-ca, meaning the + // server certificate is validated against the CA. Relying on this + // behavior is discouraged, and applications that need certificate + // validation should always use verify-ca or verify-full. + if sslrootcert, ok := o["sslrootcert"]; ok { + if _, err := os.Stat(sslrootcert); err == nil { + verifyCaOnly = true + } else { + delete(o, "sslrootcert") + } } case "verify-ca": // We must skip TLS's own verification since it requires full @@ -39,7 +43,7 @@ func ssl(o values) func(net.Conn) net.Conn { tlsConf.InsecureSkipVerify = true verifyCaOnly = true case "verify-full": - tlsConf.ServerName = o.Get("host") + tlsConf.ServerName = o["host"] case "disable": return nil default: @@ -64,37 +68,42 @@ func ssl(o values) func(net.Conn) net.Conn { // in the user's home directory. The configured files must exist and have // the correct permissions. func sslClientCertificates(tlsConf *tls.Config, o values) { - sslkey := o.Get("sslkey") - sslcert := o.Get("sslcert") + // user.Current() might fail when cross-compiling. We have to ignore the + // error and continue without home directory defaults, since we wouldn't + // know from where to load them. + user, _ := user.Current() - var cinfo, kinfo os.FileInfo - var err error - - if sslcert != "" && sslkey != "" { - // Check that both files exist. Note that we don't do any more extensive - // checks than this (such as checking that the paths aren't directories); - // LoadX509KeyPair() will take care of the rest. - cinfo, err = os.Stat(sslcert) - if err != nil { - panic(err) - } - - kinfo, err = os.Stat(sslkey) - if err != nil { - panic(err) - } - } else { - // Automatically find certificates from ~/.postgresql - sslcert, sslkey, cinfo, kinfo = sslHomeCertificates() - - if cinfo == nil || kinfo == nil { - // No certificates to load - return - } + // In libpq, the client certificate is only loaded if the setting is not blank. + // + // https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1036-L1037 + sslcert := o["sslcert"] + if len(sslcert) == 0 && user != nil { + sslcert = filepath.Join(user.HomeDir, ".postgresql", "postgresql.crt") + } + // https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1045 + if len(sslcert) == 0 { + return + } + // https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1050:L1054 + if _, err := os.Stat(sslcert); os.IsNotExist(err) { + return + } else if err != nil { + panic(err) } - // The files must also have the correct permissions - sslCertificatePermissions(cinfo, kinfo) + // In libpq, the ssl key is only loaded if the setting is not blank. + // + // https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L1123-L1222 + sslkey := o["sslkey"] + if len(sslkey) == 0 && user != nil { + sslkey = filepath.Join(user.HomeDir, ".postgresql", "postgresql.key") + } + + if len(sslkey) > 0 { + if err := sslKeyPermissions(sslkey); err != nil { + panic(err) + } + } cert, err := tls.LoadX509KeyPair(sslcert, sslkey) if err != nil { @@ -105,7 +114,10 @@ func sslClientCertificates(tlsConf *tls.Config, o values) { // sslCertificateAuthority adds the RootCA specified in the "sslrootcert" setting. func sslCertificateAuthority(tlsConf *tls.Config, o values) { - if sslrootcert := o.Get("sslrootcert"); sslrootcert != "" { + // In libpq, the root certificate is only loaded if the setting is not blank. + // + // https://github.com/postgres/postgres/blob/REL9_6_2/src/interfaces/libpq/fe-secure-openssl.c#L950-L951 + if sslrootcert := o["sslrootcert"]; len(sslrootcert) > 0 { tlsConf.RootCAs = x509.NewCertPool() cert, err := ioutil.ReadFile(sslrootcert) @@ -113,41 +125,12 @@ func sslCertificateAuthority(tlsConf *tls.Config, o values) { panic(err) } - ok := tlsConf.RootCAs.AppendCertsFromPEM(cert) - if !ok { + if !tlsConf.RootCAs.AppendCertsFromPEM(cert) { errorf("couldn't parse pem in sslrootcert") } } } -// sslHomeCertificates returns the path and stats of certificates in the current -// user's home directory. -func sslHomeCertificates() (cert, key string, cinfo, kinfo os.FileInfo) { - user, err := user.Current() - - if err != nil { - // user.Current() might fail when cross-compiling. We have to ignore the - // error and continue without client certificates, since we wouldn't know - // from where to load them. - return - } - - cert = filepath.Join(user.HomeDir, ".postgresql", "postgresql.crt") - key = filepath.Join(user.HomeDir, ".postgresql", "postgresql.key") - - cinfo, err = os.Stat(cert) - if err != nil { - cinfo = nil - } - - kinfo, err = os.Stat(key) - if err != nil { - kinfo = nil - } - - return -} - // sslVerifyCertificateAuthority carries out a TLS handshake to the server and // verifies the presented certificate against the CA, i.e. the one specified in // sslrootcert or the system CA if sslrootcert was not specified. diff --git a/vendor/github.com/lib/pq/ssl_permissions.go b/vendor/github.com/lib/pq/ssl_permissions.go index 33076a8daa..3b7c3a2a31 100644 --- a/vendor/github.com/lib/pq/ssl_permissions.go +++ b/vendor/github.com/lib/pq/ssl_permissions.go @@ -4,13 +4,17 @@ package pq import "os" -// sslCertificatePermissions checks the permissions on user-supplied certificate -// files. The key file should have very little access. +// sslKeyPermissions checks the permissions on user-supplied ssl key files. +// The key file should have very little access. // // libpq does not check key file permissions on Windows. -func sslCertificatePermissions(cert, key os.FileInfo) { - kmode := key.Mode() - if kmode != kmode&0600 { - panic(ErrSSLKeyHasWorldPermissions) +func sslKeyPermissions(sslkey string) error { + info, err := os.Stat(sslkey) + if err != nil { + return err } + if info.Mode().Perm()&0077 != 0 { + return ErrSSLKeyHasWorldPermissions + } + return nil } diff --git a/vendor/github.com/lib/pq/ssl_test.go b/vendor/github.com/lib/pq/ssl_test.go index f70a5fd578..3eafbfd20f 100644 --- a/vendor/github.com/lib/pq/ssl_test.go +++ b/vendor/github.com/lib/pq/ssl_test.go @@ -6,7 +6,6 @@ import ( _ "crypto/sha256" "crypto/x509" "database/sql" - "fmt" "os" "path/filepath" "testing" @@ -42,10 +41,13 @@ func openSSLConn(t *testing.T, conninfo string) (*sql.DB, error) { } func checkSSLSetup(t *testing.T, conninfo string) { - db, err := openSSLConn(t, conninfo) - if err == nil { - db.Close() - t.Fatalf("expected error with conninfo=%q", conninfo) + _, err := openSSLConn(t, conninfo) + if pge, ok := err.(*Error); ok { + if pge.Code.Name() != "invalid_authorization_specification" { + t.Fatalf("unexpected error code '%s'", pge.Code.Name()) + } + } else { + t.Fatalf("expected %T, got %v", (*Error)(nil), err) } } @@ -150,120 +152,128 @@ func TestSSLVerifyCA(t *testing.T) { checkSSLSetup(t, "sslmode=disable user=pqgossltest") // Not OK according to the system CA - _, err := openSSLConn(t, "host=postgres sslmode=verify-ca user=pqgossltest") - if err == nil { - t.Fatal("expected error") + { + _, err := openSSLConn(t, "host=postgres sslmode=verify-ca user=pqgossltest") + if _, ok := err.(x509.UnknownAuthorityError); !ok { + t.Fatalf("expected %T, got %#+v", x509.UnknownAuthorityError{}, err) + } } - _, ok := err.(x509.UnknownAuthorityError) - if !ok { - t.Fatalf("expected x509.UnknownAuthorityError, got %#+v", err) + + // Still not OK according to the system CA; empty sslrootcert is treated as unspecified. + { + _, err := openSSLConn(t, "host=postgres sslmode=verify-ca user=pqgossltest sslrootcert=''") + if _, ok := err.(x509.UnknownAuthorityError); !ok { + t.Fatalf("expected %T, got %#+v", x509.UnknownAuthorityError{}, err) + } } rootCertPath := filepath.Join(os.Getenv("PQSSLCERTTEST_PATH"), "root.crt") rootCert := "sslrootcert=" + rootCertPath + " " // No match on Common Name, but that's OK - _, err = openSSLConn(t, rootCert+"host=127.0.0.1 sslmode=verify-ca user=pqgossltest") - if err != nil { + if _, err := openSSLConn(t, rootCert+"host=127.0.0.1 sslmode=verify-ca user=pqgossltest"); err != nil { t.Fatal(err) } // Everything OK - _, err = openSSLConn(t, rootCert+"host=postgres sslmode=verify-ca user=pqgossltest") - if err != nil { + if _, err := openSSLConn(t, rootCert+"host=postgres sslmode=verify-ca user=pqgossltest"); err != nil { t.Fatal(err) } } -func getCertConninfo(t *testing.T, source string) string { - var sslkey string - var sslcert string - - certpath := os.Getenv("PQSSLCERTTEST_PATH") - - switch source { - case "missingkey": - sslkey = "/tmp/filedoesnotexist" - sslcert = filepath.Join(certpath, "postgresql.crt") - case "missingcert": - sslkey = filepath.Join(certpath, "postgresql.key") - sslcert = "/tmp/filedoesnotexist" - case "certtwice": - sslkey = filepath.Join(certpath, "postgresql.crt") - sslcert = filepath.Join(certpath, "postgresql.crt") - case "valid": - sslkey = filepath.Join(certpath, "postgresql.key") - sslcert = filepath.Join(certpath, "postgresql.crt") - default: - t.Fatalf("invalid source %q", source) - } - return fmt.Sprintf("sslmode=require user=pqgosslcert sslkey=%s sslcert=%s", sslkey, sslcert) -} - // Authenticate over SSL using client certificates func TestSSLClientCertificates(t *testing.T) { maybeSkipSSLTests(t) // Environment sanity check: should fail without SSL checkSSLSetup(t, "sslmode=disable user=pqgossltest") - // Should also fail without a valid certificate - db, err := openSSLConn(t, "sslmode=require user=pqgosslcert") - if err == nil { - db.Close() - t.Fatal("expected error") + const baseinfo = "sslmode=require user=pqgosslcert" + + // Certificate not specified, should fail + { + _, err := openSSLConn(t, baseinfo) + if pge, ok := err.(*Error); ok { + if pge.Code.Name() != "invalid_authorization_specification" { + t.Fatalf("unexpected error code '%s'", pge.Code.Name()) + } + } else { + t.Fatalf("expected %T, got %v", (*Error)(nil), err) + } } - pge, ok := err.(*Error) + + // Empty certificate specified, should fail + { + _, err := openSSLConn(t, baseinfo+" sslcert=''") + if pge, ok := err.(*Error); ok { + if pge.Code.Name() != "invalid_authorization_specification" { + t.Fatalf("unexpected error code '%s'", pge.Code.Name()) + } + } else { + t.Fatalf("expected %T, got %v", (*Error)(nil), err) + } + } + + // Non-existent certificate specified, should fail + { + _, err := openSSLConn(t, baseinfo+" sslcert=/tmp/filedoesnotexist") + if pge, ok := err.(*Error); ok { + if pge.Code.Name() != "invalid_authorization_specification" { + t.Fatalf("unexpected error code '%s'", pge.Code.Name()) + } + } else { + t.Fatalf("expected %T, got %v", (*Error)(nil), err) + } + } + + certpath, ok := os.LookupEnv("PQSSLCERTTEST_PATH") if !ok { - t.Fatal("expected pq.Error") + t.Fatalf("PQSSLCERTTEST_PATH not present in environment") } - if pge.Code.Name() != "invalid_authorization_specification" { - t.Fatalf("unexpected error code %q", pge.Code.Name()) + + sslcert := filepath.Join(certpath, "postgresql.crt") + + // Cert present, key not specified, should fail + { + _, err := openSSLConn(t, baseinfo+" sslcert="+sslcert) + if _, ok := err.(*os.PathError); !ok { + t.Fatalf("expected %T, got %#+v", (*os.PathError)(nil), err) + } } + // Cert present, empty key specified, should fail + { + _, err := openSSLConn(t, baseinfo+" sslcert="+sslcert+" sslkey=''") + if _, ok := err.(*os.PathError); !ok { + t.Fatalf("expected %T, got %#+v", (*os.PathError)(nil), err) + } + } + + // Cert present, non-existent key, should fail + { + _, err := openSSLConn(t, baseinfo+" sslcert="+sslcert+" sslkey=/tmp/filedoesnotexist") + if _, ok := err.(*os.PathError); !ok { + t.Fatalf("expected %T, got %#+v", (*os.PathError)(nil), err) + } + } + + // Key has wrong permissions (passing the cert as the key), should fail + if _, err := openSSLConn(t, baseinfo+" sslcert="+sslcert+" sslkey="+sslcert); err != ErrSSLKeyHasWorldPermissions { + t.Fatalf("expected %s, got %#+v", ErrSSLKeyHasWorldPermissions, err) + } + + sslkey := filepath.Join(certpath, "postgresql.key") + // Should work - db, err = openSSLConn(t, getCertConninfo(t, "valid")) - if err != nil { + if db, err := openSSLConn(t, baseinfo+" sslcert="+sslcert+" sslkey="+sslkey); err != nil { t.Fatal(err) - } - rows, err := db.Query("SELECT 1") - if err != nil { - t.Fatal(err) - } - rows.Close() -} - -// Test errors with ssl certificates -func TestSSLClientCertificatesMissingFiles(t *testing.T) { - maybeSkipSSLTests(t) - // Environment sanity check: should fail without SSL - checkSSLSetup(t, "sslmode=disable user=pqgossltest") - - // Key missing, should fail - _, err := openSSLConn(t, getCertConninfo(t, "missingkey")) - if err == nil { - t.Fatal("expected error") - } - // should be a PathError - _, ok := err.(*os.PathError) - if !ok { - t.Fatalf("expected PathError, got %#+v", err) - } - - // Cert missing, should fail - _, err = openSSLConn(t, getCertConninfo(t, "missingcert")) - if err == nil { - t.Fatal("expected error") - } - // should be a PathError - _, ok = err.(*os.PathError) - if !ok { - t.Fatalf("expected PathError, got %#+v", err) - } - - // Key has wrong permissions, should fail - _, err = openSSLConn(t, getCertConninfo(t, "certtwice")) - if err == nil { - t.Fatal("expected error") - } - if err != ErrSSLKeyHasWorldPermissions { - t.Fatalf("expected ErrSSLKeyHasWorldPermissions, got %#+v", err) + } else { + rows, err := db.Query("SELECT 1") + if err != nil { + t.Fatal(err) + } + if err := rows.Close(); err != nil { + t.Fatal(err) + } + if err := db.Close(); err != nil { + t.Fatal(err) + } } } diff --git a/vendor/github.com/lib/pq/ssl_windows.go b/vendor/github.com/lib/pq/ssl_windows.go index 529daed225..5d2c763ceb 100644 --- a/vendor/github.com/lib/pq/ssl_windows.go +++ b/vendor/github.com/lib/pq/ssl_windows.go @@ -2,8 +2,8 @@ package pq -import "os" - -// sslCertificatePermissions checks the permissions on user-supplied certificate -// files. In libpq, this is a no-op on Windows. -func sslCertificatePermissions(cert, key os.FileInfo) {} +// sslKeyPermissions checks the permissions on user-supplied ssl key files. +// The key file should have very little access. +// +// libpq does not check key file permissions on Windows. +func sslKeyPermissions(string) error { return nil } diff --git a/vendor/github.com/miekg/dns/README.md b/vendor/github.com/miekg/dns/README.md index 0c1f1b6a9c..2acc7f1ff9 100644 --- a/vendor/github.com/miekg/dns/README.md +++ b/vendor/github.com/miekg/dns/README.md @@ -25,6 +25,7 @@ two versions of Go, currently: 1.6 and 1.7. A not-so-up-to-date-list-that-may-be-actually-current: +* https://github.com/coredns/coredns * https://cloudflare.com * https://github.com/abh/geodns * http://www.statdns.com/ @@ -54,6 +55,8 @@ A not-so-up-to-date-list-that-may-be-actually-current: * https://github.com/mehrdadrad/mylg * https://github.com/bamarni/dockness * https://github.com/fffaraz/microdns +* http://quilt.io +* https://github.com/ipdcode/hades (JD.COM) Send pull request if you want to be listed here. @@ -142,6 +145,7 @@ Example programs can be found in the `github.com/miekg/exdns` repository. * 6975 - Algorithm Understanding in DNSSEC * 7043 - EUI48/EUI64 records * 7314 - DNS (EDNS) EXPIRE Option +* 7828 - edns-tcp-keepalive EDNS0 Option * 7553 - URI record * 7858 - DNS over TLS: Initiation and Performance Considerations (draft) * 7873 - Domain Name System (DNS) Cookies (draft-ietf-dnsop-cookies) diff --git a/vendor/github.com/miekg/dns/client.go b/vendor/github.com/miekg/dns/client.go index 0db7f7bf68..d54d6422e1 100644 --- a/vendor/github.com/miekg/dns/client.go +++ b/vendor/github.com/miekg/dns/client.go @@ -121,12 +121,12 @@ func (c *Client) Exchange(m *Msg, a string) (r *Msg, rtt time.Duration, err erro r, rtt, err, shared := c.group.Do(m.Question[0].Name+t+cl, func() (*Msg, time.Duration, error) { return c.exchange(m, a) }) + if r != nil && shared { + r = r.Copy() + } if err != nil { return r, rtt, err } - if shared { - return r.Copy(), rtt, nil - } return r, rtt, nil } @@ -300,6 +300,18 @@ func tcpMsgLen(t io.Reader) (int, error) { if err != nil { return 0, err } + + // As seen with my local router/switch, retursn 1 byte on the above read, + // resulting a a ShortRead. Just write it out (instead of loop) and read the + // other byte. + if n == 1 { + n1, err := t.Read(p[1:]) + if err != nil { + return 0, err + } + n += n1 + } + if n != 2 { return 0, ErrShortRead } @@ -400,7 +412,7 @@ func (co *Conn) Write(p []byte) (n int, err error) { n, err := io.Copy(w, bytes.NewReader(p)) return int(n), err } - n, err = co.Conn.(*net.UDPConn).Write(p) + n, err = co.Conn.Write(p) return n, err } diff --git a/vendor/github.com/miekg/dns/client_test.go b/vendor/github.com/miekg/dns/client_test.go index 850bcfcda6..dee585f367 100644 --- a/vendor/github.com/miekg/dns/client_test.go +++ b/vendor/github.com/miekg/dns/client_test.go @@ -5,6 +5,7 @@ import ( "fmt" "net" "strconv" + "sync" "testing" "time" ) @@ -77,8 +78,8 @@ func TestClientTLSSync(t *testing.T) { } } -func TestClientSyncBadId(t *testing.T) { - HandleFunc("miek.nl.", HelloServerBadId) +func TestClientSyncBadID(t *testing.T) { + HandleFunc("miek.nl.", HelloServerBadID) defer HandleRemove("miek.nl.") s, addrstr, err := RunLocalUDPServer("127.0.0.1:0") @@ -450,3 +451,61 @@ func TestTimeout(t *testing.T) { t.Errorf("exchange took longer (%v) than specified Timeout (%v)", length, timeout) } } + +// Check that responses from deduplicated requests aren't shared between callers +func TestConcurrentExchanges(t *testing.T) { + cases := make([]*Msg, 2) + cases[0] = new(Msg) + cases[1] = new(Msg) + cases[1].Truncated = true + for _, m := range cases { + block := make(chan struct{}) + waiting := make(chan struct{}) + + handler := func(w ResponseWriter, req *Msg) { + r := m.Copy() + r.SetReply(req) + + waiting <- struct{}{} + <-block + w.WriteMsg(r) + } + + HandleFunc("miek.nl.", handler) + defer HandleRemove("miek.nl.") + + s, addrstr, err := RunLocalUDPServer("127.0.0.1:0") + if err != nil { + t.Fatalf("unable to run test server: %s", err) + } + defer s.Shutdown() + + m := new(Msg) + m.SetQuestion("miek.nl.", TypeSRV) + c := &Client{ + SingleInflight: true, + } + r := make([]*Msg, 2) + + var wg sync.WaitGroup + wg.Add(len(r)) + for i := 0; i < len(r); i++ { + go func(i int) { + r[i], _, _ = c.Exchange(m.Copy(), addrstr) + wg.Done() + }(i) + } + select { + case <-waiting: + case <-time.After(time.Second): + t.FailNow() + } + close(block) + wg.Wait() + + if r[0] == r[1] { + t.Log("Got same response object, expected non-shared responses") + t.Fail() + } + } +} diff --git a/vendor/github.com/miekg/dns/clientconfig.go b/vendor/github.com/miekg/dns/clientconfig.go index cfa9ad0b22..0a1f5a92c5 100644 --- a/vendor/github.com/miekg/dns/clientconfig.go +++ b/vendor/github.com/miekg/dns/clientconfig.go @@ -97,3 +97,35 @@ func ClientConfigFromFile(resolvconf string) (*ClientConfig, error) { } return c, nil } + +// NameList returns all of the names that should be queried based on the +// config. It is based off of go's net/dns name building, but it does not +// check the length of the resulting names. +func (c *ClientConfig) NameList(name string) []string { + // if this domain is already fully qualified, no append needed. + if IsFqdn(name) { + return []string{name} + } + + // Check to see if the name has more labels than Ndots. Do this before making + // the domain fully qualified. + hasNdots := CountLabel(name) > c.Ndots + // Make the domain fully qualified. + name = Fqdn(name) + + // Make a list of names based off search. + names := []string{} + + // If name has enough dots, try that first. + if hasNdots { + names = append(names, name) + } + for _, s := range c.Search { + names = append(names, Fqdn(name+s)) + } + // If we didn't have enough dots, try after suffixes. + if !hasNdots { + names = append(names, name) + } + return names +} diff --git a/vendor/github.com/miekg/dns/clientconfig_test.go b/vendor/github.com/miekg/dns/clientconfig_test.go index 63bc5c814b..7755a8a6f6 100644 --- a/vendor/github.com/miekg/dns/clientconfig_test.go +++ b/vendor/github.com/miekg/dns/clientconfig_test.go @@ -48,3 +48,40 @@ func testConfig(t *testing.T, data string) { func TestNameserver(t *testing.T) { testConfig(t, normal) } func TestMissingFinalNewLine(t *testing.T) { testConfig(t, missingNewline) } + +func TestNameList(t *testing.T) { + cfg := ClientConfig{ + Ndots: 1, + } + // fqdn should be only result returned + names := cfg.NameList("miek.nl.") + if len(names) != 1 { + t.Errorf("NameList returned != 1 names: %v", names) + } else if names[0] != "miek.nl." { + t.Errorf("NameList didn't return sent fqdn domain: %v", names[0]) + } + + cfg.Search = []string{ + "test", + } + // Sent domain has NDots and search + names = cfg.NameList("miek.nl") + if len(names) != 2 { + t.Errorf("NameList returned != 2 names: %v", names) + } else if names[0] != "miek.nl." { + t.Errorf("NameList didn't return sent domain first: %v", names[0]) + } else if names[1] != "miek.nl.test." { + t.Errorf("NameList didn't return search last: %v", names[1]) + } + + cfg.Ndots = 2 + // Sent domain has less than NDots and search + names = cfg.NameList("miek.nl") + if len(names) != 2 { + t.Errorf("NameList returned != 2 names: %v", names) + } else if names[0] != "miek.nl.test." { + t.Errorf("NameList didn't return search first: %v", names[0]) + } else if names[1] != "miek.nl." { + t.Errorf("NameList didn't return sent domain last: %v", names[1]) + } +} diff --git a/vendor/github.com/miekg/dns/compress_generate.go b/vendor/github.com/miekg/dns/compress_generate.go new file mode 100644 index 0000000000..1a301e9f39 --- /dev/null +++ b/vendor/github.com/miekg/dns/compress_generate.go @@ -0,0 +1,184 @@ +//+build ignore + +// compression_generate.go is meant to run with go generate. It will use +// go/{importer,types} to track down all the RR struct types. Then for each type +// it will look to see if there are (compressible) names, if so it will add that +// type to compressionLenHelperType and comressionLenSearchType which "fake" the +// compression so that Len() is fast. +package main + +import ( + "bytes" + "fmt" + "go/format" + "go/importer" + "go/types" + "log" + "os" +) + +var packageHdr = ` +// *** DO NOT MODIFY *** +// AUTOGENERATED BY go generate from compress_generate.go + +package dns + +` + +// getTypeStruct will take a type and the package scope, and return the +// (innermost) struct if the type is considered a RR type (currently defined as +// those structs beginning with a RR_Header, could be redefined as implementing +// the RR interface). The bool return value indicates if embedded structs were +// resolved. +func getTypeStruct(t types.Type, scope *types.Scope) (*types.Struct, bool) { + st, ok := t.Underlying().(*types.Struct) + if !ok { + return nil, false + } + if st.Field(0).Type() == scope.Lookup("RR_Header").Type() { + return st, false + } + if st.Field(0).Anonymous() { + st, _ := getTypeStruct(st.Field(0).Type(), scope) + return st, true + } + return nil, false +} + +func main() { + // Import and type-check the package + pkg, err := importer.Default().Import("github.com/miekg/dns") + fatalIfErr(err) + scope := pkg.Scope() + + domainTypes := map[string]bool{} // Types that have a domain name in them (either comressible or not). + cdomainTypes := map[string]bool{} // Types that have a compressible domain name in them (subset of domainType) + for _, name := range scope.Names() { + o := scope.Lookup(name) + if o == nil || !o.Exported() { + continue + } + st, _ := getTypeStruct(o.Type(), scope) + if st == nil { + continue + } + if name == "PrivateRR" { + continue + } + + if scope.Lookup("Type"+o.Name()) == nil && o.Name() != "RFC3597" { + log.Fatalf("Constant Type%s does not exist.", o.Name()) + } + + for i := 1; i < st.NumFields(); i++ { + if _, ok := st.Field(i).Type().(*types.Slice); ok { + if st.Tag(i) == `dns:"domain-name"` { + domainTypes[o.Name()] = true + } + if st.Tag(i) == `dns:"cdomain-name"` { + cdomainTypes[o.Name()] = true + domainTypes[o.Name()] = true + } + continue + } + + switch { + case st.Tag(i) == `dns:"domain-name"`: + domainTypes[o.Name()] = true + case st.Tag(i) == `dns:"cdomain-name"`: + cdomainTypes[o.Name()] = true + domainTypes[o.Name()] = true + } + } + } + + b := &bytes.Buffer{} + b.WriteString(packageHdr) + + // compressionLenHelperType - all types that have domain-name/cdomain-name can be used for compressing names + + fmt.Fprint(b, "func compressionLenHelperType(c map[string]int, r RR) {\n") + fmt.Fprint(b, "switch x := r.(type) {\n") + for name, _ := range domainTypes { + o := scope.Lookup(name) + st, _ := getTypeStruct(o.Type(), scope) + + fmt.Fprintf(b, "case *%s:\n", name) + for i := 1; i < st.NumFields(); i++ { + out := func(s string) { fmt.Fprintf(b, "compressionLenHelper(c, x.%s)\n", st.Field(i).Name()) } + + if _, ok := st.Field(i).Type().(*types.Slice); ok { + switch st.Tag(i) { + case `dns:"domain-name"`: + fallthrough + case `dns:"cdomain-name"`: + // For HIP we need to slice over the elements in this slice. + fmt.Fprintf(b, `for i := range x.%s { + compressionLenHelper(c, x.%s[i]) + } +`, st.Field(i).Name(), st.Field(i).Name()) + } + continue + } + + switch { + case st.Tag(i) == `dns:"cdomain-name"`: + fallthrough + case st.Tag(i) == `dns:"domain-name"`: + out(st.Field(i).Name()) + } + } + } + fmt.Fprintln(b, "}\n}\n\n") + + // compressionLenSearchType - search cdomain-tags types for compressible names. + + fmt.Fprint(b, "func compressionLenSearchType(c map[string]int, r RR) (int, bool) {\n") + fmt.Fprint(b, "switch x := r.(type) {\n") + for name, _ := range cdomainTypes { + o := scope.Lookup(name) + st, _ := getTypeStruct(o.Type(), scope) + + fmt.Fprintf(b, "case *%s:\n", name) + j := 1 + for i := 1; i < st.NumFields(); i++ { + out := func(s string, j int) { + fmt.Fprintf(b, "k%d, ok%d := compressionLenSearch(c, x.%s)\n", j, j, st.Field(i).Name()) + } + + // There are no slice types with names that can be compressed. + + switch { + case st.Tag(i) == `dns:"cdomain-name"`: + out(st.Field(i).Name(), j) + j++ + } + } + k := "k1" + ok := "ok1" + for i := 2; i < j; i++ { + k += fmt.Sprintf(" + k%d", i) + ok += fmt.Sprintf(" && ok%d", i) + } + fmt.Fprintf(b, "return %s, %s\n", k, ok) + } + fmt.Fprintln(b, "}\nreturn 0, false\n}\n\n") + + // gofmt + res, err := format.Source(b.Bytes()) + if err != nil { + b.WriteTo(os.Stderr) + log.Fatal(err) + } + + f, err := os.Create("zcompress.go") + fatalIfErr(err) + defer f.Close() + f.Write(res) +} + +func fatalIfErr(err error) { + if err != nil { + log.Fatal(err) + } +} diff --git a/vendor/github.com/miekg/dns/dane.go b/vendor/github.com/miekg/dns/dane.go index cdaa833ff2..8c4a14ef19 100644 --- a/vendor/github.com/miekg/dns/dane.go +++ b/vendor/github.com/miekg/dns/dane.go @@ -6,7 +6,6 @@ import ( "crypto/x509" "encoding/hex" "errors" - "io" ) // CertificateToDANE converts a certificate to a hex string as used in the TLSA or SMIMEA records. @@ -23,20 +22,20 @@ func CertificateToDANE(selector, matchingType uint8, cert *x509.Certificate) (st h := sha256.New() switch selector { case 0: - io.WriteString(h, string(cert.Raw)) + h.Write(cert.Raw) return hex.EncodeToString(h.Sum(nil)), nil case 1: - io.WriteString(h, string(cert.RawSubjectPublicKeyInfo)) + h.Write(cert.RawSubjectPublicKeyInfo) return hex.EncodeToString(h.Sum(nil)), nil } case 2: h := sha512.New() switch selector { case 0: - io.WriteString(h, string(cert.Raw)) + h.Write(cert.Raw) return hex.EncodeToString(h.Sum(nil)), nil case 1: - io.WriteString(h, string(cert.RawSubjectPublicKeyInfo)) + h.Write(cert.RawSubjectPublicKeyInfo) return hex.EncodeToString(h.Sum(nil)), nil } } diff --git a/vendor/github.com/miekg/dns/dns_test.go b/vendor/github.com/miekg/dns/dns_test.go index ad68533fd5..dbfe25328f 100644 --- a/vendor/github.com/miekg/dns/dns_test.go +++ b/vendor/github.com/miekg/dns/dns_test.go @@ -310,6 +310,23 @@ func TestMsgLengthCompressionMalformed(t *testing.T) { m.Len() // Should not crash. } +func TestMsgCompressLength2(t *testing.T) { + msg := new(Msg) + msg.Compress = true + msg.SetQuestion(Fqdn("bliep."), TypeANY) + msg.Answer = append(msg.Answer, &SRV{Hdr: RR_Header{Name: "blaat.", Rrtype: 0x21, Class: 0x1, Ttl: 0x3c}, Port: 0x4c57, Target: "foo.bar."}) + msg.Extra = append(msg.Extra, &A{Hdr: RR_Header{Name: "foo.bar.", Rrtype: 0x1, Class: 0x1, Ttl: 0x3c}, A: net.IP{0xac, 0x11, 0x0, 0x3}}) + predicted := msg.Len() + buf, err := msg.Pack() + if err != nil { + t.Error(err) + } + if predicted != len(buf) { + t.Errorf("predicted compressed length is wrong: predicted %s (len=%d) %d, actual %d", + msg.Question[0].Name, len(msg.Answer), predicted, len(buf)) + } +} + func TestToRFC3597(t *testing.T) { a, _ := NewRR("miek.nl. IN A 10.0.1.1") x := new(RFC3597) diff --git a/vendor/github.com/miekg/dns/dnssec.go b/vendor/github.com/miekg/dns/dnssec.go index f5f3fbdd89..07262011e6 100644 --- a/vendor/github.com/miekg/dns/dnssec.go +++ b/vendor/github.com/miekg/dns/dnssec.go @@ -43,7 +43,7 @@ const ( PRIVATEOID uint8 = 254 ) -// Map for algorithm names. +// AlgorithmToString is a map of algorithm IDs to algorithm names. var AlgorithmToString = map[uint8]string{ RSAMD5: "RSAMD5", DH: "DH", @@ -61,10 +61,10 @@ var AlgorithmToString = map[uint8]string{ PRIVATEOID: "PRIVATEOID", } -// Map of algorithm strings. +// StringToAlgorithm is the reverse of AlgorithmToString. var StringToAlgorithm = reverseInt8(AlgorithmToString) -// Map of algorithm crypto hashes. +// AlgorithmToHash is a map of algorithm crypto hash IDs to crypto.Hash's. var AlgorithmToHash = map[uint8]crypto.Hash{ RSAMD5: crypto.MD5, // Deprecated in RFC 6725 RSASHA1: crypto.SHA1, @@ -85,7 +85,7 @@ const ( SHA512 // Experimental ) -// Map for hash names. +// HashToString is a map of hash IDs to names. var HashToString = map[uint8]string{ SHA1: "SHA1", SHA256: "SHA256", @@ -94,7 +94,7 @@ var HashToString = map[uint8]string{ SHA512: "SHA512", } -// Map of hash strings. +// StringToHash is a map of names to hash IDs. var StringToHash = reverseInt8(HashToString) // DNSKEY flag values. @@ -208,9 +208,6 @@ func (k *DNSKEY) ToDS(h uint8) *DS { // "|" denotes concatenation // DNSKEY RDATA = Flags | Protocol | Algorithm | Public Key. - // digest buffer - digest := append(owner, wire...) // another copy - var hash crypto.Hash switch h { case SHA1: @@ -226,7 +223,8 @@ func (k *DNSKEY) ToDS(h uint8) *DS { } s := hash.New() - s.Write(digest) + s.Write(owner) + s.Write(wire) ds.Digest = hex.EncodeToString(s.Sum(nil)) return ds } @@ -297,7 +295,6 @@ func (rr *RRSIG) Sign(k crypto.Signer, rrset []RR) error { if err != nil { return err } - signdata = append(signdata, wire...) hash, ok := AlgorithmToHash[rr.Algorithm] if !ok { @@ -306,6 +303,7 @@ func (rr *RRSIG) Sign(k crypto.Signer, rrset []RR) error { h := hash.New() h.Write(signdata) + h.Write(wire) signature, err := sign(k, h.Sum(nil), hash, rr.Algorithm) if err != nil { @@ -415,7 +413,6 @@ func (rr *RRSIG) Verify(k *DNSKEY, rrset []RR) error { if err != nil { return err } - signeddata = append(signeddata, wire...) sigbuf := rr.sigBuf() // Get the binary signature data if rr.Algorithm == PRIVATEDNS { // PRIVATEOID @@ -438,6 +435,7 @@ func (rr *RRSIG) Verify(k *DNSKEY, rrset []RR) error { h := hash.New() h.Write(signeddata) + h.Write(wire) return rsa.VerifyPKCS1v15(pubkey, hash, h.Sum(nil), sigbuf) case ECDSAP256SHA256, ECDSAP384SHA384: @@ -452,6 +450,7 @@ func (rr *RRSIG) Verify(k *DNSKEY, rrset []RR) error { h := hash.New() h.Write(signeddata) + h.Write(wire) if ecdsa.Verify(pubkey, h.Sum(nil), r, s) { return nil } diff --git a/vendor/github.com/miekg/dns/dnssec_keygen.go b/vendor/github.com/miekg/dns/dnssec_keygen.go index 229a079370..5e4b7741a6 100644 --- a/vendor/github.com/miekg/dns/dnssec_keygen.go +++ b/vendor/github.com/miekg/dns/dnssec_keygen.go @@ -121,17 +121,17 @@ func (k *DNSKEY) setPublicKeyDSA(_Q, _P, _G, _Y *big.Int) bool { // RFC 3110: Section 2. RSA Public KEY Resource Records func exponentToBuf(_E int) []byte { var buf []byte - i := big.NewInt(int64(_E)) - if len(i.Bytes()) < 256 { - buf = make([]byte, 1) - buf[0] = uint8(len(i.Bytes())) + i := big.NewInt(int64(_E)).Bytes() + if len(i) < 256 { + buf = make([]byte, 1, 1+len(i)) + buf[0] = uint8(len(i)) } else { - buf = make([]byte, 3) + buf = make([]byte, 3, 3+len(i)) buf[0] = 0 - buf[1] = uint8(len(i.Bytes()) >> 8) - buf[2] = uint8(len(i.Bytes())) + buf[1] = uint8(len(i) >> 8) + buf[2] = uint8(len(i)) } - buf = append(buf, i.Bytes()...) + buf = append(buf, i...) return buf } diff --git a/vendor/github.com/miekg/dns/dnssec_keyscan.go b/vendor/github.com/miekg/dns/dnssec_keyscan.go index 9ff3a617ef..4f8d830b85 100644 --- a/vendor/github.com/miekg/dns/dnssec_keyscan.go +++ b/vendor/github.com/miekg/dns/dnssec_keyscan.go @@ -36,7 +36,7 @@ func (k *DNSKEY) ReadPrivateKey(q io.Reader, file string) (crypto.PrivateKey, er return nil, ErrPrivKey } // TODO(mg): check if the pubkey matches the private key - algo, err := strconv.Atoi(strings.SplitN(m["algorithm"], " ", 2)[0]) + algo, err := strconv.ParseUint(strings.SplitN(m["algorithm"], " ", 2)[0], 10, 8) if err != nil { return nil, ErrPrivKey } diff --git a/vendor/github.com/miekg/dns/edns.go b/vendor/github.com/miekg/dns/edns.go index 465b85f37f..dbff3714cf 100644 --- a/vendor/github.com/miekg/dns/edns.go +++ b/vendor/github.com/miekg/dns/edns.go @@ -157,7 +157,7 @@ type EDNS0 interface { String() string } -// The nsid EDNS0 option is used to retrieve a nameserver +// EDNS0_NSID option is used to retrieve a nameserver // identifier. When sending a request Nsid must be set to the empty string // The identifier is an opaque string encoded as hex. // Basic use pattern for creating an nsid option: @@ -197,7 +197,7 @@ func (e *EDNS0_NSID) String() string { return string(e.Nsid) } // e := new(dns.EDNS0_SUBNET) // e.Code = dns.EDNS0SUBNET // e.Family = 1 // 1 for IPv4 source address, 2 for IPv6 -// e.SourceNetMask = 32 // 32 for IPV4, 128 for IPv6 +// e.SourceNetmask = 32 // 32 for IPV4, 128 for IPv6 // e.SourceScope = 0 // e.Address = net.ParseIP("127.0.0.1").To4() // for IPv4 // // e.Address = net.ParseIP("2001:7b8:32a::2") // for IPV6 @@ -301,7 +301,7 @@ func (e *EDNS0_SUBNET) String() (s string) { return } -// The Cookie EDNS0 option +// The EDNS0_COOKIE option is used to add a DNS Cookie to a message. // // o := new(dns.OPT) // o.Hdr.Name = "." @@ -543,15 +543,15 @@ func (e *EDNS0_LOCAL) unpack(b []byte) error { return nil } +// EDNS0_TCP_KEEPALIVE is an EDNS0 option that instructs the server to keep +// the TCP connection alive. See RFC 7828. type EDNS0_TCP_KEEPALIVE struct { Code uint16 // Always EDNSTCPKEEPALIVE Length uint16 // the value 0 if the TIMEOUT is omitted, the value 2 if it is present; Timeout uint16 // an idle timeout value for the TCP connection, specified in units of 100 milliseconds, encoded in network byte order. } -func (e *EDNS0_TCP_KEEPALIVE) Option() uint16 { - return EDNS0TCPKEEPALIVE -} +func (e *EDNS0_TCP_KEEPALIVE) Option() uint16 { return EDNS0TCPKEEPALIVE } func (e *EDNS0_TCP_KEEPALIVE) pack() ([]byte, error) { if e.Timeout != 0 && e.Length != 2 { diff --git a/vendor/github.com/miekg/dns/idn/punycode.go b/vendor/github.com/miekg/dns/idn/punycode.go index 7e5c263fc8..1d03bf6ae6 100644 --- a/vendor/github.com/miekg/dns/idn/punycode.go +++ b/vendor/github.com/miekg/dns/idn/punycode.go @@ -242,11 +242,8 @@ func encode(input []byte) []byte { t, k, cp rune // weight and codepoint calculation ) - s := &bytes.Buffer{} for h := basiclen; h < fulllen; n, delta = n+1, delta+1 { nextltr = next(b, n) - s.Truncate(0) - s.WriteRune(nextltr) delta, n = delta+(nextltr-n)*rune(h+1), nextltr for _, ltr = range b { diff --git a/vendor/github.com/miekg/dns/msg.go b/vendor/github.com/miekg/dns/msg.go index 0d8cc6fb3e..b5c074f05e 100644 --- a/vendor/github.com/miekg/dns/msg.go +++ b/vendor/github.com/miekg/dns/msg.go @@ -9,6 +9,7 @@ package dns //go:generate go run msg_generate.go +//go:generate go run compress_generate.go import ( crand "crypto/rand" @@ -16,22 +17,9 @@ import ( "math/big" "math/rand" "strconv" + "sync" ) -func init() { - // Initialize default math/rand source using crypto/rand to provide better - // security without the performance trade-off. - buf := make([]byte, 8) - _, err := crand.Read(buf) - if err != nil { - // Failed to read from cryptographic source, fallback to default initial - // seed (1) by returning early - return - } - seed := binary.BigEndian.Uint64(buf) - rand.Seed(int64(seed)) -} - const maxCompressionOffset = 2 << 13 // We have 14 bits for the compression pointer var ( @@ -66,11 +54,45 @@ var ( // dns.Id = func() uint16 { return 3 } var Id func() uint16 = id +var ( + idLock sync.Mutex + idRand *rand.Rand +) + // id returns a 16 bits random number to be used as a // message id. The random provided should be good enough. func id() uint16 { - id32 := rand.Uint32() - return uint16(id32) + idLock.Lock() + + if idRand == nil { + // This (partially) works around + // https://github.com/golang/go/issues/11833 by only + // seeding idRand upon the first call to id. + + var seed int64 + var buf [8]byte + + if _, err := crand.Read(buf[:]); err == nil { + seed = int64(binary.LittleEndian.Uint64(buf[:])) + } else { + seed = rand.Int63() + } + + idRand = rand.New(rand.NewSource(seed)) + } + + // The call to idRand.Uint32 must be within the + // mutex lock because *rand.Rand is not safe for + // concurrent use. + // + // There is no added performance overhead to calling + // idRand.Uint32 inside a mutex lock over just + // calling rand.Uint32 as the global math/rand rng + // is internally protected by a sync.Mutex. + id := uint16(idRand.Uint32()) + + idLock.Unlock() + return id } // MsgHdr is a a manually-unpacked version of (id, bits). @@ -241,7 +263,9 @@ func packDomainName(s string, msg []byte, off int, compression map[string]int, c bsFresh = true } // Don't try to compress '.' - if compress && roBs[begin:] != "." { + // We should only compress when compress it true, but we should also still pick + // up names that can be used for *future* compression(s). + if compression != nil && roBs[begin:] != "." { if p, ok := compression[roBs[begin:]]; !ok { // Only offsets smaller than this can be used. if offset < maxCompressionOffset { @@ -303,6 +327,7 @@ End: // UnpackDomainName unpacks a domain name into a string. func UnpackDomainName(msg []byte, off int) (string, int, error) { s := make([]byte, 0, 64) + labels := 0 off1 := 0 lenmsg := len(msg) ptr := 0 // number of pointers followed @@ -345,6 +370,15 @@ Loop: } } } + // never exceed the allowed label count lenght (63) + if labels >= 63 { + return "", lenmsg, &Error{err: "name exceeds 63 labels"} + } + labels += 1 + // never exceed the allowed doman name length (255 octets) + if len(s) >= 255 { + return "", lenmsg, &Error{err: "name exceeded allowed 255 octets"} + } s = append(s, '.') off += c case 0xC0: @@ -364,6 +398,9 @@ Loop: if ptr++; ptr > 10 { return "", lenmsg, &Error{err: "too many compression pointers"} } + // pointer should guarantee that it advances and points forwards at least + // but the condition on previous three lines guarantees that it's + // at least loop-free off = (c^0xC0)<<8 | int(c1) default: // 0x80 and 0x40 are reserved @@ -710,12 +747,10 @@ func (dns *Msg) PackBuffer(buf []byte) (msg []byte, err error) { // We need the uncompressed length here, because we first pack it and then compress it. msg = buf - compress := dns.Compress - dns.Compress = false - if packLen := dns.Len() + 1; len(msg) < packLen { + uncompressedLen := compressedLen(dns, false) + if packLen := uncompressedLen + 1; len(msg) < packLen { msg = make([]byte, packLen) } - dns.Compress = compress // Pack it in: header and then the pieces. off := 0 @@ -868,16 +903,18 @@ func (dns *Msg) String() string { // If dns.Compress is true compression it is taken into account. Len() // is provided to be a faster way to get the size of the resulting packet, // than packing it, measuring the size and discarding the buffer. -func (dns *Msg) Len() int { +func (dns *Msg) Len() int { return compressedLen(dns, dns.Compress) } + +// compressedLen returns the message length when in compressed wire format +// when compress is true, otherwise the uncompressed length is returned. +func compressedLen(dns *Msg, compress bool) int { // We always return one more than needed. l := 12 // Message header is always 12 bytes - var compression map[string]int - if dns.Compress { - compression = make(map[string]int) - } + compression := map[string]int{} + for i := 0; i < len(dns.Question); i++ { l += dns.Question[i].len() - if dns.Compress { + if compress { compressionLenHelper(compression, dns.Question[i].Name) } } @@ -886,7 +923,7 @@ func (dns *Msg) Len() int { continue } l += dns.Answer[i].len() - if dns.Compress { + if compress { k, ok := compressionLenSearch(compression, dns.Answer[i].Header().Name) if ok { l += 1 - k @@ -904,7 +941,7 @@ func (dns *Msg) Len() int { continue } l += dns.Ns[i].len() - if dns.Compress { + if compress { k, ok := compressionLenSearch(compression, dns.Ns[i].Header().Name) if ok { l += 1 - k @@ -922,7 +959,7 @@ func (dns *Msg) Len() int { continue } l += dns.Extra[i].len() - if dns.Compress { + if compress { k, ok := compressionLenSearch(compression, dns.Extra[i].Header().Name) if ok { l += 1 - k @@ -970,97 +1007,6 @@ func compressionLenSearch(c map[string]int, s string) (int, bool) { return 0, false } -// TODO(miek): should add all types, because the all can be *used* for compression. Autogenerate from msg_generate and put in zmsg.go -func compressionLenHelperType(c map[string]int, r RR) { - switch x := r.(type) { - case *NS: - compressionLenHelper(c, x.Ns) - case *MX: - compressionLenHelper(c, x.Mx) - case *CNAME: - compressionLenHelper(c, x.Target) - case *PTR: - compressionLenHelper(c, x.Ptr) - case *SOA: - compressionLenHelper(c, x.Ns) - compressionLenHelper(c, x.Mbox) - case *MB: - compressionLenHelper(c, x.Mb) - case *MG: - compressionLenHelper(c, x.Mg) - case *MR: - compressionLenHelper(c, x.Mr) - case *MF: - compressionLenHelper(c, x.Mf) - case *MD: - compressionLenHelper(c, x.Md) - case *RT: - compressionLenHelper(c, x.Host) - case *RP: - compressionLenHelper(c, x.Mbox) - compressionLenHelper(c, x.Txt) - case *MINFO: - compressionLenHelper(c, x.Rmail) - compressionLenHelper(c, x.Email) - case *AFSDB: - compressionLenHelper(c, x.Hostname) - case *SRV: - compressionLenHelper(c, x.Target) - case *NAPTR: - compressionLenHelper(c, x.Replacement) - case *RRSIG: - compressionLenHelper(c, x.SignerName) - case *NSEC: - compressionLenHelper(c, x.NextDomain) - // HIP? - } -} - -// Only search on compressing these types. -func compressionLenSearchType(c map[string]int, r RR) (int, bool) { - switch x := r.(type) { - case *NS: - return compressionLenSearch(c, x.Ns) - case *MX: - return compressionLenSearch(c, x.Mx) - case *CNAME: - return compressionLenSearch(c, x.Target) - case *DNAME: - return compressionLenSearch(c, x.Target) - case *PTR: - return compressionLenSearch(c, x.Ptr) - case *SOA: - k, ok := compressionLenSearch(c, x.Ns) - k1, ok1 := compressionLenSearch(c, x.Mbox) - if !ok && !ok1 { - return 0, false - } - return k + k1, true - case *MB: - return compressionLenSearch(c, x.Mb) - case *MG: - return compressionLenSearch(c, x.Mg) - case *MR: - return compressionLenSearch(c, x.Mr) - case *MF: - return compressionLenSearch(c, x.Mf) - case *MD: - return compressionLenSearch(c, x.Md) - case *RT: - return compressionLenSearch(c, x.Host) - case *MINFO: - k, ok := compressionLenSearch(c, x.Rmail) - k1, ok1 := compressionLenSearch(c, x.Email) - if !ok && !ok1 { - return 0, false - } - return k + k1, true - case *AFSDB: - return compressionLenSearch(c, x.Hostname) - } - return 0, false -} - // Copy returns a new RR which is a deep-copy of r. func Copy(r RR) RR { r1 := r.copy(); return r1 } diff --git a/vendor/github.com/miekg/dns/nsecx.go b/vendor/github.com/miekg/dns/nsecx.go index 6f10f3e65b..51ce7f8b17 100644 --- a/vendor/github.com/miekg/dns/nsecx.go +++ b/vendor/github.com/miekg/dns/nsecx.go @@ -3,7 +3,6 @@ package dns import ( "crypto/sha1" "hash" - "io" "strings" ) @@ -36,15 +35,15 @@ func HashName(label string, ha uint8, iter uint16, salt string) string { } // k = 0 - name = append(name, wire...) - io.WriteString(s, string(name)) + s.Write(name) + s.Write(wire) nsec3 := s.Sum(nil) // k > 0 for k := uint16(0); k < iter; k++ { s.Reset() - nsec3 = append(nsec3, wire...) - io.WriteString(s, string(nsec3)) - nsec3 = s.Sum(nil) + s.Write(nsec3) + s.Write(wire) + nsec3 = s.Sum(nsec3[:0]) } return toBase32(nsec3) } diff --git a/vendor/github.com/miekg/dns/parse_test.go b/vendor/github.com/miekg/dns/parse_test.go index dc18b59ceb..c727c1301f 100644 --- a/vendor/github.com/miekg/dns/parse_test.go +++ b/vendor/github.com/miekg/dns/parse_test.go @@ -836,11 +836,7 @@ func TestSRVPacking(t *testing.T) { if err != nil { continue } - port := 8484 - tmp, err := strconv.Atoi(p) - if err == nil { - port = tmp - } + port, _ := strconv.ParseUint(p, 10, 16) rr := &SRV{ Hdr: RR_Header{Name: "somename.", diff --git a/vendor/github.com/miekg/dns/reverse.go b/vendor/github.com/miekg/dns/reverse.go index 099dac9486..f6e7a47a6e 100644 --- a/vendor/github.com/miekg/dns/reverse.go +++ b/vendor/github.com/miekg/dns/reverse.go @@ -6,10 +6,10 @@ var StringToType = reverseInt16(TypeToString) // StringToClass is the reverse of ClassToString, needed for string parsing. var StringToClass = reverseInt16(ClassToString) -// Map of opcodes strings. +// StringToOpcode is a map of opcodes to strings. var StringToOpcode = reverseInt(OpcodeToString) -// Map of rcodes strings. +// StringToRcode is a map of rcodes to strings. var StringToRcode = reverseInt(RcodeToString) // Reverse a map diff --git a/vendor/github.com/miekg/dns/scan.go b/vendor/github.com/miekg/dns/scan.go index d34597ba34..de0db32f8d 100644 --- a/vendor/github.com/miekg/dns/scan.go +++ b/vendor/github.com/miekg/dns/scan.go @@ -819,8 +819,8 @@ func classToInt(token string) (uint16, bool) { if len(token) < offset+1 { return 0, false } - class, ok := strconv.Atoi(token[offset:]) - if ok != nil || class > maxUint16 { + class, err := strconv.ParseUint(token[offset:], 10, 16) + if err != nil { return 0, false } return uint16(class), true @@ -832,8 +832,8 @@ func typeToInt(token string) (uint16, bool) { if len(token) < offset+1 { return 0, false } - typ, ok := strconv.Atoi(token[offset:]) - if ok != nil || typ > maxUint16 { + typ, err := strconv.ParseUint(token[offset:], 10, 16) + if err != nil { return 0, false } return uint16(typ), true diff --git a/vendor/github.com/miekg/dns/scan_rr.go b/vendor/github.com/miekg/dns/scan_rr.go index 8d6a1bf24a..f4c0d37675 100644 --- a/vendor/github.com/miekg/dns/scan_rr.go +++ b/vendor/github.com/miekg/dns/scan_rr.go @@ -447,7 +447,7 @@ func setMX(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad MX Pref", l}, "" } @@ -476,7 +476,7 @@ func setRT(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil { return nil, &ParseError{f, "bad RT Preference", l}, "" } @@ -506,7 +506,7 @@ func setAFSDB(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad AFSDB Subtype", l}, "" } @@ -551,7 +551,7 @@ func setKX(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad KX Pref", l}, "" } @@ -665,7 +665,7 @@ func setSOA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.err { return nil, &ParseError{f, "bad SOA zone parameter", l}, "" } - if j, e := strconv.Atoi(l.token); e != nil { + if j, e := strconv.ParseUint(l.token, 10, 32); e != nil { if i == 0 { // Serial should be a number return nil, &ParseError{f, "bad SOA zone parameter", l}, "" @@ -705,21 +705,21 @@ func setSRV(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad SRV Priority", l}, "" } rr.Priority = uint16(i) <-c // zBlank l = <-c // zString - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad SRV Weight", l}, "" } rr.Weight = uint16(i) <-c // zBlank l = <-c // zString - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad SRV Port", l}, "" } @@ -749,14 +749,14 @@ func setNAPTR(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad NAPTR Order", l}, "" } rr.Order = uint16(i) <-c // zBlank l = <-c // zString - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad NAPTR Preference", l}, "" } @@ -885,7 +885,7 @@ func setLOC(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { return nil, &ParseError{f, "bad LOC Latitude", l}, "" } @@ -897,7 +897,7 @@ func setLOC(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if rr.Latitude, ok = locCheckNorth(l.token, rr.Latitude); ok { goto East } - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { return nil, &ParseError{f, "bad LOC Latitude minutes", l}, "" } @@ -923,7 +923,7 @@ East: // East <-c // zBlank l = <-c - if i, e := strconv.Atoi(l.token); e != nil || l.err { + if i, e := strconv.ParseUint(l.token, 10, 32); e != nil || l.err { return nil, &ParseError{f, "bad LOC Longitude", l}, "" } else { rr.Longitude = 1000 * 60 * 60 * uint32(i) @@ -934,7 +934,7 @@ East: if rr.Longitude, ok = locCheckEast(l.token, rr.Longitude); ok { goto Altitude } - if i, e := strconv.Atoi(l.token); e != nil || l.err { + if i, e := strconv.ParseUint(l.token, 10, 32); e != nil || l.err { return nil, &ParseError{f, "bad LOC Longitude minutes", l}, "" } else { rr.Longitude += 1000 * 60 * uint32(i) @@ -1016,7 +1016,7 @@ func setHIP(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, l.comment } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad HIP PublicKeyAlgorithm", l}, "" } @@ -1077,14 +1077,14 @@ func setCERT(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { } if v, ok := StringToCertType[l.token]; ok { rr.Type = v - } else if i, e := strconv.Atoi(l.token); e != nil { + } else if i, e := strconv.ParseUint(l.token, 10, 16); e != nil { return nil, &ParseError{f, "bad CERT Type", l}, "" } else { rr.Type = uint16(i) } <-c // zBlank l = <-c // zString - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad CERT KeyTag", l}, "" } @@ -1093,7 +1093,7 @@ func setCERT(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { l = <-c // zString if v, ok := StringToAlgorithm[l.token]; ok { rr.Algorithm = v - } else if i, e := strconv.Atoi(l.token); e != nil { + } else if i, e := strconv.ParseUint(l.token, 10, 8); e != nil { return nil, &ParseError{f, "bad CERT Algorithm", l}, "" } else { rr.Algorithm = uint8(i) @@ -1148,21 +1148,21 @@ func setRRSIG(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { } <-c // zBlank l = <-c - i, err := strconv.Atoi(l.token) + i, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { return nil, &ParseError{f, "bad RRSIG Algorithm", l}, "" } rr.Algorithm = uint8(i) <-c // zBlank l = <-c - i, err = strconv.Atoi(l.token) + i, err = strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { return nil, &ParseError{f, "bad RRSIG Labels", l}, "" } rr.Labels = uint8(i) <-c // zBlank l = <-c - i, err = strconv.Atoi(l.token) + i, err = strconv.ParseUint(l.token, 10, 32) if err != nil || l.err { return nil, &ParseError{f, "bad RRSIG OrigTtl", l}, "" } @@ -1193,7 +1193,7 @@ func setRRSIG(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { } <-c // zBlank l = <-c - i, err = strconv.Atoi(l.token) + i, err = strconv.ParseUint(l.token, 10, 16) if err != nil || l.err { return nil, &ParseError{f, "bad RRSIG KeyTag", l}, "" } @@ -1274,21 +1274,21 @@ func setNSEC3(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, l.comment } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad NSEC3 Hash", l}, "" } rr.Hash = uint8(i) <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad NSEC3 Flags", l}, "" } rr.Flags = uint8(i) <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad NSEC3 Iterations", l}, "" } @@ -1342,21 +1342,21 @@ func setNSEC3PARAM(h RR_Header, c chan lex, o, f string) (RR, *ParseError, strin if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad NSEC3PARAM Hash", l}, "" } rr.Hash = uint8(i) <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad NSEC3PARAM Flags", l}, "" } rr.Flags = uint8(i) <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad NSEC3PARAM Iterations", l}, "" } @@ -1440,14 +1440,14 @@ func setSSHFP(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad SSHFP Algorithm", l}, "" } rr.Algorithm = uint8(i) <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad SSHFP Type", l}, "" } @@ -1469,21 +1469,21 @@ func setDNSKEYs(h RR_Header, c chan lex, o, f, typ string) (RR, *ParseError, str if l.length == 0 { return rr, nil, l.comment } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad " + typ + " Flags", l}, "" } rr.Flags = uint16(i) <-c // zBlank l = <-c // zString - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad " + typ + " Protocol", l}, "" } rr.Protocol = uint8(i) <-c // zBlank l = <-c // zString - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad " + typ + " Algorithm", l}, "" } @@ -1525,21 +1525,21 @@ func setRKEY(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, l.comment } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad RKEY Flags", l}, "" } rr.Flags = uint16(i) <-c // zBlank l = <-c // zString - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad RKEY Protocol", l}, "" } rr.Protocol = uint8(i) <-c // zBlank l = <-c // zString - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad RKEY Algorithm", l}, "" } @@ -1610,14 +1610,14 @@ func setDSs(h RR_Header, c chan lex, o, f, typ string) (RR, *ParseError, string) if l.length == 0 { return rr, nil, l.comment } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad " + typ + " KeyTag", l}, "" } rr.KeyTag = uint16(i) <-c // zBlank l = <-c - if i, e := strconv.Atoi(l.token); e != nil { + if i, e = strconv.ParseUint(l.token, 10, 8); e != nil { i, ok := StringToAlgorithm[l.tokenUpper] if !ok || l.err { return nil, &ParseError{f, "bad " + typ + " Algorithm", l}, "" @@ -1628,7 +1628,7 @@ func setDSs(h RR_Header, c chan lex, o, f, typ string) (RR, *ParseError, string) } <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad " + typ + " DigestType", l}, "" } @@ -1669,14 +1669,14 @@ func setTA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, l.comment } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad TA KeyTag", l}, "" } rr.KeyTag = uint16(i) <-c // zBlank l = <-c - if i, e := strconv.Atoi(l.token); e != nil { + if i, e := strconv.ParseUint(l.token, 10, 8); e != nil { i, ok := StringToAlgorithm[l.tokenUpper] if !ok || l.err { return nil, &ParseError{f, "bad TA Algorithm", l}, "" @@ -1687,7 +1687,7 @@ func setTA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { } <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad TA DigestType", l}, "" } @@ -1707,21 +1707,21 @@ func setTLSA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, l.comment } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad TLSA Usage", l}, "" } rr.Usage = uint8(i) <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad TLSA Selector", l}, "" } rr.Selector = uint8(i) <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad TLSA MatchingType", l}, "" } @@ -1742,21 +1742,21 @@ func setSMIMEA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, l.comment } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad SMIMEA Usage", l}, "" } rr.Usage = uint8(i) <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad SMIMEA Selector", l}, "" } rr.Selector = uint8(i) <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { return nil, &ParseError{f, "bad SMIMEA MatchingType", l}, "" } @@ -1842,14 +1842,14 @@ func setURI(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad URI Priority", l}, "" } rr.Priority = uint16(i) <-c // zBlank l = <-c - i, e = strconv.Atoi(l.token) + i, e = strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad URI Weight", l}, "" } @@ -1888,7 +1888,7 @@ func setNID(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad NID Preference", l}, "" } @@ -1911,7 +1911,7 @@ func setL32(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad L32 Preference", l}, "" } @@ -1933,7 +1933,7 @@ func setLP(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad LP Preference", l}, "" } @@ -1966,7 +1966,7 @@ func setL64(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad L64 Preference", l}, "" } @@ -1988,7 +1988,7 @@ func setUID(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { return nil, &ParseError{f, "bad UID Uid", l}, "" } @@ -2003,7 +2003,7 @@ func setGID(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { return nil, &ParseError{f, "bad GID Gid", l}, "" } @@ -2033,7 +2033,7 @@ func setPX(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, "" } - i, e := strconv.Atoi(l.token) + i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { return nil, &ParseError{f, "bad PX Preference", l}, "" } @@ -2079,7 +2079,7 @@ func setCAA(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { if l.length == 0 { return rr, nil, l.comment } - i, err := strconv.Atoi(l.token) + i, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { return nil, &ParseError{f, "bad CAA Flag", l}, "" } diff --git a/vendor/github.com/miekg/dns/server_test.go b/vendor/github.com/miekg/dns/server_test.go index 098be2ebeb..f17a2f90f7 100644 --- a/vendor/github.com/miekg/dns/server_test.go +++ b/vendor/github.com/miekg/dns/server_test.go @@ -20,7 +20,7 @@ func HelloServer(w ResponseWriter, req *Msg) { w.WriteMsg(m) } -func HelloServerBadId(w ResponseWriter, req *Msg) { +func HelloServerBadID(w ResponseWriter, req *Msg) { m := new(Msg) m.SetReply(req) m.Id++ @@ -548,7 +548,7 @@ func TestHandlerCloseTCP(t *testing.T) { return } time.Sleep(time.Second / 10) - tries += 1 + tries++ goto exchange } }() diff --git a/vendor/github.com/miekg/dns/sig0.go b/vendor/github.com/miekg/dns/sig0.go index 2dce06af82..f31e9e6843 100644 --- a/vendor/github.com/miekg/dns/sig0.go +++ b/vendor/github.com/miekg/dns/sig0.go @@ -60,16 +60,15 @@ func (rr *SIG) Sign(k crypto.Signer, m *Msg) ([]byte, error) { } rr.Signature = toBase64(signature) - sig := string(signature) - buf = append(buf, sig...) + buf = append(buf, signature...) if len(buf) > int(^uint16(0)) { return nil, ErrBuf } // Adjust sig data length rdoff := len(mbuf) + 1 + 2 + 2 + 4 rdlen := binary.BigEndian.Uint16(buf[rdoff:]) - rdlen += uint16(len(sig)) + rdlen += uint16(len(signature)) binary.BigEndian.PutUint16(buf[rdoff:], rdlen) // Adjust additional count adc := binary.BigEndian.Uint16(buf[10:]) diff --git a/vendor/github.com/miekg/dns/smimea.go b/vendor/github.com/miekg/dns/smimea.go index 3a4bb57003..4e7ded4b38 100644 --- a/vendor/github.com/miekg/dns/smimea.go +++ b/vendor/github.com/miekg/dns/smimea.go @@ -33,15 +33,15 @@ func (r *SMIMEA) Verify(cert *x509.Certificate) error { return ErrSig // ErrSig, really? } -// SIMEAName returns the ownername of a SMIMEA resource record as per the +// SMIMEAName returns the ownername of a SMIMEA resource record as per the // format specified in RFC 'draft-ietf-dane-smime-12' Section 2 and 3 -func SMIMEAName(email_address string, domain_name string) (string, error) { +func SMIMEAName(email, domain string) (string, error) { hasher := sha256.New() - hasher.Write([]byte(email_address)) + hasher.Write([]byte(email)) // RFC Section 3: "The local-part is hashed using the SHA2-256 // algorithm with the hash truncated to 28 octets and // represented in its hexadecimal representation to become the // left-most label in the prepared domain name" - return hex.EncodeToString(hasher.Sum(nil)[:28]) + "." + "_smimecert." + domain_name, nil + return hex.EncodeToString(hasher.Sum(nil)[:28]) + "." + "_smimecert." + domain, nil } diff --git a/vendor/github.com/miekg/dns/tsig.go b/vendor/github.com/miekg/dns/tsig.go index 78365e1c5b..24013096b0 100644 --- a/vendor/github.com/miekg/dns/tsig.go +++ b/vendor/github.com/miekg/dns/tsig.go @@ -9,7 +9,6 @@ import ( "encoding/binary" "encoding/hex" "hash" - "io" "strconv" "strings" "time" @@ -124,7 +123,7 @@ func TsigGenerate(m *Msg, secret, requestMAC string, timersOnly bool) ([]byte, s default: return nil, "", ErrKeyAlg } - io.WriteString(h, string(buf)) + h.Write(buf) t.MAC = hex.EncodeToString(h.Sum(nil)) t.MACSize = uint16(len(t.MAC) / 2) // Size is half! diff --git a/vendor/github.com/miekg/dns/types.go b/vendor/github.com/miekg/dns/types.go index c8b3191e5a..c17251cb6e 100644 --- a/vendor/github.com/miekg/dns/types.go +++ b/vendor/github.com/miekg/dns/types.go @@ -144,7 +144,7 @@ const ( OpcodeUpdate = 5 ) -// Headers is the wire format for the DNS packet header. +// Header is the wire format for the DNS packet header. type Header struct { Id uint16 Bits uint16 diff --git a/vendor/github.com/miekg/dns/types_generate.go b/vendor/github.com/miekg/dns/types_generate.go index bf80da329c..dd1310942b 100644 --- a/vendor/github.com/miekg/dns/types_generate.go +++ b/vendor/github.com/miekg/dns/types_generate.go @@ -197,7 +197,7 @@ func main() { case st.Tag(i) == "": switch st.Field(i).Type().(*types.Basic).Kind() { case types.Uint8: - o("l += 1 // %s\n") + o("l++ // %s\n") case types.Uint16: o("l += 2 // %s\n") case types.Uint32: diff --git a/vendor/github.com/miekg/dns/udp.go b/vendor/github.com/miekg/dns/udp.go index c79c6c8837..af111b9a89 100644 --- a/vendor/github.com/miekg/dns/udp.go +++ b/vendor/github.com/miekg/dns/udp.go @@ -1,10 +1,9 @@ -// +build !windows,!plan9 +// +build !windows package dns import ( "net" - "syscall" ) // SessionUDP holds the remote address and the associated @@ -17,29 +16,6 @@ type SessionUDP struct { // RemoteAddr returns the remote network address. func (s *SessionUDP) RemoteAddr() net.Addr { return s.raddr } -// setUDPSocketOptions sets the UDP socket options. -// This function is implemented on a per platform basis. See udp_*.go for more details -func setUDPSocketOptions(conn *net.UDPConn) error { - sa, err := getUDPSocketName(conn) - if err != nil { - return err - } - switch sa.(type) { - case *syscall.SockaddrInet6: - v6only, err := getUDPSocketOptions6Only(conn) - if err != nil { - return err - } - setUDPSocketOptions6(conn) - if !v6only { - setUDPSocketOptions4(conn) - } - case *syscall.SockaddrInet4: - setUDPSocketOptions4(conn) - } - return nil -} - // ReadFromSessionUDP acts just like net.UDPConn.ReadFrom(), but returns a session object instead of a // net.UDPAddr. func ReadFromSessionUDP(conn *net.UDPConn, b []byte) (int, *SessionUDP, error) { diff --git a/vendor/github.com/miekg/dns/udp_linux.go b/vendor/github.com/miekg/dns/udp_linux.go index 142a80073e..033df42399 100644 --- a/vendor/github.com/miekg/dns/udp_linux.go +++ b/vendor/github.com/miekg/dns/udp_linux.go @@ -1,4 +1,4 @@ -// +build linux +// +build linux,!appengine package dns @@ -15,6 +15,29 @@ import ( "syscall" ) +// setUDPSocketOptions sets the UDP socket options. +// This function is implemented on a per platform basis. See udp_*.go for more details +func setUDPSocketOptions(conn *net.UDPConn) error { + sa, err := getUDPSocketName(conn) + if err != nil { + return err + } + switch sa.(type) { + case *syscall.SockaddrInet6: + v6only, err := getUDPSocketOptions6Only(conn) + if err != nil { + return err + } + setUDPSocketOptions6(conn) + if !v6only { + setUDPSocketOptions4(conn) + } + case *syscall.SockaddrInet4: + setUDPSocketOptions4(conn) + } + return nil +} + // setUDPSocketOptions4 prepares the v4 socket for sessions. func setUDPSocketOptions4(conn *net.UDPConn) error { file, err := conn.File() diff --git a/vendor/github.com/miekg/dns/udp_other.go b/vendor/github.com/miekg/dns/udp_other.go index d40732441b..488a282b26 100644 --- a/vendor/github.com/miekg/dns/udp_other.go +++ b/vendor/github.com/miekg/dns/udp_other.go @@ -1,17 +1,15 @@ -// +build !linux,!plan9 +// +build !linux appengine package dns import ( "net" - "syscall" ) // These do nothing. See udp_linux.go for an example of how to implement this. // We tried to adhire to some kind of naming scheme. - +func setUDPSocketOptions(conn *net.UDPConn) error { return nil } func setUDPSocketOptions4(conn *net.UDPConn) error { return nil } func setUDPSocketOptions6(conn *net.UDPConn) error { return nil } func getUDPSocketOptions6Only(conn *net.UDPConn) (bool, error) { return false, nil } -func getUDPSocketName(conn *net.UDPConn) (syscall.Sockaddr, error) { return nil, nil } diff --git a/vendor/github.com/miekg/dns/udp_plan9.go b/vendor/github.com/miekg/dns/udp_plan9.go deleted file mode 100644 index b794deeba0..0000000000 --- a/vendor/github.com/miekg/dns/udp_plan9.go +++ /dev/null @@ -1,34 +0,0 @@ -package dns - -import ( - "net" -) - -func setUDPSocketOptions(conn *net.UDPConn) error { return nil } - -// SessionUDP holds the remote address and the associated -// out-of-band data. -type SessionUDP struct { - raddr *net.UDPAddr - context []byte -} - -// RemoteAddr returns the remote network address. -func (s *SessionUDP) RemoteAddr() net.Addr { return s.raddr } - -// ReadFromSessionUDP acts just like net.UDPConn.ReadFrom(), but returns a session object instead of a -// net.UDPAddr. -func ReadFromSessionUDP(conn *net.UDPConn, b []byte) (int, *SessionUDP, error) { - oob := make([]byte, 40) - n, oobn, _, raddr, err := conn.ReadMsgUDP(b, oob) - if err != nil { - return n, nil, err - } - return n, &SessionUDP{raddr, oob[:oobn]}, err -} - -// WriteToSessionUDP acts just like net.UDPConn.WritetTo(), but uses a *SessionUDP instead of a net.Addr. -func WriteToSessionUDP(conn *net.UDPConn, b []byte, session *SessionUDP) (int, error) { - n, _, err := conn.WriteMsgUDP(b, session.context, session.raddr) - return n, err -} diff --git a/vendor/github.com/miekg/dns/udp_windows.go b/vendor/github.com/miekg/dns/udp_windows.go index 2ce4b33002..51e532ac2a 100644 --- a/vendor/github.com/miekg/dns/udp_windows.go +++ b/vendor/github.com/miekg/dns/udp_windows.go @@ -8,6 +8,8 @@ type SessionUDP struct { raddr *net.UDPAddr } +func (s *SessionUDP) RemoteAddr() net.Addr { return s.raddr } + // ReadFromSessionUDP acts just like net.UDPConn.ReadFrom(), but returns a session object instead of a // net.UDPAddr. func ReadFromSessionUDP(conn *net.UDPConn, b []byte) (int, *SessionUDP, error) { @@ -25,10 +27,3 @@ func WriteToSessionUDP(conn *net.UDPConn, b []byte, session *SessionUDP) (int, e return n, err } -func (s *SessionUDP) RemoteAddr() net.Addr { return s.raddr } - -// setUDPSocketOptions sets the UDP socket options. -// This function is implemented on a per platform basis. See udp_*.go for more details -func setUDPSocketOptions(conn *net.UDPConn) error { - return nil -} diff --git a/vendor/github.com/miekg/dns/update_test.go b/vendor/github.com/miekg/dns/update_test.go index 56602dfe9f..12760a1ee5 100644 --- a/vendor/github.com/miekg/dns/update_test.go +++ b/vendor/github.com/miekg/dns/update_test.go @@ -92,28 +92,28 @@ func TestPreReqAndRemovals(t *testing.T) { m.Id = 1234 // Use a full set of RRs each time, so we are sure the rdata is stripped. - rr_name1, _ := NewRR("name_used. 3600 IN A 127.0.0.1") - rr_name2, _ := NewRR("name_not_used. 3600 IN A 127.0.0.1") - rr_remove1, _ := NewRR("remove1. 3600 IN A 127.0.0.1") - rr_remove2, _ := NewRR("remove2. 3600 IN A 127.0.0.1") - rr_remove3, _ := NewRR("remove3. 3600 IN A 127.0.0.1") - rr_insert, _ := NewRR("insert. 3600 IN A 127.0.0.1") - rr_rrset1, _ := NewRR("rrset_used1. 3600 IN A 127.0.0.1") - rr_rrset2, _ := NewRR("rrset_used2. 3600 IN A 127.0.0.1") - rr_rrset3, _ := NewRR("rrset_not_used. 3600 IN A 127.0.0.1") + rrName1, _ := NewRR("name_used. 3600 IN A 127.0.0.1") + rrName2, _ := NewRR("name_not_used. 3600 IN A 127.0.0.1") + rrRemove1, _ := NewRR("remove1. 3600 IN A 127.0.0.1") + rrRemove2, _ := NewRR("remove2. 3600 IN A 127.0.0.1") + rrRemove3, _ := NewRR("remove3. 3600 IN A 127.0.0.1") + rrInsert, _ := NewRR("insert. 3600 IN A 127.0.0.1") + rrRrset1, _ := NewRR("rrset_used1. 3600 IN A 127.0.0.1") + rrRrset2, _ := NewRR("rrset_used2. 3600 IN A 127.0.0.1") + rrRrset3, _ := NewRR("rrset_not_used. 3600 IN A 127.0.0.1") // Handle the prereqs. - m.NameUsed([]RR{rr_name1}) - m.NameNotUsed([]RR{rr_name2}) - m.RRsetUsed([]RR{rr_rrset1}) - m.Used([]RR{rr_rrset2}) - m.RRsetNotUsed([]RR{rr_rrset3}) + m.NameUsed([]RR{rrName1}) + m.NameNotUsed([]RR{rrName2}) + m.RRsetUsed([]RR{rrRrset1}) + m.Used([]RR{rrRrset2}) + m.RRsetNotUsed([]RR{rrRrset3}) // and now the updates. - m.RemoveName([]RR{rr_remove1}) - m.RemoveRRset([]RR{rr_remove2}) - m.Remove([]RR{rr_remove3}) - m.Insert([]RR{rr_insert}) + m.RemoveName([]RR{rrRemove1}) + m.RemoveRRset([]RR{rrRemove2}) + m.Remove([]RR{rrRemove3}) + m.Insert([]RR{rrInsert}) // This test function isn't a Example function because we print these RR with tabs at the // end and the Example function trim these, thus they never match. diff --git a/vendor/github.com/miekg/dns/zcompress.go b/vendor/github.com/miekg/dns/zcompress.go new file mode 100644 index 0000000000..86a31a9168 --- /dev/null +++ b/vendor/github.com/miekg/dns/zcompress.go @@ -0,0 +1,119 @@ +// *** DO NOT MODIFY *** +// AUTOGENERATED BY go generate from compress_generate.go + +package dns + +func compressionLenHelperType(c map[string]int, r RR) { + switch x := r.(type) { + case *KX: + compressionLenHelper(c, x.Exchanger) + case *MX: + compressionLenHelper(c, x.Mx) + case *NSEC: + compressionLenHelper(c, x.NextDomain) + case *DNAME: + compressionLenHelper(c, x.Target) + case *HIP: + for i := range x.RendezvousServers { + compressionLenHelper(c, x.RendezvousServers[i]) + } + case *CNAME: + compressionLenHelper(c, x.Target) + case *MR: + compressionLenHelper(c, x.Mr) + case *PX: + compressionLenHelper(c, x.Map822) + compressionLenHelper(c, x.Mapx400) + case *SIG: + compressionLenHelper(c, x.SignerName) + case *SRV: + compressionLenHelper(c, x.Target) + case *TALINK: + compressionLenHelper(c, x.PreviousName) + compressionLenHelper(c, x.NextName) + case *LP: + compressionLenHelper(c, x.Fqdn) + case *NAPTR: + compressionLenHelper(c, x.Replacement) + case *NS: + compressionLenHelper(c, x.Ns) + case *RP: + compressionLenHelper(c, x.Mbox) + compressionLenHelper(c, x.Txt) + case *RRSIG: + compressionLenHelper(c, x.SignerName) + case *TKEY: + compressionLenHelper(c, x.Algorithm) + case *TSIG: + compressionLenHelper(c, x.Algorithm) + case *AFSDB: + compressionLenHelper(c, x.Hostname) + case *MF: + compressionLenHelper(c, x.Mf) + case *RT: + compressionLenHelper(c, x.Host) + case *MINFO: + compressionLenHelper(c, x.Rmail) + compressionLenHelper(c, x.Email) + case *PTR: + compressionLenHelper(c, x.Ptr) + case *SOA: + compressionLenHelper(c, x.Ns) + compressionLenHelper(c, x.Mbox) + case *MD: + compressionLenHelper(c, x.Md) + case *NSAPPTR: + compressionLenHelper(c, x.Ptr) + case *MG: + compressionLenHelper(c, x.Mg) + case *MB: + compressionLenHelper(c, x.Mb) + } +} + +func compressionLenSearchType(c map[string]int, r RR) (int, bool) { + switch x := r.(type) { + case *MF: + k1, ok1 := compressionLenSearch(c, x.Mf) + return k1, ok1 + case *MG: + k1, ok1 := compressionLenSearch(c, x.Mg) + return k1, ok1 + case *MINFO: + k1, ok1 := compressionLenSearch(c, x.Rmail) + k2, ok2 := compressionLenSearch(c, x.Email) + return k1 + k2, ok1 && ok2 + case *MR: + k1, ok1 := compressionLenSearch(c, x.Mr) + return k1, ok1 + case *PTR: + k1, ok1 := compressionLenSearch(c, x.Ptr) + return k1, ok1 + case *AFSDB: + k1, ok1 := compressionLenSearch(c, x.Hostname) + return k1, ok1 + case *CNAME: + k1, ok1 := compressionLenSearch(c, x.Target) + return k1, ok1 + case *MD: + k1, ok1 := compressionLenSearch(c, x.Md) + return k1, ok1 + case *RT: + k1, ok1 := compressionLenSearch(c, x.Host) + return k1, ok1 + case *SOA: + k1, ok1 := compressionLenSearch(c, x.Ns) + k2, ok2 := compressionLenSearch(c, x.Mbox) + return k1 + k2, ok1 && ok2 + case *MB: + k1, ok1 := compressionLenSearch(c, x.Mb) + return k1, ok1 + case *MX: + k1, ok1 := compressionLenSearch(c, x.Mx) + return k1, ok1 + case *NS: + k1, ok1 := compressionLenSearch(c, x.Ns) + return k1, ok1 + } + return 0, false +} diff --git a/vendor/github.com/miekg/dns/ztypes.go b/vendor/github.com/miekg/dns/ztypes.go index 3c052773e9..311b8243b7 100644 --- a/vendor/github.com/miekg/dns/ztypes.go +++ b/vendor/github.com/miekg/dns/ztypes.go @@ -254,7 +254,7 @@ func (rr *ANY) len() int { } func (rr *CAA) len() int { l := rr.Hdr.len() - l += 1 // Flag + l++ // Flag l += len(rr.Tag) + 1 l += len(rr.Value) return l @@ -263,7 +263,7 @@ func (rr *CERT) len() int { l := rr.Hdr.len() l += 2 // Type l += 2 // KeyTag - l += 1 // Algorithm + l++ // Algorithm l += base64.StdEncoding.DecodedLen(len(rr.Certificate)) return l } @@ -285,16 +285,16 @@ func (rr *DNAME) len() int { func (rr *DNSKEY) len() int { l := rr.Hdr.len() l += 2 // Flags - l += 1 // Protocol - l += 1 // Algorithm + l++ // Protocol + l++ // Algorithm l += base64.StdEncoding.DecodedLen(len(rr.PublicKey)) return l } func (rr *DS) len() int { l := rr.Hdr.len() l += 2 // KeyTag - l += 1 // Algorithm - l += 1 // DigestType + l++ // Algorithm + l++ // DigestType l += len(rr.Digest)/2 + 1 return l } @@ -333,8 +333,8 @@ func (rr *HINFO) len() int { } func (rr *HIP) len() int { l := rr.Hdr.len() - l += 1 // HitLength - l += 1 // PublicKeyAlgorithm + l++ // HitLength + l++ // PublicKeyAlgorithm l += 2 // PublicKeyLength l += len(rr.Hit)/2 + 1 l += base64.StdEncoding.DecodedLen(len(rr.PublicKey)) @@ -363,10 +363,10 @@ func (rr *L64) len() int { } func (rr *LOC) len() int { l := rr.Hdr.len() - l += 1 // Version - l += 1 // Size - l += 1 // HorizPre - l += 1 // VertPre + l++ // Version + l++ // Size + l++ // HorizPre + l++ // VertPre l += 4 // Latitude l += 4 // Longitude l += 4 // Altitude @@ -455,10 +455,10 @@ func (rr *NSAPPTR) len() int { } func (rr *NSEC3PARAM) len() int { l := rr.Hdr.len() - l += 1 // Hash - l += 1 // Flags + l++ // Hash + l++ // Flags l += 2 // Iterations - l += 1 // SaltLength + l++ // SaltLength l += len(rr.Salt)/2 + 1 return l } @@ -487,8 +487,8 @@ func (rr *RFC3597) len() int { func (rr *RKEY) len() int { l := rr.Hdr.len() l += 2 // Flags - l += 1 // Protocol - l += 1 // Algorithm + l++ // Protocol + l++ // Algorithm l += base64.StdEncoding.DecodedLen(len(rr.PublicKey)) return l } @@ -501,8 +501,8 @@ func (rr *RP) len() int { func (rr *RRSIG) len() int { l := rr.Hdr.len() l += 2 // TypeCovered - l += 1 // Algorithm - l += 1 // Labels + l++ // Algorithm + l++ // Labels l += 4 // OrigTtl l += 4 // Expiration l += 4 // Inception @@ -519,9 +519,9 @@ func (rr *RT) len() int { } func (rr *SMIMEA) len() int { l := rr.Hdr.len() - l += 1 // Usage - l += 1 // Selector - l += 1 // MatchingType + l++ // Usage + l++ // Selector + l++ // MatchingType l += len(rr.Certificate)/2 + 1 return l } @@ -553,16 +553,16 @@ func (rr *SRV) len() int { } func (rr *SSHFP) len() int { l := rr.Hdr.len() - l += 1 // Algorithm - l += 1 // Type + l++ // Algorithm + l++ // Type l += len(rr.FingerPrint)/2 + 1 return l } func (rr *TA) len() int { l := rr.Hdr.len() l += 2 // KeyTag - l += 1 // Algorithm - l += 1 // DigestType + l++ // Algorithm + l++ // DigestType l += len(rr.Digest)/2 + 1 return l } @@ -587,9 +587,9 @@ func (rr *TKEY) len() int { } func (rr *TLSA) len() int { l := rr.Hdr.len() - l += 1 // Usage - l += 1 // Selector - l += 1 // MatchingType + l++ // Usage + l++ // Selector + l++ // MatchingType l += len(rr.Certificate)/2 + 1 return l } diff --git a/vendor/github.com/prometheus/client_model/AUTHORS.md b/vendor/github.com/prometheus/client_model/AUTHORS.md deleted file mode 100644 index e8b3efa6ac..0000000000 --- a/vendor/github.com/prometheus/client_model/AUTHORS.md +++ /dev/null @@ -1,13 +0,0 @@ -The Prometheus project was started by Matt T. Proud (emeritus) and -Julius Volz in 2012. - -Maintainers of this repository: - -* Björn Rabenstein - -The following individuals have contributed code to this repository -(listed in alphabetical order): - -* Björn Rabenstein -* Matt T. Proud -* Tobias Schmidt diff --git a/vendor/github.com/prometheus/client_model/CONTRIBUTING.md b/vendor/github.com/prometheus/client_model/CONTRIBUTING.md index 573d58741b..40503edbf1 100644 --- a/vendor/github.com/prometheus/client_model/CONTRIBUTING.md +++ b/vendor/github.com/prometheus/client_model/CONTRIBUTING.md @@ -2,16 +2,16 @@ Prometheus uses GitHub to manage reviews of pull requests. -* If you have a trivial fix or improvement, go ahead and create a pull - request, addressing (with `@...`) one or more of the maintainers - (see [AUTHORS.md](AUTHORS.md)) in the description of the pull request. +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) the maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. * If you plan to do something more involved, first discuss your ideas on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). This will avoid unnecessary work and surely give you and us a good deal of inspiration. -* Relevant coding style guidelines for the Go parts are the [Go Code Review +* Relevant coding style guidelines are the [Go Code Review Comments](https://code.google.com/p/go-wiki/wiki/CodeReviewComments) and the _Formatting and style_ section of Peter Bourgon's [Go: Best Practices for Production diff --git a/vendor/github.com/prometheus/client_model/MAINTAINERS.md b/vendor/github.com/prometheus/client_model/MAINTAINERS.md new file mode 100644 index 0000000000..3ede55fe18 --- /dev/null +++ b/vendor/github.com/prometheus/client_model/MAINTAINERS.md @@ -0,0 +1 @@ +* Björn Rabenstein diff --git a/vendor/github.com/prometheus/common/AUTHORS.md b/vendor/github.com/prometheus/common/AUTHORS.md deleted file mode 100644 index c63f4d3951..0000000000 --- a/vendor/github.com/prometheus/common/AUTHORS.md +++ /dev/null @@ -1,11 +0,0 @@ -Maintainers of this repository: - -* Fabian Reinartz - -The following individuals have contributed code to this repository -(listed in alphabetical order): - -* Björn Rabenstein -* Fabian Reinartz -* Julius Volz -* Miguel Molina diff --git a/vendor/github.com/prometheus/common/CONTRIBUTING.md b/vendor/github.com/prometheus/common/CONTRIBUTING.md index 5705f0fbea..40503edbf1 100644 --- a/vendor/github.com/prometheus/common/CONTRIBUTING.md +++ b/vendor/github.com/prometheus/common/CONTRIBUTING.md @@ -2,9 +2,9 @@ Prometheus uses GitHub to manage reviews of pull requests. -* If you have a trivial fix or improvement, go ahead and create a pull - request, addressing (with `@...`) one or more of the maintainers - (see [AUTHORS.md](AUTHORS.md)) in the description of the pull request. +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) the maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. * If you plan to do something more involved, first discuss your ideas on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). diff --git a/vendor/github.com/prometheus/common/MAINTAINERS.md b/vendor/github.com/prometheus/common/MAINTAINERS.md new file mode 100644 index 0000000000..1b31521616 --- /dev/null +++ b/vendor/github.com/prometheus/common/MAINTAINERS.md @@ -0,0 +1 @@ +* Fabian Reinartz diff --git a/vendor/github.com/prometheus/common/model/value.go b/vendor/github.com/prometheus/common/model/value.go index 7728abaeea..c9ed3ffd82 100644 --- a/vendor/github.com/prometheus/common/model/value.go +++ b/vendor/github.com/prometheus/common/model/value.go @@ -129,11 +129,8 @@ func (s *Sample) Equal(o *Sample) bool { if !s.Timestamp.Equal(o.Timestamp) { return false } - if s.Value.Equal(o.Value) { - return false - } - return true + return s.Value.Equal(o.Value) } func (s Sample) String() string { diff --git a/vendor/github.com/prometheus/common/model/value_test.go b/vendor/github.com/prometheus/common/model/value_test.go index 8d2b69ea14..b97dcf84cf 100644 --- a/vendor/github.com/prometheus/common/model/value_test.go +++ b/vendor/github.com/prometheus/common/model/value_test.go @@ -21,7 +21,7 @@ import ( "testing" ) -func TestEqual(t *testing.T) { +func TestEqualValues(t *testing.T) { tests := map[string]struct { in1, in2 SampleValue want bool @@ -76,6 +76,57 @@ func TestEqual(t *testing.T) { } } +func TestEqualSamples(t *testing.T) { + testSample := &Sample{} + + tests := map[string]struct { + in1, in2 *Sample + want bool + }{ + "equal pointers": { + in1: testSample, + in2: testSample, + want: true, + }, + "different metrics": { + in1: &Sample{Metric: Metric{"foo": "bar"}}, + in2: &Sample{Metric: Metric{"foo": "biz"}}, + want: false, + }, + "different timestamp": { + in1: &Sample{Timestamp: 0}, + in2: &Sample{Timestamp: 1}, + want: false, + }, + "different value": { + in1: &Sample{Value: 0}, + in2: &Sample{Value: 1}, + want: false, + }, + "equal samples": { + in1: &Sample{ + Metric: Metric{"foo": "bar"}, + Timestamp: 0, + Value: 1, + }, + in2: &Sample{ + Metric: Metric{"foo": "bar"}, + Timestamp: 0, + Value: 1, + }, + want: true, + }, + } + + for name, test := range tests { + got := test.in1.Equal(test.in2) + if got != test.want { + t.Errorf("Comparing %s, %v and %v: got %t, want %t", name, test.in1, test.in2, got, test.want) + } + } + +} + func TestSamplePairJSON(t *testing.T) { input := []struct { plain string diff --git a/vendor/github.com/prometheus/procfs/AUTHORS.md b/vendor/github.com/prometheus/procfs/AUTHORS.md deleted file mode 100644 index d558635602..0000000000 --- a/vendor/github.com/prometheus/procfs/AUTHORS.md +++ /dev/null @@ -1,21 +0,0 @@ -The Prometheus project was started by Matt T. Proud (emeritus) and -Julius Volz in 2012. - -Maintainers of this repository: - -* Tobias Schmidt - -The following individuals have contributed code to this repository -(listed in alphabetical order): - -* Armen Baghumian -* Bjoern Rabenstein -* David Cournapeau -* Ji-Hoon, Seol -* Jonas Große Sundrup -* Julius Volz -* Matt Layher -* Matthias Rampke -* Nicky Gerritsen -* Rémi Audebert -* Tobias Schmidt diff --git a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md b/vendor/github.com/prometheus/procfs/CONTRIBUTING.md index 5705f0fbea..40503edbf1 100644 --- a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md +++ b/vendor/github.com/prometheus/procfs/CONTRIBUTING.md @@ -2,9 +2,9 @@ Prometheus uses GitHub to manage reviews of pull requests. -* If you have a trivial fix or improvement, go ahead and create a pull - request, addressing (with `@...`) one or more of the maintainers - (see [AUTHORS.md](AUTHORS.md)) in the description of the pull request. +* If you have a trivial fix or improvement, go ahead and create a pull request, + addressing (with `@...`) the maintainer of this repository (see + [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. * If you plan to do something more involved, first discuss your ideas on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). diff --git a/vendor/github.com/prometheus/procfs/MAINTAINERS.md b/vendor/github.com/prometheus/procfs/MAINTAINERS.md new file mode 100644 index 0000000000..35993c41c2 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/MAINTAINERS.md @@ -0,0 +1 @@ +* Tobias Schmidt diff --git a/vendor/github.com/prometheus/procfs/README.md b/vendor/github.com/prometheus/procfs/README.md index 6e7ee6b8b7..2095494719 100644 --- a/vendor/github.com/prometheus/procfs/README.md +++ b/vendor/github.com/prometheus/procfs/README.md @@ -8,3 +8,4 @@ backwards-incompatible ways without warnings. Use it at your own risk. [![GoDoc](https://godoc.org/github.com/prometheus/procfs?status.png)](https://godoc.org/github.com/prometheus/procfs) [![Build Status](https://travis-ci.org/prometheus/procfs.svg?branch=master)](https://travis-ci.org/prometheus/procfs) +[![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/procfs)](https://goreportcard.com/report/github.com/prometheus/procfs) diff --git a/vendor/github.com/prometheus/procfs/buddyinfo.go b/vendor/github.com/prometheus/procfs/buddyinfo.go new file mode 100644 index 0000000000..680a9842a4 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/buddyinfo.go @@ -0,0 +1,95 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// A BuddyInfo is the details parsed from /proc/buddyinfo. +// The data is comprised of an array of free fragments of each size. +// The sizes are 2^n*PAGE_SIZE, where n is the array index. +type BuddyInfo struct { + Node string + Zone string + Sizes []float64 +} + +// NewBuddyInfo reads the buddyinfo statistics. +func NewBuddyInfo() ([]BuddyInfo, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewBuddyInfo() +} + +// NewBuddyInfo reads the buddyinfo statistics from the specified `proc` filesystem. +func (fs FS) NewBuddyInfo() ([]BuddyInfo, error) { + file, err := os.Open(fs.Path("buddyinfo")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseBuddyInfo(file) +} + +func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { + var ( + buddyInfo = []BuddyInfo{} + scanner = bufio.NewScanner(r) + bucketCount = -1 + ) + + for scanner.Scan() { + var err error + line := scanner.Text() + parts := strings.Fields(string(line)) + + if len(parts) < 4 { + return nil, fmt.Errorf("invalid number of fields when parsing buddyinfo") + } + + node := strings.TrimRight(parts[1], ",") + zone := strings.TrimRight(parts[3], ",") + arraySize := len(parts[4:]) + + if bucketCount == -1 { + bucketCount = arraySize + } else { + if bucketCount != arraySize { + return nil, fmt.Errorf("mismatch in number of buddyinfo buckets, previous count %d, new count %d", bucketCount, arraySize) + } + } + + sizes := make([]float64, arraySize) + for i := 0; i < arraySize; i++ { + sizes[i], err = strconv.ParseFloat(parts[i+4], 64) + if err != nil { + return nil, fmt.Errorf("invalid value in buddyinfo: %s", err) + } + } + + buddyInfo = append(buddyInfo, BuddyInfo{node, zone, sizes}) + } + + return buddyInfo, scanner.Err() +} diff --git a/vendor/github.com/prometheus/procfs/buddyinfo_test.go b/vendor/github.com/prometheus/procfs/buddyinfo_test.go new file mode 100644 index 0000000000..bcf9355cab --- /dev/null +++ b/vendor/github.com/prometheus/procfs/buddyinfo_test.go @@ -0,0 +1,64 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "strings" + "testing" +) + +func TestBuddyInfo(t *testing.T) { + buddyInfo, err := FS("fixtures/buddyinfo/valid").NewBuddyInfo() + if err != nil { + t.Fatal(err) + } + + if want, got := "DMA", buddyInfo[0].Zone; want != got { + t.Errorf("want Node 0, Zone %s, got %s", want, got) + } + + if want, got := "Normal", buddyInfo[2].Zone; want != got { + t.Errorf("want Node 0, Zone %s, got %s", want, got) + } + + if want, got := 4381.0, buddyInfo[2].Sizes[0]; want != got { + t.Errorf("want Node 0, Zone Normal %f, got %f", want, got) + } + + if want, got := 572.0, buddyInfo[1].Sizes[1]; want != got { + t.Errorf("want Node 0, Zone DMA32 %f, got %f", want, got) + } +} + +func TestBuddyInfoShort(t *testing.T) { + _, err := FS("fixtures/buddyinfo/short").NewBuddyInfo() + if err == nil { + t.Errorf("expected error, but none occurred") + } + + if want, got := "invalid number of fields when parsing buddyinfo", err.Error(); want != got { + t.Errorf("wrong error returned, wanted %q, got %q", want, got) + } +} + +func TestBuddyInfoSizeMismatch(t *testing.T) { + _, err := FS("fixtures/buddyinfo/sizemismatch").NewBuddyInfo() + if err == nil { + t.Errorf("expected error, but none occurred") + } + + if want, got := "mismatch in number of buddyinfo buckets", err.Error(); !strings.HasPrefix(got, want) { + t.Errorf("wrong error returned, wanted prefix %q, got %q", want, got) + } +} diff --git a/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/short/buddyinfo b/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/short/buddyinfo new file mode 100644 index 0000000000..40e71ca357 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/short/buddyinfo @@ -0,0 +1,3 @@ +Node 0, zone +Node 0, zone +Node 0, zone diff --git a/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/sizemismatch/buddyinfo b/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/sizemismatch/buddyinfo new file mode 100644 index 0000000000..9456361829 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/sizemismatch/buddyinfo @@ -0,0 +1,3 @@ +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 diff --git a/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/valid/buddyinfo b/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/valid/buddyinfo new file mode 100644 index 0000000000..f90594a81b --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/buddyinfo/valid/buddyinfo @@ -0,0 +1,3 @@ +Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 +Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 +Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 diff --git a/vendor/github.com/prometheus/procfs/fixtures/fs/xfs/stat b/vendor/github.com/prometheus/procfs/fixtures/fs/xfs/stat new file mode 100644 index 0000000000..f7ca7f9407 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fixtures/fs/xfs/stat @@ -0,0 +1,23 @@ +extent_alloc 92447 97589 92448 93751 +abt 0 0 0 0 +blk_map 1767055 188820 184891 92447 92448 2140766 0 +bmbt 0 0 0 0 +dir 185039 92447 92444 136422 +trans 706 944304 0 +ig 185045 58807 0 126238 0 33637 22 +log 2883 113448 9 17360 739 +push_ail 945014 0 134260 15483 0 3940 464 159985 0 40 +xstrat 92447 0 +rw 107739 94045 +attr 4 0 0 0 +icluster 8677 7849 135802 +vnodes 92601 0 0 0 92444 92444 92444 0 +buf 2666287 7122 2659202 3599 2 7085 0 10297 7085 +abtb2 184941 1277345 13257 13278 0 0 0 0 0 0 0 0 0 0 2746147 +abtc2 345295 2416764 172637 172658 0 0 0 0 0 0 0 0 0 0 21406023 +bmbt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +ibt2 343004 1358467 0 0 0 0 0 0 0 0 0 0 0 0 0 +fibt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +qm 0 0 0 0 0 0 0 0 +xpc 399724544 92823103 86219234 +debug 0 diff --git a/vendor/github.com/prometheus/procfs/fs.go b/vendor/github.com/prometheus/procfs/fs.go index 49aaab0505..17546756b3 100644 --- a/vendor/github.com/prometheus/procfs/fs.go +++ b/vendor/github.com/prometheus/procfs/fs.go @@ -4,6 +4,8 @@ import ( "fmt" "os" "path" + + "github.com/prometheus/procfs/xfs" ) // FS represents the pseudo-filesystem proc, which provides an interface to @@ -31,3 +33,14 @@ func NewFS(mountPoint string) (FS, error) { func (fs FS) Path(p ...string) string { return path.Join(append([]string{string(fs)}, p...)...) } + +// XFSStats retrieves XFS filesystem runtime statistics. +func (fs FS) XFSStats() (*xfs.Stats, error) { + f, err := os.Open(fs.Path("fs/xfs/stat")) + if err != nil { + return nil, err + } + defer f.Close() + + return xfs.ParseStats(f) +} diff --git a/vendor/github.com/prometheus/procfs/fs_test.go b/vendor/github.com/prometheus/procfs/fs_test.go index 91f1c6c976..e492cde55e 100644 --- a/vendor/github.com/prometheus/procfs/fs_test.go +++ b/vendor/github.com/prometheus/procfs/fs_test.go @@ -11,3 +11,16 @@ func TestNewFS(t *testing.T) { t.Error("want NewFS to fail if mount point is not a directory") } } + +func TestFSXFSStats(t *testing.T) { + stats, err := FS("fixtures").XFSStats() + if err != nil { + t.Fatalf("failed to parse XFS stats: %v", err) + } + + // Very lightweight test just to sanity check the path used + // to open XFS stats. Heavier tests in package xfs. + if want, got := uint32(92447), stats.ExtentAllocation.ExtentsAllocated; want != got { + t.Errorf("unexpected extents allocated:\nwant: %d\nhave: %d", want, got) + } +} diff --git a/vendor/github.com/prometheus/procfs/ipvs_test.go b/vendor/github.com/prometheus/procfs/ipvs_test.go index c836c23acf..796ee5b882 100644 --- a/vendor/github.com/prometheus/procfs/ipvs_test.go +++ b/vendor/github.com/prometheus/procfs/ipvs_test.go @@ -14,7 +14,7 @@ var ( OutgoingBytes: 0, } expectedIPVSBackendStatuses = []IPVSBackendStatus{ - IPVSBackendStatus{ + { LocalAddress: net.ParseIP("192.168.0.22"), LocalPort: 3306, RemoteAddress: net.ParseIP("192.168.82.22"), @@ -24,7 +24,7 @@ var ( ActiveConn: 248, InactConn: 2, }, - IPVSBackendStatus{ + { LocalAddress: net.ParseIP("192.168.0.22"), LocalPort: 3306, RemoteAddress: net.ParseIP("192.168.83.24"), @@ -34,7 +34,7 @@ var ( ActiveConn: 248, InactConn: 2, }, - IPVSBackendStatus{ + { LocalAddress: net.ParseIP("192.168.0.22"), LocalPort: 3306, RemoteAddress: net.ParseIP("192.168.83.21"), @@ -44,7 +44,7 @@ var ( ActiveConn: 248, InactConn: 1, }, - IPVSBackendStatus{ + { LocalAddress: net.ParseIP("192.168.0.57"), LocalPort: 3306, RemoteAddress: net.ParseIP("192.168.84.22"), @@ -54,7 +54,7 @@ var ( ActiveConn: 0, InactConn: 0, }, - IPVSBackendStatus{ + { LocalAddress: net.ParseIP("192.168.0.57"), LocalPort: 3306, RemoteAddress: net.ParseIP("192.168.82.21"), @@ -64,7 +64,7 @@ var ( ActiveConn: 1499, InactConn: 0, }, - IPVSBackendStatus{ + { LocalAddress: net.ParseIP("192.168.0.57"), LocalPort: 3306, RemoteAddress: net.ParseIP("192.168.50.21"), @@ -74,7 +74,7 @@ var ( ActiveConn: 1498, InactConn: 0, }, - IPVSBackendStatus{ + { LocalAddress: net.ParseIP("192.168.0.55"), LocalPort: 3306, RemoteAddress: net.ParseIP("192.168.50.26"), @@ -84,7 +84,7 @@ var ( ActiveConn: 0, InactConn: 0, }, - IPVSBackendStatus{ + { LocalAddress: net.ParseIP("192.168.0.55"), LocalPort: 3306, RemoteAddress: net.ParseIP("192.168.49.32"), diff --git a/vendor/github.com/prometheus/procfs/mdstat_test.go b/vendor/github.com/prometheus/procfs/mdstat_test.go index ca5fe4d1b0..fa463c2fb1 100644 --- a/vendor/github.com/prometheus/procfs/mdstat_test.go +++ b/vendor/github.com/prometheus/procfs/mdstat_test.go @@ -11,13 +11,13 @@ func TestMDStat(t *testing.T) { } refs := map[string]MDStat{ - "md3": MDStat{"md3", "active", 8, 8, 5853468288, 5853468288}, - "md127": MDStat{"md127", "active", 2, 2, 312319552, 312319552}, - "md0": MDStat{"md0", "active", 2, 2, 248896, 248896}, - "md4": MDStat{"md4", "inactive", 2, 2, 4883648, 4883648}, - "md6": MDStat{"md6", "active", 1, 2, 195310144, 16775552}, - "md8": MDStat{"md8", "active", 2, 2, 195310144, 16775552}, - "md7": MDStat{"md7", "active", 3, 4, 7813735424, 7813735424}, + "md3": {"md3", "active", 8, 8, 5853468288, 5853468288}, + "md127": {"md127", "active", 2, 2, 312319552, 312319552}, + "md0": {"md0", "active", 2, 2, 248896, 248896}, + "md4": {"md4", "inactive", 2, 2, 4883648, 4883648}, + "md6": {"md6", "active", 1, 2, 195310144, 16775552}, + "md8": {"md8", "active", 2, 2, 195310144, 16775552}, + "md7": {"md7", "active", 3, 4, 7813735424, 7813735424}, } if want, have := len(refs), len(mdStates); want != have { diff --git a/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/prometheus/procfs/mountstats.go index 47ab0a7449..fe8f1f6a22 100644 --- a/vendor/github.com/prometheus/procfs/mountstats.go +++ b/vendor/github.com/prometheus/procfs/mountstats.go @@ -123,7 +123,7 @@ type NFSEventsStats struct { VFSFlush uint64 // Number of times fsync() has been called on directories and files. VFSFsync uint64 - // Number of times locking has been attemped on a file. + // Number of times locking has been attempted on a file. VFSLock uint64 // Number of times files have been closed and released. VFSFileRelease uint64 @@ -356,7 +356,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e } // When encountering "per-operation statistics", we must break this - // loop and parse them seperately to ensure we can terminate parsing + // loop and parse them separately to ensure we can terminate parsing // before reaching another device entry; hence why this 'if' statement // is not just another switch case if ss[0] == fieldPerOpStats { diff --git a/vendor/github.com/prometheus/procfs/mountstats_test.go b/vendor/github.com/prometheus/procfs/mountstats_test.go index e657079398..75fd4a0f1c 100644 --- a/vendor/github.com/prometheus/procfs/mountstats_test.go +++ b/vendor/github.com/prometheus/procfs/mountstats_test.go @@ -12,7 +12,6 @@ func TestMountStats(t *testing.T) { tests := []struct { name string s string - fs bool mounts []*Mount invalid bool }{ @@ -113,7 +112,6 @@ func TestMountStats(t *testing.T) { }, { name: "fixtures OK", - fs: true, mounts: []*Mount{ { Device: "rootfs", @@ -201,10 +199,9 @@ func TestMountStats(t *testing.T) { if tt.s != "" { mounts, err = parseMountStats(strings.NewReader(tt.s)) - } - if tt.fs { - proc, err := FS("fixtures").NewProc(26231) - if err != nil { + } else { + proc, e := FS("fixtures").NewProc(26231) + if e != nil { t.Fatalf("failed to create proc: %v", err) } diff --git a/vendor/github.com/prometheus/procfs/xfs/parse.go b/vendor/github.com/prometheus/procfs/xfs/parse.go new file mode 100644 index 0000000000..d1285fa6c6 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/xfs/parse.go @@ -0,0 +1,361 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package xfs + +import ( + "bufio" + "fmt" + "io" + "log" + "strconv" + "strings" +) + +// ParseStats parses a Stats from an input io.Reader, using the format +// found in /proc/fs/xfs/stat. +func ParseStats(r io.Reader) (*Stats, error) { + const ( + // Fields parsed into stats structures. + fieldExtentAlloc = "extent_alloc" + fieldAbt = "abt" + fieldBlkMap = "blk_map" + fieldBmbt = "bmbt" + fieldDir = "dir" + fieldTrans = "trans" + fieldIg = "ig" + fieldLog = "log" + fieldRw = "rw" + fieldAttr = "attr" + fieldIcluster = "icluster" + fieldVnodes = "vnodes" + fieldBuf = "buf" + fieldXpc = "xpc" + + // Unimplemented at this time due to lack of documentation. + fieldPushAil = "push_ail" + fieldXstrat = "xstrat" + fieldAbtb2 = "abtb2" + fieldAbtc2 = "abtc2" + fieldBmbt2 = "bmbt2" + fieldIbt2 = "ibt2" + fieldFibt2 = "fibt2" + fieldQm = "qm" + fieldDebug = "debug" + ) + + var xfss Stats + + s := bufio.NewScanner(r) + for s.Scan() { + // Expect at least a string label and a single integer value, ex: + // - abt 0 + // - rw 1 2 + ss := strings.Fields(string(s.Bytes())) + if len(ss) < 2 { + continue + } + label := ss[0] + + // Extended precision counters are uint64 values. + if label == fieldXpc { + us, err := parseUint64s(ss[1:]) + if err != nil { + return nil, err + } + + xfss.ExtendedPrecision, err = extendedPrecisionStats(us) + if err != nil { + return nil, err + } + + continue + } + + // All other counters are uint32 values. + us, err := parseUint32s(ss[1:]) + if err != nil { + return nil, err + } + + switch label { + case fieldExtentAlloc: + xfss.ExtentAllocation, err = extentAllocationStats(us) + case fieldAbt: + xfss.AllocationBTree, err = btreeStats(us) + case fieldBlkMap: + xfss.BlockMapping, err = blockMappingStats(us) + case fieldBmbt: + xfss.BlockMapBTree, err = btreeStats(us) + case fieldDir: + xfss.DirectoryOperation, err = directoryOperationStats(us) + case fieldTrans: + xfss.Transaction, err = transactionStats(us) + case fieldIg: + xfss.InodeOperation, err = inodeOperationStats(us) + case fieldLog: + xfss.LogOperation, err = logOperationStats(us) + case fieldRw: + xfss.ReadWrite, err = readWriteStats(us) + case fieldAttr: + xfss.AttributeOperation, err = attributeOperationStats(us) + case fieldIcluster: + xfss.InodeClustering, err = inodeClusteringStats(us) + case fieldVnodes: + xfss.Vnode, err = vnodeStats(us) + case fieldBuf: + xfss.Buffer, err = bufferStats(us) + } + if err != nil { + return nil, err + } + } + + return &xfss, s.Err() +} + +// extentAllocationStats builds an ExtentAllocationStats from a slice of uint32s. +func extentAllocationStats(us []uint32) (ExtentAllocationStats, error) { + if l := len(us); l != 4 { + return ExtentAllocationStats{}, fmt.Errorf("incorrect number of values for XFS extent allocation stats: %d", l) + } + + return ExtentAllocationStats{ + ExtentsAllocated: us[0], + BlocksAllocated: us[1], + ExtentsFreed: us[2], + BlocksFreed: us[3], + }, nil +} + +// btreeStats builds a BTreeStats from a slice of uint32s. +func btreeStats(us []uint32) (BTreeStats, error) { + if l := len(us); l != 4 { + return BTreeStats{}, fmt.Errorf("incorrect number of values for XFS btree stats: %d", l) + } + + return BTreeStats{ + Lookups: us[0], + Compares: us[1], + RecordsInserted: us[2], + RecordsDeleted: us[3], + }, nil +} + +// BlockMappingStat builds a BlockMappingStats from a slice of uint32s. +func blockMappingStats(us []uint32) (BlockMappingStats, error) { + if l := len(us); l != 7 { + return BlockMappingStats{}, fmt.Errorf("incorrect number of values for XFS block mapping stats: %d", l) + } + + return BlockMappingStats{ + Reads: us[0], + Writes: us[1], + Unmaps: us[2], + ExtentListInsertions: us[3], + ExtentListDeletions: us[4], + ExtentListLookups: us[5], + ExtentListCompares: us[6], + }, nil +} + +// DirectoryOperationStats builds a DirectoryOperationStats from a slice of uint32s. +func directoryOperationStats(us []uint32) (DirectoryOperationStats, error) { + if l := len(us); l != 4 { + return DirectoryOperationStats{}, fmt.Errorf("incorrect number of values for XFS directory operation stats: %d", l) + } + + return DirectoryOperationStats{ + Lookups: us[0], + Creates: us[1], + Removes: us[2], + Getdents: us[3], + }, nil +} + +// TransactionStats builds a TransactionStats from a slice of uint32s. +func transactionStats(us []uint32) (TransactionStats, error) { + if l := len(us); l != 3 { + return TransactionStats{}, fmt.Errorf("incorrect number of values for XFS transaction stats: %d", l) + } + + return TransactionStats{ + Sync: us[0], + Async: us[1], + Empty: us[2], + }, nil +} + +// InodeOperationStats builds an InodeOperationStats from a slice of uint32s. +func inodeOperationStats(us []uint32) (InodeOperationStats, error) { + if l := len(us); l != 7 { + return InodeOperationStats{}, fmt.Errorf("incorrect number of values for XFS inode operation stats: %d", l) + } + + return InodeOperationStats{ + Attempts: us[0], + Found: us[1], + Recycle: us[2], + Missed: us[3], + Duplicate: us[4], + Reclaims: us[5], + AttributeChange: us[6], + }, nil +} + +// LogOperationStats builds a LogOperationStats from a slice of uint32s. +func logOperationStats(us []uint32) (LogOperationStats, error) { + if l := len(us); l != 5 { + return LogOperationStats{}, fmt.Errorf("incorrect number of values for XFS log operation stats: %d", l) + } + + return LogOperationStats{ + Writes: us[0], + Blocks: us[1], + NoInternalBuffers: us[2], + Force: us[3], + ForceSleep: us[4], + }, nil +} + +// ReadWriteStats builds a ReadWriteStats from a slice of uint32s. +func readWriteStats(us []uint32) (ReadWriteStats, error) { + if l := len(us); l != 2 { + return ReadWriteStats{}, fmt.Errorf("incorrect number of values for XFS read write stats: %d", l) + } + + return ReadWriteStats{ + Read: us[0], + Write: us[1], + }, nil +} + +// AttributeOperationStats builds an AttributeOperationStats from a slice of uint32s. +func attributeOperationStats(us []uint32) (AttributeOperationStats, error) { + if l := len(us); l != 4 { + return AttributeOperationStats{}, fmt.Errorf("incorrect number of values for XFS attribute operation stats: %d", l) + } + + return AttributeOperationStats{ + Get: us[0], + Set: us[1], + Remove: us[2], + List: us[3], + }, nil +} + +// InodeClusteringStats builds an InodeClusteringStats from a slice of uint32s. +func inodeClusteringStats(us []uint32) (InodeClusteringStats, error) { + if l := len(us); l != 3 { + return InodeClusteringStats{}, fmt.Errorf("incorrect number of values for XFS inode clustering stats: %d", l) + } + + return InodeClusteringStats{ + Iflush: us[0], + Flush: us[1], + FlushInode: us[2], + }, nil +} + +// VnodeStats builds a VnodeStats from a slice of uint32s. +func vnodeStats(us []uint32) (VnodeStats, error) { + // The attribute "Free" appears to not be available on older XFS + // stats versions. Therefore, 7 or 8 elements may appear in + // this slice. + l := len(us) + log.Println(l) + if l != 7 && l != 8 { + return VnodeStats{}, fmt.Errorf("incorrect number of values for XFS vnode stats: %d", l) + } + + s := VnodeStats{ + Active: us[0], + Allocate: us[1], + Get: us[2], + Hold: us[3], + Release: us[4], + Reclaim: us[5], + Remove: us[6], + } + + // Skip adding free, unless it is present. The zero value will + // be used in place of an actual count. + if l == 7 { + return s, nil + } + + s.Free = us[7] + return s, nil +} + +// BufferStats builds a BufferStats from a slice of uint32s. +func bufferStats(us []uint32) (BufferStats, error) { + if l := len(us); l != 9 { + return BufferStats{}, fmt.Errorf("incorrect number of values for XFS buffer stats: %d", l) + } + + return BufferStats{ + Get: us[0], + Create: us[1], + GetLocked: us[2], + GetLockedWaited: us[3], + BusyLocked: us[4], + MissLocked: us[5], + PageRetries: us[6], + PageFound: us[7], + GetRead: us[8], + }, nil +} + +// ExtendedPrecisionStats builds an ExtendedPrecisionStats from a slice of uint32s. +func extendedPrecisionStats(us []uint64) (ExtendedPrecisionStats, error) { + if l := len(us); l != 3 { + return ExtendedPrecisionStats{}, fmt.Errorf("incorrect number of values for XFS extended precision stats: %d", l) + } + + return ExtendedPrecisionStats{ + FlushBytes: us[0], + WriteBytes: us[1], + ReadBytes: us[2], + }, nil +} + +// parseUint32s parses a slice of strings into a slice of uint32s. +func parseUint32s(ss []string) ([]uint32, error) { + us := make([]uint32, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 32) + if err != nil { + return nil, err + } + + us = append(us, uint32(u)) + } + + return us, nil +} + +// parseUint64s parses a slice of strings into a slice of uint64s. +func parseUint64s(ss []string) ([]uint64, error) { + us := make([]uint64, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + us = append(us, u) + } + + return us, nil +} diff --git a/vendor/github.com/prometheus/procfs/xfs/parse_test.go b/vendor/github.com/prometheus/procfs/xfs/parse_test.go new file mode 100644 index 0000000000..11ddb7425b --- /dev/null +++ b/vendor/github.com/prometheus/procfs/xfs/parse_test.go @@ -0,0 +1,446 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package xfs_test + +import ( + "log" + "reflect" + "strings" + "testing" + + "github.com/prometheus/procfs" + "github.com/prometheus/procfs/xfs" +) + +func TestParseStats(t *testing.T) { + tests := []struct { + name string + s string + fs bool + stats *xfs.Stats + invalid bool + }{ + { + name: "empty file OK", + }, + { + name: "short or empty lines and unknown labels ignored", + s: "one\n\ntwo 1 2 3\n", + stats: &xfs.Stats{}, + }, + { + name: "bad uint32", + s: "extent_alloc XXX", + invalid: true, + }, + { + name: "bad uint64", + s: "xpc XXX", + invalid: true, + }, + { + name: "extent_alloc bad", + s: "extent_alloc 1", + invalid: true, + }, + { + name: "extent_alloc OK", + s: "extent_alloc 1 2 3 4", + stats: &xfs.Stats{ + ExtentAllocation: xfs.ExtentAllocationStats{ + ExtentsAllocated: 1, + BlocksAllocated: 2, + ExtentsFreed: 3, + BlocksFreed: 4, + }, + }, + }, + { + name: "abt bad", + s: "abt 1", + invalid: true, + }, + { + name: "abt OK", + s: "abt 1 2 3 4", + stats: &xfs.Stats{ + AllocationBTree: xfs.BTreeStats{ + Lookups: 1, + Compares: 2, + RecordsInserted: 3, + RecordsDeleted: 4, + }, + }, + }, + { + name: "blk_map bad", + s: "blk_map 1", + invalid: true, + }, + { + name: "blk_map OK", + s: "blk_map 1 2 3 4 5 6 7", + stats: &xfs.Stats{ + BlockMapping: xfs.BlockMappingStats{ + Reads: 1, + Writes: 2, + Unmaps: 3, + ExtentListInsertions: 4, + ExtentListDeletions: 5, + ExtentListLookups: 6, + ExtentListCompares: 7, + }, + }, + }, + { + name: "bmbt bad", + s: "bmbt 1", + invalid: true, + }, + { + name: "bmbt OK", + s: "bmbt 1 2 3 4", + stats: &xfs.Stats{ + BlockMapBTree: xfs.BTreeStats{ + Lookups: 1, + Compares: 2, + RecordsInserted: 3, + RecordsDeleted: 4, + }, + }, + }, + { + name: "dir bad", + s: "dir 1", + invalid: true, + }, + { + name: "dir OK", + s: "dir 1 2 3 4", + stats: &xfs.Stats{ + DirectoryOperation: xfs.DirectoryOperationStats{ + Lookups: 1, + Creates: 2, + Removes: 3, + Getdents: 4, + }, + }, + }, + { + name: "trans bad", + s: "trans 1", + invalid: true, + }, + { + name: "trans OK", + s: "trans 1 2 3", + stats: &xfs.Stats{ + Transaction: xfs.TransactionStats{ + Sync: 1, + Async: 2, + Empty: 3, + }, + }, + }, + { + name: "ig bad", + s: "ig 1", + invalid: true, + }, + { + name: "ig OK", + s: "ig 1 2 3 4 5 6 7", + stats: &xfs.Stats{ + InodeOperation: xfs.InodeOperationStats{ + Attempts: 1, + Found: 2, + Recycle: 3, + Missed: 4, + Duplicate: 5, + Reclaims: 6, + AttributeChange: 7, + }, + }, + }, + { + name: "log bad", + s: "log 1", + invalid: true, + }, + { + name: "log OK", + s: "log 1 2 3 4 5", + stats: &xfs.Stats{ + LogOperation: xfs.LogOperationStats{ + Writes: 1, + Blocks: 2, + NoInternalBuffers: 3, + Force: 4, + ForceSleep: 5, + }, + }, + }, + { + name: "rw bad", + s: "rw 1", + invalid: true, + }, + { + name: "rw OK", + s: "rw 1 2", + stats: &xfs.Stats{ + ReadWrite: xfs.ReadWriteStats{ + Read: 1, + Write: 2, + }, + }, + }, + { + name: "attr bad", + s: "attr 1", + invalid: true, + }, + { + name: "attr OK", + s: "attr 1 2 3 4", + stats: &xfs.Stats{ + AttributeOperation: xfs.AttributeOperationStats{ + Get: 1, + Set: 2, + Remove: 3, + List: 4, + }, + }, + }, + { + name: "icluster bad", + s: "icluster 1", + invalid: true, + }, + { + name: "icluster OK", + s: "icluster 1 2 3", + stats: &xfs.Stats{ + InodeClustering: xfs.InodeClusteringStats{ + Iflush: 1, + Flush: 2, + FlushInode: 3, + }, + }, + }, + { + name: "vnodes bad", + s: "vnodes 1", + invalid: true, + }, + { + name: "vnodes (missing free) OK", + s: "vnodes 1 2 3 4 5 6 7", + stats: &xfs.Stats{ + Vnode: xfs.VnodeStats{ + Active: 1, + Allocate: 2, + Get: 3, + Hold: 4, + Release: 5, + Reclaim: 6, + Remove: 7, + }, + }, + }, + { + name: "vnodes (with free) OK", + s: "vnodes 1 2 3 4 5 6 7 8", + stats: &xfs.Stats{ + Vnode: xfs.VnodeStats{ + Active: 1, + Allocate: 2, + Get: 3, + Hold: 4, + Release: 5, + Reclaim: 6, + Remove: 7, + Free: 8, + }, + }, + }, + { + name: "buf bad", + s: "buf 1", + invalid: true, + }, + { + name: "buf OK", + s: "buf 1 2 3 4 5 6 7 8 9", + stats: &xfs.Stats{ + Buffer: xfs.BufferStats{ + Get: 1, + Create: 2, + GetLocked: 3, + GetLockedWaited: 4, + BusyLocked: 5, + MissLocked: 6, + PageRetries: 7, + PageFound: 8, + GetRead: 9, + }, + }, + }, + { + name: "xpc bad", + s: "xpc 1", + invalid: true, + }, + { + name: "xpc OK", + s: "xpc 1 2 3", + stats: &xfs.Stats{ + ExtendedPrecision: xfs.ExtendedPrecisionStats{ + FlushBytes: 1, + WriteBytes: 2, + ReadBytes: 3, + }, + }, + }, + { + name: "fixtures OK", + fs: true, + stats: &xfs.Stats{ + ExtentAllocation: xfs.ExtentAllocationStats{ + ExtentsAllocated: 92447, + BlocksAllocated: 97589, + ExtentsFreed: 92448, + BlocksFreed: 93751, + }, + AllocationBTree: xfs.BTreeStats{ + Lookups: 0, + Compares: 0, + RecordsInserted: 0, + RecordsDeleted: 0, + }, + BlockMapping: xfs.BlockMappingStats{ + Reads: 1767055, + Writes: 188820, + Unmaps: 184891, + ExtentListInsertions: 92447, + ExtentListDeletions: 92448, + ExtentListLookups: 2140766, + ExtentListCompares: 0, + }, + BlockMapBTree: xfs.BTreeStats{ + Lookups: 0, + Compares: 0, + RecordsInserted: 0, + RecordsDeleted: 0, + }, + DirectoryOperation: xfs.DirectoryOperationStats{ + Lookups: 185039, + Creates: 92447, + Removes: 92444, + Getdents: 136422, + }, + Transaction: xfs.TransactionStats{ + Sync: 706, + Async: 944304, + Empty: 0, + }, + InodeOperation: xfs.InodeOperationStats{ + Attempts: 185045, + Found: 58807, + Recycle: 0, + Missed: 126238, + Duplicate: 0, + Reclaims: 33637, + AttributeChange: 22, + }, + LogOperation: xfs.LogOperationStats{ + Writes: 2883, + Blocks: 113448, + NoInternalBuffers: 9, + Force: 17360, + ForceSleep: 739, + }, + ReadWrite: xfs.ReadWriteStats{ + Read: 107739, + Write: 94045, + }, + AttributeOperation: xfs.AttributeOperationStats{ + Get: 4, + Set: 0, + Remove: 0, + List: 0, + }, + InodeClustering: xfs.InodeClusteringStats{ + Iflush: 8677, + Flush: 7849, + FlushInode: 135802, + }, + Vnode: xfs.VnodeStats{ + Active: 92601, + Allocate: 0, + Get: 0, + Hold: 0, + Release: 92444, + Reclaim: 92444, + Remove: 92444, + Free: 0, + }, + Buffer: xfs.BufferStats{ + Get: 2666287, + Create: 7122, + GetLocked: 2659202, + GetLockedWaited: 3599, + BusyLocked: 2, + MissLocked: 7085, + PageRetries: 0, + PageFound: 10297, + GetRead: 7085, + }, + ExtendedPrecision: xfs.ExtendedPrecisionStats{ + FlushBytes: 399724544, + WriteBytes: 92823103, + ReadBytes: 86219234, + }, + }, + }, + } + + for i, tt := range tests { + t.Logf("[%02d] test %q", i, tt.name) + + var ( + stats *xfs.Stats + err error + ) + + if tt.s != "" { + stats, err = xfs.ParseStats(strings.NewReader(tt.s)) + } + if tt.fs { + stats, err = procfs.FS("../fixtures").XFSStats() + } + + if tt.invalid && err == nil { + t.Error("expected an error, but none occurred") + } + if !tt.invalid && err != nil { + t.Errorf("unexpected error: %v", err) + } + + if want, have := tt.stats, stats; !reflect.DeepEqual(want, have) { + log.Printf("stats: %#v", have) + t.Errorf("unexpected XFS stats:\nwant:\n%v\nhave:\n%v", want, have) + } + } +} diff --git a/vendor/github.com/prometheus/procfs/xfs/xfs.go b/vendor/github.com/prometheus/procfs/xfs/xfs.go new file mode 100644 index 0000000000..ed77d907ae --- /dev/null +++ b/vendor/github.com/prometheus/procfs/xfs/xfs.go @@ -0,0 +1,158 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package xfs provides access to statistics exposed by the XFS filesystem. +package xfs + +// Stats contains XFS filesystem runtime statistics, parsed from +// /proc/fs/xfs/stat. +// +// The names and meanings of each statistic were taken from +// http://xfs.org/index.php/Runtime_Stats and xfs_stats.h in the Linux +// kernel source. Most counters are uint32s (same data types used in +// xfs_stats.h), but some of the "extended precision stats" are uint64s. +type Stats struct { + ExtentAllocation ExtentAllocationStats + AllocationBTree BTreeStats + BlockMapping BlockMappingStats + BlockMapBTree BTreeStats + DirectoryOperation DirectoryOperationStats + Transaction TransactionStats + InodeOperation InodeOperationStats + LogOperation LogOperationStats + ReadWrite ReadWriteStats + AttributeOperation AttributeOperationStats + InodeClustering InodeClusteringStats + Vnode VnodeStats + Buffer BufferStats + ExtendedPrecision ExtendedPrecisionStats +} + +// ExtentAllocationStats contains statistics regarding XFS extent allocations. +type ExtentAllocationStats struct { + ExtentsAllocated uint32 + BlocksAllocated uint32 + ExtentsFreed uint32 + BlocksFreed uint32 +} + +// BTreeStats contains statistics regarding an XFS internal B-tree. +type BTreeStats struct { + Lookups uint32 + Compares uint32 + RecordsInserted uint32 + RecordsDeleted uint32 +} + +// BlockMappingStats contains statistics regarding XFS block maps. +type BlockMappingStats struct { + Reads uint32 + Writes uint32 + Unmaps uint32 + ExtentListInsertions uint32 + ExtentListDeletions uint32 + ExtentListLookups uint32 + ExtentListCompares uint32 +} + +// DirectoryOperationStats contains statistics regarding XFS directory entries. +type DirectoryOperationStats struct { + Lookups uint32 + Creates uint32 + Removes uint32 + Getdents uint32 +} + +// TransactionStats contains statistics regarding XFS metadata transactions. +type TransactionStats struct { + Sync uint32 + Async uint32 + Empty uint32 +} + +// InodeOperationStats contains statistics regarding XFS inode operations. +type InodeOperationStats struct { + Attempts uint32 + Found uint32 + Recycle uint32 + Missed uint32 + Duplicate uint32 + Reclaims uint32 + AttributeChange uint32 +} + +// LogOperationStats contains statistics regarding the XFS log buffer. +type LogOperationStats struct { + Writes uint32 + Blocks uint32 + NoInternalBuffers uint32 + Force uint32 + ForceSleep uint32 +} + +// ReadWriteStats contains statistics regarding the number of read and write +// system calls for XFS filesystems. +type ReadWriteStats struct { + Read uint32 + Write uint32 +} + +// AttributeOperationStats contains statistics regarding manipulation of +// XFS extended file attributes. +type AttributeOperationStats struct { + Get uint32 + Set uint32 + Remove uint32 + List uint32 +} + +// InodeClusteringStats contains statistics regarding XFS inode clustering +// operations. +type InodeClusteringStats struct { + Iflush uint32 + Flush uint32 + FlushInode uint32 +} + +// VnodeStats contains statistics regarding XFS vnode operations. +type VnodeStats struct { + Active uint32 + Allocate uint32 + Get uint32 + Hold uint32 + Release uint32 + Reclaim uint32 + Remove uint32 + Free uint32 +} + +// BufferStats contains statistics regarding XFS read/write I/O buffers. +type BufferStats struct { + Get uint32 + Create uint32 + GetLocked uint32 + GetLockedWaited uint32 + BusyLocked uint32 + MissLocked uint32 + PageRetries uint32 + PageFound uint32 + GetRead uint32 +} + +// ExtendedPrecisionStats contains high precision counters used to track the +// total number of bytes read, written, or flushed, during XFS operations. +type ExtendedPrecisionStats struct { + FlushBytes uint64 + WriteBytes uint64 + ReadBytes uint64 +} diff --git a/vendor/github.com/spf13/cobra/.travis.yml b/vendor/github.com/spf13/cobra/.travis.yml index bd72adf685..42d1f57d30 100644 --- a/vendor/github.com/spf13/cobra/.travis.yml +++ b/vendor/github.com/spf13/cobra/.travis.yml @@ -5,8 +5,9 @@ matrix: - go: 1.4.3 env: NOVET=true # No bundled vet. - go: 1.5.4 - - go: 1.6.3 - - go: 1.7 + - go: 1.6.4 + - go: 1.7.5 + - go: 1.8 - go: tip allow_failures: - go: tip diff --git a/vendor/github.com/spf13/cobra/README.md b/vendor/github.com/spf13/cobra/README.md index 2efda59205..2de9840122 100644 --- a/vendor/github.com/spf13/cobra/README.md +++ b/vendor/github.com/spf13/cobra/README.md @@ -8,6 +8,7 @@ Many of the most widely used Go projects are built using Cobra including: * [Hugo](http://gohugo.io) * [rkt](https://github.com/coreos/rkt) * [etcd](https://github.com/coreos/etcd) +* [Docker](https://github.com/docker/docker) * [Docker (distribution)](https://github.com/docker/distribution) * [OpenShift](https://www.openshift.com/) * [Delve](https://github.com/derekparker/delve) @@ -755,7 +756,7 @@ providing a way to handle the errors in one location. The current list of functi * PersistentPostRunE If you would like to silence the default `error` and `usage` output in favor of your own, you can set `SilenceUsage` -and `SilenceErrors` to `false` on the command. A child command respects these flags if they are set on the parent +and `SilenceErrors` to `true` on the command. A child command respects these flags if they are set on the parent command. **Example Usage using RunE:** diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go index 3ee1a0a9d1..ae3930dfc6 100644 --- a/vendor/github.com/spf13/cobra/command.go +++ b/vendor/github.com/spf13/cobra/command.go @@ -57,6 +57,9 @@ type Command struct { Deprecated string // Is this command hidden and should NOT show up in the list of available commands? Hidden bool + // Annotations are key/value pairs that can be used by applications to identify or + // group commands + Annotations map[string]string // Full set of flags flags *flag.FlagSet // Set of flags childrens of this command will inherit @@ -152,12 +155,12 @@ func (c *Command) SetUsageTemplate(s string) { } // SetFlagErrorFunc sets a function to generate an error when flag parsing -// fails +// fails. func (c *Command) SetFlagErrorFunc(f func(*Command, error) error) { c.flagErrorFunc = f } -// SetHelpFunc sets help function. Can be defined by Application +// SetHelpFunc sets help function. Can be defined by Application. func (c *Command) SetHelpFunc(f func(*Command, []string)) { c.helpFunc = f } @@ -184,7 +187,7 @@ func (c *Command) SetGlobalNormalizationFunc(n func(f *flag.FlagSet, name string } } -// OutOrStdout returns output to stdout +// OutOrStdout returns output to stdout. func (c *Command) OutOrStdout() io.Writer { return c.getOut(os.Stdout) } @@ -342,19 +345,19 @@ Aliases: {{end}}{{if .HasExample}} Examples: -{{ .Example }}{{end}}{{ if .HasAvailableSubCommands}} +{{ .Example }}{{end}}{{if .HasAvailableSubCommands}} -Available Commands:{{range .Commands}}{{if .IsAvailableCommand}} - {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{ if .HasAvailableLocalFlags}} +Available Commands:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}} + {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} Flags: -{{.LocalFlags.FlagUsages | trimRightSpace}}{{end}}{{ if .HasAvailableInheritedFlags}} +{{.LocalFlags.FlagUsages | trimRightSpace}}{{end}}{{if .HasAvailableInheritedFlags}} Global Flags: {{.InheritedFlags.FlagUsages | trimRightSpace}}{{end}}{{if .HasHelpSubCommands}} -Additional help topics:{{range .Commands}}{{if .IsHelpCommand}} - {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{ if .HasAvailableSubCommands }} +Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} + {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} ` @@ -381,20 +384,18 @@ func (c *Command) resetChildrensParents() { } } -// Test if the named flag is a boolean flag. -func isBooleanFlag(name string, f *flag.FlagSet) bool { +func hasNoOptDefVal(name string, f *flag.FlagSet) bool { flag := f.Lookup(name) if flag == nil { return false } - return flag.Value.Type() == "bool" + return len(flag.NoOptDefVal) > 0 } -// Test if the named flag is a boolean flag. -func isBooleanShortFlag(name string, f *flag.FlagSet) bool { +func shortHasNoOptDefVal(name string, fs *flag.FlagSet) bool { result := false - f.VisitAll(func(f *flag.Flag) { - if f.Shorthand == name && f.Value.Type() == "bool" { + fs.VisitAll(func(flag *flag.Flag) { + if flag.Shorthand == name && len(flag.NoOptDefVal) > 0 { result = true } }) @@ -420,8 +421,8 @@ func stripFlags(args []string, c *Command) []string { inQuote = true case strings.HasPrefix(y, "--") && !strings.Contains(y, "="): // TODO: this isn't quite right, we should really check ahead for 'true' or 'false' - inFlag = !isBooleanFlag(y[2:], c.Flags()) - case strings.HasPrefix(y, "-") && !strings.Contains(y, "=") && len(y) == 2 && !isBooleanShortFlag(y[1:], c.Flags()): + inFlag = !hasNoOptDefVal(y[2:], c.Flags()) + case strings.HasPrefix(y, "-") && !strings.Contains(y, "=") && len(y) == 2 && !shortHasNoOptDefVal(y[1:], c.Flags()): inFlag = true case inFlag: inFlag = false @@ -455,7 +456,7 @@ func argsMinusFirstX(args []string, x string) []string { return args } -// Find finds the target command given the args and command tree +// Find the target command given the args and command tree // Meant to be run on the highest node. Only searches down. func (c *Command) Find(args []string) (*Command, []string, error) { if c == nil { @@ -695,7 +696,6 @@ func (c *Command) Execute() error { // ExecuteC executes the command. func (c *Command) ExecuteC() (cmd *Command, err error) { - // Regardless of what command execute is called on, run on Root only if c.HasParent() { return c.Root().ExecuteC() @@ -780,7 +780,7 @@ func (c *Command) initHelpCmd() { Run: func(c *Command, args []string) { cmd, _, e := c.Root().Find(args) if cmd == nil || e != nil { - c.Printf("Unknown help topic %#q.", args) + c.Printf("Unknown help topic %#q\n", args) c.Root().Usage() } else { cmd.Help() @@ -969,7 +969,8 @@ func (c *Command) Name() string { if i >= 0 { name = name[:i] } - return name + c.name = name + return c.name } // HasAlias determines if a given string is an alias of the command. @@ -1020,11 +1021,12 @@ func (c *Command) IsAvailableCommand() bool { return false } -// IsHelpCommand determines if a command is a 'help' command; a help command is -// determined by the fact that it is NOT runnable/hidden/deprecated, and has no -// sub commands that are runnable/hidden/deprecated. -func (c *Command) IsHelpCommand() bool { - +// IsAdditionalHelpTopicCommand determines if a command is an additional +// help topic command; additional help topic command is determined by the +// fact that it is NOT runnable/hidden/deprecated, and has no sub commands that +// are runnable/hidden/deprecated. +// Concrete example: https://github.com/spf13/cobra/issues/393#issuecomment-282741924. +func (c *Command) IsAdditionalHelpTopicCommand() bool { // if a command is runnable, deprecated, or hidden it is not a 'help' command if c.Runnable() || len(c.Deprecated) != 0 || c.Hidden { return false @@ -1032,7 +1034,7 @@ func (c *Command) IsHelpCommand() bool { // if any non-help sub commands are found, the command is not a 'help' command for _, sub := range c.commands { - if !sub.IsHelpCommand() { + if !sub.IsAdditionalHelpTopicCommand() { return false } } @@ -1045,10 +1047,9 @@ func (c *Command) IsHelpCommand() bool { // that need to be shown in the usage/help default template under 'additional help // topics'. func (c *Command) HasHelpSubCommands() bool { - // return true on the first found available 'help' sub command for _, sub := range c.commands { - if sub.IsHelpCommand() { + if sub.IsAdditionalHelpTopicCommand() { return true } } @@ -1060,7 +1061,6 @@ func (c *Command) HasHelpSubCommands() bool { // HasAvailableSubCommands determines if a command has available sub commands that // need to be shown in the usage/help default template under 'available commands'. func (c *Command) HasAvailableSubCommands() bool { - // return true on the first found available (non deprecated/help/hidden) // sub command for _, sub := range c.commands { diff --git a/vendor/github.com/spf13/cobra/doc/man_docs.go b/vendor/github.com/spf13/cobra/doc/man_docs.go index fd7107c424..b9266c367c 100644 --- a/vendor/github.com/spf13/cobra/doc/man_docs.go +++ b/vendor/github.com/spf13/cobra/doc/man_docs.go @@ -49,7 +49,7 @@ func GenManTreeFromOpts(cmd *cobra.Command, opts GenManTreeOptions) error { header = &GenManHeader{} } for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsHelpCommand() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { continue } if err := GenManTreeFromOpts(c, opts); err != nil { @@ -216,7 +216,7 @@ func genMan(cmd *cobra.Command, header *GenManHeader) []byte { children := cmd.Commands() sort.Sort(byName(children)) for _, c := range children { - if !c.IsAvailableCommand() || c.IsHelpCommand() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { continue } seealso := fmt.Sprintf("**%s-%s(%s)**", dashCommandName, c.Name(), header.Section) diff --git a/vendor/github.com/spf13/cobra/doc/md_docs.go b/vendor/github.com/spf13/cobra/doc/md_docs.go index fa13631804..8d159c1d73 100644 --- a/vendor/github.com/spf13/cobra/doc/md_docs.go +++ b/vendor/github.com/spf13/cobra/doc/md_docs.go @@ -119,7 +119,7 @@ func GenMarkdownCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) sort.Sort(byName(children)) for _, child := range children { - if !child.IsAvailableCommand() || child.IsHelpCommand() { + if !child.IsAvailableCommand() || child.IsAdditionalHelpTopicCommand() { continue } cname := name + " " + child.Name() @@ -149,7 +149,7 @@ func GenMarkdownTree(cmd *cobra.Command, dir string) error { func GenMarkdownTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error { for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsHelpCommand() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { continue } if err := GenMarkdownTreeCustom(c, dir, filePrepender, linkHandler); err != nil { diff --git a/vendor/github.com/spf13/cobra/doc/util.go b/vendor/github.com/spf13/cobra/doc/util.go index a7d2765a90..8d3dbecec8 100644 --- a/vendor/github.com/spf13/cobra/doc/util.go +++ b/vendor/github.com/spf13/cobra/doc/util.go @@ -27,7 +27,7 @@ func hasSeeAlso(cmd *cobra.Command) bool { return true } for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsHelpCommand() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { continue } return true diff --git a/vendor/github.com/spf13/cobra/doc/yaml_docs.go b/vendor/github.com/spf13/cobra/doc/yaml_docs.go index 75474d299d..ac8db89ebe 100644 --- a/vendor/github.com/spf13/cobra/doc/yaml_docs.go +++ b/vendor/github.com/spf13/cobra/doc/yaml_docs.go @@ -57,7 +57,7 @@ func GenYamlTree(cmd *cobra.Command, dir string) error { // GenYamlTreeCustom creates yaml structured ref files func GenYamlTreeCustom(cmd *cobra.Command, dir string, filePrepender, linkHandler func(string) string) error { for _, c := range cmd.Commands() { - if !c.IsAvailableCommand() || c.IsHelpCommand() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { continue } if err := GenYamlTreeCustom(c, dir, filePrepender, linkHandler); err != nil { @@ -117,7 +117,7 @@ func GenYamlCustom(cmd *cobra.Command, w io.Writer, linkHandler func(string) str children := cmd.Commands() sort.Sort(byName(children)) for _, child := range children { - if !child.IsAvailableCommand() || child.IsHelpCommand() { + if !child.IsAvailableCommand() || child.IsAdditionalHelpTopicCommand() { continue } result = append(result, child.Name()+" - "+child.Short) diff --git a/vendor/github.com/tylerb/graceful/README.md b/vendor/github.com/tylerb/graceful/README.md index 328c3acf89..c641b6e784 100644 --- a/vendor/github.com/tylerb/graceful/README.md +++ b/vendor/github.com/tylerb/graceful/README.md @@ -3,6 +3,11 @@ graceful [![GoDoc](https://godoc.org/github.com/tylerb/graceful?status.png)](htt Graceful is a Go 1.3+ package enabling graceful shutdown of http.Handler servers. +## Using Go 1.8? + +If you are using Go 1.8, you may not need to use this library! Consider using `http.Server`'s built-in [Shutdown()](https://golang.org/pkg/net/http/#Server.Shutdown) +method for graceful shutdowns. + ## Installation To install, simply execute: diff --git a/vendor/github.com/tylerb/graceful/graceful.go b/vendor/github.com/tylerb/graceful/graceful.go index d6a9ca068a..ebf0aeb7dc 100644 --- a/vendor/github.com/tylerb/graceful/graceful.go +++ b/vendor/github.com/tylerb/graceful/graceful.go @@ -366,6 +366,7 @@ func (srv *Server) manageConnections(add, idle, active, remove chan net.Conn, sh select { case conn := <-add: srv.connections[conn] = struct{}{} + srv.idleConnections[conn] = struct{}{} // Newly-added connections are considered idle until they become active. case conn := <-idle: srv.idleConnections[conn] = struct{}{} case conn := <-active: diff --git a/vendor/github.com/xenolf/lego/README.md b/vendor/github.com/xenolf/lego/README.md index 9be562944e..852f0a8338 100644 --- a/vendor/github.com/xenolf/lego/README.md +++ b/vendor/github.com/xenolf/lego/README.md @@ -23,7 +23,11 @@ To build lego inside a Docker container, just run ``` docker build -t lego . ``` - +##### From the package manager +- [ArchLinux (AUR)](https://aur.archlinux.org/packages/lego-git): +``` +yaourt -S lego-git +``` #### Features - Register with CA diff --git a/vendor/github.com/xenolf/lego/acme/client.go b/vendor/github.com/xenolf/lego/acme/client.go index e824f5080f..ba56e796ca 100644 --- a/vendor/github.com/xenolf/lego/acme/client.go +++ b/vendor/github.com/xenolf/lego/acme/client.go @@ -535,6 +535,7 @@ func (c *Client) getChallenges(domains []string) ([]authorizationResource, map[s links := parseLinks(hdr["Link"]) if links["next"] == "" { logf("[ERROR][%s] acme: Server did not provide next link to proceed", domain) + errc <- domainError{Domain: domain, Error: errors.New("Server did not provide next link to proceed")} return } @@ -560,12 +561,20 @@ func (c *Client) getChallenges(domains []string) ([]authorizationResource, map[s } } + logAuthz(challenges) + close(resc) close(errc) return challenges, failures } +func logAuthz(authz []authorizationResource) { + for _, auth := range authz { + logf("[INFO][%s] AuthURL: %s", auth.Domain, auth.AuthURL) + } +} + func (c *Client) requestCertificate(authz []authorizationResource, bundle bool, privKey crypto.PrivateKey, mustStaple bool) (CertificateResource, error) { if len(authz) == 0 { return CertificateResource{}, errors.New("Passed no authorizations to requestCertificate!") diff --git a/vendor/github.com/xenolf/lego/acme/client_test.go b/vendor/github.com/xenolf/lego/acme/client_test.go index e309554f30..b18334c8a8 100644 --- a/vendor/github.com/xenolf/lego/acme/client_test.go +++ b/vendor/github.com/xenolf/lego/acme/client_test.go @@ -10,6 +10,7 @@ import ( "net/http/httptest" "strings" "testing" + "time" ) func TestNewClient(t *testing.T) { @@ -118,6 +119,39 @@ func TestClientOptPort(t *testing.T) { } } +func TestNotHoldingLockWhileMakingHTTPRequests(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + time.Sleep(250 * time.Millisecond) + w.Header().Add("Replay-Nonce", "12345") + w.Header().Add("Retry-After", "0") + writeJSONResponse(w, &challenge{Type: "http-01", Status: "Valid", URI: "http://example.com/", Token: "token"}) + })) + defer ts.Close() + + privKey, _ := rsa.GenerateKey(rand.Reader, 512) + j := &jws{privKey: privKey, directoryURL: ts.URL} + ch := make(chan bool) + resultCh := make(chan bool) + go func() { + j.Nonce() + ch <- true + }() + go func() { + j.Nonce() + ch <- true + }() + go func() { + <-ch + <-ch + resultCh <- true + }() + select { + case <-resultCh: + case <-time.After(400 * time.Millisecond): + t.Fatal("JWS is probably holding a lock while making HTTP request") + } +} + func TestValidate(t *testing.T) { var statuses []string ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -168,6 +202,43 @@ func TestValidate(t *testing.T) { } } +func TestGetChallenges(t *testing.T) { + var ts *httptest.Server + ts = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case "GET", "HEAD": + w.Header().Add("Replay-Nonce", "12345") + w.Header().Add("Retry-After", "0") + writeJSONResponse(w, directory{NewAuthzURL: ts.URL, NewCertURL: ts.URL, NewRegURL: ts.URL, RevokeCertURL: ts.URL}) + case "POST": + writeJSONResponse(w, authorization{}) + } + })) + defer ts.Close() + + keyBits := 512 // small value keeps test fast + keyType := RSA2048 + key, err := rsa.GenerateKey(rand.Reader, keyBits) + if err != nil { + t.Fatal("Could not generate test key:", err) + } + user := mockUser{ + email: "test@test.com", + regres: &RegistrationResource{NewAuthzURL: ts.URL}, + privatekey: key, + } + + client, err := NewClient(ts.URL, user, keyType) + if err != nil { + t.Fatalf("Could not create client: %v", err) + } + + _, failures := client.getChallenges([]string{"example.com"}) + if failures["example.com"] == nil { + t.Fatal("Expecting \"Server did not provide next link to proceed\" error, got nil") + } +} + // writeJSONResponse marshals the body as JSON and writes it to the response. func writeJSONResponse(w http.ResponseWriter, body interface{}) { bs, err := json.Marshal(body) diff --git a/vendor/github.com/xenolf/lego/acme/error.go b/vendor/github.com/xenolf/lego/acme/error.go index 6d7013cf1d..e4bc934c25 100644 --- a/vendor/github.com/xenolf/lego/acme/error.go +++ b/vendor/github.com/xenolf/lego/acme/error.go @@ -8,7 +8,10 @@ import ( "strings" ) -const tosAgreementError = "Must agree to subscriber agreement before any further actions" +const ( + tosAgreementError = "Must agree to subscriber agreement before any further actions" + invalidNonceError = "JWS has invalid anti-replay nonce" +) // RemoteError is the base type for all errors specific to the ACME protocol. type RemoteError struct { @@ -28,6 +31,12 @@ type TOSError struct { RemoteError } +// NonceError represents the error which is returned if the +// nonce sent by the client was not accepted by the server. +type NonceError struct { + RemoteError +} + type domainError struct { Domain string Error error @@ -73,6 +82,10 @@ func handleHTTPError(resp *http.Response) error { return TOSError{errorDetail} } + if errorDetail.StatusCode == http.StatusBadRequest && strings.HasPrefix(errorDetail.Detail, invalidNonceError) { + return NonceError{errorDetail} + } + return errorDetail } diff --git a/vendor/github.com/xenolf/lego/acme/http.go b/vendor/github.com/xenolf/lego/acme/http.go index 180db786d4..dc958046a5 100644 --- a/vendor/github.com/xenolf/lego/acme/http.go +++ b/vendor/github.com/xenolf/lego/acme/http.go @@ -31,14 +31,14 @@ const ( func httpHead(url string) (resp *http.Response, err error) { req, err := http.NewRequest("HEAD", url, nil) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to head %q: %v", url, err) } req.Header.Set("User-Agent", userAgent()) resp, err = HTTPClient.Do(req) if err != nil { - return resp, err + return resp, fmt.Errorf("failed to do head %q: %v", url, err) } resp.Body.Close() return resp, err @@ -49,7 +49,7 @@ func httpHead(url string) (resp *http.Response, err error) { func httpPost(url string, bodyType string, body io.Reader) (resp *http.Response, err error) { req, err := http.NewRequest("POST", url, body) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to post %q: %v", url, err) } req.Header.Set("Content-Type", bodyType) req.Header.Set("User-Agent", userAgent()) @@ -62,7 +62,7 @@ func httpPost(url string, bodyType string, body io.Reader) (resp *http.Response, func httpGet(url string) (resp *http.Response, err error) { req, err := http.NewRequest("GET", url, nil) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to get %q: %v", url, err) } req.Header.Set("User-Agent", userAgent()) @@ -74,7 +74,7 @@ func httpGet(url string) (resp *http.Response, err error) { func getJSON(uri string, respBody interface{}) (http.Header, error) { resp, err := httpGet(uri) if err != nil { - return nil, fmt.Errorf("failed to get %q: %v", uri, err) + return nil, fmt.Errorf("failed to get json %q: %v", uri, err) } defer resp.Body.Close() diff --git a/vendor/github.com/xenolf/lego/acme/jws.go b/vendor/github.com/xenolf/lego/acme/jws.go index 2a1fc244d9..1b4d29d533 100644 --- a/vendor/github.com/xenolf/lego/acme/jws.go +++ b/vendor/github.com/xenolf/lego/acme/jws.go @@ -16,8 +16,7 @@ import ( type jws struct { directoryURL string privKey crypto.PrivateKey - nonces []string - sync.Mutex + nonces nonceManager } func keyAsJWK(key interface{}) *jose.JsonWebKey { @@ -38,19 +37,31 @@ func keyAsJWK(key interface{}) *jose.JsonWebKey { func (j *jws) post(url string, content []byte) (*http.Response, error) { signedContent, err := j.signContent(content) if err != nil { - return nil, err + return nil, fmt.Errorf("Failed to sign content -> %s", err.Error()) } resp, err := httpPost(url, "application/jose+json", bytes.NewBuffer([]byte(signedContent.FullSerialize()))) - if err != nil { - return nil, err + + // Even in case of an error, the response should still contain a nonce. + nonce, nonceErr := getNonceFromResponse(resp) + if nonceErr == nil { + j.nonces.Push(nonce) } - j.Lock() - defer j.Unlock() - j.getNonceFromResponse(resp) + if err != nil { + switch err.(type) { + case NonceError: + // In case of a nonce error - retry once + resp, err = httpPost(url, "application/jose+json", bytes.NewBuffer([]byte(signedContent.FullSerialize()))) + if err != nil { + return nil, fmt.Errorf("Failed to HTTP POST to %s -> %s", url, err.Error()) + } + default: + return nil, fmt.Errorf("Failed to HTTP POST to %s -> %s", url, err.Error()) + } + } - return resp, err + return resp, nil } func (j *jws) signContent(content []byte) (*jose.JsonWebSignature, error) { @@ -69,49 +80,63 @@ func (j *jws) signContent(content []byte) (*jose.JsonWebSignature, error) { signer, err := jose.NewSigner(alg, j.privKey) if err != nil { - return nil, err + return nil, fmt.Errorf("Failed to create jose signer -> %s", err.Error()) } signer.SetNonceSource(j) signed, err := signer.Sign(content) if err != nil { - return nil, err + return nil, fmt.Errorf("Failed to sign content -> %s", err.Error()) } return signed, nil } -func (j *jws) getNonceFromResponse(resp *http.Response) error { +func (j *jws) Nonce() (string, error) { + if nonce, ok := j.nonces.Pop(); ok { + return nonce, nil + } + + return getNonce(j.directoryURL) +} + +type nonceManager struct { + nonces []string + sync.Mutex +} + +func (n *nonceManager) Pop() (string, bool) { + n.Lock() + defer n.Unlock() + + if len(n.nonces) == 0 { + return "", false + } + + nonce := n.nonces[len(n.nonces)-1] + n.nonces = n.nonces[:len(n.nonces)-1] + return nonce, true +} + +func (n *nonceManager) Push(nonce string) { + n.Lock() + defer n.Unlock() + n.nonces = append(n.nonces, nonce) +} + +func getNonce(url string) (string, error) { + resp, err := httpHead(url) + if err != nil { + return "", fmt.Errorf("Failed to get nonce from HTTP HEAD -> %s", err.Error()) + } + + return getNonceFromResponse(resp) +} + +func getNonceFromResponse(resp *http.Response) (string, error) { nonce := resp.Header.Get("Replay-Nonce") if nonce == "" { - return fmt.Errorf("Server did not respond with a proper nonce header.") + return "", fmt.Errorf("Server did not respond with a proper nonce header.") } - j.nonces = append(j.nonces, nonce) - return nil -} - -func (j *jws) getNonce() error { - resp, err := httpHead(j.directoryURL) - if err != nil { - return err - } - - return j.getNonceFromResponse(resp) -} - -func (j *jws) Nonce() (string, error) { - j.Lock() - defer j.Unlock() - nonce := "" - if len(j.nonces) == 0 { - err := j.getNonce() - if err != nil { - return nonce, err - } - } - if len(j.nonces) == 0 { - return "", fmt.Errorf("Can't get nonce") - } - nonce, j.nonces = j.nonces[len(j.nonces)-1], j.nonces[:len(j.nonces)-1] return nonce, nil } diff --git a/vendor/github.com/xenolf/lego/providers/http/memcached/memcached.go b/vendor/github.com/xenolf/lego/providers/http/memcached/memcached.go index 9c5f6c0b40..9ac8b811da 100644 --- a/vendor/github.com/xenolf/lego/providers/http/memcached/memcached.go +++ b/vendor/github.com/xenolf/lego/providers/http/memcached/memcached.go @@ -1,4 +1,5 @@ -// Package webroot implements a HTTP provider for solving the HTTP-01 challenge using web server's root path. +// Package memcached implements a HTTP provider for solving the HTTP-01 challenge using memcached +// in combination with a webserver. package memcached import ( diff --git a/vendor/golang.org/x/crypto/acme/acme.go b/vendor/golang.org/x/crypto/acme/acme.go index 8aafada091..8619508e58 100644 --- a/vendor/golang.org/x/crypto/acme/acme.go +++ b/vendor/golang.org/x/crypto/acme/acme.go @@ -47,6 +47,10 @@ const LetsEncryptURL = "https://acme-v01.api.letsencrypt.org/directory" const ( maxChainLen = 5 // max depth and breadth of a certificate chain maxCertSize = 1 << 20 // max size of a certificate, in bytes + + // Max number of collected nonces kept in memory. + // Expect usual peak of 1 or 2. + maxNonces = 100 ) // CertOption is an optional argument type for Client methods which manipulate @@ -108,6 +112,9 @@ type Client struct { dirMu sync.Mutex // guards writes to dir dir *Directory // cached result of Client's Discover method + + noncesMu sync.Mutex + nonces map[string]struct{} // nonces collected from previous responses } // Discover performs ACME server discovery using c.DirectoryURL. @@ -131,6 +138,7 @@ func (c *Client) Discover(ctx context.Context) (Directory, error) { return Directory{}, err } defer res.Body.Close() + c.addNonce(res.Header) if res.StatusCode != http.StatusOK { return Directory{}, responseError(res) } @@ -192,7 +200,7 @@ func (c *Client) CreateCert(ctx context.Context, csr []byte, exp time.Duration, req.NotAfter = now.Add(exp).Format(time.RFC3339) } - res, err := postJWS(ctx, c.HTTPClient, c.Key, c.dir.CertURL, req) + res, err := c.postJWS(ctx, c.Key, c.dir.CertURL, req) if err != nil { return nil, "", err } @@ -267,7 +275,7 @@ func (c *Client) RevokeCert(ctx context.Context, key crypto.Signer, cert []byte, if key == nil { key = c.Key } - res, err := postJWS(ctx, c.HTTPClient, key, c.dir.RevokeURL, body) + res, err := c.postJWS(ctx, key, c.dir.RevokeURL, body) if err != nil { return err } @@ -355,7 +363,7 @@ func (c *Client) Authorize(ctx context.Context, domain string) (*Authorization, Resource: "new-authz", Identifier: authzID{Type: "dns", Value: domain}, } - res, err := postJWS(ctx, c.HTTPClient, c.Key, c.dir.AuthzURL, req) + res, err := c.postJWS(ctx, c.Key, c.dir.AuthzURL, req) if err != nil { return nil, err } @@ -413,7 +421,7 @@ func (c *Client) RevokeAuthorization(ctx context.Context, url string) error { Status: "deactivated", Delete: true, } - res, err := postJWS(ctx, c.HTTPClient, c.Key, url, req) + res, err := c.postJWS(ctx, c.Key, url, req) if err != nil { return err } @@ -519,7 +527,7 @@ func (c *Client) Accept(ctx context.Context, chal *Challenge) (*Challenge, error Type: chal.Type, Auth: auth, } - res, err := postJWS(ctx, c.HTTPClient, c.Key, chal.URI, req) + res, err := c.postJWS(ctx, c.Key, chal.URI, req) if err != nil { return nil, err } @@ -652,7 +660,7 @@ func (c *Client) doReg(ctx context.Context, url string, typ string, acct *Accoun req.Contact = acct.Contact req.Agreement = acct.AgreedTerms } - res, err := postJWS(ctx, c.HTTPClient, c.Key, url, req) + res, err := c.postJWS(ctx, c.Key, url, req) if err != nil { return nil, err } @@ -689,6 +697,78 @@ func (c *Client) doReg(ctx context.Context, url string, typ string, acct *Accoun }, nil } +// postJWS signs the body with the given key and POSTs it to the provided url. +// The body argument must be JSON-serializable. +func (c *Client) postJWS(ctx context.Context, key crypto.Signer, url string, body interface{}) (*http.Response, error) { + nonce, err := c.popNonce(ctx, url) + if err != nil { + return nil, err + } + b, err := jwsEncodeJSON(body, key, nonce) + if err != nil { + return nil, err + } + res, err := ctxhttp.Post(ctx, c.HTTPClient, url, "application/jose+json", bytes.NewReader(b)) + if err != nil { + return nil, err + } + c.addNonce(res.Header) + return res, nil +} + +// popNonce returns a nonce value previously stored with c.addNonce +// or fetches a fresh one from the given URL. +func (c *Client) popNonce(ctx context.Context, url string) (string, error) { + c.noncesMu.Lock() + defer c.noncesMu.Unlock() + if len(c.nonces) == 0 { + return fetchNonce(ctx, c.HTTPClient, url) + } + var nonce string + for nonce = range c.nonces { + delete(c.nonces, nonce) + break + } + return nonce, nil +} + +// addNonce stores a nonce value found in h (if any) for future use. +func (c *Client) addNonce(h http.Header) { + v := nonceFromHeader(h) + if v == "" { + return + } + c.noncesMu.Lock() + defer c.noncesMu.Unlock() + if len(c.nonces) >= maxNonces { + return + } + if c.nonces == nil { + c.nonces = make(map[string]struct{}) + } + c.nonces[v] = struct{}{} +} + +func fetchNonce(ctx context.Context, client *http.Client, url string) (string, error) { + resp, err := ctxhttp.Head(ctx, client, url) + if err != nil { + return "", err + } + defer resp.Body.Close() + nonce := nonceFromHeader(resp.Header) + if nonce == "" { + if resp.StatusCode > 299 { + return "", responseError(resp) + } + return "", errors.New("acme: nonce not found") + } + return nonce, nil +} + +func nonceFromHeader(h http.Header) string { + return h.Get("Replay-Nonce") +} + func responseCert(ctx context.Context, client *http.Client, res *http.Response, bundle bool) ([][]byte, error) { b, err := ioutil.ReadAll(io.LimitReader(res.Body, maxCertSize+1)) if err != nil { @@ -793,33 +873,6 @@ func chainCert(ctx context.Context, client *http.Client, url string, depth int) return chain, nil } -// postJWS signs the body with the given key and POSTs it to the provided url. -// The body argument must be JSON-serializable. -func postJWS(ctx context.Context, client *http.Client, key crypto.Signer, url string, body interface{}) (*http.Response, error) { - nonce, err := fetchNonce(ctx, client, url) - if err != nil { - return nil, err - } - b, err := jwsEncodeJSON(body, key, nonce) - if err != nil { - return nil, err - } - return ctxhttp.Post(ctx, client, url, "application/jose+json", bytes.NewReader(b)) -} - -func fetchNonce(ctx context.Context, client *http.Client, url string) (string, error) { - resp, err := ctxhttp.Head(ctx, client, url) - if err != nil { - return "", nil - } - defer resp.Body.Close() - enc := resp.Header.Get("replay-nonce") - if enc == "" { - return "", errors.New("acme: nonce not found") - } - return enc, nil -} - // linkHeader returns URI-Reference values of all Link headers // with relation-type rel. // See https://tools.ietf.org/html/rfc5988#section-5 for details. diff --git a/vendor/golang.org/x/crypto/acme/acme_test.go b/vendor/golang.org/x/crypto/acme/acme_test.go index 4e618f2929..1205dbb363 100644 --- a/vendor/golang.org/x/crypto/acme/acme_test.go +++ b/vendor/golang.org/x/crypto/acme/acme_test.go @@ -45,6 +45,28 @@ func decodeJWSRequest(t *testing.T, v interface{}, r *http.Request) { } } +type jwsHead struct { + Alg string + Nonce string + JWK map[string]string `json:"jwk"` +} + +func decodeJWSHead(r *http.Request) (*jwsHead, error) { + var req struct{ Protected string } + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + return nil, err + } + b, err := base64.RawURLEncoding.DecodeString(req.Protected) + if err != nil { + return nil, err + } + var head jwsHead + if err := json.Unmarshal(b, &head); err != nil { + return nil, err + } + return &head, nil +} + func TestDiscover(t *testing.T) { const ( reg = "https://example.com/acme/new-reg" @@ -916,7 +938,30 @@ func TestRevokeCert(t *testing.T) { } } -func TestFetchNonce(t *testing.T) { +func TestNonce_add(t *testing.T) { + var c Client + c.addNonce(http.Header{"Replay-Nonce": {"nonce"}}) + c.addNonce(http.Header{"Replay-Nonce": {}}) + c.addNonce(http.Header{"Replay-Nonce": {"nonce"}}) + + nonces := map[string]struct{}{"nonce": struct{}{}} + if !reflect.DeepEqual(c.nonces, nonces) { + t.Errorf("c.nonces = %q; want %q", c.nonces, nonces) + } +} + +func TestNonce_addMax(t *testing.T) { + c := &Client{nonces: make(map[string]struct{})} + for i := 0; i < maxNonces; i++ { + c.nonces[fmt.Sprintf("%d", i)] = struct{}{} + } + c.addNonce(http.Header{"Replay-Nonce": {"nonce"}}) + if n := len(c.nonces); n != maxNonces { + t.Errorf("len(c.nonces) = %d; want %d", n, maxNonces) + } +} + +func TestNonce_fetch(t *testing.T) { tests := []struct { code int nonce string @@ -949,6 +994,76 @@ func TestFetchNonce(t *testing.T) { } } +func TestNonce_fetchError(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusTooManyRequests) + })) + defer ts.Close() + _, err := fetchNonce(context.Background(), http.DefaultClient, ts.URL) + e, ok := err.(*Error) + if !ok { + t.Fatalf("err is %T; want *Error", err) + } + if e.StatusCode != http.StatusTooManyRequests { + t.Errorf("e.StatusCode = %d; want %d", e.StatusCode, http.StatusTooManyRequests) + } +} + +func TestNonce_postJWS(t *testing.T) { + var count int + seen := make(map[string]bool) + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + count++ + w.Header().Set("replay-nonce", fmt.Sprintf("nonce%d", count)) + if r.Method == "HEAD" { + // We expect the client do a HEAD request + // but only to fetch the first nonce. + return + } + // Make client.Authorize happy; we're not testing its result. + defer func() { + w.WriteHeader(http.StatusCreated) + w.Write([]byte(`{"status":"valid"}`)) + }() + + head, err := decodeJWSHead(r) + if err != nil { + t.Errorf("decodeJWSHead: %v", err) + return + } + if head.Nonce == "" { + t.Error("head.Nonce is empty") + return + } + if seen[head.Nonce] { + t.Errorf("nonce is already used: %q", head.Nonce) + } + seen[head.Nonce] = true + })) + defer ts.Close() + + client := Client{Key: testKey, dir: &Directory{AuthzURL: ts.URL}} + if _, err := client.Authorize(context.Background(), "example.com"); err != nil { + t.Errorf("client.Authorize 1: %v", err) + } + // The second call should not generate another extra HEAD request. + if _, err := client.Authorize(context.Background(), "example.com"); err != nil { + t.Errorf("client.Authorize 2: %v", err) + } + + if count != 3 { + t.Errorf("total requests count: %d; want 3", count) + } + if n := len(client.nonces); n != 1 { + t.Errorf("len(client.nonces) = %d; want 1", n) + } + for k := range seen { + if _, exist := client.nonces[k]; exist { + t.Errorf("used nonce %q in client.nonces", k) + } + } +} + func TestLinkHeader(t *testing.T) { h := http.Header{"Link": { `;rel="next"`, diff --git a/vendor/golang.org/x/crypto/acme/autocert/autocert_test.go b/vendor/golang.org/x/crypto/acme/autocert/autocert_test.go index 4bcd6d532a..7afb213317 100644 --- a/vendor/golang.org/x/crypto/acme/autocert/autocert_test.go +++ b/vendor/golang.org/x/crypto/acme/autocert/autocert_test.go @@ -22,6 +22,7 @@ import ( "net/http" "net/http/httptest" "reflect" + "sync" "testing" "time" @@ -51,26 +52,44 @@ var authzTmpl = template.Must(template.New("authz").Parse(`{ ] }`)) -type memCache map[string][]byte +type memCache struct { + mu sync.Mutex + keyData map[string][]byte +} -func (m memCache) Get(ctx context.Context, key string) ([]byte, error) { - v, ok := m[key] +func (m *memCache) Get(ctx context.Context, key string) ([]byte, error) { + m.mu.Lock() + defer m.mu.Unlock() + + v, ok := m.keyData[key] if !ok { return nil, ErrCacheMiss } return v, nil } -func (m memCache) Put(ctx context.Context, key string, data []byte) error { - m[key] = data +func (m *memCache) Put(ctx context.Context, key string, data []byte) error { + m.mu.Lock() + defer m.mu.Unlock() + + m.keyData[key] = data return nil } -func (m memCache) Delete(ctx context.Context, key string) error { - delete(m, key) +func (m *memCache) Delete(ctx context.Context, key string) error { + m.mu.Lock() + defer m.mu.Unlock() + + delete(m.keyData, key) return nil } +func newMemCache() *memCache { + return &memCache{ + keyData: make(map[string][]byte), + } +} + func dummyCert(pub interface{}, san ...string) ([]byte, error) { return dateDummyCert(pub, time.Now(), time.Now().Add(90*24*time.Hour), san...) } @@ -124,7 +143,7 @@ func TestGetCertificate_trailingDot(t *testing.T) { func TestGetCertificate_ForceRSA(t *testing.T) { man := &Manager{ Prompt: AcceptTOS, - Cache: make(memCache), + Cache: newMemCache(), ForceRSA: true, } defer man.stopRenew() @@ -280,8 +299,7 @@ func testGetCertificate(t *testing.T, man *Manager, domain string, hello *tls.Cl } func TestAccountKeyCache(t *testing.T) { - cache := make(memCache) - m := Manager{Cache: cache} + m := Manager{Cache: newMemCache()} ctx := context.Background() k1, err := m.accountKey(ctx) if err != nil { @@ -315,8 +333,7 @@ func TestCache(t *testing.T) { PrivateKey: privKey, } - cache := make(memCache) - man := &Manager{Cache: cache} + man := &Manager{Cache: newMemCache()} defer man.stopRenew() if err := man.cachePut("example.org", tlscert); err != nil { t.Fatalf("man.cachePut: %v", err) diff --git a/vendor/golang.org/x/crypto/acme/autocert/renewal_test.go b/vendor/golang.org/x/crypto/acme/autocert/renewal_test.go index d1ec52f4d0..10c811ac40 100644 --- a/vendor/golang.org/x/crypto/acme/autocert/renewal_test.go +++ b/vendor/golang.org/x/crypto/acme/autocert/renewal_test.go @@ -111,7 +111,7 @@ func TestRenewFromCache(t *testing.T) { } man := &Manager{ Prompt: AcceptTOS, - Cache: make(memCache), + Cache: newMemCache(), RenewBefore: 24 * time.Hour, Client: &acme.Client{ Key: key, diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s index 96a51d524b..784bce6a9c 100644 --- a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s +++ b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s @@ -54,68 +54,223 @@ DATA ·AVX_c48<>+0x00(SB)/8, $0x0100070605040302 DATA ·AVX_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a GLOBL ·AVX_c48<>(SB), (NOPTR+RODATA), $16 -// unfortunately the BYTE representation of VPERMQ must be used -#define ROUND_AVX2(m0, m1, m2, m3, t, c40, c48) \ - VPADDQ m0, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFD $-79, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPSHUFB c40, Y1, Y1; \ - VPADDQ m1, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFB c48, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPADDQ Y1, Y1, t; \ - VPSRLQ $63, Y1, Y1; \ - VPXOR t, Y1, Y1; \ - BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x39 \ // VPERMQ 0x39, Y1, Y1 - BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xd2; BYTE $0x4e \ // VPERMQ 0x4e, Y2, Y2 - BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x93 \ // VPERMQ 0x93, Y3, Y3 - VPADDQ m2, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFD $-79, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPSHUFB c40, Y1, Y1; \ - VPADDQ m3, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFB c48, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPADDQ Y1, Y1, t; \ - VPSRLQ $63, Y1, Y1; \ - VPXOR t, Y1, Y1; \ - BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x39 \ // VPERMQ 0x39, Y3, Y3 - BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xd2; BYTE $0x4e \ // VPERMQ 0x4e, Y2, Y2 - BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x93 \ // VPERMQ 0x93, Y1, Y1 +#define VPERMQ_0x39_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x39 +#define VPERMQ_0x93_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x93 +#define VPERMQ_0x4E_Y2_Y2 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xd2; BYTE $0x4e +#define VPERMQ_0x93_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x93 +#define VPERMQ_0x39_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x39 -// load msg into Y12, Y13, Y14, Y15 -#define LOAD_MSG_AVX2(src, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15) \ - MOVQ i0*8(src), X12; \ - PINSRQ $1, i1*8(src), X12; \ - MOVQ i2*8(src), X11; \ - PINSRQ $1, i3*8(src), X11; \ - VINSERTI128 $1, X11, Y12, Y12; \ - MOVQ i4*8(src), X13; \ - PINSRQ $1, i5*8(src), X13; \ - MOVQ i6*8(src), X11; \ - PINSRQ $1, i7*8(src), X11; \ - VINSERTI128 $1, X11, Y13, Y13; \ - MOVQ i8*8(src), X14; \ - PINSRQ $1, i9*8(src), X14; \ - MOVQ i10*8(src), X11; \ - PINSRQ $1, i11*8(src), X11; \ +#define ROUND_AVX2(m0, m1, m2, m3, t, c40, c48) \ + VPADDQ m0, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFD $-79, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPSHUFB c40, Y1, Y1; \ + VPADDQ m1, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFB c48, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPADDQ Y1, Y1, t; \ + VPSRLQ $63, Y1, Y1; \ + VPXOR t, Y1, Y1; \ + VPERMQ_0x39_Y1_Y1; \ + VPERMQ_0x4E_Y2_Y2; \ + VPERMQ_0x93_Y3_Y3; \ + VPADDQ m2, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFD $-79, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPSHUFB c40, Y1, Y1; \ + VPADDQ m3, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFB c48, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPADDQ Y1, Y1, t; \ + VPSRLQ $63, Y1, Y1; \ + VPXOR t, Y1, Y1; \ + VPERMQ_0x39_Y3_Y3; \ + VPERMQ_0x4E_Y2_Y2; \ + VPERMQ_0x93_Y1_Y1 + +#define VMOVQ_SI_X11_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x1E +#define VMOVQ_SI_X12_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x26 +#define VMOVQ_SI_X13_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x2E +#define VMOVQ_SI_X14_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x36 +#define VMOVQ_SI_X15_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x3E + +#define VMOVQ_SI_X11(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x5E; BYTE $n +#define VMOVQ_SI_X12(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x66; BYTE $n +#define VMOVQ_SI_X13(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x6E; BYTE $n +#define VMOVQ_SI_X14(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x76; BYTE $n +#define VMOVQ_SI_X15(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x7E; BYTE $n + +#define VPINSRQ_1_SI_X11_0 BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x1E; BYTE $0x01 +#define VPINSRQ_1_SI_X12_0 BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x26; BYTE $0x01 +#define VPINSRQ_1_SI_X13_0 BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x2E; BYTE $0x01 +#define VPINSRQ_1_SI_X14_0 BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x36; BYTE $0x01 +#define VPINSRQ_1_SI_X15_0 BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x3E; BYTE $0x01 + +#define VPINSRQ_1_SI_X11(n) BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x5E; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X12(n) BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x66; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X13(n) BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x6E; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X14(n) BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x76; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X15(n) BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x7E; BYTE $n; BYTE $0x01 + +#define VMOVQ_R8_X15 BYTE $0xC4; BYTE $0x41; BYTE $0xF9; BYTE $0x6E; BYTE $0xF8 +#define VPINSRQ_1_R9_X15 BYTE $0xC4; BYTE $0x43; BYTE $0x81; BYTE $0x22; BYTE $0xF9; BYTE $0x01 + +// load msg: Y12 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y12(i0, i1, i2, i3) \ + VMOVQ_SI_X12(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X12(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y12, Y12 + +// load msg: Y13 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y13(i0, i1, i2, i3) \ + VMOVQ_SI_X13(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X13(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y13, Y13 + +// load msg: Y14 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y14(i0, i1, i2, i3) \ + VMOVQ_SI_X14(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X14(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y14, Y14 + +// load msg: Y15 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y15(i0, i1, i2, i3) \ + VMOVQ_SI_X15(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X15(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() \ + VMOVQ_SI_X12_0; \ + VMOVQ_SI_X11(4*8); \ + VPINSRQ_1_SI_X12(2*8); \ + VPINSRQ_1_SI_X11(6*8); \ + VINSERTI128 $1, X11, Y12, Y12; \ + LOAD_MSG_AVX2_Y13(1, 3, 5, 7); \ + LOAD_MSG_AVX2_Y14(8, 10, 12, 14); \ + LOAD_MSG_AVX2_Y15(9, 11, 13, 15) + +#define LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() \ + LOAD_MSG_AVX2_Y12(14, 4, 9, 13); \ + LOAD_MSG_AVX2_Y13(10, 8, 15, 6); \ + VMOVQ_SI_X11(11*8); \ + VPSHUFD $0x4E, 0*8(SI), X14; \ + VPINSRQ_1_SI_X11(5*8); \ VINSERTI128 $1, X11, Y14, Y14; \ - MOVQ i12*8(src), X15; \ - PINSRQ $1, i13*8(src), X15; \ - MOVQ i14*8(src), X11; \ - PINSRQ $1, i15*8(src), X11; \ + LOAD_MSG_AVX2_Y15(12, 2, 7, 3) + +#define LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() \ + VMOVQ_SI_X11(5*8); \ + VMOVDQU 11*8(SI), X12; \ + VPINSRQ_1_SI_X11(15*8); \ + VINSERTI128 $1, X11, Y12, Y12; \ + VMOVQ_SI_X13(8*8); \ + VMOVQ_SI_X11(2*8); \ + VPINSRQ_1_SI_X13_0; \ + VPINSRQ_1_SI_X11(13*8); \ + VINSERTI128 $1, X11, Y13, Y13; \ + LOAD_MSG_AVX2_Y14(10, 3, 7, 9); \ + LOAD_MSG_AVX2_Y15(14, 6, 1, 4) + +#define LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() \ + LOAD_MSG_AVX2_Y12(7, 3, 13, 11); \ + LOAD_MSG_AVX2_Y13(9, 1, 12, 14); \ + LOAD_MSG_AVX2_Y14(2, 5, 4, 15); \ + VMOVQ_SI_X15(6*8); \ + VMOVQ_SI_X11_0; \ + VPINSRQ_1_SI_X15(10*8); \ + VPINSRQ_1_SI_X11(8*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() \ + LOAD_MSG_AVX2_Y12(9, 5, 2, 10); \ + VMOVQ_SI_X13_0; \ + VMOVQ_SI_X11(4*8); \ + VPINSRQ_1_SI_X13(7*8); \ + VPINSRQ_1_SI_X11(15*8); \ + VINSERTI128 $1, X11, Y13, Y13; \ + LOAD_MSG_AVX2_Y14(14, 11, 6, 3); \ + LOAD_MSG_AVX2_Y15(1, 12, 8, 13) + +#define LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() \ + VMOVQ_SI_X12(2*8); \ + VMOVQ_SI_X11_0; \ + VPINSRQ_1_SI_X12(6*8); \ + VPINSRQ_1_SI_X11(8*8); \ + VINSERTI128 $1, X11, Y12, Y12; \ + LOAD_MSG_AVX2_Y13(12, 10, 11, 3); \ + LOAD_MSG_AVX2_Y14(4, 7, 15, 1); \ + LOAD_MSG_AVX2_Y15(13, 5, 14, 9) + +#define LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() \ + LOAD_MSG_AVX2_Y12(12, 1, 14, 4); \ + LOAD_MSG_AVX2_Y13(5, 15, 13, 10); \ + VMOVQ_SI_X14_0; \ + VPSHUFD $0x4E, 8*8(SI), X11; \ + VPINSRQ_1_SI_X14(6*8); \ + VINSERTI128 $1, X11, Y14, Y14; \ + LOAD_MSG_AVX2_Y15(7, 3, 2, 11) + +#define LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() \ + LOAD_MSG_AVX2_Y12(13, 7, 12, 3); \ + LOAD_MSG_AVX2_Y13(11, 14, 1, 9); \ + LOAD_MSG_AVX2_Y14(5, 15, 8, 2); \ + VMOVQ_SI_X15_0; \ + VMOVQ_SI_X11(6*8); \ + VPINSRQ_1_SI_X15(4*8); \ + VPINSRQ_1_SI_X11(10*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() \ + VMOVQ_SI_X12(6*8); \ + VMOVQ_SI_X11(11*8); \ + VPINSRQ_1_SI_X12(14*8); \ + VPINSRQ_1_SI_X11_0; \ + VINSERTI128 $1, X11, Y12, Y12; \ + LOAD_MSG_AVX2_Y13(15, 9, 3, 8); \ + VMOVQ_SI_X11(1*8); \ + VMOVDQU 12*8(SI), X14; \ + VPINSRQ_1_SI_X11(10*8); \ + VINSERTI128 $1, X11, Y14, Y14; \ + VMOVQ_SI_X15(2*8); \ + VMOVDQU 4*8(SI), X11; \ + VPINSRQ_1_SI_X15(7*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() \ + LOAD_MSG_AVX2_Y12(10, 8, 7, 1); \ + VMOVQ_SI_X13(2*8); \ + VPSHUFD $0x4E, 5*8(SI), X11; \ + VPINSRQ_1_SI_X13(4*8); \ + VINSERTI128 $1, X11, Y13, Y13; \ + LOAD_MSG_AVX2_Y14(15, 9, 3, 13); \ + VMOVQ_SI_X15(11*8); \ + VMOVQ_SI_X11(12*8); \ + VPINSRQ_1_SI_X15(14*8); \ + VPINSRQ_1_SI_X11_0; \ VINSERTI128 $1, X11, Y15, Y15 // func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) @@ -162,34 +317,34 @@ noinc: VMOVDQA Y6, Y2 VPXOR 0(SP), Y7, Y3 - LOAD_MSG_AVX2(SI, 0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15) + LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() VMOVDQA Y12, 32(SP) VMOVDQA Y13, 64(SP) VMOVDQA Y14, 96(SP) VMOVDQA Y15, 128(SP) ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2(SI, 14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3) + LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() VMOVDQA Y12, 160(SP) VMOVDQA Y13, 192(SP) VMOVDQA Y14, 224(SP) VMOVDQA Y15, 256(SP) ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2(SI, 11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4) + LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2(SI, 7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8) + LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2(SI, 9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13) + LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2(SI, 2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9) + LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2(SI, 12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11) + LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2(SI, 13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10) + LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2(SI, 6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5) + LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2(SI, 10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0) + LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) ROUND_AVX2(32(SP), 64(SP), 96(SP), 128(SP), Y10, Y4, Y5) @@ -209,56 +364,55 @@ noinc: VMOVDQU Y8, 0(AX) VMOVDQU Y9, 32(AX) + VZEROUPPER MOVQ DX, SP RET -// unfortunately the BYTE representation of VPUNPCKLQDQ and VPUNPCKHQDQ must be used -#define VPUNPCKLQDQ_X8_X8_X10 BYTE $0xC4; BYTE $0x41; BYTE $0x39; BYTE $0x6C; BYTE $0xD0 -#define VPUNPCKHQDQ_X7_X10_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xF2 -#define VPUNPCKLQDQ_X7_X7_X10 BYTE $0xC5; BYTE $0x41; BYTE $0x6C; BYTE $0xD7 -#define VPUNPCKHQDQ_X8_X10_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x39; BYTE $0x6D; BYTE $0xFA -#define VPUNPCKLQDQ_X3_X3_X10 BYTE $0xC5; BYTE $0x61; BYTE $0x6C; BYTE $0xD3 -#define VPUNPCKHQDQ_X2_X10_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x69; BYTE $0x6D; BYTE $0xD2 -#define VPUNPCKLQDQ_X9_X9_X10 BYTE $0xC4; BYTE $0x41; BYTE $0x31; BYTE $0x6C; BYTE $0xD1 -#define VPUNPCKHQDQ_X3_X10_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xDA -#define VPUNPCKLQDQ_X2_X2_X10 BYTE $0xC5; BYTE $0x69; BYTE $0x6C; BYTE $0xD2 -#define VPUNPCKHQDQ_X3_X10_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xD2 -#define VPUNPCKHQDQ_X8_X10_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x39; BYTE $0x6D; BYTE $0xDA -#define VPUNPCKHQDQ_X6_X10_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x49; BYTE $0x6D; BYTE $0xF2 -#define VPUNPCKHQDQ_X7_X10_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xFA +#define VPUNPCKLQDQ_X2_X2_X15 BYTE $0xC5; BYTE $0x69; BYTE $0x6C; BYTE $0xFA +#define VPUNPCKLQDQ_X3_X3_X15 BYTE $0xC5; BYTE $0x61; BYTE $0x6C; BYTE $0xFB +#define VPUNPCKLQDQ_X7_X7_X15 BYTE $0xC5; BYTE $0x41; BYTE $0x6C; BYTE $0xFF +#define VPUNPCKLQDQ_X13_X13_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x11; BYTE $0x6C; BYTE $0xFD +#define VPUNPCKLQDQ_X14_X14_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x09; BYTE $0x6C; BYTE $0xFE + +#define VPUNPCKHQDQ_X15_X2_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x69; BYTE $0x6D; BYTE $0xD7 +#define VPUNPCKHQDQ_X15_X3_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xDF +#define VPUNPCKHQDQ_X15_X6_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x49; BYTE $0x6D; BYTE $0xF7 +#define VPUNPCKHQDQ_X15_X7_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xFF +#define VPUNPCKHQDQ_X15_X3_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xD7 +#define VPUNPCKHQDQ_X15_X7_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xF7 +#define VPUNPCKHQDQ_X15_X13_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xDF +#define VPUNPCKHQDQ_X15_X13_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xFF -// shuffle X2 and X6 using the temp registers X8, X9, X10 #define SHUFFLE_AVX() \ - VMOVDQA X4, X9; \ - VMOVDQA X5, X4; \ - VMOVDQA X9, X5; \ - VMOVDQA X6, X8; \ - VPUNPCKLQDQ_X8_X8_X10; \ - VPUNPCKHQDQ_X7_X10_X6; \ - VPUNPCKLQDQ_X7_X7_X10; \ - VPUNPCKHQDQ_X8_X10_X7; \ - VPUNPCKLQDQ_X3_X3_X10; \ - VMOVDQA X2, X9; \ - VPUNPCKHQDQ_X2_X10_X2; \ - VPUNPCKLQDQ_X9_X9_X10; \ - VPUNPCKHQDQ_X3_X10_X3; \ + VMOVDQA X6, X13; \ + VMOVDQA X2, X14; \ + VMOVDQA X4, X6; \ + VPUNPCKLQDQ_X13_X13_X15; \ + VMOVDQA X5, X4; \ + VMOVDQA X6, X5; \ + VPUNPCKHQDQ_X15_X7_X6; \ + VPUNPCKLQDQ_X7_X7_X15; \ + VPUNPCKHQDQ_X15_X13_X7; \ + VPUNPCKLQDQ_X3_X3_X15; \ + VPUNPCKHQDQ_X15_X2_X2; \ + VPUNPCKLQDQ_X14_X14_X15; \ + VPUNPCKHQDQ_X15_X3_X3; \ -// inverse shuffle X2 and X6 using the temp registers X8, X9, X10 #define SHUFFLE_AVX_INV() \ - VMOVDQA X4, X9; \ - VMOVDQA X5, X4; \ - VMOVDQA X9, X5; \ - VMOVDQA X2, X8; \ - VPUNPCKLQDQ_X2_X2_X10; \ - VPUNPCKHQDQ_X3_X10_X2; \ - VPUNPCKLQDQ_X3_X3_X10; \ - VPUNPCKHQDQ_X8_X10_X3; \ - VPUNPCKLQDQ_X7_X7_X10; \ - VMOVDQA X6, X9; \ - VPUNPCKHQDQ_X6_X10_X6; \ - VPUNPCKLQDQ_X9_X9_X10; \ - VPUNPCKHQDQ_X7_X10_X7; \ + VMOVDQA X2, X13; \ + VMOVDQA X4, X14; \ + VPUNPCKLQDQ_X2_X2_X15; \ + VMOVDQA X5, X4; \ + VPUNPCKHQDQ_X15_X3_X2; \ + VMOVDQA X14, X5; \ + VPUNPCKLQDQ_X3_X3_X15; \ + VMOVDQA X6, X14; \ + VPUNPCKHQDQ_X15_X13_X3; \ + VPUNPCKLQDQ_X7_X7_X15; \ + VPUNPCKHQDQ_X15_X6_X6; \ + VPUNPCKLQDQ_X14_X14_X15; \ + VPUNPCKHQDQ_X15_X7_X7; \ #define HALF_ROUND_AVX(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \ VPADDQ m0, v0, v0; \ @@ -294,28 +448,133 @@ noinc: VPSRLQ $63, v3, v3; \ VPXOR t0, v3, v3 -// unfortunately the BYTE representation of VPINSRQ must be used -#define VPINSRQ_1_R10_X8_X8 BYTE $0xC4; BYTE $0x43; BYTE $0xB9; BYTE $0x22; BYTE $0xC2; BYTE $0x01 -#define VPINSRQ_1_R11_X9_X9 BYTE $0xC4; BYTE $0x43; BYTE $0xB1; BYTE $0x22; BYTE $0xCB; BYTE $0x01 -#define VPINSRQ_1_R12_X10_X10 BYTE $0xC4; BYTE $0x43; BYTE $0xA9; BYTE $0x22; BYTE $0xD4; BYTE $0x01 -#define VPINSRQ_1_R13_X11_X11 BYTE $0xC4; BYTE $0x43; BYTE $0xA1; BYTE $0x22; BYTE $0xDD; BYTE $0x01 +// load msg: X12 = (i0, i1), X13 = (i2, i3), X14 = (i4, i5), X15 = (i6, i7) +// i0, i1, i2, i3, i4, i5, i6, i7 must not be 0 +#define LOAD_MSG_AVX(i0, i1, i2, i3, i4, i5, i6, i7) \ + VMOVQ_SI_X12(i0*8); \ + VMOVQ_SI_X13(i2*8); \ + VMOVQ_SI_X14(i4*8); \ + VMOVQ_SI_X15(i6*8); \ + VPINSRQ_1_SI_X12(i1*8); \ + VPINSRQ_1_SI_X13(i3*8); \ + VPINSRQ_1_SI_X14(i5*8); \ + VPINSRQ_1_SI_X15(i7*8) -#define VPINSRQ_1_R9_X8_X8 BYTE $0xC4; BYTE $0x43; BYTE $0xB9; BYTE $0x22; BYTE $0xC1; BYTE $0x01 +// load msg: X12 = (0, 2), X13 = (4, 6), X14 = (1, 3), X15 = (5, 7) +#define LOAD_MSG_AVX_0_2_4_6_1_3_5_7() \ + VMOVQ_SI_X12_0; \ + VMOVQ_SI_X13(4*8); \ + VMOVQ_SI_X14(1*8); \ + VMOVQ_SI_X15(5*8); \ + VPINSRQ_1_SI_X12(2*8); \ + VPINSRQ_1_SI_X13(6*8); \ + VPINSRQ_1_SI_X14(3*8); \ + VPINSRQ_1_SI_X15(7*8) -// load src into X8, X9, X10 and X11 using R10, R11, R12 and R13 for temp registers -#define LOAD_MSG_AVX(src, i0, i1, i2, i3, i4, i5, i6, i7) \ - MOVQ i0*8(src), X8; \ - MOVQ i1*8(src), R10; \ - MOVQ i2*8(src), X9; \ - MOVQ i3*8(src), R11; \ - MOVQ i4*8(src), X10; \ - MOVQ i5*8(src), R12; \ - MOVQ i6*8(src), X11; \ - MOVQ i7*8(src), R13; \ - VPINSRQ_1_R10_X8_X8; \ - VPINSRQ_1_R11_X9_X9; \ - VPINSRQ_1_R12_X10_X10; \ - VPINSRQ_1_R13_X11_X11 +// load msg: X12 = (1, 0), X13 = (11, 5), X14 = (12, 2), X15 = (7, 3) +#define LOAD_MSG_AVX_1_0_11_5_12_2_7_3() \ + VPSHUFD $0x4E, 0*8(SI), X12; \ + VMOVQ_SI_X13(11*8); \ + VMOVQ_SI_X14(12*8); \ + VMOVQ_SI_X15(7*8); \ + VPINSRQ_1_SI_X13(5*8); \ + VPINSRQ_1_SI_X14(2*8); \ + VPINSRQ_1_SI_X15(3*8) + +// load msg: X12 = (11, 12), X13 = (5, 15), X14 = (8, 0), X15 = (2, 13) +#define LOAD_MSG_AVX_11_12_5_15_8_0_2_13() \ + VMOVDQU 11*8(SI), X12; \ + VMOVQ_SI_X13(5*8); \ + VMOVQ_SI_X14(8*8); \ + VMOVQ_SI_X15(2*8); \ + VPINSRQ_1_SI_X13(15*8); \ + VPINSRQ_1_SI_X14_0; \ + VPINSRQ_1_SI_X15(13*8) + +// load msg: X12 = (2, 5), X13 = (4, 15), X14 = (6, 10), X15 = (0, 8) +#define LOAD_MSG_AVX_2_5_4_15_6_10_0_8() \ + VMOVQ_SI_X12(2*8); \ + VMOVQ_SI_X13(4*8); \ + VMOVQ_SI_X14(6*8); \ + VMOVQ_SI_X15_0; \ + VPINSRQ_1_SI_X12(5*8); \ + VPINSRQ_1_SI_X13(15*8); \ + VPINSRQ_1_SI_X14(10*8); \ + VPINSRQ_1_SI_X15(8*8) + +// load msg: X12 = (9, 5), X13 = (2, 10), X14 = (0, 7), X15 = (4, 15) +#define LOAD_MSG_AVX_9_5_2_10_0_7_4_15() \ + VMOVQ_SI_X12(9*8); \ + VMOVQ_SI_X13(2*8); \ + VMOVQ_SI_X14_0; \ + VMOVQ_SI_X15(4*8); \ + VPINSRQ_1_SI_X12(5*8); \ + VPINSRQ_1_SI_X13(10*8); \ + VPINSRQ_1_SI_X14(7*8); \ + VPINSRQ_1_SI_X15(15*8) + +// load msg: X12 = (2, 6), X13 = (0, 8), X14 = (12, 10), X15 = (11, 3) +#define LOAD_MSG_AVX_2_6_0_8_12_10_11_3() \ + VMOVQ_SI_X12(2*8); \ + VMOVQ_SI_X13_0; \ + VMOVQ_SI_X14(12*8); \ + VMOVQ_SI_X15(11*8); \ + VPINSRQ_1_SI_X12(6*8); \ + VPINSRQ_1_SI_X13(8*8); \ + VPINSRQ_1_SI_X14(10*8); \ + VPINSRQ_1_SI_X15(3*8) + +// load msg: X12 = (0, 6), X13 = (9, 8), X14 = (7, 3), X15 = (2, 11) +#define LOAD_MSG_AVX_0_6_9_8_7_3_2_11() \ + MOVQ 0*8(SI), X12; \ + VPSHUFD $0x4E, 8*8(SI), X13; \ + MOVQ 7*8(SI), X14; \ + MOVQ 2*8(SI), X15; \ + VPINSRQ_1_SI_X12(6*8); \ + VPINSRQ_1_SI_X14(3*8); \ + VPINSRQ_1_SI_X15(11*8) + +// load msg: X12 = (6, 14), X13 = (11, 0), X14 = (15, 9), X15 = (3, 8) +#define LOAD_MSG_AVX_6_14_11_0_15_9_3_8() \ + MOVQ 6*8(SI), X12; \ + MOVQ 11*8(SI), X13; \ + MOVQ 15*8(SI), X14; \ + MOVQ 3*8(SI), X15; \ + VPINSRQ_1_SI_X12(14*8); \ + VPINSRQ_1_SI_X13_0; \ + VPINSRQ_1_SI_X14(9*8); \ + VPINSRQ_1_SI_X15(8*8) + +// load msg: X12 = (5, 15), X13 = (8, 2), X14 = (0, 4), X15 = (6, 10) +#define LOAD_MSG_AVX_5_15_8_2_0_4_6_10() \ + MOVQ 5*8(SI), X12; \ + MOVQ 8*8(SI), X13; \ + MOVQ 0*8(SI), X14; \ + MOVQ 6*8(SI), X15; \ + VPINSRQ_1_SI_X12(15*8); \ + VPINSRQ_1_SI_X13(2*8); \ + VPINSRQ_1_SI_X14(4*8); \ + VPINSRQ_1_SI_X15(10*8) + +// load msg: X12 = (12, 13), X13 = (1, 10), X14 = (2, 7), X15 = (4, 5) +#define LOAD_MSG_AVX_12_13_1_10_2_7_4_5() \ + VMOVDQU 12*8(SI), X12; \ + MOVQ 1*8(SI), X13; \ + MOVQ 2*8(SI), X14; \ + VPINSRQ_1_SI_X13(10*8); \ + VPINSRQ_1_SI_X14(7*8); \ + VMOVDQU 4*8(SI), X15 + +// load msg: X12 = (15, 9), X13 = (3, 13), X14 = (11, 14), X15 = (12, 0) +#define LOAD_MSG_AVX_15_9_3_13_11_14_12_0() \ + MOVQ 15*8(SI), X12; \ + MOVQ 3*8(SI), X13; \ + MOVQ 11*8(SI), X14; \ + MOVQ 12*8(SI), X15; \ + VPINSRQ_1_SI_X12(9*8); \ + VPINSRQ_1_SI_X13(13*8); \ + VPINSRQ_1_SI_X14(14*8); \ + VPINSRQ_1_SI_X15_0 // func hashBlocksAVX(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) TEXT ·hashBlocksAVX(SB), 4, $288-48 // frame size = 272 + 16 byte alignment @@ -331,15 +590,17 @@ TEXT ·hashBlocksAVX(SB), 4, $288-48 // frame size = 272 + 16 byte alignment ANDQ $~15, R9 MOVQ R9, SP - MOVOU ·AVX_c40<>(SB), X13 - MOVOU ·AVX_c48<>(SB), X14 + VMOVDQU ·AVX_c40<>(SB), X0 + VMOVDQU ·AVX_c48<>(SB), X1 + VMOVDQA X0, X8 + VMOVDQA X1, X9 VMOVDQU ·AVX_iv3<>(SB), X0 VMOVDQA X0, 0(SP) XORQ CX, 0(SP) // 0(SP) = ·AVX_iv3 ^ (CX || 0) - VMOVDQU 0(AX), X12 - VMOVDQU 16(AX), X15 + VMOVDQU 0(AX), X10 + VMOVDQU 16(AX), X11 VMOVDQU 32(AX), X2 VMOVDQU 48(AX), X3 @@ -353,124 +614,124 @@ loop: INCQ R9 noinc: - MOVQ R8, X8 - VPINSRQ_1_R9_X8_X8 + VMOVQ_R8_X15 + VPINSRQ_1_R9_X15 - VMOVDQA X12, X0 - VMOVDQA X15, X1 + VMOVDQA X10, X0 + VMOVDQA X11, X1 VMOVDQU ·AVX_iv0<>(SB), X4 VMOVDQU ·AVX_iv1<>(SB), X5 VMOVDQU ·AVX_iv2<>(SB), X6 - VPXOR X8, X6, X6 + VPXOR X15, X6, X6 VMOVDQA 0(SP), X7 - LOAD_MSG_AVX(SI, 0, 2, 4, 6, 1, 3, 5, 7) - VMOVDQA X8, 16(SP) - VMOVDQA X9, 32(SP) - VMOVDQA X10, 48(SP) - VMOVDQA X11, 64(SP) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_0_2_4_6_1_3_5_7() + VMOVDQA X12, 16(SP) + VMOVDQA X13, 32(SP) + VMOVDQA X14, 48(SP) + VMOVDQA X15, 64(SP) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX() - LOAD_MSG_AVX(SI, 8, 10, 12, 14, 9, 11, 13, 15) - VMOVDQA X8, 80(SP) - VMOVDQA X9, 96(SP) - VMOVDQA X10, 112(SP) - VMOVDQA X11, 128(SP) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX(8, 10, 12, 14, 9, 11, 13, 15) + VMOVDQA X12, 80(SP) + VMOVDQA X13, 96(SP) + VMOVDQA X14, 112(SP) + VMOVDQA X15, 128(SP) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX_INV() - LOAD_MSG_AVX(SI, 14, 4, 9, 13, 10, 8, 15, 6) - VMOVDQA X8, 144(SP) - VMOVDQA X9, 160(SP) - VMOVDQA X10, 176(SP) - VMOVDQA X11, 192(SP) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX(14, 4, 9, 13, 10, 8, 15, 6) + VMOVDQA X12, 144(SP) + VMOVDQA X13, 160(SP) + VMOVDQA X14, 176(SP) + VMOVDQA X15, 192(SP) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX() - LOAD_MSG_AVX(SI, 1, 0, 11, 5, 12, 2, 7, 3) - VMOVDQA X8, 208(SP) - VMOVDQA X9, 224(SP) - VMOVDQA X10, 240(SP) - VMOVDQA X11, 256(SP) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_1_0_11_5_12_2_7_3() + VMOVDQA X12, 208(SP) + VMOVDQA X13, 224(SP) + VMOVDQA X14, 240(SP) + VMOVDQA X15, 256(SP) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX_INV() - LOAD_MSG_AVX(SI, 11, 12, 5, 15, 8, 0, 2, 13) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_11_12_5_15_8_0_2_13() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX() - LOAD_MSG_AVX(SI, 10, 3, 7, 9, 14, 6, 1, 4) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX(10, 3, 7, 9, 14, 6, 1, 4) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX_INV() - LOAD_MSG_AVX(SI, 7, 3, 13, 11, 9, 1, 12, 14) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX(7, 3, 13, 11, 9, 1, 12, 14) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX() - LOAD_MSG_AVX(SI, 2, 5, 4, 15, 6, 10, 0, 8) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_2_5_4_15_6_10_0_8() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX_INV() - LOAD_MSG_AVX(SI, 9, 5, 2, 10, 0, 7, 4, 15) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_9_5_2_10_0_7_4_15() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX() - LOAD_MSG_AVX(SI, 14, 11, 6, 3, 1, 12, 8, 13) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX(14, 11, 6, 3, 1, 12, 8, 13) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX_INV() - LOAD_MSG_AVX(SI, 2, 6, 0, 8, 12, 10, 11, 3) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_2_6_0_8_12_10_11_3() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX() - LOAD_MSG_AVX(SI, 4, 7, 15, 1, 13, 5, 14, 9) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX(4, 7, 15, 1, 13, 5, 14, 9) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX_INV() - LOAD_MSG_AVX(SI, 12, 1, 14, 4, 5, 15, 13, 10) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX(12, 1, 14, 4, 5, 15, 13, 10) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX() - LOAD_MSG_AVX(SI, 0, 6, 9, 8, 7, 3, 2, 11) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_0_6_9_8_7_3_2_11() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX_INV() - LOAD_MSG_AVX(SI, 13, 7, 12, 3, 11, 14, 1, 9) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX(13, 7, 12, 3, 11, 14, 1, 9) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX() - LOAD_MSG_AVX(SI, 5, 15, 8, 2, 0, 4, 6, 10) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_5_15_8_2_0_4_6_10() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX_INV() - LOAD_MSG_AVX(SI, 6, 14, 11, 0, 15, 9, 3, 8) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_6_14_11_0_15_9_3_8() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX() - LOAD_MSG_AVX(SI, 12, 13, 1, 10, 2, 7, 4, 5) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_12_13_1_10_2_7_4_5() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX_INV() - LOAD_MSG_AVX(SI, 10, 8, 7, 1, 2, 4, 6, 5) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX(10, 8, 7, 1, 2, 4, 6, 5) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX() - LOAD_MSG_AVX(SI, 15, 9, 3, 13, 11, 14, 12, 0) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + LOAD_MSG_AVX_15_9_3_13_11_14_12_0() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) SHUFFLE_AVX_INV() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X11, X13, X14) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 16(SP), 32(SP), 48(SP), 64(SP), X15, X8, X9) SHUFFLE_AVX() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 80(SP), 96(SP), 112(SP), 128(SP), X11, X13, X14) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 80(SP), 96(SP), 112(SP), 128(SP), X15, X8, X9) SHUFFLE_AVX_INV() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 144(SP), 160(SP), 176(SP), 192(SP), X11, X13, X14) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 144(SP), 160(SP), 176(SP), 192(SP), X15, X8, X9) SHUFFLE_AVX() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 208(SP), 224(SP), 240(SP), 256(SP), X11, X13, X14) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 208(SP), 224(SP), 240(SP), 256(SP), X15, X8, X9) SHUFFLE_AVX_INV() - VMOVDQU 32(AX), X10 - VMOVDQU 48(AX), X11 - VPXOR X0, X12, X12 - VPXOR X1, X15, X15 - VPXOR X2, X10, X10 - VPXOR X3, X11, X11 - VPXOR X4, X12, X12 - VPXOR X5, X15, X15 - VPXOR X6, X10, X2 - VPXOR X7, X11, X3 + VMOVDQU 32(AX), X14 + VMOVDQU 48(AX), X15 + VPXOR X0, X10, X10 + VPXOR X1, X11, X11 + VPXOR X2, X14, X14 + VPXOR X3, X15, X15 + VPXOR X4, X10, X10 + VPXOR X5, X11, X11 + VPXOR X6, X14, X2 + VPXOR X7, X15, X3 VMOVDQU X2, 32(AX) VMOVDQU X3, 48(AX) @@ -478,12 +739,11 @@ noinc: SUBQ $128, DI JNE loop - VMOVDQU X12, 0(AX) - VMOVDQU X15, 16(AX) + VMOVDQU X10, 0(AX) + VMOVDQU X11, 16(AX) MOVQ R8, 0(BX) MOVQ R9, 8(BX) - VZEROUPPER MOVQ BP, SP diff --git a/vendor/golang.org/x/crypto/blake2b/register.go b/vendor/golang.org/x/crypto/blake2b/register.go new file mode 100644 index 0000000000..efd689af4b --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2b/register.go @@ -0,0 +1,32 @@ +// Copyright 2017 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.9 + +package blake2b + +import ( + "crypto" + "hash" +) + +func init() { + newHash256 := func() hash.Hash { + h, _ := New256(nil) + return h + } + newHash384 := func() hash.Hash { + h, _ := New384(nil) + return h + } + + newHash512 := func() hash.Hash { + h, _ := New512(nil) + return h + } + + crypto.RegisterHash(crypto.BLAKE2b_256, newHash256) + crypto.RegisterHash(crypto.BLAKE2b_384, newHash384) + crypto.RegisterHash(crypto.BLAKE2b_512, newHash512) +} diff --git a/vendor/golang.org/x/crypto/blake2s/register.go b/vendor/golang.org/x/crypto/blake2s/register.go new file mode 100644 index 0000000000..d277459a1c --- /dev/null +++ b/vendor/golang.org/x/crypto/blake2s/register.go @@ -0,0 +1,21 @@ +// Copyright 2017 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.9 + +package blake2s + +import ( + "crypto" + "hash" +) + +func init() { + newHash256 := func() hash.Hash { + h, _ := New256(nil) + return h + } + + crypto.RegisterHash(crypto.BLAKE2s_256, newHash256) +} diff --git a/vendor/golang.org/x/crypto/cryptobyte/asn1.go b/vendor/golang.org/x/crypto/cryptobyte/asn1.go new file mode 100644 index 0000000000..166e22d7b8 --- /dev/null +++ b/vendor/golang.org/x/crypto/cryptobyte/asn1.go @@ -0,0 +1,604 @@ +// Copyright 2017 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 cryptobyte + +import ( + "encoding/asn1" + "fmt" + "math/big" + "reflect" + "time" +) + +// This file contains ASN.1-related methods for String and Builder. + +// Tag represents an ASN.1 tag number and class (together also referred to as +// identifier octets). Methods in this package only support the low-tag-number +// form, i.e. a single identifier octet with bits 7-8 encoding the class and +// bits 1-6 encoding the tag number. +type Tag uint8 + +// Contructed returns t with the context-specific class bit set. +func (t Tag) ContextSpecific() Tag { return t | 0x80 } + +// Contructed returns t with the constructed class bit set. +func (t Tag) Constructed() Tag { return t | 0x20 } + +// Builder + +// AddASN1Int64 appends a DER-encoded ASN.1 INTEGER. +func (b *Builder) AddASN1Int64(v int64) { + b.addASN1Signed(asn1.TagInteger, v) +} + +// AddASN1Enum appends a DER-encoded ASN.1 ENUMERATION. +func (b *Builder) AddASN1Enum(v int64) { + b.addASN1Signed(asn1.TagEnum, v) +} + +func (b *Builder) addASN1Signed(tag Tag, v int64) { + b.AddASN1(tag, func(c *Builder) { + length := 1 + for i := v; i >= 0x80 || i < -0x80; i >>= 8 { + length++ + } + + for ; length > 0; length-- { + i := v >> uint((length-1)*8) & 0xff + c.AddUint8(uint8(i)) + } + }) +} + +// AddASN1Uint64 appends a DER-encoded ASN.1 INTEGER. +func (b *Builder) AddASN1Uint64(v uint64) { + b.AddASN1(asn1.TagInteger, func(c *Builder) { + length := 1 + for i := v; i >= 0x80; i >>= 8 { + length++ + } + + for ; length > 0; length-- { + i := v >> uint((length-1)*8) & 0xff + c.AddUint8(uint8(i)) + } + }) +} + +// AddASN1BigInt appends a DER-encoded ASN.1 INTEGER. +func (b *Builder) AddASN1BigInt(n *big.Int) { + if b.err != nil { + return + } + + b.AddASN1(asn1.TagInteger, func(c *Builder) { + if n.Sign() < 0 { + // A negative number has to be converted to two's-complement form. So we + // invert and subtract 1. If the most-significant-bit isn't set then + // we'll need to pad the beginning with 0xff in order to keep the number + // negative. + nMinus1 := new(big.Int).Neg(n) + nMinus1.Sub(nMinus1, bigOne) + bytes := nMinus1.Bytes() + for i := range bytes { + bytes[i] ^= 0xff + } + if bytes[0]&0x80 == 0 { + c.add(0xff) + } + c.add(bytes...) + } else if n.Sign() == 0 { + c.add(0) + } else { + bytes := n.Bytes() + if bytes[0]&0x80 != 0 { + c.add(0) + } + c.add(bytes...) + } + }) +} + +// AddASN1OctetString appends a DER-encoded ASN.1 OCTET STRING. +func (b *Builder) AddASN1OctetString(bytes []byte) { + b.AddASN1(asn1.TagOctetString, func(c *Builder) { + c.AddBytes(bytes) + }) +} + +const generalizedTimeFormatStr = "20060102150405Z0700" + +// AddASN1GeneralizedTime appends a DER-encoded ASN.1 GENERALIZEDTIME. +func (b *Builder) AddASN1GeneralizedTime(t time.Time) { + if t.Year() < 0 || t.Year() > 9999 { + b.err = fmt.Errorf("cryptobyte: cannot represent %v as a GeneralizedTime", t) + return + } + b.AddASN1(asn1.TagGeneralizedTime, func(c *Builder) { + c.AddBytes([]byte(t.Format(generalizedTimeFormatStr))) + }) +} + +// AddASN1BitString appends a DER-encoded ASN.1 BIT STRING. +func (b *Builder) AddASN1BitString(s asn1.BitString) { + // TODO(martinkr): Implement. + b.MarshalASN1(s) +} + +// MarshalASN1 calls asn1.Marshal on its input and appends the result if +// successful or records an error if one occurred. +func (b *Builder) MarshalASN1(v interface{}) { + // NOTE(martinkr): This is somewhat of a hack to allow propagation of + // asn1.Marshal errors into Builder.err. N.B. if you call MarshalASN1 with a + // value embedded into a struct, its tag information is lost. + if b.err != nil { + return + } + bytes, err := asn1.Marshal(v) + if err != nil { + b.err = err + return + } + b.AddBytes(bytes) +} + +// AddASN1 appends an ASN.1 object. The object is prefixed with the given tag. +// Tags greater than 30 are not supported and result in an error (i.e. +// low-tag-number form only). The child builder passed to the +// BuilderContinuation can be used to build the content of the ASN.1 object. +func (b *Builder) AddASN1(tag Tag, f BuilderContinuation) { + if b.err != nil { + return + } + // Identifiers with the low five bits set indicate high-tag-number format + // (two or more octets), which we don't support. + if tag&0x1f == 0x1f { + b.err = fmt.Errorf("cryptobyte: high-tag number identifier octects not supported: 0x%x", tag) + return + } + b.AddUint8(uint8(tag)) + b.addLengthPrefixed(1, true, f) +} + +// String + +var bigIntType = reflect.TypeOf((*big.Int)(nil)).Elem() + +// ReadASN1Integer decodes an ASN.1 INTEGER into out and advances. If out does +// not point to an integer or to a big.Int, it panics. It returns true on +// success and false on error. +func (s *String) ReadASN1Integer(out interface{}) bool { + if reflect.TypeOf(out).Kind() != reflect.Ptr { + panic("out is not a pointer") + } + switch reflect.ValueOf(out).Elem().Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + var i int64 + if !s.readASN1Int64(&i) || reflect.ValueOf(out).Elem().OverflowInt(i) { + return false + } + reflect.ValueOf(out).Elem().SetInt(i) + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + var u uint64 + if !s.readASN1Uint64(&u) || reflect.ValueOf(out).Elem().OverflowUint(u) { + return false + } + reflect.ValueOf(out).Elem().SetUint(u) + return true + case reflect.Struct: + if reflect.TypeOf(out).Elem() == bigIntType { + return s.readASN1BigInt(out.(*big.Int)) + } + } + panic("out does not point to an integer type") +} + +func checkASN1Integer(bytes []byte) bool { + if len(bytes) == 0 { + // An INTEGER is encoded with at least one octet. + return false + } + if len(bytes) == 1 { + return true + } + if bytes[0] == 0 && bytes[1]&0x80 == 0 || bytes[0] == 0xff && bytes[1]&0x80 == 0x80 { + // Value is not minimally encoded. + return false + } + return true +} + +var bigOne = big.NewInt(1) + +func (s *String) readASN1BigInt(out *big.Int) bool { + var bytes String + if !s.ReadASN1(&bytes, asn1.TagInteger) || !checkASN1Integer(bytes) { + return false + } + if bytes[0]&0x80 == 0x80 { + // Negative number. + neg := make([]byte, len(bytes)) + for i, b := range bytes { + neg[i] = ^b + } + out.SetBytes(neg) + out.Add(out, bigOne) + out.Neg(out) + } else { + out.SetBytes(bytes) + } + return true +} + +func (s *String) readASN1Int64(out *int64) bool { + var bytes String + if !s.ReadASN1(&bytes, asn1.TagInteger) || !checkASN1Integer(bytes) || !asn1Signed(out, bytes) { + return false + } + return true +} + +func asn1Signed(out *int64, n []byte) bool { + length := len(n) + if length > 8 { + return false + } + for i := 0; i < length; i++ { + *out <<= 8 + *out |= int64(n[i]) + } + // Shift up and down in order to sign extend the result. + *out <<= 64 - uint8(length)*8 + *out >>= 64 - uint8(length)*8 + return true +} + +func (s *String) readASN1Uint64(out *uint64) bool { + var bytes String + if !s.ReadASN1(&bytes, asn1.TagInteger) || !checkASN1Integer(bytes) || !asn1Unsigned(out, bytes) { + return false + } + return true +} + +func asn1Unsigned(out *uint64, n []byte) bool { + length := len(n) + if length > 9 || length == 9 && n[0] != 0 { + // Too large for uint64. + return false + } + if n[0]&0x80 != 0 { + // Negative number. + return false + } + for i := 0; i < length; i++ { + *out <<= 8 + *out |= uint64(n[i]) + } + return true +} + +// ReadASN1Enum decodes an ASN.1 ENUMERATION into out and advances. It returns +// true on success and false on error. +func (s *String) ReadASN1Enum(out *int) bool { + var bytes String + var i int64 + if !s.ReadASN1(&bytes, asn1.TagEnum) || !checkASN1Integer(bytes) || !asn1Signed(&i, bytes) { + return false + } + if int64(int(i)) != i { + return false + } + *out = int(i) + return true +} + +func (s *String) readBase128Int(out *int) bool { + ret := 0 + for i := 0; len(*s) > 0; i++ { + if i == 4 { + return false + } + ret <<= 7 + b := s.read(1)[0] + ret |= int(b & 0x7f) + if b&0x80 == 0 { + *out = ret + return true + } + } + return false // truncated +} + +// ReadASN1ObjectIdentifier decodes an ASN.1 OBJECT IDENTIFIER into out and +// advances. It returns true on success and false on error. +func (s *String) ReadASN1ObjectIdentifier(out *asn1.ObjectIdentifier) bool { + var bytes String + if !s.ReadASN1(&bytes, asn1.TagOID) || len(bytes) == 0 { + return false + } + + // In the worst case, we get two elements from the first byte (which is + // encoded differently) and then every varint is a single byte long. + components := make([]int, len(bytes)+1) + + // The first varint is 40*value1 + value2: + // According to this packing, value1 can take the values 0, 1 and 2 only. + // When value1 = 0 or value1 = 1, then value2 is <= 39. When value1 = 2, + // then there are no restrictions on value2. + var v int + if !bytes.readBase128Int(&v) { + return false + } + if v < 80 { + components[0] = v / 40 + components[1] = v % 40 + } else { + components[0] = 2 + components[1] = v - 80 + } + + i := 2 + for ; len(bytes) > 0; i++ { + if !bytes.readBase128Int(&v) { + return false + } + components[i] = v + } + *out = components[:i] + return true +} + +// ReadASN1GeneralizedTime decodes an ASN.1 GENERALIZEDTIME into out and +// advances. It returns true on success and false on error. +func (s *String) ReadASN1GeneralizedTime(out *time.Time) bool { + var bytes String + if !s.ReadASN1(&bytes, asn1.TagGeneralizedTime) { + return false + } + t := string(bytes) + res, err := time.Parse(generalizedTimeFormatStr, t) + if err != nil { + return false + } + if serialized := res.Format(generalizedTimeFormatStr); serialized != t { + return false + } + *out = res + return true +} + +// ReadASN1BitString decodes an ASN.1 BIT STRING into out and advances. It +// returns true on success and false on error. +func (s *String) ReadASN1BitString(out *asn1.BitString) bool { + var bytes String + if !s.ReadASN1(&bytes, asn1.TagBitString) || len(bytes) == 0 { + return false + } + + paddingBits := uint8(bytes[0]) + bytes = bytes[1:] + if paddingBits > 7 || + len(bytes) == 0 && paddingBits != 0 || + len(bytes) > 0 && bytes[len(bytes)-1]&(1< 4 || len(*s) < int(2+lenLen) { + return false + } + + lenBytes := String((*s)[2 : 2+lenLen]) + if !lenBytes.readUnsigned(&len32, int(lenLen)) { + return false + } + + // ITU-T X.690 section 10.1 (DER length forms) requires encoding the length + // with the minimum number of octets. + if len32 < 128 { + // Length should have used short-form encoding. + return false + } + if len32>>((lenLen-1)*8) == 0 { + // Leading octet is 0. Length should have been at least one byte shorter. + return false + } + + headerLen = 2 + uint32(lenLen) + if headerLen+len32 < len32 { + // Overflow. + return false + } + length = headerLen + len32 + } + + if uint32(int(length)) != length || !s.ReadBytes((*[]byte)(out), int(length)) { + return false + } + if skipHeader && !out.Skip(int(headerLen)) { + panic("cryptobyte: internal error") + } + + return true +} diff --git a/vendor/golang.org/x/crypto/cryptobyte/asn1_test.go b/vendor/golang.org/x/crypto/cryptobyte/asn1_test.go new file mode 100644 index 0000000000..c8c1870323 --- /dev/null +++ b/vendor/golang.org/x/crypto/cryptobyte/asn1_test.go @@ -0,0 +1,285 @@ +// Copyright 2017 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 cryptobyte + +import ( + "bytes" + "encoding/asn1" + "math/big" + "reflect" + "testing" + "time" +) + +type readASN1Test struct { + name string + in []byte + tag Tag + ok bool + out interface{} +} + +var readASN1TestData = []readASN1Test{ + {"valid", []byte{0x30, 2, 1, 2}, 0x30, true, []byte{1, 2}}, + {"truncated", []byte{0x30, 3, 1, 2}, 0x30, false, nil}, + {"zero length of length", []byte{0x30, 0x80}, 0x30, false, nil}, + {"invalid long form length", []byte{0x30, 0x81, 1, 1}, 0x30, false, nil}, + {"non-minimal length", append([]byte{0x30, 0x82, 0, 0x80}, make([]byte, 0x80)...), 0x30, false, nil}, + {"invalid tag", []byte{0xa1, 3, 0x4, 1, 1}, 31, false, nil}, + {"high tag", []byte{0x1f, 0x81, 0x80, 0x01, 2, 1, 2}, 0xff /* actually 0x4001, but tag is uint8 */, false, nil}, +} + +func TestReadASN1(t *testing.T) { + for _, test := range readASN1TestData { + t.Run(test.name, func(t *testing.T) { + var in, out String = test.in, nil + ok := in.ReadASN1(&out, test.tag) + if ok != test.ok || ok && !bytes.Equal(out, test.out.([]byte)) { + t.Errorf("in.ReadASN1() = %v, want %v; out = %v, want %v", ok, test.ok, out, test.out) + } + }) + } +} + +func TestReadASN1Optional(t *testing.T) { + var empty String + var present bool + ok := empty.ReadOptionalASN1(nil, &present, 0xa0) + if !ok || present { + t.Errorf("empty.ReadOptionalASN1() = %v, want true; present = %v want false", ok, present) + } + + var in, out String = []byte{0xa1, 3, 0x4, 1, 1}, nil + ok = in.ReadOptionalASN1(&out, &present, 0xa0) + if !ok || present { + t.Errorf("in.ReadOptionalASN1() = %v, want true, present = %v, want false", ok, present) + } + ok = in.ReadOptionalASN1(&out, &present, 0xa1) + wantBytes := []byte{4, 1, 1} + if !ok || !present || !bytes.Equal(out, wantBytes) { + t.Errorf("in.ReadOptionalASN1() = %v, want true; present = %v, want true; out = %v, want = %v", ok, present, out, wantBytes) + } +} + +var optionalOctetStringTestData = []struct { + readASN1Test + present bool +}{ + {readASN1Test{"empty", []byte{}, 0xa0, true, []byte{}}, false}, + {readASN1Test{"invalid", []byte{0xa1, 3, 0x4, 2, 1}, 0xa1, false, []byte{}}, true}, + {readASN1Test{"missing", []byte{0xa1, 3, 0x4, 1, 1}, 0xa0, true, []byte{}}, false}, + {readASN1Test{"present", []byte{0xa1, 3, 0x4, 1, 1}, 0xa1, true, []byte{1}}, true}, +} + +func TestReadASN1OptionalOctetString(t *testing.T) { + for _, test := range optionalOctetStringTestData { + t.Run(test.name, func(t *testing.T) { + in := String(test.in) + var out []byte + var present bool + ok := in.ReadOptionalASN1OctetString(&out, &present, test.tag) + if ok != test.ok || present != test.present || !bytes.Equal(out, test.out.([]byte)) { + t.Errorf("in.ReadOptionalASN1OctetString() = %v, want %v; present = %v want %v; out = %v, want %v", ok, test.ok, present, test.present, out, test.out) + } + }) + } +} + +const defaultInt = -1 + +var optionalIntTestData = []readASN1Test{ + {"empty", []byte{}, 0xa0, true, defaultInt}, + {"invalid", []byte{0xa1, 3, 0x2, 2, 127}, 0xa1, false, 0}, + {"missing", []byte{0xa1, 3, 0x2, 1, 127}, 0xa0, true, defaultInt}, + {"present", []byte{0xa1, 3, 0x2, 1, 42}, 0xa1, true, 42}, +} + +func TestReadASN1OptionalInteger(t *testing.T) { + for _, test := range optionalIntTestData { + t.Run(test.name, func(t *testing.T) { + in := String(test.in) + var out int + ok := in.ReadOptionalASN1Integer(&out, test.tag, defaultInt) + if ok != test.ok || ok && out != test.out.(int) { + t.Errorf("in.ReadOptionalASN1Integer() = %v, want %v; out = %v, want %v", ok, test.ok, out, test.out) + } + }) + } +} + +func TestReadASN1IntegerSigned(t *testing.T) { + testData64 := []struct { + in []byte + out int64 + }{ + {[]byte{2, 3, 128, 0, 0}, -0x800000}, + {[]byte{2, 2, 255, 0}, -256}, + {[]byte{2, 2, 255, 127}, -129}, + {[]byte{2, 1, 128}, -128}, + {[]byte{2, 1, 255}, -1}, + {[]byte{2, 1, 0}, 0}, + {[]byte{2, 1, 1}, 1}, + {[]byte{2, 1, 2}, 2}, + {[]byte{2, 1, 127}, 127}, + {[]byte{2, 2, 0, 128}, 128}, + {[]byte{2, 2, 1, 0}, 256}, + {[]byte{2, 4, 0, 128, 0, 0}, 0x800000}, + } + for i, test := range testData64 { + in := String(test.in) + var out int64 + ok := in.ReadASN1Integer(&out) + if !ok || out != test.out { + t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out, test.out) + } + } + + // Repeat the same cases, reading into a big.Int. + t.Run("big.Int", func(t *testing.T) { + for i, test := range testData64 { + in := String(test.in) + var out big.Int + ok := in.ReadASN1Integer(&out) + if !ok || out.Int64() != test.out { + t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out.Int64(), test.out) + } + } + }) +} + +func TestReadASN1IntegerUnsigned(t *testing.T) { + testData := []struct { + in []byte + out uint64 + }{ + {[]byte{2, 1, 0}, 0}, + {[]byte{2, 1, 1}, 1}, + {[]byte{2, 1, 2}, 2}, + {[]byte{2, 1, 127}, 127}, + {[]byte{2, 2, 0, 128}, 128}, + {[]byte{2, 2, 1, 0}, 256}, + {[]byte{2, 4, 0, 128, 0, 0}, 0x800000}, + {[]byte{2, 8, 127, 255, 255, 255, 255, 255, 255, 255}, 0x7fffffffffffffff}, + {[]byte{2, 9, 0, 128, 0, 0, 0, 0, 0, 0, 0}, 0x8000000000000000}, + {[]byte{2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255}, 0xffffffffffffffff}, + } + for i, test := range testData { + in := String(test.in) + var out uint64 + ok := in.ReadASN1Integer(&out) + if !ok || out != test.out { + t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out, test.out) + } + } +} + +func TestReadASN1IntegerInvalid(t *testing.T) { + testData := []String{ + []byte{3, 1, 0}, // invalid tag + // truncated + []byte{2, 1}, + []byte{2, 2, 0}, + // not minimally encoded + []byte{2, 2, 0, 1}, + []byte{2, 2, 0xff, 0xff}, + } + + for i, test := range testData { + var out int64 + if test.ReadASN1Integer(&out) { + t.Errorf("#%d: in.ReadASN1Integer() = true, want false (out = %d)", i, out) + } + } +} + +func TestReadASN1ObjectIdentifier(t *testing.T) { + testData := []struct { + in []byte + ok bool + out []int + }{ + {[]byte{}, false, []int{}}, + {[]byte{6, 0}, false, []int{}}, + {[]byte{5, 1, 85}, false, []int{2, 5}}, + {[]byte{6, 1, 85}, true, []int{2, 5}}, + {[]byte{6, 2, 85, 0x02}, true, []int{2, 5, 2}}, + {[]byte{6, 4, 85, 0x02, 0xc0, 0x00}, true, []int{2, 5, 2, 0x2000}}, + {[]byte{6, 3, 0x81, 0x34, 0x03}, true, []int{2, 100, 3}}, + {[]byte{6, 7, 85, 0x02, 0xc0, 0x80, 0x80, 0x80, 0x80}, false, []int{}}, + } + + for i, test := range testData { + in := String(test.in) + var out asn1.ObjectIdentifier + ok := in.ReadASN1ObjectIdentifier(&out) + if ok != test.ok || ok && !out.Equal(test.out) { + t.Errorf("#%d: in.ReadASN1ObjectIdentifier() = %v, want %v; out = %v, want %v", i, ok, test.ok, out, test.out) + } + } +} + +func TestReadASN1GeneralizedTime(t *testing.T) { + testData := []struct { + in string + ok bool + out time.Time + }{ + {"20100102030405Z", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.UTC)}, + {"20100102030405", false, time.Time{}}, + {"20100102030405+0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))}, + {"20100102030405-0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", -6*60*60-7*60))}, + /* These are invalid times. However, the time package normalises times + * and they were accepted in some versions. See #11134. */ + {"00000100000000Z", false, time.Time{}}, + {"20101302030405Z", false, time.Time{}}, + {"20100002030405Z", false, time.Time{}}, + {"20100100030405Z", false, time.Time{}}, + {"20100132030405Z", false, time.Time{}}, + {"20100231030405Z", false, time.Time{}}, + {"20100102240405Z", false, time.Time{}}, + {"20100102036005Z", false, time.Time{}}, + {"20100102030460Z", false, time.Time{}}, + {"-20100102030410Z", false, time.Time{}}, + {"2010-0102030410Z", false, time.Time{}}, + {"2010-0002030410Z", false, time.Time{}}, + {"201001-02030410Z", false, time.Time{}}, + {"20100102-030410Z", false, time.Time{}}, + {"2010010203-0410Z", false, time.Time{}}, + {"201001020304-10Z", false, time.Time{}}, + } + for i, test := range testData { + in := String(append([]byte{asn1.TagGeneralizedTime, byte(len(test.in))}, test.in...)) + var out time.Time + ok := in.ReadASN1GeneralizedTime(&out) + if ok != test.ok || ok && !reflect.DeepEqual(out, test.out) { + t.Errorf("#%d: in.ReadASN1GeneralizedTime() = %v, want %v; out = %q, want %q", i, ok, test.ok, out, test.out) + } + } +} + +func TestReadASN1BitString(t *testing.T) { + testData := []struct { + in []byte + ok bool + out asn1.BitString + }{ + {[]byte{}, false, asn1.BitString{}}, + {[]byte{0x00}, true, asn1.BitString{}}, + {[]byte{0x07, 0x00}, true, asn1.BitString{Bytes: []byte{0}, BitLength: 1}}, + {[]byte{0x07, 0x01}, false, asn1.BitString{}}, + {[]byte{0x07, 0x40}, false, asn1.BitString{}}, + {[]byte{0x08, 0x00}, false, asn1.BitString{}}, + {[]byte{0xff}, false, asn1.BitString{}}, + {[]byte{0xfe, 0x00}, false, asn1.BitString{}}, + } + for i, test := range testData { + in := String(append([]byte{3, byte(len(test.in))}, test.in...)) + var out asn1.BitString + ok := in.ReadASN1BitString(&out) + if ok != test.ok || ok && (!bytes.Equal(out.Bytes, test.out.Bytes) || out.BitLength != test.out.BitLength) { + t.Errorf("#%d: in.ReadASN1BitString() = %v, want %v; out = %v, want %v", i, ok, test.ok, out, test.out) + } + } +} diff --git a/vendor/golang.org/x/crypto/cryptobyte/builder.go b/vendor/golang.org/x/crypto/cryptobyte/builder.go new file mode 100644 index 0000000000..9883fb3c39 --- /dev/null +++ b/vendor/golang.org/x/crypto/cryptobyte/builder.go @@ -0,0 +1,255 @@ +// Copyright 2017 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 cryptobyte + +import ( + "errors" + "fmt" +) + +// A Builder builds byte strings from fixed-length and length-prefixed values. +// The zero value is a usable Builder that allocates space as needed. +type Builder struct { + err error + result []byte + fixedSize bool + child *Builder + offset int + pendingLenLen int + pendingIsASN1 bool +} + +// NewBuilder creates a Builder that appends its output to the given buffer. +// Like append(), the slice will be reallocated if its capacity is exceeded. +// Use Bytes to get the final buffer. +func NewBuilder(buffer []byte) *Builder { + return &Builder{ + result: buffer, + } +} + +// NewFixedBuilder creates a Builder that appends its output into the given +// buffer. This builder does not reallocate the output buffer. Writes that +// would exceed the buffer's capacity are treated as an error. +func NewFixedBuilder(buffer []byte) *Builder { + return &Builder{ + result: buffer, + fixedSize: true, + } +} + +// Bytes returns the bytes written by the builder or an error if one has +// occurred during during building. +func (b *Builder) Bytes() ([]byte, error) { + if b.err != nil { + return nil, b.err + } + return b.result[b.offset:], nil +} + +// BytesOrPanic returns the bytes written by the builder or panics if an error +// has occurred during building. +func (b *Builder) BytesOrPanic() []byte { + if b.err != nil { + panic(b.err) + } + return b.result[b.offset:] +} + +// AddUint8 appends an 8-bit value to the byte string. +func (b *Builder) AddUint8(v uint8) { + b.add(byte(v)) +} + +// AddUint16 appends a big-endian, 16-bit value to the byte string. +func (b *Builder) AddUint16(v uint16) { + b.add(byte(v>>8), byte(v)) +} + +// AddUint24 appends a big-endian, 24-bit value to the byte string. The highest +// byte of the 32-bit input value is silently truncated. +func (b *Builder) AddUint24(v uint32) { + b.add(byte(v>>16), byte(v>>8), byte(v)) +} + +// AddUint32 appends a big-endian, 32-bit value to the byte string. +func (b *Builder) AddUint32(v uint32) { + b.add(byte(v>>24), byte(v>>16), byte(v>>8), byte(v)) +} + +// AddBytes appends a sequence of bytes to the byte string. +func (b *Builder) AddBytes(v []byte) { + b.add(v...) +} + +// BuilderContinuation is continuation-passing interface for building +// length-prefixed byte sequences. Builder methods for length-prefixed +// sequences (AddUint8LengthPrefixed etc.) will invoke the BuilderContinuation +// supplied to them. The child builder passed to the continuation can be used +// to build the content of the length-prefixed sequence. Example: +// +// parent := cryptobyte.NewBuilder() +// parent.AddUint8LengthPrefixed(func (child *Builder) { +// child.AddUint8(42) +// child.AddUint8LengthPrefixed(func (grandchild *Builder) { +// grandchild.AddUint8(5) +// }) +// }) +// +// It is an error to write more bytes to the child than allowed by the reserved +// length prefix. After the continuation returns, the child must be considered +// invalid, i.e. users must not store any copies or references of the child +// that outlive the continuation. +type BuilderContinuation func(child *Builder) + +// AddUint8LengthPrefixed adds a 8-bit length-prefixed byte sequence. +func (b *Builder) AddUint8LengthPrefixed(f BuilderContinuation) { + b.addLengthPrefixed(1, false, f) +} + +// AddUint16LengthPrefixed adds a big-endian, 16-bit length-prefixed byte sequence. +func (b *Builder) AddUint16LengthPrefixed(f BuilderContinuation) { + b.addLengthPrefixed(2, false, f) +} + +// AddUint24LengthPrefixed adds a big-endian, 24-bit length-prefixed byte sequence. +func (b *Builder) AddUint24LengthPrefixed(f BuilderContinuation) { + b.addLengthPrefixed(3, false, f) +} + +func (b *Builder) addLengthPrefixed(lenLen int, isASN1 bool, f BuilderContinuation) { + // Subsequent writes can be ignored if the builder has encountered an error. + if b.err != nil { + return + } + + offset := len(b.result) + b.add(make([]byte, lenLen)...) + + b.child = &Builder{ + result: b.result, + fixedSize: b.fixedSize, + offset: offset, + pendingLenLen: lenLen, + pendingIsASN1: isASN1, + } + + f(b.child) + b.flushChild() + if b.child != nil { + panic("cryptobyte: internal error") + } +} + +func (b *Builder) flushChild() { + if b.child == nil { + return + } + b.child.flushChild() + child := b.child + b.child = nil + + if child.err != nil { + b.err = child.err + return + } + + length := len(child.result) - child.pendingLenLen - child.offset + + if length < 0 { + panic("cryptobyte: internal error") // result unexpectedly shrunk + } + + if child.pendingIsASN1 { + // For ASN.1, we reserved a single byte for the length. If that turned out + // to be incorrect, we have to move the contents along in order to make + // space. + if child.pendingLenLen != 1 { + panic("cryptobyte: internal error") + } + var lenLen, lenByte uint8 + if int64(length) > 0xfffffffe { + b.err = errors.New("pending ASN.1 child too long") + return + } else if length > 0xffffff { + lenLen = 5 + lenByte = 0x80 | 4 + } else if length > 0xffff { + lenLen = 4 + lenByte = 0x80 | 3 + } else if length > 0xff { + lenLen = 3 + lenByte = 0x80 | 2 + } else if length > 0x7f { + lenLen = 2 + lenByte = 0x80 | 1 + } else { + lenLen = 1 + lenByte = uint8(length) + length = 0 + } + + // Insert the initial length byte, make space for successive length bytes, + // and adjust the offset. + child.result[child.offset] = lenByte + extraBytes := int(lenLen - 1) + if extraBytes != 0 { + child.add(make([]byte, extraBytes)...) + childStart := child.offset + child.pendingLenLen + copy(child.result[childStart+extraBytes:], child.result[childStart:]) + } + child.offset++ + child.pendingLenLen = extraBytes + } + + l := length + for i := child.pendingLenLen - 1; i >= 0; i-- { + child.result[child.offset+i] = uint8(l) + l >>= 8 + } + if l != 0 { + b.err = fmt.Errorf("cryptobyte: pending child length %d exceeds %d-byte length prefix", length, child.pendingLenLen) + return + } + + if !b.fixedSize { + b.result = child.result // In case child reallocated result. + } +} + +func (b *Builder) add(bytes ...byte) { + if b.err != nil { + return + } + if b.child != nil { + panic("attempted write while child is pending") + } + if len(b.result)+len(bytes) < len(bytes) { + b.err = errors.New("cryptobyte: length overflow") + } + if b.fixedSize && len(b.result)+len(bytes) > cap(b.result) { + b.err = errors.New("cryptobyte: Builder is exceeding its fixed-size buffer") + return + } + b.result = append(b.result, bytes...) +} + +// A MarshalingValue marshals itself into a Builder. +type MarshalingValue interface { + // Marshal is called by Builder.AddValue. It receives a pointer to a builder + // to marshal itself into. It may return an error that occurred during + // marshaling, such as unset or invalid values. + Marshal(b *Builder) error +} + +// AddValue calls Marshal on v, passing a pointer to the builder to append to. +// If Marshal returns an error, it is set on the Builder so that subsequent +// appends don't have an effect. +func (b *Builder) AddValue(v MarshalingValue) { + err := v.Marshal(b) + if err != nil { + b.err = err + } +} diff --git a/vendor/golang.org/x/crypto/cryptobyte/cryptobyte_test.go b/vendor/golang.org/x/crypto/cryptobyte/cryptobyte_test.go new file mode 100644 index 0000000000..49c61dca4a --- /dev/null +++ b/vendor/golang.org/x/crypto/cryptobyte/cryptobyte_test.go @@ -0,0 +1,379 @@ +// Copyright 2017 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 cryptobyte + +import ( + "bytes" + "fmt" + "testing" +) + +func builderBytesEq(b *Builder, want ...byte) error { + got := b.BytesOrPanic() + if !bytes.Equal(got, want) { + return fmt.Errorf("Bytes() = %v, want %v", got, want) + } + return nil +} + +func TestBytes(t *testing.T) { + var b Builder + v := []byte("foobarbaz") + b.AddBytes(v[0:3]) + b.AddBytes(v[3:4]) + b.AddBytes(v[4:9]) + if err := builderBytesEq(&b, v...); err != nil { + t.Error(err) + } + s := String(b.BytesOrPanic()) + for _, w := range []string{"foo", "bar", "baz"} { + var got []byte + if !s.ReadBytes(&got, 3) { + t.Errorf("ReadBytes() = false, want true (w = %v)", w) + } + want := []byte(w) + if !bytes.Equal(got, want) { + t.Errorf("ReadBytes(): got = %v, want %v", got, want) + } + } + if len(s) != 0 { + t.Errorf("len(s) = %d, want 0", len(s)) + } +} + +func TestUint8(t *testing.T) { + var b Builder + b.AddUint8(42) + if err := builderBytesEq(&b, 42); err != nil { + t.Error(err) + } + + var s String = b.BytesOrPanic() + var v uint8 + if !s.ReadUint8(&v) { + t.Error("ReadUint8() = false, want true") + } + if v != 42 { + t.Errorf("v = %d, want 42", v) + } + if len(s) != 0 { + t.Errorf("len(s) = %d, want 0", len(s)) + } +} + +func TestUint16(t *testing.T) { + var b Builder + b.AddUint16(65534) + if err := builderBytesEq(&b, 255, 254); err != nil { + t.Error(err) + } + var s String = b.BytesOrPanic() + var v uint16 + if !s.ReadUint16(&v) { + t.Error("ReadUint16() == false, want true") + } + if v != 65534 { + t.Errorf("v = %d, want 65534", v) + } + if len(s) != 0 { + t.Errorf("len(s) = %d, want 0", len(s)) + } +} + +func TestUint24(t *testing.T) { + var b Builder + b.AddUint24(0xfffefd) + if err := builderBytesEq(&b, 255, 254, 253); err != nil { + t.Error(err) + } + + var s String = b.BytesOrPanic() + var v uint32 + if !s.ReadUint24(&v) { + t.Error("ReadUint8() = false, want true") + } + if v != 0xfffefd { + t.Errorf("v = %d, want fffefd", v) + } + if len(s) != 0 { + t.Errorf("len(s) = %d, want 0", len(s)) + } +} + +func TestUint24Truncation(t *testing.T) { + var b Builder + b.AddUint24(0x10111213) + if err := builderBytesEq(&b, 0x11, 0x12, 0x13); err != nil { + t.Error(err) + } +} + +func TestUint32(t *testing.T) { + var b Builder + b.AddUint32(0xfffefdfc) + if err := builderBytesEq(&b, 255, 254, 253, 252); err != nil { + t.Error(err) + } + + var s String = b.BytesOrPanic() + var v uint32 + if !s.ReadUint32(&v) { + t.Error("ReadUint8() = false, want true") + } + if v != 0xfffefdfc { + t.Errorf("v = %x, want fffefdfc", v) + } + if len(s) != 0 { + t.Errorf("len(s) = %d, want 0", len(s)) + } +} + +func TestUMultiple(t *testing.T) { + var b Builder + b.AddUint8(23) + b.AddUint32(0xfffefdfc) + b.AddUint16(42) + if err := builderBytesEq(&b, 23, 255, 254, 253, 252, 0, 42); err != nil { + t.Error(err) + } + + var s String = b.BytesOrPanic() + var ( + x uint8 + y uint32 + z uint16 + ) + if !s.ReadUint8(&x) || !s.ReadUint32(&y) || !s.ReadUint16(&z) { + t.Error("ReadUint8() = false, want true") + } + if x != 23 || y != 0xfffefdfc || z != 42 { + t.Errorf("x, y, z = %d, %d, %d; want 23, 4294901244, 5", x, y, z) + } + if len(s) != 0 { + t.Errorf("len(s) = %d, want 0", len(s)) + } +} + +func TestUint8LengthPrefixedSimple(t *testing.T) { + var b Builder + b.AddUint8LengthPrefixed(func(c *Builder) { + c.AddUint8(23) + c.AddUint8(42) + }) + if err := builderBytesEq(&b, 2, 23, 42); err != nil { + t.Error(err) + } + + var base, child String = b.BytesOrPanic(), nil + var x, y uint8 + if !base.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) || + !child.ReadUint8(&y) { + t.Error("parsing failed") + } + if x != 23 || y != 42 { + t.Errorf("want x, y == 23, 42; got %d, %d", x, y) + } + if len(base) != 0 { + t.Errorf("len(base) = %d, want 0", len(base)) + } + if len(child) != 0 { + t.Errorf("len(child) = %d, want 0", len(child)) + } +} + +func TestUint8LengthPrefixedMulti(t *testing.T) { + var b Builder + b.AddUint8LengthPrefixed(func(c *Builder) { + c.AddUint8(23) + c.AddUint8(42) + }) + b.AddUint8(5) + b.AddUint8LengthPrefixed(func(c *Builder) { + c.AddUint8(123) + c.AddUint8(234) + }) + if err := builderBytesEq(&b, 2, 23, 42, 5, 2, 123, 234); err != nil { + t.Error(err) + } + + var s, child String = b.BytesOrPanic(), nil + var u, v, w, x, y uint8 + if !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&u) || !child.ReadUint8(&v) || + !s.ReadUint8(&w) || !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) || !child.ReadUint8(&y) { + t.Error("parsing failed") + } + if u != 23 || v != 42 || w != 5 || x != 123 || y != 234 { + t.Errorf("u, v, w, x, y = %d, %d, %d, %d, %d; want 23, 42, 5, 123, 234", + u, v, w, x, y) + } + if len(s) != 0 { + t.Errorf("len(s) = %d, want 0", len(s)) + } + if len(child) != 0 { + t.Errorf("len(child) = %d, want 0", len(child)) + } +} + +func TestUint8LengthPrefixedNested(t *testing.T) { + var b Builder + b.AddUint8LengthPrefixed(func(c *Builder) { + c.AddUint8(5) + c.AddUint8LengthPrefixed(func(d *Builder) { + d.AddUint8(23) + d.AddUint8(42) + }) + c.AddUint8(123) + }) + if err := builderBytesEq(&b, 5, 5, 2, 23, 42, 123); err != nil { + t.Error(err) + } + + var base, child1, child2 String = b.BytesOrPanic(), nil, nil + var u, v, w, x uint8 + if !base.ReadUint8LengthPrefixed(&child1) { + t.Error("parsing base failed") + } + if !child1.ReadUint8(&u) || !child1.ReadUint8LengthPrefixed(&child2) || !child1.ReadUint8(&x) { + t.Error("parsing child1 failed") + } + if !child2.ReadUint8(&v) || !child2.ReadUint8(&w) { + t.Error("parsing child2 failed") + } + if u != 5 || v != 23 || w != 42 || x != 123 { + t.Errorf("u, v, w, x = %d, %d, %d, %d, want 5, 23, 42, 123", + u, v, w, x) + } + if len(base) != 0 { + t.Errorf("len(base) = %d, want 0", len(base)) + } + if len(child1) != 0 { + t.Errorf("len(child1) = %d, want 0", len(child1)) + } + if len(base) != 0 { + t.Errorf("len(child2) = %d, want 0", len(child2)) + } +} + +func TestPreallocatedBuffer(t *testing.T) { + var buf [5]byte + b := NewBuilder(buf[0:0]) + b.AddUint8(1) + b.AddUint8LengthPrefixed(func(c *Builder) { + c.AddUint8(3) + c.AddUint8(4) + }) + b.AddUint16(1286) // Outgrow buf by one byte. + want := []byte{1, 2, 3, 4, 0} + if !bytes.Equal(buf[:], want) { + t.Errorf("buf = %v want %v", buf, want) + } + if err := builderBytesEq(b, 1, 2, 3, 4, 5, 6); err != nil { + t.Error(err) + } +} + +func TestWriteWithPendingChild(t *testing.T) { + var b Builder + b.AddUint8LengthPrefixed(func(c *Builder) { + c.AddUint8LengthPrefixed(func(d *Builder) { + defer func() { + if recover() == nil { + t.Errorf("recover() = nil, want error; c.AddUint8() did not panic") + } + }() + c.AddUint8(2) // panics + + defer func() { + if recover() == nil { + t.Errorf("recover() = nil, want error; b.AddUint8() did not panic") + } + }() + b.AddUint8(2) // panics + }) + + defer func() { + if recover() == nil { + t.Errorf("recover() = nil, want error; b.AddUint8() did not panic") + } + }() + b.AddUint8(2) // panics + }) +} + +// ASN.1 + +func TestASN1Int64(t *testing.T) { + tests := []struct { + in int64 + want []byte + }{ + {-0x800000, []byte{2, 3, 128, 0, 0}}, + {-256, []byte{2, 2, 255, 0}}, + {-129, []byte{2, 2, 255, 127}}, + {-128, []byte{2, 1, 128}}, + {-1, []byte{2, 1, 255}}, + {0, []byte{2, 1, 0}}, + {1, []byte{2, 1, 1}}, + {2, []byte{2, 1, 2}}, + {127, []byte{2, 1, 127}}, + {128, []byte{2, 2, 0, 128}}, + {256, []byte{2, 2, 1, 0}}, + {0x800000, []byte{2, 4, 0, 128, 0, 0}}, + } + for i, tt := range tests { + var b Builder + b.AddASN1Int64(tt.in) + if err := builderBytesEq(&b, tt.want...); err != nil { + t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in) + } + + var n int64 + s := String(b.BytesOrPanic()) + ok := s.ReadASN1Integer(&n) + if !ok || n != tt.in { + t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)", + ok, n, tt.in, i) + } + if len(s) != 0 { + t.Errorf("len(s) = %d, want 0", len(s)) + } + } +} + +func TestASN1Uint64(t *testing.T) { + tests := []struct { + in uint64 + want []byte + }{ + {0, []byte{2, 1, 0}}, + {1, []byte{2, 1, 1}}, + {2, []byte{2, 1, 2}}, + {127, []byte{2, 1, 127}}, + {128, []byte{2, 2, 0, 128}}, + {256, []byte{2, 2, 1, 0}}, + {0x800000, []byte{2, 4, 0, 128, 0, 0}}, + {0x7fffffffffffffff, []byte{2, 8, 127, 255, 255, 255, 255, 255, 255, 255}}, + {0x8000000000000000, []byte{2, 9, 0, 128, 0, 0, 0, 0, 0, 0, 0}}, + {0xffffffffffffffff, []byte{2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255}}, + } + for i, tt := range tests { + var b Builder + b.AddASN1Uint64(tt.in) + if err := builderBytesEq(&b, tt.want...); err != nil { + t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in) + } + + var n uint64 + s := String(b.BytesOrPanic()) + ok := s.ReadASN1Integer(&n) + if !ok || n != tt.in { + t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)", + ok, n, tt.in, i) + } + if len(s) != 0 { + t.Errorf("len(s) = %d, want 0", len(s)) + } + } +} diff --git a/vendor/golang.org/x/crypto/cryptobyte/example_test.go b/vendor/golang.org/x/crypto/cryptobyte/example_test.go new file mode 100644 index 0000000000..7d3c06e120 --- /dev/null +++ b/vendor/golang.org/x/crypto/cryptobyte/example_test.go @@ -0,0 +1,120 @@ +// Copyright 2017 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 cryptobyte_test + +import ( + "encoding/asn1" + "fmt" + "golang.org/x/crypto/cryptobyte" +) + +func ExampleString_lengthPrefixed() { + // This is an example of parsing length-prefixed data (as found in, for + // example, TLS). Imagine a 16-bit prefixed series of 8-bit prefixed + // strings. + + input := cryptobyte.String([]byte{0, 12, 5, 'h', 'e', 'l', 'l', 'o', 5, 'w', 'o', 'r', 'l', 'd'}) + var result []string + + var values cryptobyte.String + if !input.ReadUint16LengthPrefixed(&values) || + !input.Empty() { + panic("bad format") + } + + for !values.Empty() { + var value cryptobyte.String + if !values.ReadUint8LengthPrefixed(&value) { + panic("bad format") + } + + result = append(result, string(value)) + } + + // Output: []string{"hello", "world"} + fmt.Printf("%#v\n", result) +} + +func ExampleString_asn1() { + // This is an example of parsing ASN.1 data that looks like: + // Foo ::= SEQUENCE { + // version [6] INTEGER DEFAULT 0 + // data OCTET STRING + // } + + input := cryptobyte.String([]byte{0x30, 12, 0xa6, 3, 2, 1, 2, 4, 5, 'h', 'e', 'l', 'l', 'o'}) + + var ( + version int64 + data, inner, versionBytes cryptobyte.String + haveVersion bool + ) + if !input.ReadASN1(&inner, cryptobyte.Tag(asn1.TagSequence).Constructed()) || + !input.Empty() || + !inner.ReadOptionalASN1(&versionBytes, &haveVersion, cryptobyte.Tag(6).Constructed().ContextSpecific()) || + (haveVersion && !versionBytes.ReadASN1Integer(&version)) || + (haveVersion && !versionBytes.Empty()) || + !inner.ReadASN1(&data, asn1.TagOctetString) || + !inner.Empty() { + panic("bad format") + } + + // Output: haveVersion: true, version: 2, data: hello + fmt.Printf("haveVersion: %t, version: %d, data: %s\n", haveVersion, version, string(data)) +} + +func ExampleBuilder_asn1() { + // This is an example of building ASN.1 data that looks like: + // Foo ::= SEQUENCE { + // version [6] INTEGER DEFAULT 0 + // data OCTET STRING + // } + + version := int64(2) + data := []byte("hello") + const defaultVersion = 0 + + var b cryptobyte.Builder + b.AddASN1(cryptobyte.Tag(asn1.TagSequence).Constructed(), func(b *cryptobyte.Builder) { + if version != defaultVersion { + b.AddASN1(cryptobyte.Tag(6).Constructed().ContextSpecific(), func(b *cryptobyte.Builder) { + b.AddASN1Int64(version) + }) + } + b.AddASN1OctetString(data) + }) + + result, err := b.Bytes() + if err != nil { + panic(err) + } + + // Output: 300ca603020102040568656c6c6f + fmt.Printf("%x\n", result) +} + +func ExampleBuilder_lengthPrefixed() { + // This is an example of building length-prefixed data (as found in, + // for example, TLS). Imagine a 16-bit prefixed series of 8-bit + // prefixed strings. + input := []string{"hello", "world"} + + var b cryptobyte.Builder + b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { + for _, value := range input { + b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { + b.AddBytes([]byte(value)) + }) + } + }) + + result, err := b.Bytes() + if err != nil { + panic(err) + } + + // Output: 000c0568656c6c6f05776f726c64 + fmt.Printf("%x\n", result) +} diff --git a/vendor/golang.org/x/crypto/cryptobyte/string.go b/vendor/golang.org/x/crypto/cryptobyte/string.go new file mode 100644 index 0000000000..b1215b3bf8 --- /dev/null +++ b/vendor/golang.org/x/crypto/cryptobyte/string.go @@ -0,0 +1,157 @@ +// Copyright 2017 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 cryptobyte implements building and parsing of byte strings for +// DER-encoded ASN.1 and TLS messages. See the examples for the Builder and +// String types to get started. +package cryptobyte + +// String represents a string of bytes. It provides methods for parsing +// fixed-length and length-prefixed values from it. +type String []byte + +// read advances a String by n bytes and returns them. If less than n bytes +// remain, it returns nil. +func (s *String) read(n int) []byte { + if len(*s) < n { + return nil + } + v := (*s)[:n] + *s = (*s)[n:] + return v +} + +// Skip advances the String by n byte and reports whether it was successful. +func (s *String) Skip(n int) bool { + return s.read(n) != nil +} + +// ReadUint8 decodes an 8-bit value into out and advances over it. It +// returns true on success and false on error. +func (s *String) ReadUint8(out *uint8) bool { + v := s.read(1) + if v == nil { + return false + } + *out = uint8(v[0]) + return true +} + +// ReadUint16 decodes a big-endian, 16-bit value into out and advances over it. +// It returns true on success and false on error. +func (s *String) ReadUint16(out *uint16) bool { + v := s.read(2) + if v == nil { + return false + } + *out = uint16(v[0])<<8 | uint16(v[1]) + return true +} + +// ReadUint24 decodes a big-endian, 24-bit value into out and advances over it. +// It returns true on success and false on error. +func (s *String) ReadUint24(out *uint32) bool { + v := s.read(3) + if v == nil { + return false + } + *out = uint32(v[0])<<16 | uint32(v[1])<<8 | uint32(v[2]) + return true +} + +// ReadUint32 decodes a big-endian, 32-bit value into out and advances over it. +// It returns true on success and false on error. +func (s *String) ReadUint32(out *uint32) bool { + v := s.read(4) + if v == nil { + return false + } + *out = uint32(v[0])<<24 | uint32(v[1])<<16 | uint32(v[2])<<8 | uint32(v[3]) + return true +} + +func (s *String) readUnsigned(out *uint32, length int) bool { + v := s.read(length) + if v == nil { + return false + } + var result uint32 + for i := 0; i < length; i++ { + result <<= 8 + result |= uint32(v[i]) + } + *out = result + return true +} + +func (s *String) readLengthPrefixed(lenLen int, outChild *String) bool { + lenBytes := s.read(lenLen) + if lenBytes == nil { + return false + } + var length uint32 + for _, b := range lenBytes { + length = length << 8 + length = length | uint32(b) + } + if int(length) < 0 { + // This currently cannot overflow because we read uint24 at most, but check + // anyway in case that changes in the future. + return false + } + v := s.read(int(length)) + if v == nil { + return false + } + *outChild = v + return true +} + +// ReadUint8LengthPrefixed reads the content of an 8-bit length-prefixed value +// into out and advances over it. It returns true on success and false on +// error. +func (s *String) ReadUint8LengthPrefixed(out *String) bool { + return s.readLengthPrefixed(1, out) +} + +// ReadUint16LengthPrefixed reads the content of a big-endian, 16-bit +// length-prefixed value into out and advances over it. It returns true on +// success and false on error. +func (s *String) ReadUint16LengthPrefixed(out *String) bool { + return s.readLengthPrefixed(2, out) +} + +// ReadUint24LengthPrefixed reads the content of a big-endian, 24-bit +// length-prefixed value into out and advances over it. It returns true on +// success and false on error. +func (s *String) ReadUint24LengthPrefixed(out *String) bool { + return s.readLengthPrefixed(3, out) +} + +// ReadBytes reads n bytes into out and advances over them. It returns true on +// success and false and error. +func (s *String) ReadBytes(out *[]byte, n int) bool { + v := s.read(n) + if v == nil { + return false + } + *out = v + return true +} + +// CopyBytes copies len(out) bytes into out and advances over them. It returns +// true on success and false on error. +func (s *String) CopyBytes(out []byte) bool { + n := len(out) + v := s.read(n) + if v == nil { + return false + } + return copy(out, v) == n +} + +// Empty reports whether the string does not contain any bytes. +func (s String) Empty() bool { + return len(s) == 0 +} diff --git a/vendor/golang.org/x/crypto/curve25519/const_amd64.h b/vendor/golang.org/x/crypto/curve25519/const_amd64.h new file mode 100644 index 0000000000..80ad2220fd --- /dev/null +++ b/vendor/golang.org/x/crypto/curve25519/const_amd64.h @@ -0,0 +1,8 @@ +// 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. + +// This code was translated into a form compatible with 6a from the public +// domain sources in SUPERCOP: http://bench.cr.yp.to/supercop.html + +#define REDMASK51 0x0007FFFFFFFFFFFF diff --git a/vendor/golang.org/x/crypto/curve25519/const_amd64.s b/vendor/golang.org/x/crypto/curve25519/const_amd64.s index 797f9b051d..0ad539885b 100644 --- a/vendor/golang.org/x/crypto/curve25519/const_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/const_amd64.s @@ -7,8 +7,8 @@ // +build amd64,!gccgo,!appengine -DATA ·REDMASK51(SB)/8, $0x0007FFFFFFFFFFFF -GLOBL ·REDMASK51(SB), 8, $8 +// These constants cannot be encoded in non-MOVQ immediates. +// We access them directly from memory instead. DATA ·_121666_213(SB)/8, $996687872 GLOBL ·_121666_213(SB), 8, $8 diff --git a/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s b/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s index 932800b8d1..536479bf62 100644 --- a/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s @@ -7,6 +7,8 @@ // +build amd64,!gccgo,!appengine +#include "const_amd64.h" + // func freeze(inout *[5]uint64) TEXT ·freeze(SB),7,$0-8 MOVQ inout+0(FP), DI @@ -16,7 +18,7 @@ TEXT ·freeze(SB),7,$0-8 MOVQ 16(DI),CX MOVQ 24(DI),R8 MOVQ 32(DI),R9 - MOVQ ·REDMASK51(SB),AX + MOVQ $REDMASK51,AX MOVQ AX,R10 SUBQ $18,R10 MOVQ $3,R11 diff --git a/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s b/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s index ee7b36c368..7074e5cd9d 100644 --- a/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s @@ -7,6 +7,8 @@ // +build amd64,!gccgo,!appengine +#include "const_amd64.h" + // func ladderstep(inout *[5][5]uint64) TEXT ·ladderstep(SB),0,$296-8 MOVQ inout+0(FP),DI @@ -118,7 +120,7 @@ TEXT ·ladderstep(SB),0,$296-8 MULQ 72(SP) ADDQ AX,R12 ADCQ DX,R13 - MOVQ ·REDMASK51(SB),DX + MOVQ $REDMASK51,DX SHLQ $13,CX:SI ANDQ DX,SI SHLQ $13,R9:R8 @@ -233,7 +235,7 @@ TEXT ·ladderstep(SB),0,$296-8 MULQ 32(SP) ADDQ AX,R12 ADCQ DX,R13 - MOVQ ·REDMASK51(SB),DX + MOVQ $REDMASK51,DX SHLQ $13,CX:SI ANDQ DX,SI SHLQ $13,R9:R8 @@ -438,7 +440,7 @@ TEXT ·ladderstep(SB),0,$296-8 MULQ 72(SP) ADDQ AX,R12 ADCQ DX,R13 - MOVQ ·REDMASK51(SB),DX + MOVQ $REDMASK51,DX SHLQ $13,CX:SI ANDQ DX,SI SHLQ $13,R9:R8 @@ -588,7 +590,7 @@ TEXT ·ladderstep(SB),0,$296-8 MULQ 32(SP) ADDQ AX,R12 ADCQ DX,R13 - MOVQ ·REDMASK51(SB),DX + MOVQ $REDMASK51,DX SHLQ $13,CX:SI ANDQ DX,SI SHLQ $13,R9:R8 @@ -728,7 +730,7 @@ TEXT ·ladderstep(SB),0,$296-8 MULQ 152(DI) ADDQ AX,R12 ADCQ DX,R13 - MOVQ ·REDMASK51(SB),DX + MOVQ $REDMASK51,DX SHLQ $13,CX:SI ANDQ DX,SI SHLQ $13,R9:R8 @@ -843,7 +845,7 @@ TEXT ·ladderstep(SB),0,$296-8 MULQ 192(DI) ADDQ AX,R12 ADCQ DX,R13 - MOVQ ·REDMASK51(SB),DX + MOVQ $REDMASK51,DX SHLQ $13,CX:SI ANDQ DX,SI SHLQ $13,R9:R8 @@ -993,7 +995,7 @@ TEXT ·ladderstep(SB),0,$296-8 MULQ 32(DI) ADDQ AX,R12 ADCQ DX,R13 - MOVQ ·REDMASK51(SB),DX + MOVQ $REDMASK51,DX SHLQ $13,CX:SI ANDQ DX,SI SHLQ $13,R9:R8 @@ -1143,7 +1145,7 @@ TEXT ·ladderstep(SB),0,$296-8 MULQ 112(SP) ADDQ AX,R12 ADCQ DX,R13 - MOVQ ·REDMASK51(SB),DX + MOVQ $REDMASK51,DX SHLQ $13,CX:SI ANDQ DX,SI SHLQ $13,R9:R8 @@ -1329,7 +1331,7 @@ TEXT ·ladderstep(SB),0,$296-8 MULQ 192(SP) ADDQ AX,R12 ADCQ DX,R13 - MOVQ ·REDMASK51(SB),DX + MOVQ $REDMASK51,DX SHLQ $13,CX:SI ANDQ DX,SI SHLQ $13,R9:R8 diff --git a/vendor/golang.org/x/crypto/curve25519/mul_amd64.s b/vendor/golang.org/x/crypto/curve25519/mul_amd64.s index 33ce57dcde..b162e65159 100644 --- a/vendor/golang.org/x/crypto/curve25519/mul_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/mul_amd64.s @@ -7,6 +7,8 @@ // +build amd64,!gccgo,!appengine +#include "const_amd64.h" + // func mul(dest, a, b *[5]uint64) TEXT ·mul(SB),0,$16-24 MOVQ dest+0(FP), DI @@ -121,7 +123,7 @@ TEXT ·mul(SB),0,$16-24 MULQ 32(CX) ADDQ AX,R14 ADCQ DX,R15 - MOVQ ·REDMASK51(SB),SI + MOVQ $REDMASK51,SI SHLQ $13,R9:R8 ANDQ SI,R8 SHLQ $13,R11:R10 diff --git a/vendor/golang.org/x/crypto/curve25519/square_amd64.s b/vendor/golang.org/x/crypto/curve25519/square_amd64.s index 3a92804ddf..4e864a83ef 100644 --- a/vendor/golang.org/x/crypto/curve25519/square_amd64.s +++ b/vendor/golang.org/x/crypto/curve25519/square_amd64.s @@ -7,6 +7,8 @@ // +build amd64,!gccgo,!appengine +#include "const_amd64.h" + // func square(out, in *[5]uint64) TEXT ·square(SB),7,$0-16 MOVQ out+0(FP), DI @@ -84,7 +86,7 @@ TEXT ·square(SB),7,$0-16 MULQ 32(SI) ADDQ AX,R13 ADCQ DX,R14 - MOVQ ·REDMASK51(SB),SI + MOVQ $REDMASK51,SI SHLQ $13,R8:CX ANDQ SI,CX SHLQ $13,R10:R9 diff --git a/vendor/golang.org/x/crypto/ocsp/ocsp_test.go b/vendor/golang.org/x/crypto/ocsp/ocsp_test.go index a3c8986194..d325d851eb 100644 --- a/vendor/golang.org/x/crypto/ocsp/ocsp_test.go +++ b/vendor/golang.org/x/crypto/ocsp/ocsp_test.go @@ -225,7 +225,6 @@ func TestOCSPResponse(t *testing.T) { }, } - producedAt := time.Now().Truncate(time.Minute) thisUpdate := time.Date(2010, 7, 7, 15, 1, 5, 0, time.UTC) nextUpdate := time.Date(2010, 7, 7, 18, 35, 17, 0, time.UTC) template := Response{ @@ -284,8 +283,9 @@ func TestOCSPResponse(t *testing.T) { t.Errorf("resp.Extensions: got %v, want %v", resp.Extensions, template.ExtraExtensions) } - if !resp.ProducedAt.Equal(producedAt) { - t.Errorf("resp.ProducedAt: got %d, want %d", resp.ProducedAt, producedAt) + delay := time.Since(resp.ProducedAt) + if delay < -time.Hour || delay > time.Hour { + t.Errorf("resp.ProducedAt: got %s, want close to current time (%s)", resp.ProducedAt, time.Now()) } if resp.Status != template.Status { diff --git a/vendor/golang.org/x/crypto/poly1305/poly1305_test.go b/vendor/golang.org/x/crypto/poly1305/poly1305_test.go index 7b8ab2fe16..017027fe6e 100644 --- a/vendor/golang.org/x/crypto/poly1305/poly1305_test.go +++ b/vendor/golang.org/x/crypto/poly1305/poly1305_test.go @@ -6,10 +6,14 @@ package poly1305 import ( "bytes" + "encoding/hex" + "flag" "testing" "unsafe" ) +var stressFlag = flag.Bool("stress", false, "run slow stress tests") + var testData = []struct { in, k, correct []byte }{ @@ -88,6 +92,39 @@ func testSum(t *testing.T, unaligned bool) { } } +func TestBurnin(t *testing.T) { + // This test can be used to sanity-check significant changes. It can + // take about many minutes to run, even on fast machines. It's disabled + // by default. + if !*stressFlag { + t.Skip("skipping without -stress") + } + + var key [32]byte + var input [25]byte + var output [16]byte + + for i := range key { + key[i] = 1 + } + for i := range input { + input[i] = 2 + } + + for i := uint64(0); i < 1e10; i++ { + Sum(&output, input[:], &key) + copy(key[0:], output[:]) + copy(key[16:], output[:]) + copy(input[:], output[:]) + copy(input[16:], output[:]) + } + + const expected = "5e3b866aea0b636d240c83c428f84bfa" + if got := hex.EncodeToString(output[:]); got != expected { + t.Errorf("expected %s, got %s", expected, got) + } +} + func TestSum(t *testing.T) { testSum(t, false) } func TestSumUnaligned(t *testing.T) { testSum(t, true) } diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ref.go b/vendor/golang.org/x/crypto/poly1305/sum_ref.go index dbe50e78a0..b2805a5ca1 100644 --- a/vendor/golang.org/x/crypto/poly1305/sum_ref.go +++ b/vendor/golang.org/x/crypto/poly1305/sum_ref.go @@ -6,1526 +6,136 @@ package poly1305 -// Based on original, public domain implementation from NaCl by D. J. -// Bernstein. +import "encoding/binary" -import "math" - -const ( - alpham80 = 0.00000000558793544769287109375 - alpham48 = 24.0 - alpham16 = 103079215104.0 - alpha0 = 6755399441055744.0 - alpha18 = 1770887431076116955136.0 - alpha32 = 29014219670751100192948224.0 - alpha50 = 7605903601369376408980219232256.0 - alpha64 = 124615124604835863084731911901282304.0 - alpha82 = 32667107224410092492483962313449748299776.0 - alpha96 = 535217884764734955396857238543560676143529984.0 - alpha112 = 35076039295941670036888435985190792471742381031424.0 - alpha130 = 9194973245195333150150082162901855101712434733101613056.0 - scale = 0.0000000000000000000000000000000000000036734198463196484624023016788195177431833298649127735047148490821200539357960224151611328125 - offset0 = 6755408030990331.0 - offset1 = 29014256564239239022116864.0 - offset2 = 124615283061160854719918951570079744.0 - offset3 = 535219245894202480694386063513315216128475136.0 -) - -// Sum generates an authenticator for m using a one-time key and puts the +// Sum generates an authenticator for msg using a one-time key and puts the // 16-byte result into out. Authenticating two different messages with the same // key allows an attacker to forge messages at will. -func Sum(out *[16]byte, m []byte, key *[32]byte) { - r := key - s := key[16:] +func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) { var ( - y7 float64 - y6 float64 - y1 float64 - y0 float64 - y5 float64 - y4 float64 - x7 float64 - x6 float64 - x1 float64 - x0 float64 - y3 float64 - y2 float64 - x5 float64 - r3lowx0 float64 - x4 float64 - r0lowx6 float64 - x3 float64 - r3highx0 float64 - x2 float64 - r0highx6 float64 - r0lowx0 float64 - sr1lowx6 float64 - r0highx0 float64 - sr1highx6 float64 - sr3low float64 - r1lowx0 float64 - sr2lowx6 float64 - r1highx0 float64 - sr2highx6 float64 - r2lowx0 float64 - sr3lowx6 float64 - r2highx0 float64 - sr3highx6 float64 - r1highx4 float64 - r1lowx4 float64 - r0highx4 float64 - r0lowx4 float64 - sr3highx4 float64 - sr3lowx4 float64 - sr2highx4 float64 - sr2lowx4 float64 - r0lowx2 float64 - r0highx2 float64 - r1lowx2 float64 - r1highx2 float64 - r2lowx2 float64 - r2highx2 float64 - sr3lowx2 float64 - sr3highx2 float64 - z0 float64 - z1 float64 - z2 float64 - z3 float64 - m0 int64 - m1 int64 - m2 int64 - m3 int64 - m00 uint32 - m01 uint32 - m02 uint32 - m03 uint32 - m10 uint32 - m11 uint32 - m12 uint32 - m13 uint32 - m20 uint32 - m21 uint32 - m22 uint32 - m23 uint32 - m30 uint32 - m31 uint32 - m32 uint32 - m33 uint64 - lbelow2 int32 - lbelow3 int32 - lbelow4 int32 - lbelow5 int32 - lbelow6 int32 - lbelow7 int32 - lbelow8 int32 - lbelow9 int32 - lbelow10 int32 - lbelow11 int32 - lbelow12 int32 - lbelow13 int32 - lbelow14 int32 - lbelow15 int32 - s00 uint32 - s01 uint32 - s02 uint32 - s03 uint32 - s10 uint32 - s11 uint32 - s12 uint32 - s13 uint32 - s20 uint32 - s21 uint32 - s22 uint32 - s23 uint32 - s30 uint32 - s31 uint32 - s32 uint32 - s33 uint32 - bits32 uint64 - f uint64 - f0 uint64 - f1 uint64 - f2 uint64 - f3 uint64 - f4 uint64 - g uint64 - g0 uint64 - g1 uint64 - g2 uint64 - g3 uint64 - g4 uint64 + h0, h1, h2, h3, h4 uint32 // the hash accumulators + r0, r1, r2, r3, r4 uint64 // the r part of the key ) - var p int32 + r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff) + r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03) + r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff) + r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff) + r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff) - l := int32(len(m)) + R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5 - r00 := uint32(r[0]) + for len(msg) >= TagSize { + // h += msg + h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24) - r01 := uint32(r[1]) + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) - r02 := uint32(r[2]) - r0 := int64(2151) + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff - r03 := uint32(r[3]) - r03 &= 15 - r0 <<= 51 + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff - r10 := uint32(r[4]) - r10 &= 252 - r01 <<= 8 - r0 += int64(r00) - - r11 := uint32(r[5]) - r02 <<= 16 - r0 += int64(r01) - - r12 := uint32(r[6]) - r03 <<= 24 - r0 += int64(r02) - - r13 := uint32(r[7]) - r13 &= 15 - r1 := int64(2215) - r0 += int64(r03) - - d0 := r0 - r1 <<= 51 - r2 := int64(2279) - - r20 := uint32(r[8]) - r20 &= 252 - r11 <<= 8 - r1 += int64(r10) - - r21 := uint32(r[9]) - r12 <<= 16 - r1 += int64(r11) - - r22 := uint32(r[10]) - r13 <<= 24 - r1 += int64(r12) - - r23 := uint32(r[11]) - r23 &= 15 - r2 <<= 51 - r1 += int64(r13) - - d1 := r1 - r21 <<= 8 - r2 += int64(r20) - - r30 := uint32(r[12]) - r30 &= 252 - r22 <<= 16 - r2 += int64(r21) - - r31 := uint32(r[13]) - r23 <<= 24 - r2 += int64(r22) - - r32 := uint32(r[14]) - r2 += int64(r23) - r3 := int64(2343) - - d2 := r2 - r3 <<= 51 - - r33 := uint32(r[15]) - r33 &= 15 - r31 <<= 8 - r3 += int64(r30) - - r32 <<= 16 - r3 += int64(r31) - - r33 <<= 24 - r3 += int64(r32) - - r3 += int64(r33) - h0 := alpha32 - alpha32 - - d3 := r3 - h1 := alpha32 - alpha32 - - h2 := alpha32 - alpha32 - - h3 := alpha32 - alpha32 - - h4 := alpha32 - alpha32 - - r0low := math.Float64frombits(uint64(d0)) - h5 := alpha32 - alpha32 - - r1low := math.Float64frombits(uint64(d1)) - h6 := alpha32 - alpha32 - - r2low := math.Float64frombits(uint64(d2)) - h7 := alpha32 - alpha32 - - r0low -= alpha0 - - r1low -= alpha32 - - r2low -= alpha64 - - r0high := r0low + alpha18 - - r3low := math.Float64frombits(uint64(d3)) - - r1high := r1low + alpha50 - sr1low := scale * r1low - - r2high := r2low + alpha82 - sr2low := scale * r2low - - r0high -= alpha18 - r0high_stack := r0high - - r3low -= alpha96 - - r1high -= alpha50 - r1high_stack := r1high - - sr1high := sr1low + alpham80 - - r0low -= r0high - - r2high -= alpha82 - sr3low = scale * r3low - - sr2high := sr2low + alpham48 - - r1low -= r1high - r1low_stack := r1low - - sr1high -= alpham80 - sr1high_stack := sr1high - - r2low -= r2high - r2low_stack := r2low - - sr2high -= alpham48 - sr2high_stack := sr2high - - r3high := r3low + alpha112 - r0low_stack := r0low - - sr1low -= sr1high - sr1low_stack := sr1low - - sr3high := sr3low + alpham16 - r2high_stack := r2high - - sr2low -= sr2high - sr2low_stack := sr2low - - r3high -= alpha112 - r3high_stack := r3high - - sr3high -= alpham16 - sr3high_stack := sr3high - - r3low -= r3high - r3low_stack := r3low - - sr3low -= sr3high - sr3low_stack := sr3low - - if l < 16 { - goto addatmost15bytes + msg = msg[TagSize:] } - m00 = uint32(m[p+0]) - m0 = 2151 + if len(msg) > 0 { + var block [TagSize]byte + off := copy(block[:], msg) + block[off] = 0x01 - m0 <<= 51 - m1 = 2215 - m01 = uint32(m[p+1]) + // h += msg + h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8) - m1 <<= 51 - m2 = 2279 - m02 = uint32(m[p+2]) + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) - m2 <<= 51 - m3 = 2343 - m03 = uint32(m[p+3]) + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff - m10 = uint32(m[p+4]) - m01 <<= 8 - m0 += int64(m00) - - m11 = uint32(m[p+5]) - m02 <<= 16 - m0 += int64(m01) - - m12 = uint32(m[p+6]) - m03 <<= 24 - m0 += int64(m02) - - m13 = uint32(m[p+7]) - m3 <<= 51 - m0 += int64(m03) - - m20 = uint32(m[p+8]) - m11 <<= 8 - m1 += int64(m10) - - m21 = uint32(m[p+9]) - m12 <<= 16 - m1 += int64(m11) - - m22 = uint32(m[p+10]) - m13 <<= 24 - m1 += int64(m12) - - m23 = uint32(m[p+11]) - m1 += int64(m13) - - m30 = uint32(m[p+12]) - m21 <<= 8 - m2 += int64(m20) - - m31 = uint32(m[p+13]) - m22 <<= 16 - m2 += int64(m21) - - m32 = uint32(m[p+14]) - m23 <<= 24 - m2 += int64(m22) - - m33 = uint64(m[p+15]) - m2 += int64(m23) - - d0 = m0 - m31 <<= 8 - m3 += int64(m30) - - d1 = m1 - m32 <<= 16 - m3 += int64(m31) - - d2 = m2 - m33 += 256 - - m33 <<= 24 - m3 += int64(m32) - - m3 += int64(m33) - d3 = m3 - - p += 16 - l -= 16 - - z0 = math.Float64frombits(uint64(d0)) - - z1 = math.Float64frombits(uint64(d1)) - - z2 = math.Float64frombits(uint64(d2)) - - z3 = math.Float64frombits(uint64(d3)) - - z0 -= alpha0 - - z1 -= alpha32 - - z2 -= alpha64 - - z3 -= alpha96 - - h0 += z0 - - h1 += z1 - - h3 += z2 - - h5 += z3 - - if l < 16 { - goto multiplyaddatmost15bytes + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff } -multiplyaddatleast16bytes: - - m2 = 2279 - m20 = uint32(m[p+8]) - y7 = h7 + alpha130 - - m2 <<= 51 - m3 = 2343 - m21 = uint32(m[p+9]) - y6 = h6 + alpha130 - - m3 <<= 51 - m0 = 2151 - m22 = uint32(m[p+10]) - y1 = h1 + alpha32 - - m0 <<= 51 - m1 = 2215 - m23 = uint32(m[p+11]) - y0 = h0 + alpha32 - - m1 <<= 51 - m30 = uint32(m[p+12]) - y7 -= alpha130 - - m21 <<= 8 - m2 += int64(m20) - m31 = uint32(m[p+13]) - y6 -= alpha130 - - m22 <<= 16 - m2 += int64(m21) - m32 = uint32(m[p+14]) - y1 -= alpha32 - - m23 <<= 24 - m2 += int64(m22) - m33 = uint64(m[p+15]) - y0 -= alpha32 - - m2 += int64(m23) - m00 = uint32(m[p+0]) - y5 = h5 + alpha96 - - m31 <<= 8 - m3 += int64(m30) - m01 = uint32(m[p+1]) - y4 = h4 + alpha96 - - m32 <<= 16 - m02 = uint32(m[p+2]) - x7 = h7 - y7 - y7 *= scale - - m33 += 256 - m03 = uint32(m[p+3]) - x6 = h6 - y6 - y6 *= scale - - m33 <<= 24 - m3 += int64(m31) - m10 = uint32(m[p+4]) - x1 = h1 - y1 - - m01 <<= 8 - m3 += int64(m32) - m11 = uint32(m[p+5]) - x0 = h0 - y0 - - m3 += int64(m33) - m0 += int64(m00) - m12 = uint32(m[p+6]) - y5 -= alpha96 - - m02 <<= 16 - m0 += int64(m01) - m13 = uint32(m[p+7]) - y4 -= alpha96 - - m03 <<= 24 - m0 += int64(m02) - d2 = m2 - x1 += y7 - - m0 += int64(m03) - d3 = m3 - x0 += y6 - - m11 <<= 8 - m1 += int64(m10) - d0 = m0 - x7 += y5 - - m12 <<= 16 - m1 += int64(m11) - x6 += y4 - - m13 <<= 24 - m1 += int64(m12) - y3 = h3 + alpha64 - - m1 += int64(m13) - d1 = m1 - y2 = h2 + alpha64 - - x0 += x1 - - x6 += x7 - - y3 -= alpha64 - r3low = r3low_stack - - y2 -= alpha64 - r0low = r0low_stack - - x5 = h5 - y5 - r3lowx0 = r3low * x0 - r3high = r3high_stack - - x4 = h4 - y4 - r0lowx6 = r0low * x6 - r0high = r0high_stack - - x3 = h3 - y3 - r3highx0 = r3high * x0 - sr1low = sr1low_stack - - x2 = h2 - y2 - r0highx6 = r0high * x6 - sr1high = sr1high_stack - - x5 += y3 - r0lowx0 = r0low * x0 - r1low = r1low_stack - - h6 = r3lowx0 + r0lowx6 - sr1lowx6 = sr1low * x6 - r1high = r1high_stack - - x4 += y2 - r0highx0 = r0high * x0 - sr2low = sr2low_stack - - h7 = r3highx0 + r0highx6 - sr1highx6 = sr1high * x6 - sr2high = sr2high_stack - - x3 += y1 - r1lowx0 = r1low * x0 - r2low = r2low_stack - - h0 = r0lowx0 + sr1lowx6 - sr2lowx6 = sr2low * x6 - r2high = r2high_stack - - x2 += y0 - r1highx0 = r1high * x0 - sr3low = sr3low_stack - - h1 = r0highx0 + sr1highx6 - sr2highx6 = sr2high * x6 - sr3high = sr3high_stack - - x4 += x5 - r2lowx0 = r2low * x0 - z2 = math.Float64frombits(uint64(d2)) - - h2 = r1lowx0 + sr2lowx6 - sr3lowx6 = sr3low * x6 - - x2 += x3 - r2highx0 = r2high * x0 - z3 = math.Float64frombits(uint64(d3)) - - h3 = r1highx0 + sr2highx6 - sr3highx6 = sr3high * x6 - - r1highx4 = r1high * x4 - z2 -= alpha64 - - h4 = r2lowx0 + sr3lowx6 - r1lowx4 = r1low * x4 - - r0highx4 = r0high * x4 - z3 -= alpha96 - - h5 = r2highx0 + sr3highx6 - r0lowx4 = r0low * x4 - - h7 += r1highx4 - sr3highx4 = sr3high * x4 - - h6 += r1lowx4 - sr3lowx4 = sr3low * x4 - - h5 += r0highx4 - sr2highx4 = sr2high * x4 - - h4 += r0lowx4 - sr2lowx4 = sr2low * x4 - - h3 += sr3highx4 - r0lowx2 = r0low * x2 - - h2 += sr3lowx4 - r0highx2 = r0high * x2 - - h1 += sr2highx4 - r1lowx2 = r1low * x2 - - h0 += sr2lowx4 - r1highx2 = r1high * x2 - - h2 += r0lowx2 - r2lowx2 = r2low * x2 - - h3 += r0highx2 - r2highx2 = r2high * x2 - - h4 += r1lowx2 - sr3lowx2 = sr3low * x2 - - h5 += r1highx2 - sr3highx2 = sr3high * x2 - - p += 16 - l -= 16 - h6 += r2lowx2 - - h7 += r2highx2 - - z1 = math.Float64frombits(uint64(d1)) - h0 += sr3lowx2 - - z0 = math.Float64frombits(uint64(d0)) - h1 += sr3highx2 - - z1 -= alpha32 - - z0 -= alpha0 - - h5 += z3 - - h3 += z2 - - h1 += z1 - - h0 += z0 - - if l >= 16 { - goto multiplyaddatleast16bytes - } - -multiplyaddatmost15bytes: - - y7 = h7 + alpha130 - - y6 = h6 + alpha130 - - y1 = h1 + alpha32 - - y0 = h0 + alpha32 - - y7 -= alpha130 - - y6 -= alpha130 - - y1 -= alpha32 - - y0 -= alpha32 - - y5 = h5 + alpha96 - - y4 = h4 + alpha96 - - x7 = h7 - y7 - y7 *= scale - - x6 = h6 - y6 - y6 *= scale - - x1 = h1 - y1 - - x0 = h0 - y0 - - y5 -= alpha96 - - y4 -= alpha96 - - x1 += y7 - - x0 += y6 - - x7 += y5 - - x6 += y4 - - y3 = h3 + alpha64 - - y2 = h2 + alpha64 - - x0 += x1 - - x6 += x7 - - y3 -= alpha64 - r3low = r3low_stack - - y2 -= alpha64 - r0low = r0low_stack - - x5 = h5 - y5 - r3lowx0 = r3low * x0 - r3high = r3high_stack - - x4 = h4 - y4 - r0lowx6 = r0low * x6 - r0high = r0high_stack - - x3 = h3 - y3 - r3highx0 = r3high * x0 - sr1low = sr1low_stack - - x2 = h2 - y2 - r0highx6 = r0high * x6 - sr1high = sr1high_stack - - x5 += y3 - r0lowx0 = r0low * x0 - r1low = r1low_stack - - h6 = r3lowx0 + r0lowx6 - sr1lowx6 = sr1low * x6 - r1high = r1high_stack - - x4 += y2 - r0highx0 = r0high * x0 - sr2low = sr2low_stack - - h7 = r3highx0 + r0highx6 - sr1highx6 = sr1high * x6 - sr2high = sr2high_stack - - x3 += y1 - r1lowx0 = r1low * x0 - r2low = r2low_stack - - h0 = r0lowx0 + sr1lowx6 - sr2lowx6 = sr2low * x6 - r2high = r2high_stack - - x2 += y0 - r1highx0 = r1high * x0 - sr3low = sr3low_stack - - h1 = r0highx0 + sr1highx6 - sr2highx6 = sr2high * x6 - sr3high = sr3high_stack - - x4 += x5 - r2lowx0 = r2low * x0 - - h2 = r1lowx0 + sr2lowx6 - sr3lowx6 = sr3low * x6 - - x2 += x3 - r2highx0 = r2high * x0 - - h3 = r1highx0 + sr2highx6 - sr3highx6 = sr3high * x6 - - r1highx4 = r1high * x4 - - h4 = r2lowx0 + sr3lowx6 - r1lowx4 = r1low * x4 - - r0highx4 = r0high * x4 - - h5 = r2highx0 + sr3highx6 - r0lowx4 = r0low * x4 - - h7 += r1highx4 - sr3highx4 = sr3high * x4 - - h6 += r1lowx4 - sr3lowx4 = sr3low * x4 - - h5 += r0highx4 - sr2highx4 = sr2high * x4 - - h4 += r0lowx4 - sr2lowx4 = sr2low * x4 - - h3 += sr3highx4 - r0lowx2 = r0low * x2 - - h2 += sr3lowx4 - r0highx2 = r0high * x2 - - h1 += sr2highx4 - r1lowx2 = r1low * x2 - - h0 += sr2lowx4 - r1highx2 = r1high * x2 - - h2 += r0lowx2 - r2lowx2 = r2low * x2 - - h3 += r0highx2 - r2highx2 = r2high * x2 - - h4 += r1lowx2 - sr3lowx2 = sr3low * x2 - - h5 += r1highx2 - sr3highx2 = sr3high * x2 - - h6 += r2lowx2 - - h7 += r2highx2 - - h0 += sr3lowx2 - - h1 += sr3highx2 - -addatmost15bytes: - - if l == 0 { - goto nomorebytes - } - - lbelow2 = l - 2 - - lbelow3 = l - 3 - - lbelow2 >>= 31 - lbelow4 = l - 4 - - m00 = uint32(m[p+0]) - lbelow3 >>= 31 - p += lbelow2 - - m01 = uint32(m[p+1]) - lbelow4 >>= 31 - p += lbelow3 - - m02 = uint32(m[p+2]) - p += lbelow4 - m0 = 2151 - - m03 = uint32(m[p+3]) - m0 <<= 51 - m1 = 2215 - - m0 += int64(m00) - m01 &^= uint32(lbelow2) - - m02 &^= uint32(lbelow3) - m01 -= uint32(lbelow2) - - m01 <<= 8 - m03 &^= uint32(lbelow4) - - m0 += int64(m01) - lbelow2 -= lbelow3 - - m02 += uint32(lbelow2) - lbelow3 -= lbelow4 - - m02 <<= 16 - m03 += uint32(lbelow3) - - m03 <<= 24 - m0 += int64(m02) - - m0 += int64(m03) - lbelow5 = l - 5 - - lbelow6 = l - 6 - lbelow7 = l - 7 - - lbelow5 >>= 31 - lbelow8 = l - 8 - - lbelow6 >>= 31 - p += lbelow5 - - m10 = uint32(m[p+4]) - lbelow7 >>= 31 - p += lbelow6 - - m11 = uint32(m[p+5]) - lbelow8 >>= 31 - p += lbelow7 - - m12 = uint32(m[p+6]) - m1 <<= 51 - p += lbelow8 - - m13 = uint32(m[p+7]) - m10 &^= uint32(lbelow5) - lbelow4 -= lbelow5 - - m10 += uint32(lbelow4) - lbelow5 -= lbelow6 - - m11 &^= uint32(lbelow6) - m11 += uint32(lbelow5) - - m11 <<= 8 - m1 += int64(m10) - - m1 += int64(m11) - m12 &^= uint32(lbelow7) - - lbelow6 -= lbelow7 - m13 &^= uint32(lbelow8) - - m12 += uint32(lbelow6) - lbelow7 -= lbelow8 - - m12 <<= 16 - m13 += uint32(lbelow7) - - m13 <<= 24 - m1 += int64(m12) - - m1 += int64(m13) - m2 = 2279 - - lbelow9 = l - 9 - m3 = 2343 - - lbelow10 = l - 10 - lbelow11 = l - 11 - - lbelow9 >>= 31 - lbelow12 = l - 12 - - lbelow10 >>= 31 - p += lbelow9 - - m20 = uint32(m[p+8]) - lbelow11 >>= 31 - p += lbelow10 - - m21 = uint32(m[p+9]) - lbelow12 >>= 31 - p += lbelow11 - - m22 = uint32(m[p+10]) - m2 <<= 51 - p += lbelow12 - - m23 = uint32(m[p+11]) - m20 &^= uint32(lbelow9) - lbelow8 -= lbelow9 - - m20 += uint32(lbelow8) - lbelow9 -= lbelow10 - - m21 &^= uint32(lbelow10) - m21 += uint32(lbelow9) - - m21 <<= 8 - m2 += int64(m20) - - m2 += int64(m21) - m22 &^= uint32(lbelow11) - - lbelow10 -= lbelow11 - m23 &^= uint32(lbelow12) - - m22 += uint32(lbelow10) - lbelow11 -= lbelow12 - - m22 <<= 16 - m23 += uint32(lbelow11) - - m23 <<= 24 - m2 += int64(m22) - - m3 <<= 51 - lbelow13 = l - 13 - - lbelow13 >>= 31 - lbelow14 = l - 14 - - lbelow14 >>= 31 - p += lbelow13 - lbelow15 = l - 15 - - m30 = uint32(m[p+12]) - lbelow15 >>= 31 - p += lbelow14 - - m31 = uint32(m[p+13]) - p += lbelow15 - m2 += int64(m23) - - m32 = uint32(m[p+14]) - m30 &^= uint32(lbelow13) - lbelow12 -= lbelow13 - - m30 += uint32(lbelow12) - lbelow13 -= lbelow14 - - m3 += int64(m30) - m31 &^= uint32(lbelow14) - - m31 += uint32(lbelow13) - m32 &^= uint32(lbelow15) - - m31 <<= 8 - lbelow14 -= lbelow15 - - m3 += int64(m31) - m32 += uint32(lbelow14) - d0 = m0 - - m32 <<= 16 - m33 = uint64(lbelow15 + 1) - d1 = m1 - - m33 <<= 24 - m3 += int64(m32) - d2 = m2 - - m3 += int64(m33) - d3 = m3 - - z3 = math.Float64frombits(uint64(d3)) - - z2 = math.Float64frombits(uint64(d2)) - - z1 = math.Float64frombits(uint64(d1)) - - z0 = math.Float64frombits(uint64(d0)) - - z3 -= alpha96 - - z2 -= alpha64 - - z1 -= alpha32 - - z0 -= alpha0 - - h5 += z3 - - h3 += z2 - - h1 += z1 - - h0 += z0 - - y7 = h7 + alpha130 - - y6 = h6 + alpha130 - - y1 = h1 + alpha32 - - y0 = h0 + alpha32 - - y7 -= alpha130 - - y6 -= alpha130 - - y1 -= alpha32 - - y0 -= alpha32 - - y5 = h5 + alpha96 - - y4 = h4 + alpha96 - - x7 = h7 - y7 - y7 *= scale - - x6 = h6 - y6 - y6 *= scale - - x1 = h1 - y1 - - x0 = h0 - y0 - - y5 -= alpha96 - - y4 -= alpha96 - - x1 += y7 - - x0 += y6 - - x7 += y5 - - x6 += y4 - - y3 = h3 + alpha64 - - y2 = h2 + alpha64 - - x0 += x1 - - x6 += x7 - - y3 -= alpha64 - r3low = r3low_stack - - y2 -= alpha64 - r0low = r0low_stack - - x5 = h5 - y5 - r3lowx0 = r3low * x0 - r3high = r3high_stack - - x4 = h4 - y4 - r0lowx6 = r0low * x6 - r0high = r0high_stack - - x3 = h3 - y3 - r3highx0 = r3high * x0 - sr1low = sr1low_stack - - x2 = h2 - y2 - r0highx6 = r0high * x6 - sr1high = sr1high_stack - - x5 += y3 - r0lowx0 = r0low * x0 - r1low = r1low_stack - - h6 = r3lowx0 + r0lowx6 - sr1lowx6 = sr1low * x6 - r1high = r1high_stack - - x4 += y2 - r0highx0 = r0high * x0 - sr2low = sr2low_stack - - h7 = r3highx0 + r0highx6 - sr1highx6 = sr1high * x6 - sr2high = sr2high_stack - - x3 += y1 - r1lowx0 = r1low * x0 - r2low = r2low_stack - - h0 = r0lowx0 + sr1lowx6 - sr2lowx6 = sr2low * x6 - r2high = r2high_stack - - x2 += y0 - r1highx0 = r1high * x0 - sr3low = sr3low_stack - - h1 = r0highx0 + sr1highx6 - sr2highx6 = sr2high * x6 - sr3high = sr3high_stack - - x4 += x5 - r2lowx0 = r2low * x0 - - h2 = r1lowx0 + sr2lowx6 - sr3lowx6 = sr3low * x6 - - x2 += x3 - r2highx0 = r2high * x0 - - h3 = r1highx0 + sr2highx6 - sr3highx6 = sr3high * x6 - - r1highx4 = r1high * x4 - - h4 = r2lowx0 + sr3lowx6 - r1lowx4 = r1low * x4 - - r0highx4 = r0high * x4 - - h5 = r2highx0 + sr3highx6 - r0lowx4 = r0low * x4 - - h7 += r1highx4 - sr3highx4 = sr3high * x4 - - h6 += r1lowx4 - sr3lowx4 = sr3low * x4 - - h5 += r0highx4 - sr2highx4 = sr2high * x4 - - h4 += r0lowx4 - sr2lowx4 = sr2low * x4 - - h3 += sr3highx4 - r0lowx2 = r0low * x2 - - h2 += sr3lowx4 - r0highx2 = r0high * x2 - - h1 += sr2highx4 - r1lowx2 = r1low * x2 - - h0 += sr2lowx4 - r1highx2 = r1high * x2 - - h2 += r0lowx2 - r2lowx2 = r2low * x2 - - h3 += r0highx2 - r2highx2 = r2high * x2 - - h4 += r1lowx2 - sr3lowx2 = sr3low * x2 - - h5 += r1highx2 - sr3highx2 = sr3high * x2 - - h6 += r2lowx2 - - h7 += r2highx2 - - h0 += sr3lowx2 - - h1 += sr3highx2 - -nomorebytes: - - y7 = h7 + alpha130 - - y0 = h0 + alpha32 - - y1 = h1 + alpha32 - - y2 = h2 + alpha64 - - y7 -= alpha130 - - y3 = h3 + alpha64 - - y4 = h4 + alpha96 - - y5 = h5 + alpha96 - - x7 = h7 - y7 - y7 *= scale - - y0 -= alpha32 - - y1 -= alpha32 - - y2 -= alpha64 - - h6 += x7 - - y3 -= alpha64 - - y4 -= alpha96 - - y5 -= alpha96 - - y6 = h6 + alpha130 - - x0 = h0 - y0 - - x1 = h1 - y1 - - x2 = h2 - y2 - - y6 -= alpha130 - - x0 += y7 - - x3 = h3 - y3 - - x4 = h4 - y4 - - x5 = h5 - y5 - - x6 = h6 - y6 - - y6 *= scale - - x2 += y0 - - x3 += y1 - - x4 += y2 - - x0 += y6 - - x5 += y3 - - x6 += y4 - - x2 += x3 - - x0 += x1 - - x4 += x5 - - x6 += y5 - - x2 += offset1 - d1 = int64(math.Float64bits(x2)) - - x0 += offset0 - d0 = int64(math.Float64bits(x0)) - - x4 += offset2 - d2 = int64(math.Float64bits(x4)) - - x6 += offset3 - d3 = int64(math.Float64bits(x6)) - - f0 = uint64(d0) - - f1 = uint64(d1) - bits32 = math.MaxUint64 - - f2 = uint64(d2) - bits32 >>= 32 - - f3 = uint64(d3) - f = f0 >> 32 - - f0 &= bits32 - f &= 255 - - f1 += f - g0 = f0 + 5 - - g = g0 >> 32 - g0 &= bits32 - - f = f1 >> 32 - f1 &= bits32 - - f &= 255 - g1 = f1 + g - - g = g1 >> 32 - f2 += f - - f = f2 >> 32 - g1 &= bits32 - - f2 &= bits32 - f &= 255 - - f3 += f - g2 = f2 + g - - g = g2 >> 32 - g2 &= bits32 - - f4 = f3 >> 32 - f3 &= bits32 - - f4 &= 255 - g3 = f3 + g - - g = g3 >> 32 - g3 &= bits32 - - g4 = f4 + g - - g4 = g4 - 4 - s00 = uint32(s[0]) - - f = uint64(int64(g4) >> 63) - s01 = uint32(s[1]) - - f0 &= f - g0 &^= f - s02 = uint32(s[2]) - - f1 &= f - f0 |= g0 - s03 = uint32(s[3]) - - g1 &^= f - f2 &= f - s10 = uint32(s[4]) - - f3 &= f - g2 &^= f - s11 = uint32(s[5]) - - g3 &^= f - f1 |= g1 - s12 = uint32(s[6]) - - f2 |= g2 - f3 |= g3 - s13 = uint32(s[7]) - - s01 <<= 8 - f0 += uint64(s00) - s20 = uint32(s[8]) - - s02 <<= 16 - f0 += uint64(s01) - s21 = uint32(s[9]) - - s03 <<= 24 - f0 += uint64(s02) - s22 = uint32(s[10]) - - s11 <<= 8 - f1 += uint64(s10) - s23 = uint32(s[11]) - - s12 <<= 16 - f1 += uint64(s11) - s30 = uint32(s[12]) - - s13 <<= 24 - f1 += uint64(s12) - s31 = uint32(s[13]) - - f0 += uint64(s03) - f1 += uint64(s13) - s32 = uint32(s[14]) - - s21 <<= 8 - f2 += uint64(s20) - s33 = uint32(s[15]) - - s22 <<= 16 - f2 += uint64(s21) - - s23 <<= 24 - f2 += uint64(s22) - - s31 <<= 8 - f3 += uint64(s30) - - s32 <<= 16 - f3 += uint64(s31) - - s33 <<= 24 - f3 += uint64(s32) - - f2 += uint64(s23) - f3 += uint64(s33) - - out[0] = byte(f0) - f0 >>= 8 - out[1] = byte(f0) - f0 >>= 8 - out[2] = byte(f0) - f0 >>= 8 - out[3] = byte(f0) - f0 >>= 8 - f1 += f0 - - out[4] = byte(f1) - f1 >>= 8 - out[5] = byte(f1) - f1 >>= 8 - out[6] = byte(f1) - f1 >>= 8 - out[7] = byte(f1) - f1 >>= 8 - f2 += f1 - - out[8] = byte(f2) - f2 >>= 8 - out[9] = byte(f2) - f2 >>= 8 - out[10] = byte(f2) - f2 >>= 8 - out[11] = byte(f2) - f2 >>= 8 - f3 += f2 - - out[12] = byte(f3) - f3 >>= 8 - out[13] = byte(f3) - f3 >>= 8 - out[14] = byte(f3) - f3 >>= 8 - out[15] = byte(f3) + // h %= p reduction + h2 += h1 >> 26 + h1 &= 0x3ffffff + h3 += h2 >> 26 + h2 &= 0x3ffffff + h4 += h3 >> 26 + h3 &= 0x3ffffff + h0 += 5 * (h4 >> 26) + h4 &= 0x3ffffff + h1 += h0 >> 26 + h0 &= 0x3ffffff + + // h - p + t0 := h0 + 5 + t1 := h1 + (t0 >> 26) + t2 := h2 + (t1 >> 26) + t3 := h3 + (t2 >> 26) + t4 := h4 + (t3 >> 26) - (1 << 26) + t0 &= 0x3ffffff + t1 &= 0x3ffffff + t2 &= 0x3ffffff + t3 &= 0x3ffffff + + // select h if h < p else h - p + t_mask := (t4 >> 31) - 1 + h_mask := ^t_mask + h0 = (h0 & h_mask) | (t0 & t_mask) + h1 = (h1 & h_mask) | (t1 & t_mask) + h2 = (h2 & h_mask) | (t2 & t_mask) + h3 = (h3 & h_mask) | (t3 & t_mask) + h4 = (h4 & h_mask) | (t4 & t_mask) + + // h %= 2^128 + h0 |= h1 << 26 + h1 = ((h1 >> 6) | (h2 << 20)) + h2 = ((h2 >> 12) | (h3 << 14)) + h3 = ((h3 >> 18) | (h4 << 8)) + + // s: the s part of the key + // tag = (h + s) % (2^128) + t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:])) + h0 = uint32(t) + t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32) + h1 = uint32(t) + t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32) + h2 = uint32(t) + t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32) + h3 = uint32(t) + + binary.LittleEndian.PutUint32(out[0:], h0) + binary.LittleEndian.PutUint32(out[4:], h1) + binary.LittleEndian.PutUint32(out[8:], h2) + binary.LittleEndian.PutUint32(out[12:], h3) } diff --git a/vendor/golang.org/x/crypto/ssh/agent/client_test.go b/vendor/golang.org/x/crypto/ssh/agent/client_test.go index e33d471380..a13a650017 100644 --- a/vendor/golang.org/x/crypto/ssh/agent/client_test.go +++ b/vendor/golang.org/x/crypto/ssh/agent/client_test.go @@ -180,7 +180,7 @@ func TestCert(t *testing.T) { // therefore is buffered (net.Pipe deadlocks if both sides start with // a write.) func netPipe() (net.Conn, net.Conn, error) { - listener, err := net.Listen("tcp", "127.0.0.1:0") + listener, err := net.Listen("tcp", ":0") if err != nil { return nil, nil, err } diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go index 34d3917c4f..13484ab4b3 100644 --- a/vendor/golang.org/x/crypto/ssh/cipher.go +++ b/vendor/golang.org/x/crypto/ssh/cipher.go @@ -135,6 +135,7 @@ const prefixLen = 5 type streamPacketCipher struct { mac hash.Hash cipher cipher.Stream + etm bool // The following members are to avoid per-packet allocations. prefix [prefixLen]byte @@ -150,7 +151,14 @@ func (s *streamPacketCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, err return nil, err } - s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) + var encryptedPaddingLength [1]byte + if s.mac != nil && s.etm { + copy(encryptedPaddingLength[:], s.prefix[4:5]) + s.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5]) + } else { + s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) + } + length := binary.BigEndian.Uint32(s.prefix[0:4]) paddingLength := uint32(s.prefix[4]) @@ -159,7 +167,12 @@ func (s *streamPacketCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, err s.mac.Reset() binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum) s.mac.Write(s.seqNumBytes[:]) - s.mac.Write(s.prefix[:]) + if s.etm { + s.mac.Write(s.prefix[:4]) + s.mac.Write(encryptedPaddingLength[:]) + } else { + s.mac.Write(s.prefix[:]) + } macSize = uint32(s.mac.Size()) } @@ -184,10 +197,17 @@ func (s *streamPacketCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, err } mac := s.packetData[length-1:] data := s.packetData[:length-1] + + if s.mac != nil && s.etm { + s.mac.Write(data) + } + s.cipher.XORKeyStream(data, data) if s.mac != nil { - s.mac.Write(data) + if !s.etm { + s.mac.Write(data) + } s.macResult = s.mac.Sum(s.macResult[:0]) if subtle.ConstantTimeCompare(s.macResult, mac) != 1 { return nil, errors.New("ssh: MAC failure") @@ -203,7 +223,13 @@ func (s *streamPacketCipher) writePacket(seqNum uint32, w io.Writer, rand io.Rea return errors.New("ssh: packet too large") } - paddingLength := packetSizeMultiple - (prefixLen+len(packet))%packetSizeMultiple + aadlen := 0 + if s.mac != nil && s.etm { + // packet length is not encrypted for EtM modes + aadlen = 4 + } + + paddingLength := packetSizeMultiple - (prefixLen+len(packet)-aadlen)%packetSizeMultiple if paddingLength < 4 { paddingLength += packetSizeMultiple } @@ -220,15 +246,37 @@ func (s *streamPacketCipher) writePacket(seqNum uint32, w io.Writer, rand io.Rea s.mac.Reset() binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum) s.mac.Write(s.seqNumBytes[:]) + + if s.etm { + // For EtM algorithms, the packet length must stay unencrypted, + // but the following data (padding length) must be encrypted + s.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5]) + } + s.mac.Write(s.prefix[:]) + + if !s.etm { + // For non-EtM algorithms, the algorithm is applied on unencrypted data + s.mac.Write(packet) + s.mac.Write(padding) + } + } + + if !(s.mac != nil && s.etm) { + // For EtM algorithms, the padding length has already been encrypted + // and the packet length must remain unencrypted + s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) + } + + s.cipher.XORKeyStream(packet, packet) + s.cipher.XORKeyStream(padding, padding) + + if s.mac != nil && s.etm { + // For EtM algorithms, packet and padding must be encrypted s.mac.Write(packet) s.mac.Write(padding) } - s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) - s.cipher.XORKeyStream(packet, packet) - s.cipher.XORKeyStream(padding, padding) - if _, err := w.Write(s.prefix[:]); err != nil { return err } diff --git a/vendor/golang.org/x/crypto/ssh/cipher_test.go b/vendor/golang.org/x/crypto/ssh/cipher_test.go index eced8d851c..5cfa17a62d 100644 --- a/vendor/golang.org/x/crypto/ssh/cipher_test.go +++ b/vendor/golang.org/x/crypto/ssh/cipher_test.go @@ -26,39 +26,41 @@ func TestPacketCiphers(t *testing.T) { defer delete(cipherModes, aes128cbcID) for cipher := range cipherModes { - kr := &kexResult{Hash: crypto.SHA1} - algs := directionAlgorithms{ - Cipher: cipher, - MAC: "hmac-sha1", - Compression: "none", - } - client, err := newPacketCipher(clientKeys, algs, kr) - if err != nil { - t.Errorf("newPacketCipher(client, %q): %v", cipher, err) - continue - } - server, err := newPacketCipher(clientKeys, algs, kr) - if err != nil { - t.Errorf("newPacketCipher(client, %q): %v", cipher, err) - continue - } + for mac := range macModes { + kr := &kexResult{Hash: crypto.SHA1} + algs := directionAlgorithms{ + Cipher: cipher, + MAC: mac, + Compression: "none", + } + client, err := newPacketCipher(clientKeys, algs, kr) + if err != nil { + t.Errorf("newPacketCipher(client, %q, %q): %v", cipher, mac, err) + continue + } + server, err := newPacketCipher(clientKeys, algs, kr) + if err != nil { + t.Errorf("newPacketCipher(client, %q, %q): %v", cipher, mac, err) + continue + } - want := "bla bla" - input := []byte(want) - buf := &bytes.Buffer{} - if err := client.writePacket(0, buf, rand.Reader, input); err != nil { - t.Errorf("writePacket(%q): %v", cipher, err) - continue - } + want := "bla bla" + input := []byte(want) + buf := &bytes.Buffer{} + if err := client.writePacket(0, buf, rand.Reader, input); err != nil { + t.Errorf("writePacket(%q, %q): %v", cipher, mac, err) + continue + } - packet, err := server.readPacket(0, buf) - if err != nil { - t.Errorf("readPacket(%q): %v", cipher, err) - continue - } + packet, err := server.readPacket(0, buf) + if err != nil { + t.Errorf("readPacket(%q, %q): %v", cipher, mac, err) + continue + } - if string(packet) != want { - t.Errorf("roundtrip(%q): got %q, want %q", cipher, packet, want) + if string(packet) != want { + t.Errorf("roundtrip(%q, %q): got %q, want %q", cipher, mac, packet, want) + } } } } diff --git a/vendor/golang.org/x/crypto/ssh/client_auth_test.go b/vendor/golang.org/x/crypto/ssh/client_auth_test.go index 1d9681a06c..e384c796b7 100644 --- a/vendor/golang.org/x/crypto/ssh/client_auth_test.go +++ b/vendor/golang.org/x/crypto/ssh/client_auth_test.go @@ -333,14 +333,14 @@ func TestClientLoginCert(t *testing.T) { } // allowed source address - cert.CriticalOptions = map[string]string{"source-address": "127.0.0.42/24"} + cert.CriticalOptions = map[string]string{"source-address": "127.0.0.42/24,::42/120"} cert.SignCert(rand.Reader, testSigners["ecdsa"]) if err := tryAuth(t, clientConfig); err != nil { t.Errorf("cert login with source-address failed: %v", err) } // disallowed source address - cert.CriticalOptions = map[string]string{"source-address": "127.0.0.42"} + cert.CriticalOptions = map[string]string{"source-address": "127.0.0.42,::42"} cert.SignCert(rand.Reader, testSigners["ecdsa"]) if err := tryAuth(t, clientConfig); err == nil { t.Errorf("cert login with source-address succeeded") diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go index faabb7ef96..8656d0f85d 100644 --- a/vendor/golang.org/x/crypto/ssh/common.go +++ b/vendor/golang.org/x/crypto/ssh/common.go @@ -56,7 +56,7 @@ var supportedHostKeyAlgos = []string{ // This is based on RFC 4253, section 6.4, but with hmac-md5 variants removed // because they have reached the end of their useful life. var supportedMACs = []string{ - "hmac-sha2-256", "hmac-sha1", "hmac-sha1-96", + "hmac-sha2-256-etm@openssh.com", "hmac-sha2-256", "hmac-sha1", "hmac-sha1-96", } var supportedCompressions = []string{compressionNone} diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go index 57f2d3daf6..8de650644a 100644 --- a/vendor/golang.org/x/crypto/ssh/handshake.go +++ b/vendor/golang.org/x/crypto/ssh/handshake.go @@ -66,8 +66,8 @@ type handshakeTransport struct { // If the read loop wants to schedule a kex, it pings this // channel, and the write loop will send out a kex - // message. The boolean is whether this is the first request or not. - requestKex chan bool + // message. + requestKex chan struct{} // If the other side requests or confirms a kex, its kexInit // packet is sent here for the write loop to find it. @@ -102,14 +102,14 @@ func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, serverVersion: serverVersion, clientVersion: clientVersion, incoming: make(chan []byte, chanSize), - requestKex: make(chan bool, 1), + requestKex: make(chan struct{}, 1), startKex: make(chan *pendingKex, 1), config: config, } // We always start with a mandatory key exchange. - t.requestKex <- true + t.requestKex <- struct{}{} return t } @@ -166,6 +166,7 @@ func (t *handshakeTransport) printPacket(p []byte, write bool) { if write { action = "sent" } + if p[0] == msgChannelData || p[0] == msgChannelExtendedData { log.Printf("%s %s data (packet %d bytes)", t.id(), action, len(p)) } else { @@ -230,14 +231,13 @@ func (t *handshakeTransport) recordWriteError(err error) { func (t *handshakeTransport) requestKeyExchange() { select { - case t.requestKex <- false: + case t.requestKex <- struct{}{}: default: // something already requested a kex, so do nothing. } } func (t *handshakeTransport) kexLoop() { - firstSent := false write: for t.getWriteError() == nil { @@ -251,18 +251,8 @@ write: if !ok { break write } - case requestFirst := <-t.requestKex: - // For the first key exchange, both - // sides will initiate a key exchange, - // and both channels will fire. To - // avoid doing two key exchanges in a - // row, ignore our own request for an - // initial kex if we have already sent - // it out. - if firstSent && requestFirst { - - continue - } + case <-t.requestKex: + break } if !sent { @@ -270,7 +260,6 @@ write: t.recordWriteError(err) break } - firstSent = true sent = true } } @@ -287,7 +276,8 @@ write: // We're not servicing t.startKex, but the remote end // has just sent us a kexInitMsg, so it can't send - // another key change request. + // another key change request, until we close the done + // channel on the pendingKex request. err := t.enterKeyExchange(request.otherInit) @@ -301,6 +291,23 @@ write: } else if t.algorithms != nil { t.writeBytesLeft = t.algorithms.w.rekeyBytes() } + + // we have completed the key exchange. Since the + // reader is still blocked, it is safe to clear out + // the requestKex channel. This avoids the situation + // where: 1) we consumed our own request for the + // initial kex, and 2) the kex from the remote side + // caused another send on the requestKex channel, + clear: + for { + select { + case <-t.requestKex: + // + default: + break clear + } + } + request.done <- t.writeError // kex finished. Push packets that we received while @@ -314,7 +321,7 @@ write: break } } - t.pendingPackets = t.pendingPackets[0:] + t.pendingPackets = t.pendingPackets[:0] t.mu.Unlock() } diff --git a/vendor/golang.org/x/crypto/ssh/handshake_test.go b/vendor/golang.org/x/crypto/ssh/handshake_test.go index e61348fea7..1b831127e8 100644 --- a/vendor/golang.org/x/crypto/ssh/handshake_test.go +++ b/vendor/golang.org/x/crypto/ssh/handshake_test.go @@ -40,7 +40,7 @@ func (t *testChecker) Check(dialAddr string, addr net.Addr, key PublicKey) error // therefore is buffered (net.Pipe deadlocks if both sides start with // a write.) func netPipe() (net.Conn, net.Conn, error) { - listener, err := net.Listen("tcp", "127.0.0.1:0") + listener, err := net.Listen("tcp", ":0") if err != nil { return nil, nil, err } @@ -125,7 +125,12 @@ func TestHandshakeBasic(t *testing.T) { t.Skip("see golang.org/issue/7237") } - checker := &syncChecker{make(chan int, 10)} + checker := &syncChecker{ + waitCall: make(chan int, 10), + called: make(chan int, 10), + } + + checker.waitCall <- 1 trC, trS, err := handshakePair(&ClientConfig{HostKeyCallback: checker.Check}, "addr", false) if err != nil { t.Fatalf("handshakePair: %v", err) @@ -134,22 +139,25 @@ func TestHandshakeBasic(t *testing.T) { defer trC.Close() defer trS.Close() + // Let first kex complete normally. <-checker.called clientDone := make(chan int, 0) gotHalf := make(chan int, 0) + const N = 20 go func() { defer close(clientDone) // Client writes a bunch of stuff, and does a key // change in the middle. This should not confuse the - // handshake in progress - for i := 0; i < 10; i++ { + // handshake in progress. We do this twice, so we test + // that the packet buffer is reset correctly. + for i := 0; i < N; i++ { p := []byte{msgRequestSuccess, byte(i)} if err := trC.writePacket(p); err != nil { t.Fatalf("sendPacket: %v", err) } - if i == 5 { + if (i % 10) == 5 { <-gotHalf // halfway through, we request a key change. trC.requestKeyExchange() @@ -159,32 +167,38 @@ func TestHandshakeBasic(t *testing.T) { // write more. <-checker.called } + if (i % 10) == 7 { + // write some packets until the kex + // completes, to test buffering of + // packets. + checker.waitCall <- 1 + } } }() // Server checks that client messages come in cleanly i := 0 err = nil - for ; i < 10; i++ { + for ; i < N; i++ { var p []byte p, err = trS.readPacket() if err != nil { break } - if i == 5 { + if (i % 10) == 5 { gotHalf <- 1 } want := []byte{msgRequestSuccess, byte(i)} if bytes.Compare(p, want) != 0 { - t.Errorf("message %d: got %q, want %q", i, p, want) + t.Errorf("message %d: got %v, want %v", i, p, want) } } <-clientDone if err != nil && err != io.EOF { t.Fatalf("server error: %v", err) } - if i != 10 { + if i != N { t.Errorf("received %d messages, want 10.", i) } @@ -239,7 +253,10 @@ func TestForceFirstKex(t *testing.T) { } func TestHandshakeAutoRekeyWrite(t *testing.T) { - checker := &syncChecker{make(chan int, 10)} + checker := &syncChecker{ + called: make(chan int, 10), + waitCall: nil, + } clientConf := &ClientConfig{HostKeyCallback: checker.Check} clientConf.RekeyThreshold = 500 trC, trS, err := handshakePair(clientConf, "addr", false) @@ -249,14 +266,19 @@ func TestHandshakeAutoRekeyWrite(t *testing.T) { defer trC.Close() defer trS.Close() + input := make([]byte, 251) + input[0] = msgRequestSuccess + done := make(chan int, 1) const numPacket = 5 go func() { defer close(done) j := 0 for ; j < numPacket; j++ { - if _, err := trS.readPacket(); err != nil { + if p, err := trS.readPacket(); err != nil { break + } else if !bytes.Equal(input, p) { + t.Errorf("got packet type %d, want %d", p[0], input[0]) } } @@ -268,9 +290,9 @@ func TestHandshakeAutoRekeyWrite(t *testing.T) { <-checker.called for i := 0; i < numPacket; i++ { - packet := make([]byte, 251) - packet[0] = msgRequestSuccess - if err := trC.writePacket(packet); err != nil { + p := make([]byte, len(input)) + copy(p, input) + if err := trC.writePacket(p); err != nil { t.Errorf("writePacket: %v", err) } if i == 2 { @@ -283,16 +305,23 @@ func TestHandshakeAutoRekeyWrite(t *testing.T) { } type syncChecker struct { - called chan int + waitCall chan int + called chan int } func (c *syncChecker) Check(dialAddr string, addr net.Addr, key PublicKey) error { c.called <- 1 + if c.waitCall != nil { + <-c.waitCall + } return nil } func TestHandshakeAutoRekeyRead(t *testing.T) { - sync := &syncChecker{make(chan int, 2)} + sync := &syncChecker{ + called: make(chan int, 2), + waitCall: nil, + } clientConf := &ClientConfig{ HostKeyCallback: sync.Check, } diff --git a/vendor/golang.org/x/crypto/ssh/mac.go b/vendor/golang.org/x/crypto/ssh/mac.go index 07744ad671..c07a06285e 100644 --- a/vendor/golang.org/x/crypto/ssh/mac.go +++ b/vendor/golang.org/x/crypto/ssh/mac.go @@ -15,6 +15,7 @@ import ( type macMode struct { keySize int + etm bool new func(key []byte) hash.Hash } @@ -45,13 +46,16 @@ func (t truncatingMAC) Size() int { func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() } var macModes = map[string]*macMode{ - "hmac-sha2-256": {32, func(key []byte) hash.Hash { + "hmac-sha2-256-etm@openssh.com": {32, true, func(key []byte) hash.Hash { return hmac.New(sha256.New, key) }}, - "hmac-sha1": {20, func(key []byte) hash.Hash { + "hmac-sha2-256": {32, false, func(key []byte) hash.Hash { + return hmac.New(sha256.New, key) + }}, + "hmac-sha1": {20, false, func(key []byte) hash.Hash { return hmac.New(sha1.New, key) }}, - "hmac-sha1-96": {20, func(key []byte) hash.Hash { + "hmac-sha1-96": {20, false, func(key []byte) hash.Hash { return truncatingMAC{12, hmac.New(sha1.New, key)} }}, } diff --git a/vendor/golang.org/x/crypto/ssh/mux_test.go b/vendor/golang.org/x/crypto/ssh/mux_test.go index 591aae8e8f..25d2181d62 100644 --- a/vendor/golang.org/x/crypto/ssh/mux_test.go +++ b/vendor/golang.org/x/crypto/ssh/mux_test.go @@ -499,4 +499,7 @@ func TestDebug(t *testing.T) { if debugHandshake { t.Error("handshake debug switched on") } + if debugTransport { + t.Error("transport debug switched on") + } } diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index 28b109a9c0..77c84d165c 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -10,6 +10,7 @@ import ( "fmt" "io" "net" + "strings" ) // The Permissions type holds fine-grained permissions that are @@ -231,7 +232,7 @@ func isAcceptableAlgo(algo string) bool { return false } -func checkSourceAddress(addr net.Addr, sourceAddr string) error { +func checkSourceAddress(addr net.Addr, sourceAddrs string) error { if addr == nil { return errors.New("ssh: no address known for client, but source-address match required") } @@ -241,18 +242,20 @@ func checkSourceAddress(addr net.Addr, sourceAddr string) error { return fmt.Errorf("ssh: remote address %v is not an TCP address when checking source-address match", addr) } - if allowedIP := net.ParseIP(sourceAddr); allowedIP != nil { - if allowedIP.Equal(tcpAddr.IP) { - return nil - } - } else { - _, ipNet, err := net.ParseCIDR(sourceAddr) - if err != nil { - return fmt.Errorf("ssh: error parsing source-address restriction %q: %v", sourceAddr, err) - } + for _, sourceAddr := range strings.Split(sourceAddrs, ",") { + if allowedIP := net.ParseIP(sourceAddr); allowedIP != nil { + if allowedIP.Equal(tcpAddr.IP) { + return nil + } + } else { + _, ipNet, err := net.ParseCIDR(sourceAddr) + if err != nil { + return fmt.Errorf("ssh: error parsing source-address restriction %q: %v", sourceAddr, err) + } - if ipNet.Contains(tcpAddr.IP) { - return nil + if ipNet.Contains(tcpAddr.IP) { + return nil + } } } diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go index fd199324dd..f9780e0ae7 100644 --- a/vendor/golang.org/x/crypto/ssh/transport.go +++ b/vendor/golang.org/x/crypto/ssh/transport.go @@ -8,8 +8,13 @@ import ( "bufio" "errors" "io" + "log" ) +// debugTransport if set, will print packet types as they go over the +// wire. No message decoding is done, to minimize the impact on timing. +const debugTransport = false + const ( gcmCipherID = "aes128-gcm@openssh.com" aes128cbcID = "aes128-cbc" @@ -40,7 +45,7 @@ type transport struct { bufReader *bufio.Reader bufWriter *bufio.Writer rand io.Reader - + isClient bool io.Closer } @@ -86,6 +91,22 @@ func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) err return nil } +func (t *transport) printPacket(p []byte, write bool) { + if len(p) == 0 { + return + } + who := "server" + if t.isClient { + who = "client" + } + what := "read" + if write { + what = "write" + } + + log.Println(what, who, p[0]) +} + // Read and decrypt next packet. func (t *transport) readPacket() (p []byte, err error) { for { @@ -97,6 +118,9 @@ func (t *transport) readPacket() (p []byte, err error) { break } } + if debugTransport { + t.printPacket(p, false) + } return p, err } @@ -141,6 +165,9 @@ func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { } func (t *transport) writePacket(packet []byte) error { + if debugTransport { + t.printPacket(packet, true) + } return t.writer.writePacket(t.bufWriter, t.rand, packet) } @@ -181,6 +208,8 @@ func newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transp }, Closer: rwc, } + t.isClient = isClient + if isClient { t.reader.dir = serverKeys t.writer.dir = clientKeys @@ -238,6 +267,7 @@ func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (pac c := &streamPacketCipher{ mac: macModes[algs.MAC].new(macKey), + etm: macModes[algs.MAC].etm, } c.macResult = make([]byte, c.mac.Size()) diff --git a/vendor/golang.org/x/image/draw/draw.go b/vendor/golang.org/x/image/draw/draw.go index b92e3c7f96..dfaa7fc55e 100644 --- a/vendor/golang.org/x/image/draw/draw.go +++ b/vendor/golang.org/x/image/draw/draw.go @@ -11,12 +11,12 @@ // package in the standard library. package draw -// This file just contains the API exported by the image/draw package in the -// standard library. Other files in this package provide additional features. +// This file, and the go1_*.go files, just contains the API exported by the +// image/draw package in the standard library. Other files in this package +// provide additional features. import ( "image" - "image/color" "image/draw" ) @@ -32,13 +32,6 @@ func DrawMask(dst Image, r image.Rectangle, src image.Image, sp image.Point, mas draw.DrawMask(dst, r, src, sp, mask, mp, draw.Op(op)) } -// Drawer contains the Draw method. -type Drawer interface { - // Draw aligns r.Min in dst with sp in src and then replaces the - // rectangle r in dst with the result of drawing src on dst. - Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) -} - // FloydSteinberg is a Drawer that is the Src Op with Floyd-Steinberg error // diffusion. var FloydSteinberg Drawer = floydSteinberg{} @@ -48,32 +41,3 @@ type floydSteinberg struct{} func (floydSteinberg) Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) { draw.FloydSteinberg.Draw(dst, r, src, sp) } - -// Image is an image.Image with a Set method to change a single pixel. -type Image interface { - image.Image - Set(x, y int, c color.Color) -} - -// Op is a Porter-Duff compositing operator. -type Op int - -const ( - // Over specifies ``(src in mask) over dst''. - Over Op = Op(draw.Over) - // Src specifies ``src in mask''. - Src Op = Op(draw.Src) -) - -// Draw implements the Drawer interface by calling the Draw function with -// this Op. -func (op Op) Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) { - (draw.Op(op)).Draw(dst, r, src, sp) -} - -// Quantizer produces a palette for an image. -type Quantizer interface { - // Quantize appends up to cap(p) - len(p) colors to p and returns the - // updated palette suitable for converting m to a paletted image. - Quantize(p color.Palette, m image.Image) color.Palette -} diff --git a/vendor/golang.org/x/image/draw/gen.go b/vendor/golang.org/x/image/draw/gen.go index 0fed47437f..65a7123509 100644 --- a/vendor/golang.org/x/image/draw/gen.go +++ b/vendor/golang.org/x/image/draw/gen.go @@ -804,7 +804,7 @@ func cOffset(x, y, sratio string) string { func ycbcrToRGB(lhs, tmp string) string { s := ` // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - $yy1 := int(src.Y[$i]) * 0x10100 + $yy1 := int(src.Y[$i]) * 0x10101 $cb1 := int(src.Cb[$j]) - 128 $cr1 := int(src.Cr[$j]) - 128 $r@ := ($yy1 + 91881*$cr1) >> 8 diff --git a/vendor/golang.org/x/image/draw/go1_8.go b/vendor/golang.org/x/image/draw/go1_8.go new file mode 100644 index 0000000000..ec192b7173 --- /dev/null +++ b/vendor/golang.org/x/image/draw/go1_8.go @@ -0,0 +1,49 @@ +// 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. + +// +build !go1.9,!go1.8.typealias + +package draw + +import ( + "image" + "image/color" + "image/draw" +) + +// Drawer contains the Draw method. +type Drawer interface { + // Draw aligns r.Min in dst with sp in src and then replaces the + // rectangle r in dst with the result of drawing src on dst. + Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) +} + +// Image is an image.Image with a Set method to change a single pixel. +type Image interface { + image.Image + Set(x, y int, c color.Color) +} + +// Op is a Porter-Duff compositing operator. +type Op int + +const ( + // Over specifies ``(src in mask) over dst''. + Over Op = Op(draw.Over) + // Src specifies ``src in mask''. + Src Op = Op(draw.Src) +) + +// Draw implements the Drawer interface by calling the Draw function with +// this Op. +func (op Op) Draw(dst Image, r image.Rectangle, src image.Image, sp image.Point) { + (draw.Op(op)).Draw(dst, r, src, sp) +} + +// Quantizer produces a palette for an image. +type Quantizer interface { + // Quantize appends up to cap(p) - len(p) colors to p and returns the + // updated palette suitable for converting m to a paletted image. + Quantize(p color.Palette, m image.Image) color.Palette +} diff --git a/vendor/golang.org/x/image/draw/go1_9.go b/vendor/golang.org/x/image/draw/go1_9.go new file mode 100644 index 0000000000..fc548e9470 --- /dev/null +++ b/vendor/golang.org/x/image/draw/go1_9.go @@ -0,0 +1,57 @@ +// 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.9 go1.8.typealias + +package draw + +import ( + "image/draw" +) + +// We use type aliases (new in Go 1.9) for the exported names from the standard +// library's image/draw package. This is not merely syntactic sugar for +// +// type Drawer draw.Drawer +// +// as aliasing means that the types in this package, such as draw.Image and +// draw.Op, are identical to the corresponding draw.Image and draw.Op types in +// the standard library. In comparison, prior to Go 1.9, the code in go1_8.go +// defines new types that mimic the old but are different types. +// +// The package documentation, in draw.go, explicitly gives the intent of this +// package: +// +// This package is a superset of and a drop-in replacement for the +// image/draw package in the standard library. +// +// Drop-in replacement means that I can replace all of my "image/draw" imports +// with "golang.org/x/image/draw", to access additional features in this +// package, and no further changes are required. That's mostly true, but not +// completely true unless we use type aliases. +// +// Without type aliases, users might need to import both "image/draw" and +// "golang.org/x/image/draw" in order to convert from two conceptually +// equivalent but different (from the compiler's point of view) types, such as +// from one draw.Op type to another draw.Op type, to satisfy some other +// interface or function signature. + +// Drawer contains the Draw method. +type Drawer = draw.Drawer + +// Image is an image.Image with a Set method to change a single pixel. +type Image = draw.Image + +// Op is a Porter-Duff compositing operator. +type Op = draw.Op + +const ( + // Over specifies ``(src in mask) over dst''. + Over Op = draw.Over + // Src specifies ``src in mask''. + Src Op = draw.Src +) + +// Quantizer produces a palette for an image. +type Quantizer = draw.Quantizer diff --git a/vendor/golang.org/x/image/draw/impl.go b/vendor/golang.org/x/image/draw/impl.go index d6484d7340..637887be68 100644 --- a/vendor/golang.org/x/image/draw/impl.go +++ b/vendor/golang.org/x/image/draw/impl.go @@ -343,7 +343,7 @@ func (nnInterpolator) scale_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rec pj := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pr := (pyy1 + 91881*pcr1) >> 8 @@ -386,7 +386,7 @@ func (nnInterpolator) scale_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rec pj := (sr.Min.Y+int(sy)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pr := (pyy1 + 91881*pcr1) >> 8 @@ -429,7 +429,7 @@ func (nnInterpolator) scale_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rec pj := ((sr.Min.Y+int(sy))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pr := (pyy1 + 91881*pcr1) >> 8 @@ -472,7 +472,7 @@ func (nnInterpolator) scale_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rec pj := ((sr.Min.Y+int(sy))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pr := (pyy1 + 91881*pcr1) >> 8 @@ -759,7 +759,7 @@ func (nnInterpolator) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image pj := (sy0-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pr := (pyy1 + 91881*pcr1) >> 8 @@ -803,7 +803,7 @@ func (nnInterpolator) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image pj := (sy0-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pr := (pyy1 + 91881*pcr1) >> 8 @@ -847,7 +847,7 @@ func (nnInterpolator) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image pj := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pr := (pyy1 + 91881*pcr1) >> 8 @@ -891,7 +891,7 @@ func (nnInterpolator) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image pj := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pr := (pyy1 + 91881*pcr1) >> 8 @@ -1756,7 +1756,7 @@ func (ablInterpolator) scale_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Re s00j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10100 + s00yy1 := int(src.Y[s00i]) * 0x10101 s00cb1 := int(src.Cb[s00j]) - 128 s00cr1 := int(src.Cr[s00j]) - 128 s00ru := (s00yy1 + 91881*s00cr1) >> 8 @@ -1785,7 +1785,7 @@ func (ablInterpolator) scale_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Re s10j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10100 + s10yy1 := int(src.Y[s10i]) * 0x10101 s10cb1 := int(src.Cb[s10j]) - 128 s10cr1 := int(src.Cr[s10j]) - 128 s10ru := (s10yy1 + 91881*s10cr1) >> 8 @@ -1817,7 +1817,7 @@ func (ablInterpolator) scale_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Re s01j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10100 + s01yy1 := int(src.Y[s01i]) * 0x10101 s01cb1 := int(src.Cb[s01j]) - 128 s01cr1 := int(src.Cr[s01j]) - 128 s01ru := (s01yy1 + 91881*s01cr1) >> 8 @@ -1846,7 +1846,7 @@ func (ablInterpolator) scale_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Re s11j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10100 + s11yy1 := int(src.Y[s11i]) * 0x10101 s11cb1 := int(src.Cb[s11j]) - 128 s11cr1 := int(src.Cr[s11j]) - 128 s11ru := (s11yy1 + 91881*s11cr1) >> 8 @@ -1931,7 +1931,7 @@ func (ablInterpolator) scale_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Re s00j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10100 + s00yy1 := int(src.Y[s00i]) * 0x10101 s00cb1 := int(src.Cb[s00j]) - 128 s00cr1 := int(src.Cr[s00j]) - 128 s00ru := (s00yy1 + 91881*s00cr1) >> 8 @@ -1960,7 +1960,7 @@ func (ablInterpolator) scale_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Re s10j := (sr.Min.Y+int(sy0)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10100 + s10yy1 := int(src.Y[s10i]) * 0x10101 s10cb1 := int(src.Cb[s10j]) - 128 s10cr1 := int(src.Cr[s10j]) - 128 s10ru := (s10yy1 + 91881*s10cr1) >> 8 @@ -1992,7 +1992,7 @@ func (ablInterpolator) scale_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Re s01j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10100 + s01yy1 := int(src.Y[s01i]) * 0x10101 s01cb1 := int(src.Cb[s01j]) - 128 s01cr1 := int(src.Cr[s01j]) - 128 s01ru := (s01yy1 + 91881*s01cr1) >> 8 @@ -2021,7 +2021,7 @@ func (ablInterpolator) scale_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Re s11j := (sr.Min.Y+int(sy1)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10100 + s11yy1 := int(src.Y[s11i]) * 0x10101 s11cb1 := int(src.Cb[s11j]) - 128 s11cr1 := int(src.Cr[s11j]) - 128 s11ru := (s11yy1 + 91881*s11cr1) >> 8 @@ -2106,7 +2106,7 @@ func (ablInterpolator) scale_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Re s00j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10100 + s00yy1 := int(src.Y[s00i]) * 0x10101 s00cb1 := int(src.Cb[s00j]) - 128 s00cr1 := int(src.Cr[s00j]) - 128 s00ru := (s00yy1 + 91881*s00cr1) >> 8 @@ -2135,7 +2135,7 @@ func (ablInterpolator) scale_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Re s10j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10100 + s10yy1 := int(src.Y[s10i]) * 0x10101 s10cb1 := int(src.Cb[s10j]) - 128 s10cr1 := int(src.Cr[s10j]) - 128 s10ru := (s10yy1 + 91881*s10cr1) >> 8 @@ -2167,7 +2167,7 @@ func (ablInterpolator) scale_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Re s01j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx0))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10100 + s01yy1 := int(src.Y[s01i]) * 0x10101 s01cb1 := int(src.Cb[s01j]) - 128 s01cr1 := int(src.Cr[s01j]) - 128 s01ru := (s01yy1 + 91881*s01cr1) >> 8 @@ -2196,7 +2196,7 @@ func (ablInterpolator) scale_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Re s11j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(sx1))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10100 + s11yy1 := int(src.Y[s11i]) * 0x10101 s11cb1 := int(src.Cb[s11j]) - 128 s11cr1 := int(src.Cr[s11j]) - 128 s11ru := (s11yy1 + 91881*s11cr1) >> 8 @@ -2281,7 +2281,7 @@ func (ablInterpolator) scale_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Re s00j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10100 + s00yy1 := int(src.Y[s00i]) * 0x10101 s00cb1 := int(src.Cb[s00j]) - 128 s00cr1 := int(src.Cr[s00j]) - 128 s00ru := (s00yy1 + 91881*s00cr1) >> 8 @@ -2310,7 +2310,7 @@ func (ablInterpolator) scale_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Re s10j := ((sr.Min.Y+int(sy0))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10100 + s10yy1 := int(src.Y[s10i]) * 0x10101 s10cb1 := int(src.Cb[s10j]) - 128 s10cr1 := int(src.Cr[s10j]) - 128 s10ru := (s10yy1 + 91881*s10cr1) >> 8 @@ -2342,7 +2342,7 @@ func (ablInterpolator) scale_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Re s01j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx0) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10100 + s01yy1 := int(src.Y[s01i]) * 0x10101 s01cb1 := int(src.Cb[s01j]) - 128 s01cr1 := int(src.Cr[s01j]) - 128 s01ru := (s01yy1 + 91881*s01cr1) >> 8 @@ -2371,7 +2371,7 @@ func (ablInterpolator) scale_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Re s11j := ((sr.Min.Y+int(sy1))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(sx1) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10100 + s11yy1 := int(src.Y[s11i]) * 0x10101 s11cb1 := int(src.Cb[s11j]) - 128 s11cr1 := int(src.Cr[s11j]) - 128 s11ru := (s11yy1 + 91881*s11cr1) >> 8 @@ -3345,7 +3345,7 @@ func (ablInterpolator) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr imag s00j := (sy0-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10100 + s00yy1 := int(src.Y[s00i]) * 0x10101 s00cb1 := int(src.Cb[s00j]) - 128 s00cr1 := int(src.Cr[s00j]) - 128 s00ru := (s00yy1 + 91881*s00cr1) >> 8 @@ -3374,7 +3374,7 @@ func (ablInterpolator) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr imag s10j := (sy0-src.Rect.Min.Y)*src.CStride + (sx1 - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10100 + s10yy1 := int(src.Y[s10i]) * 0x10101 s10cb1 := int(src.Cb[s10j]) - 128 s10cr1 := int(src.Cr[s10j]) - 128 s10ru := (s10yy1 + 91881*s10cr1) >> 8 @@ -3406,7 +3406,7 @@ func (ablInterpolator) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr imag s01j := (sy1-src.Rect.Min.Y)*src.CStride + (sx0 - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10100 + s01yy1 := int(src.Y[s01i]) * 0x10101 s01cb1 := int(src.Cb[s01j]) - 128 s01cr1 := int(src.Cr[s01j]) - 128 s01ru := (s01yy1 + 91881*s01cr1) >> 8 @@ -3435,7 +3435,7 @@ func (ablInterpolator) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr imag s11j := (sy1-src.Rect.Min.Y)*src.CStride + (sx1 - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10100 + s11yy1 := int(src.Y[s11i]) * 0x10101 s11cb1 := int(src.Cb[s11j]) - 128 s11cr1 := int(src.Cr[s11j]) - 128 s11ru := (s11yy1 + 91881*s11cr1) >> 8 @@ -3521,7 +3521,7 @@ func (ablInterpolator) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr imag s00j := (sy0-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10100 + s00yy1 := int(src.Y[s00i]) * 0x10101 s00cb1 := int(src.Cb[s00j]) - 128 s00cr1 := int(src.Cr[s00j]) - 128 s00ru := (s00yy1 + 91881*s00cr1) >> 8 @@ -3550,7 +3550,7 @@ func (ablInterpolator) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr imag s10j := (sy0-src.Rect.Min.Y)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10100 + s10yy1 := int(src.Y[s10i]) * 0x10101 s10cb1 := int(src.Cb[s10j]) - 128 s10cr1 := int(src.Cr[s10j]) - 128 s10ru := (s10yy1 + 91881*s10cr1) >> 8 @@ -3582,7 +3582,7 @@ func (ablInterpolator) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr imag s01j := (sy1-src.Rect.Min.Y)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10100 + s01yy1 := int(src.Y[s01i]) * 0x10101 s01cb1 := int(src.Cb[s01j]) - 128 s01cr1 := int(src.Cr[s01j]) - 128 s01ru := (s01yy1 + 91881*s01cr1) >> 8 @@ -3611,7 +3611,7 @@ func (ablInterpolator) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr imag s11j := (sy1-src.Rect.Min.Y)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10100 + s11yy1 := int(src.Y[s11i]) * 0x10101 s11cb1 := int(src.Cb[s11j]) - 128 s11cr1 := int(src.Cr[s11j]) - 128 s11ru := (s11yy1 + 91881*s11cr1) >> 8 @@ -3697,7 +3697,7 @@ func (ablInterpolator) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr imag s00j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10100 + s00yy1 := int(src.Y[s00i]) * 0x10101 s00cb1 := int(src.Cb[s00j]) - 128 s00cr1 := int(src.Cr[s00j]) - 128 s00ru := (s00yy1 + 91881*s00cr1) >> 8 @@ -3726,7 +3726,7 @@ func (ablInterpolator) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr imag s10j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10100 + s10yy1 := int(src.Y[s10i]) * 0x10101 s10cb1 := int(src.Cb[s10j]) - 128 s10cr1 := int(src.Cr[s10j]) - 128 s10ru := (s10yy1 + 91881*s10cr1) >> 8 @@ -3758,7 +3758,7 @@ func (ablInterpolator) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr imag s01j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + ((sx0)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10100 + s01yy1 := int(src.Y[s01i]) * 0x10101 s01cb1 := int(src.Cb[s01j]) - 128 s01cr1 := int(src.Cr[s01j]) - 128 s01ru := (s01yy1 + 91881*s01cr1) >> 8 @@ -3787,7 +3787,7 @@ func (ablInterpolator) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr imag s11j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + ((sx1)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10100 + s11yy1 := int(src.Y[s11i]) * 0x10101 s11cb1 := int(src.Cb[s11j]) - 128 s11cr1 := int(src.Cr[s11j]) - 128 s11ru := (s11yy1 + 91881*s11cr1) >> 8 @@ -3873,7 +3873,7 @@ func (ablInterpolator) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr imag s00j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s00yy1 := int(src.Y[s00i]) * 0x10100 + s00yy1 := int(src.Y[s00i]) * 0x10101 s00cb1 := int(src.Cb[s00j]) - 128 s00cr1 := int(src.Cr[s00j]) - 128 s00ru := (s00yy1 + 91881*s00cr1) >> 8 @@ -3902,7 +3902,7 @@ func (ablInterpolator) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr imag s10j := ((sy0)/2-src.Rect.Min.Y/2)*src.CStride + (sx1 - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s10yy1 := int(src.Y[s10i]) * 0x10100 + s10yy1 := int(src.Y[s10i]) * 0x10101 s10cb1 := int(src.Cb[s10j]) - 128 s10cr1 := int(src.Cr[s10j]) - 128 s10ru := (s10yy1 + 91881*s10cr1) >> 8 @@ -3934,7 +3934,7 @@ func (ablInterpolator) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr imag s01j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + (sx0 - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s01yy1 := int(src.Y[s01i]) * 0x10100 + s01yy1 := int(src.Y[s01i]) * 0x10101 s01cb1 := int(src.Cb[s01j]) - 128 s01cr1 := int(src.Cr[s01j]) - 128 s01ru := (s01yy1 + 91881*s01cr1) >> 8 @@ -3963,7 +3963,7 @@ func (ablInterpolator) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr imag s11j := ((sy1)/2-src.Rect.Min.Y/2)*src.CStride + (sx1 - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - s11yy1 := int(src.Y[s11i]) * 0x10100 + s11yy1 := int(src.Y[s11i]) * 0x10101 s11cb1 := int(src.Cb[s11j]) - 128 s11cr1 := int(src.Cr[s11j]) - 128 s11ru := (s11yy1 + 91881*s11cr1) >> 8 @@ -4729,7 +4729,7 @@ func (z *kernelScaler) scaleX_YCbCr444(tmp [][4]float64, src *image.YCbCr, sr im pj := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.CStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pru := (pyy1 + 91881*pcr1) >> 8 @@ -4776,7 +4776,7 @@ func (z *kernelScaler) scaleX_YCbCr422(tmp [][4]float64, src *image.YCbCr, sr im pj := (sr.Min.Y+int(y)-src.Rect.Min.Y)*src.CStride + ((sr.Min.X+int(c.coord))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pru := (pyy1 + 91881*pcr1) >> 8 @@ -4823,7 +4823,7 @@ func (z *kernelScaler) scaleX_YCbCr420(tmp [][4]float64, src *image.YCbCr, sr im pj := ((sr.Min.Y+int(y))/2-src.Rect.Min.Y/2)*src.CStride + ((sr.Min.X+int(c.coord))/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pru := (pyy1 + 91881*pcr1) >> 8 @@ -4870,7 +4870,7 @@ func (z *kernelScaler) scaleX_YCbCr440(tmp [][4]float64, src *image.YCbCr, sr im pj := ((sr.Min.Y+int(y))/2-src.Rect.Min.Y/2)*src.CStride + (sr.Min.X + int(c.coord) - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pru := (pyy1 + 91881*pcr1) >> 8 @@ -5759,7 +5759,7 @@ func (q *Kernel) transform_RGBA_YCbCr444_Src(dst *image.RGBA, dr, adr image.Rect pj := (ky-src.Rect.Min.Y)*src.CStride + (kx - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pru := (pyy1 + 91881*pcr1) >> 8 @@ -5883,7 +5883,7 @@ func (q *Kernel) transform_RGBA_YCbCr422_Src(dst *image.RGBA, dr, adr image.Rect pj := (ky-src.Rect.Min.Y)*src.CStride + ((kx)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pru := (pyy1 + 91881*pcr1) >> 8 @@ -6007,7 +6007,7 @@ func (q *Kernel) transform_RGBA_YCbCr420_Src(dst *image.RGBA, dr, adr image.Rect pj := ((ky)/2-src.Rect.Min.Y/2)*src.CStride + ((kx)/2 - src.Rect.Min.X/2) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pru := (pyy1 + 91881*pcr1) >> 8 @@ -6131,7 +6131,7 @@ func (q *Kernel) transform_RGBA_YCbCr440_Src(dst *image.RGBA, dr, adr image.Rect pj := ((ky)/2-src.Rect.Min.Y/2)*src.CStride + (kx - src.Rect.Min.X) // This is an inline version of image/color/ycbcr.go's YCbCr.RGBA method. - pyy1 := int(src.Y[pi]) * 0x10100 + pyy1 := int(src.Y[pi]) * 0x10101 pcb1 := int(src.Cb[pj]) - 128 pcr1 := int(src.Cr[pj]) - 128 pru := (pyy1 + 91881*pcr1) >> 8 diff --git a/vendor/golang.org/x/image/draw/stdlib_test.go b/vendor/golang.org/x/image/draw/stdlib_test.go index c45f78c2e4..9015bfd6ff 100644 --- a/vendor/golang.org/x/image/draw/stdlib_test.go +++ b/vendor/golang.org/x/image/draw/stdlib_test.go @@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build go1.5 +// +build go1.9 package draw // This file contains tests that depend on the exact behavior of the // image/color package in the standard library. The color conversion formula -// from YCbCr to RGBA changed between Go 1.4 and Go 1.5, so this file's tests -// are only enabled for Go 1.5 and above. +// from YCbCr to RGBA changed between Go 1.4 and Go 1.5, and between Go 1.8 and +// Go 1.9, so this file's tests are only enabled for Go 1.9 and above. import ( "bytes" diff --git a/vendor/golang.org/x/image/font/sfnt/cmap.go b/vendor/golang.org/x/image/font/sfnt/cmap.go new file mode 100644 index 0000000000..42338f1bc6 --- /dev/null +++ b/vendor/golang.org/x/image/font/sfnt/cmap.go @@ -0,0 +1,269 @@ +// Copyright 2017 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 sfnt + +import ( + "unicode/utf8" + + "golang.org/x/text/encoding/charmap" +) + +// Platform IDs and Platform Specific IDs as per +// https://www.microsoft.com/typography/otspec/name.htm +const ( + pidUnicode = 0 + pidMacintosh = 1 + pidWindows = 3 + + psidUnicode2BMPOnly = 3 + psidUnicode2FullRepertoire = 4 + // Note that FontForge may generate a bogus Platform Specific ID (value 10) + // for the Unicode Platform ID (value 0). See + // https://github.com/fontforge/fontforge/issues/2728 + + psidMacintoshRoman = 0 + + psidWindowsSymbol = 0 + psidWindowsUCS2 = 1 + psidWindowsUCS4 = 10 +) + +// platformEncodingWidth returns the number of bytes per character assumed by +// the given Platform ID and Platform Specific ID. +// +// Very old fonts, from before Unicode was widely adopted, assume only 1 byte +// per character: a character map. +// +// Old fonts, from when Unicode meant the Basic Multilingual Plane (BMP), +// assume that 2 bytes per character is sufficient. +// +// Recent fonts naturally support the full range of Unicode code points, which +// can take up to 4 bytes per character. Such fonts might still choose one of +// the legacy encodings if e.g. their repertoire is limited to the BMP, for +// greater compatibility with older software, or because the resultant file +// size can be smaller. +func platformEncodingWidth(pid, psid uint16) int { + switch pid { + case pidUnicode: + switch psid { + case psidUnicode2BMPOnly: + return 2 + case psidUnicode2FullRepertoire: + return 4 + } + + case pidMacintosh: + switch psid { + case psidMacintoshRoman: + return 1 + } + + case pidWindows: + switch psid { + case psidWindowsSymbol: + return 2 + case psidWindowsUCS2: + return 2 + case psidWindowsUCS4: + return 4 + } + } + return 0 +} + +// The various cmap formats are described at +// https://www.microsoft.com/typography/otspec/cmap.htm + +var supportedCmapFormat = func(format, pid, psid uint16) bool { + switch format { + case 0: + return pid == pidMacintosh && psid == psidMacintoshRoman + case 4: + return true + case 12: + return true + } + return false +} + +func (f *Font) makeCachedGlyphIndex(buf []byte, offset, length uint32, format uint16) ([]byte, glyphIndexFunc, error) { + switch format { + case 0: + return f.makeCachedGlyphIndexFormat0(buf, offset, length) + case 4: + return f.makeCachedGlyphIndexFormat4(buf, offset, length) + case 12: + return f.makeCachedGlyphIndexFormat12(buf, offset, length) + } + panic("unreachable") +} + +func (f *Font) makeCachedGlyphIndexFormat0(buf []byte, offset, length uint32) ([]byte, glyphIndexFunc, error) { + if length != 6+256 || offset+length > f.cmap.length { + return nil, nil, errInvalidCmapTable + } + var err error + buf, err = f.src.view(buf, int(f.cmap.offset+offset), int(length)) + if err != nil { + return nil, nil, err + } + var table [256]byte + copy(table[:], buf[6:]) + return buf, func(f *Font, b *Buffer, r rune) (GlyphIndex, error) { + // TODO: for this closure to be goroutine-safe, the + // golang.org/x/text/encoding/charmap API needs to allocate a new + // Encoder and new []byte buffers, for every call to this closure, even + // though all we want to do is to encode one rune as one byte. We could + // possibly add some fields in the Buffer struct to re-use these + // allocations, but a better solution is to improve the charmap API. + var dst, src [utf8.UTFMax]byte + n := utf8.EncodeRune(src[:], r) + _, _, err = charmap.Macintosh.NewEncoder().Transform(dst[:], src[:n], true) + if err != nil { + // The source rune r is not representable in the Macintosh-Roman encoding. + return 0, nil + } + return GlyphIndex(table[dst[0]]), nil + }, nil +} + +func (f *Font) makeCachedGlyphIndexFormat4(buf []byte, offset, length uint32) ([]byte, glyphIndexFunc, error) { + const headerSize = 14 + if offset+headerSize > f.cmap.length { + return nil, nil, errInvalidCmapTable + } + var err error + buf, err = f.src.view(buf, int(f.cmap.offset+offset), headerSize) + if err != nil { + return nil, nil, err + } + offset += headerSize + + segCount := u16(buf[6:]) + if segCount&1 != 0 { + return nil, nil, errInvalidCmapTable + } + segCount /= 2 + if segCount > maxCmapSegments { + return nil, nil, errUnsupportedNumberOfCmapSegments + } + + eLength := 8*uint32(segCount) + 2 + if offset+eLength > f.cmap.length { + return nil, nil, errInvalidCmapTable + } + buf, err = f.src.view(buf, int(f.cmap.offset+offset), int(eLength)) + if err != nil { + return nil, nil, err + } + offset += eLength + + entries := make([]cmapEntry16, segCount) + for i := range entries { + entries[i] = cmapEntry16{ + end: u16(buf[0*len(entries)+0+2*i:]), + start: u16(buf[2*len(entries)+2+2*i:]), + delta: u16(buf[4*len(entries)+2+2*i:]), + offset: u16(buf[6*len(entries)+2+2*i:]), + } + } + indexesBase := f.cmap.offset + offset + indexesLength := f.cmap.length - offset + + return buf, func(f *Font, b *Buffer, r rune) (GlyphIndex, error) { + if uint32(r) > 0xffff { + return 0, nil + } + + c := uint16(r) + for i, j := 0, len(entries); i < j; { + h := i + (j-i)/2 + entry := &entries[h] + if c < entry.start { + j = h + } else if entry.end < c { + i = h + 1 + } else if entry.offset == 0 { + return GlyphIndex(c + entry.delta), nil + } else { + offset := uint32(entry.offset) + 2*uint32(h-len(entries)+int(c-entry.start)) + if offset > indexesLength || offset+2 > indexesLength { + return 0, errInvalidCmapTable + } + x, err := b.view(&f.src, int(indexesBase+offset), 2) + if err != nil { + return 0, err + } + return GlyphIndex(u16(x)), nil + } + } + return 0, nil + }, nil +} + +func (f *Font) makeCachedGlyphIndexFormat12(buf []byte, offset, _ uint32) ([]byte, glyphIndexFunc, error) { + const headerSize = 16 + if offset+headerSize > f.cmap.length { + return nil, nil, errInvalidCmapTable + } + var err error + buf, err = f.src.view(buf, int(f.cmap.offset+offset), headerSize) + if err != nil { + return nil, nil, err + } + length := u32(buf[4:]) + if f.cmap.length < offset || length > f.cmap.length-offset { + return nil, nil, errInvalidCmapTable + } + offset += headerSize + + numGroups := u32(buf[12:]) + if numGroups > maxCmapSegments { + return nil, nil, errUnsupportedNumberOfCmapSegments + } + + eLength := 12 * numGroups + if headerSize+eLength != length { + return nil, nil, errInvalidCmapTable + } + buf, err = f.src.view(buf, int(f.cmap.offset+offset), int(eLength)) + if err != nil { + return nil, nil, err + } + offset += eLength + + entries := make([]cmapEntry32, numGroups) + for i := range entries { + entries[i] = cmapEntry32{ + start: u32(buf[0+12*i:]), + end: u32(buf[4+12*i:]), + delta: u32(buf[8+12*i:]), + } + } + + return buf, func(f *Font, b *Buffer, r rune) (GlyphIndex, error) { + c := uint32(r) + for i, j := 0, len(entries); i < j; { + h := i + (j-i)/2 + entry := &entries[h] + if c < entry.start { + j = h + } else if entry.end < c { + i = h + 1 + } else { + return GlyphIndex(c - entry.start + entry.delta), nil + } + } + return 0, nil + }, nil +} + +type cmapEntry16 struct { + end, start, delta, offset uint16 +} + +type cmapEntry32 struct { + start, end, delta uint32 +} diff --git a/vendor/golang.org/x/image/font/sfnt/data.go b/vendor/golang.org/x/image/font/sfnt/data.go new file mode 100644 index 0000000000..ad0c139aa8 --- /dev/null +++ b/vendor/golang.org/x/image/font/sfnt/data.go @@ -0,0 +1,68 @@ +// generated by go run gen.go; DO NOT EDIT + +package sfnt + +const numBuiltInPostNames = 258 + +const builtInPostNamesData = "" + + ".notdef.nullnonmarkingreturnspaceexclamquotedblnumbersigndollarp" + + "ercentampersandquotesingleparenleftparenrightasteriskpluscommahy" + + "phenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemi" + + "colonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracket" + + "leftbackslashbracketrightasciicircumunderscoregraveabcdefghijklm" + + "nopqrstuvwxyzbraceleftbarbracerightasciitildeAdieresisAringCcedi" + + "llaEacuteNtildeOdieresisUdieresisaacuteagraveacircumflexadieresi" + + "satildearingccedillaeacuteegraveecircumflexedieresisiacuteigrave" + + "icircumflexidieresisntildeoacuteograveocircumflexodieresisotilde" + + "uacuteugraveucircumflexudieresisdaggerdegreecentsterlingsectionb" + + "ulletparagraphgermandblsregisteredcopyrighttrademarkacutedieresi" + + "snotequalAEOslashinfinityplusminuslessequalgreaterequalyenmupart" + + "ialdiffsummationproductpiintegralordfeminineordmasculineOmegaaeo" + + "slashquestiondownexclamdownlogicalnotradicalflorinapproxequalDel" + + "taguillemotleftguillemotrightellipsisnonbreakingspaceAgraveAtild" + + "eOtildeOEoeendashemdashquotedblleftquotedblrightquoteleftquoteri" + + "ghtdividelozengeydieresisYdieresisfractioncurrencyguilsinglleftg" + + "uilsinglrightfifldaggerdblperiodcenteredquotesinglbasequotedblba" + + "seperthousandAcircumflexEcircumflexAacuteEdieresisEgraveIacuteIc" + + "ircumflexIdieresisIgraveOacuteOcircumflexappleOgraveUacuteUcircu" + + "mflexUgravedotlessicircumflextildemacronbrevedotaccentringcedill" + + "ahungarumlautogonekcaronLslashlslashScaronscaronZcaronzcaronbrok" + + "enbarEthethYacuteyacuteThornthornminusmultiplyonesuperiortwosupe" + + "riorthreesuperioronehalfonequarterthreequartersfrancGbrevegbreve" + + "IdotaccentScedillascedillaCacutecacuteCcaronccarondcroat" + +var builtInPostNamesOffsets = [...]uint16{ + 0x0000, 0x0007, 0x000c, 0x001c, 0x0021, 0x0027, 0x002f, 0x0039, + 0x003f, 0x0046, 0x004f, 0x005a, 0x0063, 0x006d, 0x0075, 0x0079, + 0x007e, 0x0084, 0x008a, 0x008f, 0x0093, 0x0096, 0x0099, 0x009e, + 0x00a2, 0x00a6, 0x00a9, 0x00ae, 0x00b3, 0x00b7, 0x00bc, 0x00c5, + 0x00c9, 0x00ce, 0x00d5, 0x00dd, 0x00df, 0x00e0, 0x00e1, 0x00e2, + 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, + 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, + 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x0104, + 0x010d, 0x0119, 0x0124, 0x012e, 0x0133, 0x0134, 0x0135, 0x0136, + 0x0137, 0x0138, 0x0139, 0x013a, 0x013b, 0x013c, 0x013d, 0x013e, + 0x013f, 0x0140, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, + 0x0147, 0x0148, 0x0149, 0x014a, 0x014b, 0x014c, 0x014d, 0x0156, + 0x0159, 0x0163, 0x016d, 0x0176, 0x017b, 0x0183, 0x0189, 0x018f, + 0x0198, 0x01a1, 0x01a7, 0x01ad, 0x01b8, 0x01c1, 0x01c7, 0x01cc, + 0x01d4, 0x01da, 0x01e0, 0x01eb, 0x01f4, 0x01fa, 0x0200, 0x020b, + 0x0214, 0x021a, 0x0220, 0x0226, 0x0231, 0x023a, 0x0240, 0x0246, + 0x024c, 0x0257, 0x0260, 0x0266, 0x026c, 0x0270, 0x0278, 0x027f, + 0x0285, 0x028e, 0x0298, 0x02a2, 0x02ab, 0x02b4, 0x02b9, 0x02c1, + 0x02c9, 0x02cb, 0x02d1, 0x02d9, 0x02e2, 0x02eb, 0x02f7, 0x02fa, + 0x02fc, 0x0307, 0x0310, 0x0317, 0x0319, 0x0321, 0x032c, 0x0338, + 0x033d, 0x033f, 0x0345, 0x0351, 0x035b, 0x0365, 0x036c, 0x0372, + 0x037d, 0x0382, 0x038f, 0x039d, 0x03a5, 0x03b5, 0x03bb, 0x03c1, + 0x03c7, 0x03c9, 0x03cb, 0x03d1, 0x03d7, 0x03e3, 0x03f0, 0x03f9, + 0x0403, 0x0409, 0x0410, 0x0419, 0x0422, 0x042a, 0x0432, 0x043f, + 0x044d, 0x044f, 0x0451, 0x045a, 0x0468, 0x0476, 0x0482, 0x048d, + 0x0498, 0x04a3, 0x04a9, 0x04b2, 0x04b8, 0x04be, 0x04c9, 0x04d2, + 0x04d8, 0x04de, 0x04e9, 0x04ee, 0x04f4, 0x04fa, 0x0505, 0x050b, + 0x0513, 0x051d, 0x0522, 0x0528, 0x052d, 0x0536, 0x053a, 0x0541, + 0x054d, 0x0553, 0x0558, 0x055e, 0x0564, 0x056a, 0x0570, 0x0576, + 0x057c, 0x0585, 0x0588, 0x058b, 0x0591, 0x0597, 0x059c, 0x05a1, + 0x05a6, 0x05ae, 0x05b9, 0x05c4, 0x05d1, 0x05d8, 0x05e2, 0x05ef, + 0x05f4, 0x05fa, 0x0600, 0x060a, 0x0612, 0x061a, 0x0620, 0x0626, + 0x062c, 0x0632, 0x0638, +} diff --git a/vendor/golang.org/x/image/font/sfnt/example_test.go b/vendor/golang.org/x/image/font/sfnt/example_test.go new file mode 100644 index 0000000000..17431560fc --- /dev/null +++ b/vendor/golang.org/x/image/font/sfnt/example_test.go @@ -0,0 +1,128 @@ +// Copyright 2017 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 sfnt_test + +import ( + "image" + "image/draw" + "log" + "os" + + "golang.org/x/image/font/gofont/goregular" + "golang.org/x/image/font/sfnt" + "golang.org/x/image/math/fixed" + "golang.org/x/image/vector" +) + +func ExampleRasterizeGlyph() { + const ( + ppem = 32 + width = 24 + height = 32 + originX = 0 + originY = 28 + ) + + f, err := sfnt.Parse(goregular.TTF) + if err != nil { + log.Fatalf("Parse: %v", err) + } + var b sfnt.Buffer + x, err := f.GlyphIndex(&b, 'G') + if err != nil { + log.Fatalf("GlyphIndex: %v", err) + } + if x == 0 { + log.Fatalf("GlyphIndex: no glyph index found for the rune 'G'") + } + segments, err := f.LoadGlyph(&b, x, fixed.I(ppem), nil) + if err != nil { + log.Fatalf("LoadGlyph: %v", err) + } + + r := vector.NewRasterizer(width, height) + r.DrawOp = draw.Src + for _, seg := range segments { + // The divisions by 64 below is because the seg.Args values have type + // fixed.Int26_6, a 26.6 fixed point number, and 1<<6 == 64. + switch seg.Op { + case sfnt.SegmentOpMoveTo: + r.MoveTo( + originX+float32(seg.Args[0])/64, + originY-float32(seg.Args[1])/64, + ) + case sfnt.SegmentOpLineTo: + r.LineTo( + originX+float32(seg.Args[0])/64, + originY-float32(seg.Args[1])/64, + ) + case sfnt.SegmentOpQuadTo: + r.QuadTo( + originX+float32(seg.Args[0])/64, + originY-float32(seg.Args[1])/64, + originX+float32(seg.Args[2])/64, + originY-float32(seg.Args[3])/64, + ) + case sfnt.SegmentOpCubeTo: + r.CubeTo( + originX+float32(seg.Args[0])/64, + originY-float32(seg.Args[1])/64, + originX+float32(seg.Args[2])/64, + originY-float32(seg.Args[3])/64, + originX+float32(seg.Args[4])/64, + originY-float32(seg.Args[5])/64, + ) + } + } + // TODO: call ClosePath? Once overall or once per contour (i.e. MoveTo)? + + dst := image.NewAlpha(image.Rect(0, 0, width, height)) + r.Draw(dst, dst.Bounds(), image.Opaque, image.Point{}) + + const asciiArt = ".++8" + buf := make([]byte, 0, height*(width+1)) + for y := 0; y < height; y++ { + for x := 0; x < width; x++ { + a := dst.AlphaAt(x, y).A + buf = append(buf, asciiArt[a>>6]) + } + buf = append(buf, '\n') + } + os.Stdout.Write(buf) + + // Output: + // ........................ + // ........................ + // ........................ + // ........................ + // ..........+++++++++..... + // .......+8888888888888+.. + // ......8888888888888888.. + // ....+8888+........++88.. + // ....8888................ + // ...8888................. + // ..+888+................. + // ..+888.................. + // ..888+.................. + // .+888+.................. + // .+888................... + // .+888................... + // .+888................... + // .+888..........+++++++.. + // .+888..........8888888.. + // .+888+.........+++8888.. + // ..888+............+888.. + // ..8888............+888.. + // ..+888+...........+888.. + // ...8888+..........+888.. + // ...+8888+.........+888.. + // ....+88888+.......+888.. + // .....+8888888888888888.. + // .......+888888888888++.. + // ..........++++++++...... + // ........................ + // ........................ + // ........................ +} diff --git a/vendor/golang.org/x/image/font/sfnt/gen.go b/vendor/golang.org/x/image/font/sfnt/gen.go new file mode 100644 index 0000000000..12587d4460 --- /dev/null +++ b/vendor/golang.org/x/image/font/sfnt/gen.go @@ -0,0 +1,321 @@ +// Copyright 2017 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 + +package main + +import ( + "bytes" + "fmt" + "go/format" + "io/ioutil" + "log" +) + +func main() { + data, offsets := []byte(nil), []int{0} + for _, name := range names { + data = append(data, name...) + offsets = append(offsets, len(data)) + } + + b := new(bytes.Buffer) + fmt.Fprintf(b, "// generated by go run gen.go; DO NOT EDIT\n\n") + fmt.Fprintf(b, "package sfnt\n\n") + + fmt.Fprintf(b, "const numBuiltInPostNames = %d\n\n", len(names)) + + fmt.Fprintf(b, "const builtInPostNamesData = \"\" +\n") + for s := data; ; { + if len(s) <= 64 { + fmt.Fprintf(b, "%q\n", s) + break + } + fmt.Fprintf(b, "%q +\n", s[:64]) + s = s[64:] + } + fmt.Fprintf(b, "\n") + + fmt.Fprintf(b, "var builtInPostNamesOffsets = [...]uint16{\n") + for i, o := range offsets { + fmt.Fprintf(b, "%#04x,", o) + if i%8 == 7 { + fmt.Fprintf(b, "\n") + } + } + fmt.Fprintf(b, "\n}\n") + + dstUnformatted := b.Bytes() + dst, err := format.Source(dstUnformatted) + if err != nil { + log.Fatalf("format.Source: %v\n\n----\n%s\n----", err, dstUnformatted) + } + if err := ioutil.WriteFile("data.go", dst, 0666); err != nil { + log.Fatalf("ioutil.WriteFile: %v", err) + } +} + +// names is the built-in post table names listed at +// https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6post.html +var names = [258]string{ + ".notdef", + ".null", + "nonmarkingreturn", + "space", + "exclam", + "quotedbl", + "numbersign", + "dollar", + "percent", + "ampersand", + "quotesingle", + "parenleft", + "parenright", + "asterisk", + "plus", + "comma", + "hyphen", + "period", + "slash", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "colon", + "semicolon", + "less", + "equal", + "greater", + "question", + "at", + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "bracketleft", + "backslash", + "bracketright", + "asciicircum", + "underscore", + "grave", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "braceleft", + "bar", + "braceright", + "asciitilde", + "Adieresis", + "Aring", + "Ccedilla", + "Eacute", + "Ntilde", + "Odieresis", + "Udieresis", + "aacute", + "agrave", + "acircumflex", + "adieresis", + "atilde", + "aring", + "ccedilla", + "eacute", + "egrave", + "ecircumflex", + "edieresis", + "iacute", + "igrave", + "icircumflex", + "idieresis", + "ntilde", + "oacute", + "ograve", + "ocircumflex", + "odieresis", + "otilde", + "uacute", + "ugrave", + "ucircumflex", + "udieresis", + "dagger", + "degree", + "cent", + "sterling", + "section", + "bullet", + "paragraph", + "germandbls", + "registered", + "copyright", + "trademark", + "acute", + "dieresis", + "notequal", + "AE", + "Oslash", + "infinity", + "plusminus", + "lessequal", + "greaterequal", + "yen", + "mu", + "partialdiff", + "summation", + "product", + "pi", + "integral", + "ordfeminine", + "ordmasculine", + "Omega", + "ae", + "oslash", + "questiondown", + "exclamdown", + "logicalnot", + "radical", + "florin", + "approxequal", + "Delta", + "guillemotleft", + "guillemotright", + "ellipsis", + "nonbreakingspace", + "Agrave", + "Atilde", + "Otilde", + "OE", + "oe", + "endash", + "emdash", + "quotedblleft", + "quotedblright", + "quoteleft", + "quoteright", + "divide", + "lozenge", + "ydieresis", + "Ydieresis", + "fraction", + "currency", + "guilsinglleft", + "guilsinglright", + "fi", + "fl", + "daggerdbl", + "periodcentered", + "quotesinglbase", + "quotedblbase", + "perthousand", + "Acircumflex", + "Ecircumflex", + "Aacute", + "Edieresis", + "Egrave", + "Iacute", + "Icircumflex", + "Idieresis", + "Igrave", + "Oacute", + "Ocircumflex", + "apple", + "Ograve", + "Uacute", + "Ucircumflex", + "Ugrave", + "dotlessi", + "circumflex", + "tilde", + "macron", + "breve", + "dotaccent", + "ring", + "cedilla", + "hungarumlaut", + "ogonek", + "caron", + "Lslash", + "lslash", + "Scaron", + "scaron", + "Zcaron", + "zcaron", + "brokenbar", + "Eth", + "eth", + "Yacute", + "yacute", + "Thorn", + "thorn", + "minus", + "multiply", + "onesuperior", + "twosuperior", + "threesuperior", + "onehalf", + "onequarter", + "threequarters", + "franc", + "Gbreve", + "gbreve", + "Idotaccent", + "Scedilla", + "scedilla", + "Cacute", + "cacute", + "Ccaron", + "ccaron", + "dcroat", +} diff --git a/vendor/golang.org/x/image/font/sfnt/postscript.go b/vendor/golang.org/x/image/font/sfnt/postscript.go index d5d6d9aed9..ca1b8318ce 100644 --- a/vendor/golang.org/x/image/font/sfnt/postscript.go +++ b/vendor/golang.org/x/image/font/sfnt/postscript.go @@ -566,8 +566,8 @@ var psOperators = [...][2][]psOperator{ 23: {-1, "vstemhm", t2CStem}, 24: {}, // rcurveline. 25: {}, // rlinecurve. - 26: {}, // vvcurveto. - 27: {}, // hhcurveto. + 26: {-1, "vvcurveto", t2CVvcurveto}, + 27: {-1, "hhcurveto", t2CHhcurveto}, 28: {}, // shortint. 29: {}, // callgsubr. 30: {-1, "vhcurveto", t2CVhcurveto}, @@ -653,8 +653,8 @@ func t2CAppendMoveto(p *psInterpreter) { p.type2Charstrings.segments = append(p.type2Charstrings.segments, Segment{ Op: SegmentOpMoveTo, Args: [6]fixed.Int26_6{ - 0: fixed.Int26_6(p.type2Charstrings.x) << 6, - 1: fixed.Int26_6(p.type2Charstrings.y) << 6, + 0: fixed.Int26_6(p.type2Charstrings.x), + 1: fixed.Int26_6(p.type2Charstrings.y), }, }) } @@ -663,8 +663,8 @@ func t2CAppendLineto(p *psInterpreter) { p.type2Charstrings.segments = append(p.type2Charstrings.segments, Segment{ Op: SegmentOpLineTo, Args: [6]fixed.Int26_6{ - 0: fixed.Int26_6(p.type2Charstrings.x) << 6, - 1: fixed.Int26_6(p.type2Charstrings.y) << 6, + 0: fixed.Int26_6(p.type2Charstrings.x), + 1: fixed.Int26_6(p.type2Charstrings.y), }, }) } @@ -685,12 +685,12 @@ func t2CAppendCubeto(p *psInterpreter, dxa, dya, dxb, dyb, dxc, dyc int32) { p.type2Charstrings.segments = append(p.type2Charstrings.segments, Segment{ Op: SegmentOpCubeTo, Args: [6]fixed.Int26_6{ - 0: fixed.Int26_6(xa) << 6, - 1: fixed.Int26_6(ya) << 6, - 2: fixed.Int26_6(xb) << 6, - 3: fixed.Int26_6(yb) << 6, - 4: fixed.Int26_6(xc) << 6, - 5: fixed.Int26_6(yc) << 6, + 0: fixed.Int26_6(xa), + 1: fixed.Int26_6(ya), + 2: fixed.Int26_6(xb), + 3: fixed.Int26_6(yb), + 4: fixed.Int26_6(xc), + 5: fixed.Int26_6(yc), }, }) } @@ -770,6 +770,12 @@ func t2CRlineto(p *psInterpreter) error { // As per 5177.Type2.pdf section 4.1 "Path Construction Operators", // +// hhcurveto is: +// - dy1 {dxa dxb dyb dxc}+ +// +// vvcurveto is: +// - dx1 {dya dxb dyb dyc}+ +// // hvcurveto is one of: // - dx1 dx2 dy2 dy3 {dya dxb dyb dxc dxd dxe dye dyf}* dxf? // - {dxa dxb dyb dyc dyd dxe dye dxf}+ dyf? @@ -778,59 +784,84 @@ func t2CRlineto(p *psInterpreter) error { // - dy1 dx2 dy2 dx3 {dxa dxb dyb dyc dyd dxe dye dxf}* dyf? // - {dya dxb dyb dxc dxd dxe dye dyf}+ dxf? -func t2CHvcurveto(p *psInterpreter) error { return t2CCurveto(p, false) } -func t2CVhcurveto(p *psInterpreter) error { return t2CCurveto(p, true) } +func t2CHhcurveto(p *psInterpreter) error { return t2CCurveto(p, false, false) } +func t2CVvcurveto(p *psInterpreter) error { return t2CCurveto(p, false, true) } +func t2CHvcurveto(p *psInterpreter) error { return t2CCurveto(p, true, false) } +func t2CVhcurveto(p *psInterpreter) error { return t2CCurveto(p, true, true) } -func t2CCurveto(p *psInterpreter, vertical bool) error { +// t2CCurveto implements the hh / vv / hv / vh xxcurveto operators. N relative +// cubic curve requires 6*N control points, but only 4*N+0 or 4*N+1 are used +// here: all (or all but one) of the piecewise cubic curve's tangents are +// implicitly horizontal or vertical. +// +// swap is whether that implicit horizontal / vertical constraint swaps as you +// move along the piecewise cubic curve. If swap is false, the constraints are +// either all horizontal or all vertical. If swap is true, it alternates. +// +// vertical is whether the first implicit constraint is vertical. +func t2CCurveto(p *psInterpreter, swap, vertical bool) error { if !p.type2Charstrings.seenWidth || p.stack.top < 4 { return errInvalidCFFTable } - for i := int32(0); i != p.stack.top; vertical = !vertical { - if vertical { - i = t2CVcurveto(p, i) - } else { - i = t2CHcurveto(p, i) + + i := int32(0) + switch p.stack.top & 3 { + case 0: + // No-op. + case 1: + if swap { + break } + i = 1 + if vertical { + p.type2Charstrings.x += p.stack.a[0] + } else { + p.type2Charstrings.y += p.stack.a[0] + } + default: + return errInvalidCFFTable + } + + for i != p.stack.top { + i = t2CCurveto4(p, swap, vertical, i) if i < 0 { return errInvalidCFFTable } + if swap { + vertical = !vertical + } } return nil } -func t2CHcurveto(p *psInterpreter, i int32) (j int32) { +func t2CCurveto4(p *psInterpreter, swap bool, vertical bool, i int32) (j int32) { if i+4 > p.stack.top { return -1 } dxa := p.stack.a[i+0] - dxb := p.stack.a[i+1] - dyb := p.stack.a[i+2] - dyc := p.stack.a[i+3] - dxc := int32(0) - i += 4 - if i+1 == p.stack.top { - dxc = p.stack.a[i] - i++ - } - t2CAppendCubeto(p, dxa, 0, dxb, dyb, dxc, dyc) - return i -} - -func t2CVcurveto(p *psInterpreter, i int32) (j int32) { - if i+4 > p.stack.top { - return -1 - } - dya := p.stack.a[i+0] + dya := int32(0) dxb := p.stack.a[i+1] dyb := p.stack.a[i+2] dxc := p.stack.a[i+3] dyc := int32(0) i += 4 - if i+1 == p.stack.top { - dyc = p.stack.a[i] - i++ + + if vertical { + dxa, dya = dya, dxa } - t2CAppendCubeto(p, 0, dya, dxb, dyb, dxc, dyc) + + if swap { + if i+1 == p.stack.top { + dyc = p.stack.a[i] + i++ + } + } + + if swap != vertical { + dxc, dyc = dyc, dxc + } + + t2CAppendCubeto(p, dxa, dya, dxb, dyb, dxc, dyc) return i } diff --git a/vendor/golang.org/x/image/font/sfnt/proprietary_test.go b/vendor/golang.org/x/image/font/sfnt/proprietary_test.go new file mode 100644 index 0000000000..b105ee5933 --- /dev/null +++ b/vendor/golang.org/x/image/font/sfnt/proprietary_test.go @@ -0,0 +1,479 @@ +// Copyright 2017 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 sfnt + +/* +This file contains opt-in tests for popular, high quality, proprietary fonts, +made by companies such as Adobe and Microsoft. These fonts are generally +available, but copies are not explicitly included in this repository due to +licensing differences or file size concerns. To opt-in, run: + +go test golang.org/x/image/font/sfnt -args -proprietary + +Not all tests pass out-of-the-box on all systems. For example, the Microsoft +Times New Roman font is downloadable gratis even on non-Windows systems, but as +per the ttf-mscorefonts-installer Debian package, this requires accepting an +End User License Agreement (EULA) and a CAB format decoder. These tests assume +that such fonts have already been installed. You may need to specify the +directories for these fonts: + +go test golang.org/x/image/font/sfnt -args -proprietary -adobeDir=/foo/bar/aFonts -microsoftDir=/foo/bar/mFonts + +To only run those tests for the Microsoft fonts: + +go test golang.org/x/image/font/sfnt -test.run=ProprietaryMicrosoft -args -proprietary +*/ + +// TODO: add Apple system fonts? Google fonts (Droid? Noto?)? Emoji fonts? + +// TODO: enable Apple/Microsoft tests by default on Darwin/Windows? + +import ( + "errors" + "flag" + "io/ioutil" + "path/filepath" + "testing" + + "golang.org/x/image/font" + "golang.org/x/image/math/fixed" +) + +var ( + proprietary = flag.Bool("proprietary", false, "test proprietary fonts not included in this repository") + + adobeDir = flag.String( + "adobeDir", + // This needs to be set explicitly. There is no default dir on Debian: + // https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=736680 + // + // Get the fonts from https://github.com/adobe-fonts, e.g.: + // - https://github.com/adobe-fonts/source-code-pro/releases/latest + // - https://github.com/adobe-fonts/source-han-sans/releases/latest + // - https://github.com/adobe-fonts/source-sans-pro/releases/latest + // + // Copy all of the TTF and OTF files to the one directory, such as + // $HOME/adobe-fonts, and pass that as the -adobeDir flag here. + "", + "directory name for the Adobe proprietary fonts", + ) + + microsoftDir = flag.String( + "microsoftDir", + "/usr/share/fonts/truetype/msttcorefonts", + "directory name for the Microsoft proprietary fonts", + ) +) + +func TestProprietaryAdobeSourceCodeProOTF(t *testing.T) { + testProprietary(t, "adobe", "SourceCodePro-Regular.otf", 1500, 2) +} + +func TestProprietaryAdobeSourceCodeProTTF(t *testing.T) { + testProprietary(t, "adobe", "SourceCodePro-Regular.ttf", 1500, 36) +} + +func TestProprietaryAdobeSourceHanSansSC(t *testing.T) { + testProprietary(t, "adobe", "SourceHanSansSC-Regular.otf", 65535, 2) +} + +func TestProprietaryAdobeSourceSansProOTF(t *testing.T) { + testProprietary(t, "adobe", "SourceSansPro-Regular.otf", 1800, 2) +} + +func TestProprietaryAdobeSourceSansProTTF(t *testing.T) { + testProprietary(t, "adobe", "SourceSansPro-Regular.ttf", 1800, 54) +} + +func TestProprietaryMicrosoftArial(t *testing.T) { + testProprietary(t, "microsoft", "Arial.ttf", 1200, 98) +} + +func TestProprietaryMicrosoftComicSansMS(t *testing.T) { + testProprietary(t, "microsoft", "Comic_Sans_MS.ttf", 550, 98) +} + +func TestProprietaryMicrosoftTimesNewRoman(t *testing.T) { + testProprietary(t, "microsoft", "Times_New_Roman.ttf", 1200, 98) +} + +func TestProprietaryMicrosoftWebdings(t *testing.T) { + testProprietary(t, "microsoft", "Webdings.ttf", 200, -1) +} + +// testProprietary tests that we can load every glyph in the named font. +// +// The exact number of glyphs in the font can differ across its various +// versions, but as a sanity check, there should be at least minNumGlyphs. +// +// While this package is a work-in-progress, not every glyph can be loaded. The +// firstUnsupportedGlyph argument, if non-negative, is the index of the first +// unsupported glyph in the font. This number should increase over time (or set +// negative), as the TODO's in this package are done. +func testProprietary(t *testing.T, proprietor, filename string, minNumGlyphs, firstUnsupportedGlyph int) { + if !*proprietary { + t.Skip("skipping proprietary font test") + } + + file, err := []byte(nil), error(nil) + switch proprietor { + case "adobe": + file, err = ioutil.ReadFile(filepath.Join(*adobeDir, filename)) + if err != nil { + t.Fatalf("%v\nPerhaps you need to set the -adobeDir=%v flag?", err, *adobeDir) + } + case "microsoft": + file, err = ioutil.ReadFile(filepath.Join(*microsoftDir, filename)) + if err != nil { + t.Fatalf("%v\nPerhaps you need to set the -microsoftDir=%v flag?", err, *microsoftDir) + } + default: + panic("unreachable") + } + f, err := Parse(file) + if err != nil { + t.Fatalf("Parse: %v", err) + } + ppem := fixed.Int26_6(f.UnitsPerEm()) + qualifiedFilename := proprietor + "/" + filename + var buf Buffer + + // Some of the tests below, such as which glyph index a particular rune + // maps to, can depend on the specific version of the proprietary font. If + // tested against a different version of that font, the test might (but not + // necessarily will) fail, even though the Go code is good. If so, log a + // message, but don't automatically fail (i.e. dont' call t.Fatalf). + gotVersion, err := f.Name(&buf, NameIDVersion) + if err != nil { + t.Fatalf("Name: %v", err) + } + wantVersion := proprietaryVersions[qualifiedFilename] + if gotVersion != wantVersion { + t.Logf("font version provided differs from the one the tests were written against:"+ + "\ngot %q\nwant %q", gotVersion, wantVersion) + } + + numGlyphs := f.NumGlyphs() + if numGlyphs < minNumGlyphs { + t.Fatalf("NumGlyphs: got %d, want at least %d", numGlyphs, minNumGlyphs) + } + + iMax := numGlyphs + if firstUnsupportedGlyph >= 0 { + iMax = firstUnsupportedGlyph + } + for i, numErrors := 0, 0; i < iMax; i++ { + if _, err := f.LoadGlyph(&buf, GlyphIndex(i), ppem, nil); err != nil { + t.Errorf("LoadGlyph(%d): %v", i, err) + numErrors++ + } + if numErrors == 10 { + t.Fatal("LoadGlyph: too many errors") + } + } + + for r, want := range proprietaryGlyphIndexTestCases[qualifiedFilename] { + got, err := f.GlyphIndex(&buf, r) + if err != nil { + t.Errorf("GlyphIndex(%q): %v", r, err) + continue + } + if got != want { + t.Errorf("GlyphIndex(%q): got %d, want %d", r, got, want) + continue + } + } + + for r, want := range proprietaryGlyphTestCases[qualifiedFilename] { + x, err := f.GlyphIndex(&buf, r) + if err != nil { + t.Errorf("GlyphIndex(%q): %v", r, err) + continue + } + got, err := f.LoadGlyph(&buf, x, ppem, nil) + if err != nil { + t.Errorf("LoadGlyph(%q): %v", r, err) + continue + } + if err := checkSegmentsEqual(got, want); err != nil { + t.Errorf("LoadGlyph(%q): %v", r, err) + continue + } + } + +kernLoop: + for _, tc := range proprietaryKernTestCases[qualifiedFilename] { + var indexes [2]GlyphIndex + for i := range indexes { + x, err := f.GlyphIndex(&buf, tc.runes[i]) + if x == 0 && err == nil { + err = errors.New("no glyph index found") + } + if err != nil { + t.Errorf("GlyphIndex(%q): %v", tc.runes[0], err) + continue kernLoop + } + indexes[i] = x + } + kern, err := f.Kern(&buf, indexes[0], indexes[1], tc.ppem, tc.hinting) + if err != nil { + t.Errorf("Kern(%q, %q, ppem=%d, hinting=%v): %v", + tc.runes[0], tc.runes[1], tc.ppem, tc.hinting, err) + continue + } + if got := Units(kern); got != tc.want { + t.Errorf("Kern(%q, %q, ppem=%d, hinting=%v): got %d, want %d", + tc.runes[0], tc.runes[1], tc.ppem, tc.hinting, got, tc.want) + continue + } + } +} + +// proprietaryVersions holds the expected version string of each proprietary +// font tested. If third parties such as Adobe or Microsoft update their fonts, +// and the tests subsequently fail, these versions should be updated too. +// +// Updates are expected to be infrequent. For example, as of 2017, the fonts +// installed by the Debian ttf-mscorefonts-installer package have last modified +// times no later than 2001. +var proprietaryVersions = map[string]string{ + "adobe/SourceCodePro-Regular.otf": "Version 2.030;PS 1.0;hotconv 16.6.51;makeotf.lib2.5.65220", + "adobe/SourceCodePro-Regular.ttf": "Version 2.030;PS 1.000;hotconv 16.6.51;makeotf.lib2.5.65220", + "adobe/SourceHanSansSC-Regular.otf": "Version 1.004;PS 1.004;hotconv 1.0.82;makeotf.lib2.5.63406", + "adobe/SourceSansPro-Regular.otf": "Version 2.020;PS 2.0;hotconv 1.0.86;makeotf.lib2.5.63406", + "adobe/SourceSansPro-Regular.ttf": "Version 2.020;PS 2.000;hotconv 1.0.86;makeotf.lib2.5.63406", + + "microsoft/Arial.ttf": "Version 2.82", + "microsoft/Comic_Sans_MS.ttf": "Version 2.10", + "microsoft/Times_New_Roman.ttf": "Version 2.82", + "microsoft/Webdings.ttf": "Version 1.03", +} + +// proprietaryGlyphIndexTestCases hold a sample of each font's rune to glyph +// index cmap. The numerical values can be verified by running the ttx tool. +var proprietaryGlyphIndexTestCases = map[string]map[rune]GlyphIndex{ + "adobe/SourceCodePro-Regular.otf": { + '\u0030': 877, // U+0030 DIGIT ZERO + '\u0041': 2, // U+0041 LATIN CAPITAL LETTER A + '\u0061': 28, // U+0061 LATIN SMALL LETTER A + '\u0104': 64, // U+0104 LATIN CAPITAL LETTER A WITH OGONEK + '\u0125': 323, // U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX + '\u01f4': 111, // U+01F4 LATIN CAPITAL LETTER G WITH ACUTE + '\u03a3': 623, // U+03A3 GREEK CAPITAL LETTER SIGMA + '\u2569': 1500, // U+2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL + '\U0001f100': 0, // U+0001F100 DIGIT ZERO FULL STOP + }, + "adobe/SourceCodePro-Regular.ttf": { + '\u0030': 877, // U+0030 DIGIT ZERO + '\u0041': 2, // U+0041 LATIN CAPITAL LETTER A + '\u01f4': 111, // U+01F4 LATIN CAPITAL LETTER G WITH ACUTE + }, + "adobe/SourceHanSansSC-Regular.otf": { + '\u0030': 17, // U+0030 DIGIT ZERO + '\u0041': 34, // U+0041 LATIN CAPITAL LETTER A + '\u00d7': 150, // U+00D7 MULTIPLICATION SIGN + '\u1100': 365, // U+1100 HANGUL CHOSEONG KIYEOK + '\u25ca': 1254, // U+25CA LOZENGE + '\u2e9c': 1359, // U+2E9C CJK RADICAL SUN + '\u304b': 1463, // U+304B HIRAGANA LETTER KA + '\u4e2d': 9893, // U+4E2D , 中 + '\ua960': 47537, // U+A960 HANGUL CHOSEONG TIKEUT-MIEUM + '\ufb00': 58919, // U+FB00 LATIN SMALL LIGATURE FF + '\uffee': 59213, // U+FFEE HALFWIDTH WHITE CIRCLE + '\U0001f100': 59214, // U+0001F100 DIGIT ZERO FULL STOP + '\U0001f248': 59449, // U+0001F248 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 + '\U0002f9f4': 61768, // U+0002F9F4 CJK COMPATIBILITY IDEOGRAPH-2F9F4 + }, + "adobe/SourceSansPro-Regular.otf": { + '\u0041': 2, // U+0041 LATIN CAPITAL LETTER A + '\u03a3': 592, // U+03A3 GREEK CAPITAL LETTER SIGMA + '\u0435': 999, // U+0435 CYRILLIC SMALL LETTER IE + '\u2030': 1728, // U+2030 PER MILLE SIGN + }, + "adobe/SourceSansPro-Regular.ttf": { + '\u0041': 2, // U+0041 LATIN CAPITAL LETTER A + '\u03a3': 592, // U+03A3 GREEK CAPITAL LETTER SIGMA + '\u0435': 999, // U+0435 CYRILLIC SMALL LETTER IE + '\u2030': 1728, // U+2030 PER MILLE SIGN + }, + + "microsoft/Arial.ttf": { + '\u0041': 36, // U+0041 LATIN CAPITAL LETTER A + '\u00f1': 120, // U+00F1 LATIN SMALL LETTER N WITH TILDE + '\u0401': 556, // U+0401 CYRILLIC CAPITAL LETTER IO + '\u200d': 745, // U+200D ZERO WIDTH JOINER + '\u20ab': 1150, // U+20AB DONG SIGN + '\u2229': 320, // U+2229 INTERSECTION + '\u04e9': 1319, // U+04E9 CYRILLIC SMALL LETTER BARRED O + '\U0001f100': 0, // U+0001F100 DIGIT ZERO FULL STOP + }, + "microsoft/Comic_Sans_MS.ttf": { + '\u0041': 36, // U+0041 LATIN CAPITAL LETTER A + '\u03af': 573, // U+03AF GREEK SMALL LETTER IOTA WITH TONOS + }, + "microsoft/Times_New_Roman.ttf": { + '\u0041': 36, // U+0041 LATIN CAPITAL LETTER A + '\u0042': 37, // U+0041 LATIN CAPITAL LETTER B + '\u266a': 392, // U+266A EIGHTH NOTE + '\uf041': 0, // PRIVATE USE AREA + '\uf042': 0, // PRIVATE USE AREA + }, + "microsoft/Webdings.ttf": { + '\u0041': 0, // U+0041 LATIN CAPITAL LETTER A + '\u0042': 0, // U+0041 LATIN CAPITAL LETTER B + '\u266a': 0, // U+266A EIGHTH NOTE + '\uf041': 36, // PRIVATE USE AREA + '\uf042': 37, // PRIVATE USE AREA + }, +} + +// proprietaryGlyphTestCases hold a sample of each font's glyph vectors. The +// numerical values can be verified by running the ttx tool, remembering that: +// - for PostScript glyphs, ttx coordinates are relative, and hstem / vstem +// operators are hinting-related and can be ignored. +// - for TrueType glyphs, ttx coordinates are absolute, and consecutive +// off-curve points implies an on-curve point at the midpoint. +var proprietaryGlyphTestCases = map[string]map[rune][]Segment{ + "adobe/SourceSansPro-Regular.otf": { + ',': { + // - contour #0 + // 67 -170 rmoveto + moveTo(67, -170), + // 81 34 50 67 86 vvcurveto + cubeTo(148, -136, 198, -69, 198, 17), + // 60 -26 37 -43 -33 -28 -22 -36 -37 27 -20 32 3 4 0 1 3 vhcurveto + cubeTo(198, 77, 172, 114, 129, 114), + cubeTo(96, 114, 68, 92, 68, 56), + cubeTo(68, 19, 95, -1, 127, -1), + cubeTo(130, -1, 134, -1, 137, 0), + // 1 -53 -34 -44 -57 -25 rrcurveto + cubeTo(138, -53, 104, -97, 47, -122), + }, + 'Q': { + // - contour #0 + // 332 57 rmoveto + moveTo(332, 57), + // -117 -77 106 168 163 77 101 117 117 77 -101 -163 -168 -77 -106 -117 hvcurveto + cubeTo(215, 57, 138, 163, 138, 331), + cubeTo(138, 494, 215, 595, 332, 595), + cubeTo(449, 595, 526, 494, 526, 331), + cubeTo(526, 163, 449, 57, 332, 57), + // - contour #1 + // 201 -222 rmoveto + moveTo(533, -165), + // 39 35 7 8 20 hvcurveto + cubeTo(572, -165, 607, -158, 627, -150), + // -16 64 rlineto + lineTo(611, -86), + // -5 -18 -22 -4 -29 hhcurveto + cubeTo(593, -91, 571, -95, 542, -95), + // -71 -60 29 58 -30 hvcurveto + cubeTo(471, -95, 411, -66, 381, -8), + // 139 24 93 126 189 vvcurveto + cubeTo(520, 16, 613, 142, 613, 331), + // 209 -116 128 -165 -165 -115 -127 -210 -193 96 -127 143 -20 vhcurveto + cubeTo(613, 540, 497, 668, 332, 668), + cubeTo(167, 668, 52, 541, 52, 331), + cubeTo(52, 138, 148, 11, 291, -9), + // -90 38 83 -66 121 hhcurveto + cubeTo(329, -99, 412, -165, 533, -165), + }, + }, + + "microsoft/Arial.ttf": { + ',': { + // - contour #0 + moveTo(182, 0), + lineTo(182, 205), + lineTo(387, 205), + lineTo(387, 0), + quadTo(387, -113, 347, -182), + quadTo(307, -252, 220, -290), + lineTo(170, -213), + quadTo(227, -188, 254, -139), + quadTo(281, -91, 284, 0), + lineTo(182, 0), + }, + 'i': { + // - contour #0 + moveTo(136, 1259), + lineTo(136, 1466), + lineTo(316, 1466), + lineTo(316, 1259), + lineTo(136, 1259), + // - contour #1 + moveTo(136, 0), + lineTo(136, 1062), + lineTo(316, 1062), + lineTo(316, 0), + lineTo(136, 0), + }, + 'o': { + // - contour #0 + moveTo(68, 531), + quadTo(68, 826, 232, 968), + quadTo(369, 1086, 566, 1086), + quadTo(785, 1086, 924, 942), + quadTo(1063, 799, 1063, 546), + quadTo(1063, 341, 1001, 223), + quadTo(940, 106, 822, 41), + quadTo(705, -24, 566, -24), + quadTo(343, -24, 205, 119), + quadTo(68, 262, 68, 531), + // - contour #1 + moveTo(253, 531), + quadTo(253, 327, 342, 225), + quadTo(431, 124, 566, 124), + quadTo(700, 124, 789, 226), + quadTo(878, 328, 878, 537), + quadTo(878, 734, 788, 835), + quadTo(699, 937, 566, 937), + quadTo(431, 937, 342, 836), + quadTo(253, 735, 253, 531), + }, + }, +} + +type kernTestCase struct { + ppem fixed.Int26_6 + hinting font.Hinting + runes [2]rune + want Units +} + +// proprietaryKernTestCases hold a sample of each font's kerning pairs. The +// numerical values can be verified by running the ttx tool. +var proprietaryKernTestCases = map[string][]kernTestCase{ + "microsoft/Arial.ttf": { + {2048, font.HintingNone, [2]rune{'A', 'V'}, -152}, + // U+03B8 GREEK SMALL LETTER THETA + // U+03BB GREEK SMALL LETTER LAMDA + {2048, font.HintingNone, [2]rune{'\u03b8', '\u03bb'}, -39}, + {2048, font.HintingNone, [2]rune{'\u03bb', '\u03b8'}, -0}, + }, + "microsoft/Comic_Sans_MS.ttf": { + {2048, font.HintingNone, [2]rune{'A', 'V'}, 0}, + }, + "microsoft/Times_New_Roman.ttf": { + {768, font.HintingNone, [2]rune{'A', 'V'}, -99}, + {768, font.HintingFull, [2]rune{'A', 'V'}, -128}, + {2048, font.HintingNone, [2]rune{'A', 'A'}, 0}, + {2048, font.HintingNone, [2]rune{'A', 'T'}, -227}, + {2048, font.HintingNone, [2]rune{'A', 'V'}, -264}, + {2048, font.HintingNone, [2]rune{'T', 'A'}, -164}, + {2048, font.HintingNone, [2]rune{'T', 'T'}, 0}, + {2048, font.HintingNone, [2]rune{'T', 'V'}, 0}, + {2048, font.HintingNone, [2]rune{'V', 'A'}, -264}, + {2048, font.HintingNone, [2]rune{'V', 'T'}, 0}, + {2048, font.HintingNone, [2]rune{'V', 'V'}, 0}, + // U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + // U+0393 GREEK CAPITAL LETTER GAMMA + {2048, font.HintingNone, [2]rune{'\u0390', '\u0393'}, 0}, + {2048, font.HintingNone, [2]rune{'\u0393', '\u0390'}, 76}, + }, + "microsoft/Webdings.ttf": { + {2048, font.HintingNone, [2]rune{'\uf041', '\uf042'}, 0}, + }, +} diff --git a/vendor/golang.org/x/image/font/sfnt/sfnt.go b/vendor/golang.org/x/image/font/sfnt/sfnt.go index d4929a8381..02efd5f3a5 100644 --- a/vendor/golang.org/x/image/font/sfnt/sfnt.go +++ b/vendor/golang.org/x/image/font/sfnt/sfnt.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:generate go run gen.go + // Package sfnt implements a decoder for SFNT font file formats, including // TrueType and OpenType. package sfnt // import "golang.org/x/image/font/sfnt" @@ -13,11 +15,15 @@ package sfnt // import "golang.org/x/image/font/sfnt" // // The pyftinspect tool from https://github.com/fonttools/fonttools is useful // for inspecting SFNT fonts. +// +// The ttfdump tool is also useful. For example: +// ttfdump -t cmap ../testdata/CFFTest.otf dump.txt import ( "errors" "io" + "golang.org/x/image/font" "golang.org/x/image/math/fixed" "golang.org/x/text/encoding/charmap" ) @@ -25,6 +31,20 @@ import ( // These constants are not part of the specifications, but are limitations used // by this implementation. const ( + // This value is arbitrary, but defends against parsing malicious font + // files causing excessive memory allocations. For reference, Adobe's + // SourceHanSansSC-Regular.otf has 65535 glyphs and: + // - its format-4 cmap table has 1581 segments. + // - its format-12 cmap table has 16498 segments. + // + // TODO: eliminate this constraint? If the cmap table is very large, load + // some or all of it lazily (at the time Font.GlyphIndex is called) instead + // of all of it eagerly (at the time Font.initialize is called), while + // keeping an upper bound on the memory used? This will make the code in + // cmap.go more complicated, considering that all of the Font methods are + // safe to call concurrently, as long as each call has a different *Buffer. + maxCmapSegments = 20000 + maxGlyphDataLength = 64 * 1024 maxHintBits = 256 maxNumTables = 256 @@ -41,27 +61,34 @@ var ( errInvalidBounds = errors.New("sfnt: invalid bounds") errInvalidCFFTable = errors.New("sfnt: invalid CFF table") + errInvalidCmapTable = errors.New("sfnt: invalid cmap table") errInvalidGlyphData = errors.New("sfnt: invalid glyph data") errInvalidHeadTable = errors.New("sfnt: invalid head table") + errInvalidKernTable = errors.New("sfnt: invalid kern table") errInvalidLocaTable = errors.New("sfnt: invalid loca table") errInvalidLocationData = errors.New("sfnt: invalid location data") errInvalidMaxpTable = errors.New("sfnt: invalid maxp table") errInvalidNameTable = errors.New("sfnt: invalid name table") + errInvalidPostTable = errors.New("sfnt: invalid post table") errInvalidSourceData = errors.New("sfnt: invalid source data") errInvalidTableOffset = errors.New("sfnt: invalid table offset") errInvalidTableTagOrder = errors.New("sfnt: invalid table tag order") errInvalidUCS2String = errors.New("sfnt: invalid UCS-2 string") errInvalidVersion = errors.New("sfnt: invalid version") - errUnsupportedCFFVersion = errors.New("sfnt: unsupported CFF version") - errUnsupportedCompoundGlyph = errors.New("sfnt: unsupported compound glyph") - errUnsupportedGlyphDataLength = errors.New("sfnt: unsupported glyph data length") - errUnsupportedRealNumberEncoding = errors.New("sfnt: unsupported real number encoding") - errUnsupportedNumberOfHints = errors.New("sfnt: unsupported number of hints") - errUnsupportedNumberOfTables = errors.New("sfnt: unsupported number of tables") - errUnsupportedPlatformEncoding = errors.New("sfnt: unsupported platform encoding") - errUnsupportedTableOffsetLength = errors.New("sfnt: unsupported table offset or length") - errUnsupportedType2Charstring = errors.New("sfnt: unsupported Type 2 Charstring") + errUnsupportedCFFVersion = errors.New("sfnt: unsupported CFF version") + errUnsupportedCmapEncodings = errors.New("sfnt: unsupported cmap encodings") + errUnsupportedCompoundGlyph = errors.New("sfnt: unsupported compound glyph") + errUnsupportedGlyphDataLength = errors.New("sfnt: unsupported glyph data length") + errUnsupportedKernTable = errors.New("sfnt: unsupported kern table") + errUnsupportedRealNumberEncoding = errors.New("sfnt: unsupported real number encoding") + errUnsupportedNumberOfCmapSegments = errors.New("sfnt: unsupported number of cmap segments") + errUnsupportedNumberOfHints = errors.New("sfnt: unsupported number of hints") + errUnsupportedNumberOfTables = errors.New("sfnt: unsupported number of tables") + errUnsupportedPlatformEncoding = errors.New("sfnt: unsupported platform encoding") + errUnsupportedPostTable = errors.New("sfnt: unsupported post table") + errUnsupportedTableOffsetLength = errors.New("sfnt: unsupported table offset or length") + errUnsupportedType2Charstring = errors.New("sfnt: unsupported Type 2 Charstring") ) // GlyphIndex is a glyph index in a Font. @@ -107,16 +134,16 @@ const ( // display resolution (DPI) and font size (e.g. a 12 point font). type Units int32 -// Platform IDs and Platform Specific IDs as per -// https://www.microsoft.com/typography/otspec/name.htm -const ( - pidMacintosh = 1 - pidWindows = 3 - - psidMacintoshRoman = 0 - - psidWindowsUCS2 = 1 -) +// scale returns x divided by unitsPerEm, rounded to the nearest fixed.Int26_6 +// value (1/64th of a pixel). +func scale(x fixed.Int26_6, unitsPerEm Units) fixed.Int26_6 { + if x >= 0 { + x += fixed.Int26_6(unitsPerEm) / 2 + } else { + x -= fixed.Int26_6(unitsPerEm) / 2 + } + return x / fixed.Int26_6(unitsPerEm) +} func u16(b []byte) uint16 { _ = b[1] // Bounds check hint to compiler. @@ -208,6 +235,20 @@ func (s *source) u16(buf []byte, t table, i int) (uint16, error) { return u16(buf), nil } +// u32 returns the uint32 in the table t at the relative offset i. +// +// buf is an optional scratch buffer as per the source.view method. +func (s *source) u32(buf []byte, t table, i int) (uint32, error) { + if i < 0 || uint(t.length) < uint(i+4) { + return 0, errInvalidBounds + } + buf, err := s.view(buf, int(t.offset)+i, 4) + if err != nil { + return 0, err + } + return u32(buf), nil +} + // table is a section of the font data. type table struct { offset, length uint32 @@ -247,6 +288,18 @@ func ParseReaderAt(src io.ReaderAt) (*Font, error) { // // The Font methods that don't take a *Buffer argument are always safe to call // concurrently. +// +// Some methods provide lengths or coordinates, e.g. bounds, font metrics and +// control points. All of these methods take a ppem parameter, which is the +// number of pixels in 1 em, expressed as a 26.6 fixed point value. For +// example, if 1 em is 10 pixels then ppem is fixed.I(10), which equals +// fixed.Int26_6(10 << 6). +// +// To get those lengths or coordinates in terms of font units instead of +// pixels, use ppem = fixed.Int26_6(f.UnitsPerEm()) and if those methods take a +// font.Hinting parameter, use font.HintingNone. The return values will have +// type fixed.Int26_6, but those numbers can be converted back to Units with no +// further scaling necessary. type Font struct { src source @@ -283,11 +336,16 @@ type Font struct { // https://www.microsoft.com/typography/otspec/otff.htm#otttables // "Other OpenType Tables". // - // TODO: hdmx, kern, vmtx? Others? + // TODO: hdmx, vmtx? Others? + kern table cached struct { + glyphIndex glyphIndexFunc indexToLocFormat bool // false means short, true means long. isPostScript bool + kernNumPairs int32 + kernOffset int32 + postTableVersion uint32 unitsPerEm Units // The glyph data for the glyph index i is in @@ -306,51 +364,96 @@ func (f *Font) initialize() error { if !f.src.valid() { return errInvalidSourceData } - var buf []byte - - // https://www.microsoft.com/typography/otspec/otff.htm "Organization of an - // OpenType Font" says that "The OpenType font starts with the Offset - // Table", which is 12 bytes. - buf, err := f.src.view(buf, 0, 12) + buf, isPostScript, err := f.initializeTables(nil) if err != nil { return err } + + // The order of these parseXxx calls matters. Later calls may depend on + // information parsed by earlier calls, such as the maxp table's numGlyphs. + // To enforce these dependencies, such information is passed and returned + // explicitly, and the f.cached fields are only set afterwards. + // + // When implementing new parseXxx methods, take care not to call methods + // such as Font.NumGlyphs that implicitly depend on f.cached fields. + + buf, indexToLocFormat, unitsPerEm, err := f.parseHead(buf) + if err != nil { + return err + } + buf, numGlyphs, locations, err := f.parseMaxp(buf, indexToLocFormat, isPostScript) + if err != nil { + return err + } + buf, glyphIndex, err := f.parseCmap(buf) + if err != nil { + return err + } + buf, kernNumPairs, kernOffset, err := f.parseKern(buf) + if err != nil { + return err + } + buf, postTableVersion, err := f.parsePost(buf, numGlyphs) + if err != nil { + return err + } + + f.cached.glyphIndex = glyphIndex + f.cached.indexToLocFormat = indexToLocFormat + f.cached.isPostScript = isPostScript + f.cached.kernNumPairs = kernNumPairs + f.cached.kernOffset = kernOffset + f.cached.postTableVersion = postTableVersion + f.cached.unitsPerEm = unitsPerEm + f.cached.locations = locations + + return nil +} + +func (f *Font) initializeTables(buf []byte) (buf1 []byte, isPostScript bool, err error) { + // https://www.microsoft.com/typography/otspec/otff.htm "Organization of an + // OpenType Font" says that "The OpenType font starts with the Offset + // Table", which is 12 bytes. + buf, err = f.src.view(buf, 0, 12) + if err != nil { + return nil, false, err + } switch u32(buf) { default: - return errInvalidVersion + return nil, false, errInvalidVersion case 0x00010000: // No-op. case 0x4f54544f: // "OTTO". - f.cached.isPostScript = true + isPostScript = true } numTables := int(u16(buf[4:])) if numTables > maxNumTables { - return errUnsupportedNumberOfTables + return nil, false, errUnsupportedNumberOfTables } // "The Offset Table is followed immediately by the Table Record entries... // sorted in ascending order by tag", 16 bytes each. buf, err = f.src.view(buf, 12, 16*numTables) if err != nil { - return err + return nil, false, err } for b, first, prevTag := buf, true, uint32(0); len(b) > 0; b = b[16:] { tag := u32(b) if first { first = false } else if tag <= prevTag { - return errInvalidTableTagOrder + return nil, false, errInvalidTableTagOrder } prevTag = tag o, n := u32(b[8:12]), u32(b[12:16]) if o > maxTableOffset || n > maxTableLength { - return errUnsupportedTableOffsetLength + return nil, false, errUnsupportedTableOffsetLength } // We ignore the checksums, but "all tables must begin on four byte // boundries [sic]". if o&3 != 0 { - return errInvalidTableOffset + return nil, false, errInvalidTableOffset } // Match the 4-byte tag as a uint32. For example, "OS/2" is 0x4f532f32. @@ -369,6 +472,8 @@ func (f *Font) initialize() error { f.hhea = table{o, n} case 0x686d7478: f.hmtx = table{o, n} + case 0x6b65726e: + f.kern = table{o, n} case 0x6c6f6361: f.loca = table{o, n} case 0x6d617870: @@ -379,69 +484,258 @@ func (f *Font) initialize() error { f.post = table{o, n} } } + return buf, isPostScript, nil +} - var u uint16 +func (f *Font) parseCmap(buf []byte) (buf1 []byte, glyphIndex glyphIndexFunc, err error) { + // https://www.microsoft.com/typography/OTSPEC/cmap.htm - // https://www.microsoft.com/typography/otspec/head.htm - if f.head.length != 54 { - return errInvalidHeadTable + const headerSize, entrySize = 4, 8 + if f.cmap.length < headerSize { + return nil, nil, errInvalidCmapTable } - u, err = f.src.u16(buf, f.head, 18) + u, err := f.src.u16(buf, f.cmap, 2) if err != nil { - return err + return nil, nil, err + } + numSubtables := int(u) + if f.cmap.length < headerSize+entrySize*uint32(numSubtables) { + return nil, nil, errInvalidCmapTable + } + + var ( + bestWidth int + bestOffset uint32 + bestLength uint32 + bestFormat uint16 + ) + + // Scan all of the subtables, picking the widest supported one. See the + // platformEncodingWidth comment for more discussion of width. + for i := 0; i < numSubtables; i++ { + buf, err = f.src.view(buf, int(f.cmap.offset)+headerSize+entrySize*i, entrySize) + if err != nil { + return nil, nil, err + } + pid := u16(buf) + psid := u16(buf[2:]) + width := platformEncodingWidth(pid, psid) + if width <= bestWidth { + continue + } + offset := u32(buf[4:]) + + if offset > f.cmap.length-4 { + return nil, nil, errInvalidCmapTable + } + buf, err = f.src.view(buf, int(f.cmap.offset+offset), 4) + if err != nil { + return nil, nil, err + } + format := u16(buf) + if !supportedCmapFormat(format, pid, psid) { + continue + } + length := uint32(u16(buf[2:])) + + bestWidth = width + bestOffset = offset + bestLength = length + bestFormat = format + } + + if bestWidth == 0 { + return nil, nil, errUnsupportedCmapEncodings + } + return f.makeCachedGlyphIndex(buf, bestOffset, bestLength, bestFormat) +} + +func (f *Font) parseHead(buf []byte) (buf1 []byte, indexToLocFormat bool, unitsPerEm Units, err error) { + // https://www.microsoft.com/typography/otspec/head.htm + + if f.head.length != 54 { + return nil, false, 0, errInvalidHeadTable + } + u, err := f.src.u16(buf, f.head, 18) + if err != nil { + return nil, false, 0, err } if u == 0 { - return errInvalidHeadTable + return nil, false, 0, errInvalidHeadTable } - f.cached.unitsPerEm = Units(u) + unitsPerEm = Units(u) u, err = f.src.u16(buf, f.head, 50) if err != nil { - return err + return nil, false, 0, err } - f.cached.indexToLocFormat = u != 0 + indexToLocFormat = u != 0 + return buf, indexToLocFormat, unitsPerEm, nil +} +func (f *Font) parseKern(buf []byte) (buf1 []byte, kernNumPairs, kernOffset int32, err error) { + // https://www.microsoft.com/typography/otspec/kern.htm + + if f.kern.length == 0 { + return buf, 0, 0, nil + } + const headerSize = 4 + if f.kern.length < headerSize { + return nil, 0, 0, errInvalidKernTable + } + buf, err = f.src.view(buf, int(f.kern.offset), headerSize) + if err != nil { + return nil, 0, 0, err + } + offset := int(f.kern.offset) + headerSize + length := int(f.kern.length) - headerSize + + switch version := u16(buf); version { + case 0: + // TODO: support numTables != 1. Testing that requires finding such a font. + if numTables := int(u16(buf[2:])); numTables != 1 { + return nil, 0, 0, errUnsupportedKernTable + } + return f.parseKernVersion0(buf, offset, length) + case 1: + // TODO: find such a (proprietary?) font, and support it. Both of + // https://www.microsoft.com/typography/otspec/kern.htm + // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6kern.html + // say that such fonts work on Mac OS but not on Windows. + } + return nil, 0, 0, errUnsupportedKernTable +} + +func (f *Font) parseKernVersion0(buf []byte, offset, length int) (buf1 []byte, kernNumPairs, kernOffset int32, err error) { + const headerSize = 6 + if length < headerSize { + return nil, 0, 0, errInvalidKernTable + } + buf, err = f.src.view(buf, offset, headerSize) + if err != nil { + return nil, 0, 0, err + } + if version := u16(buf); version != 0 { + return nil, 0, 0, errUnsupportedKernTable + } + subtableLength := int(u16(buf[2:])) + if subtableLength < headerSize || length < subtableLength { + return nil, 0, 0, errInvalidKernTable + } + if coverageBits := buf[5]; coverageBits != 0x01 { + // We only support horizontal kerning. + return nil, 0, 0, errUnsupportedKernTable + } + offset += headerSize + length -= headerSize + subtableLength -= headerSize + + switch format := buf[4]; format { + case 0: + return f.parseKernFormat0(buf, offset, subtableLength) + case 2: + // TODO: find such a (proprietary?) font, and support it. + } + return nil, 0, 0, errUnsupportedKernTable +} + +func (f *Font) parseKernFormat0(buf []byte, offset, length int) (buf1 []byte, kernNumPairs, kernOffset int32, err error) { + const headerSize, entrySize = 8, 6 + if length < headerSize { + return nil, 0, 0, errInvalidKernTable + } + buf, err = f.src.view(buf, offset, headerSize) + if err != nil { + return nil, 0, 0, err + } + kernNumPairs = int32(u16(buf)) + if length != headerSize+entrySize*int(kernNumPairs) { + return nil, 0, 0, errInvalidKernTable + } + return buf, kernNumPairs, int32(offset) + headerSize, nil +} + +func (f *Font) parseMaxp(buf []byte, indexToLocFormat, isPostScript bool) (buf1 []byte, numGlyphs int, locations []uint32, err error) { // https://www.microsoft.com/typography/otspec/maxp.htm - if f.cached.isPostScript { + + if isPostScript { if f.maxp.length != 6 { - return errInvalidMaxpTable + return nil, 0, nil, errInvalidMaxpTable } } else { if f.maxp.length != 32 { - return errInvalidMaxpTable + return nil, 0, nil, errInvalidMaxpTable } } - u, err = f.src.u16(buf, f.maxp, 4) + u, err := f.src.u16(buf, f.maxp, 4) if err != nil { - return err + return nil, 0, nil, err } - numGlyphs := int(u) + numGlyphs = int(u) - if f.cached.isPostScript { + if isPostScript { p := cffParser{ src: &f.src, base: int(f.cff.offset), offset: int(f.cff.offset), end: int(f.cff.offset + f.cff.length), } - f.cached.locations, err = p.parse() + locations, err = p.parse() if err != nil { - return err + return nil, 0, nil, err } } else { - f.cached.locations, err = parseLoca( - &f.src, f.loca, f.glyf.offset, f.cached.indexToLocFormat, numGlyphs) + locations, err = parseLoca(&f.src, f.loca, f.glyf.offset, indexToLocFormat, numGlyphs) if err != nil { - return err + return nil, 0, nil, err } } - if len(f.cached.locations) != numGlyphs+1 { - return errInvalidLocationData + if len(locations) != numGlyphs+1 { + return nil, 0, nil, errInvalidLocationData } - return nil + + return buf, numGlyphs, locations, nil } -// TODO: func (f *Font) GlyphIndex(r rune) (x GlyphIndex, ok bool) -// This will require parsing the cmap table. +func (f *Font) parsePost(buf []byte, numGlyphs int) (buf1 []byte, postTableVersion uint32, err error) { + // https://www.microsoft.com/typography/otspec/post.htm + + const headerSize = 32 + if f.post.length < headerSize { + return nil, 0, errInvalidPostTable + } + u, err := f.src.u32(buf, f.post, 0) + if err != nil { + return nil, 0, err + } + switch u { + case 0x20000: + if f.post.length < headerSize+2+2*uint32(numGlyphs) { + return nil, 0, errInvalidPostTable + } + case 0x30000: + // No-op. + default: + return nil, 0, errUnsupportedPostTable + } + return buf, u, nil +} + +// TODO: API for looking up glyph variants?? For example, some fonts may +// provide both slashed and dotted zero glyphs ('0'), or regular and 'old +// style' numerals, and users can direct software to choose a variant. + +type glyphIndexFunc func(f *Font, b *Buffer, r rune) (GlyphIndex, error) + +// GlyphIndex returns the glyph index for the given rune. +// +// It returns (0, nil) if there is no glyph for r. +// https://www.microsoft.com/typography/OTSPEC/cmap.htm says that "Character +// codes that do not correspond to any glyph in the font should be mapped to +// glyph index 0. The glyph at this location must be a special glyph +// representing a missing character, commonly known as .notdef." +func (f *Font) GlyphIndex(b *Buffer, r rune) (GlyphIndex, error) { + return f.cached.glyphIndex(f, b, r) +} func (f *Font) viewGlyphData(b *Buffer, x GlyphIndex) ([]byte, error) { xx := int(x) @@ -458,15 +752,16 @@ func (f *Font) viewGlyphData(b *Buffer, x GlyphIndex) ([]byte, error) { // LoadGlyphOptions are the options to the Font.LoadGlyph method. type LoadGlyphOptions struct { - // TODO: scale / transform / hinting. + // TODO: transform / hinting. } -// LoadGlyph returns the vector segments for the x'th glyph. +// LoadGlyph returns the vector segments for the x'th glyph. ppem is the number +// of pixels in 1 em. // // If b is non-nil, the segments become invalid to use once b is re-used. // // It returns ErrNotFound if the glyph index is out of range. -func (f *Font) LoadGlyph(b *Buffer, x GlyphIndex, opts *LoadGlyphOptions) ([]Segment, error) { +func (f *Font) LoadGlyph(b *Buffer, x GlyphIndex, ppem fixed.Int26_6, opts *LoadGlyphOptions) ([]Segment, error) { if b == nil { b = &Buffer{} } @@ -491,11 +786,153 @@ func (f *Font) LoadGlyph(b *Buffer, x GlyphIndex, opts *LoadGlyphOptions) ([]Seg b.segments = segments } - // TODO: look at opts to scale / transform / hint the Buffer.segments. + // Scale the segments. If we want to support hinting, we'll have to push + // the scaling computation into the PostScript / TrueType specific glyph + // loading code, such as the appendGlyfSegments body, since TrueType + // hinting bytecode works on the scaled glyph vectors. For now, though, + // it's simpler to scale as a post-processing step. + for i := range b.segments { + s := &b.segments[i] + for j := range s.Args { + s.Args[j] = scale(s.Args[j]*ppem, f.cached.unitsPerEm) + } + } + + // TODO: look at opts to transform / hint the Buffer.segments. return b.segments, nil } +// GlyphName returns the name of the x'th glyph. +// +// Not every font contains glyph names. If not present, GlyphName will return +// ("", nil). +// +// If present, the glyph name, provided by the font, is assumed to follow the +// Adobe Glyph List Specification: +// https://github.com/adobe-type-tools/agl-specification/blob/master/README.md +// +// This is also known as the "Adobe Glyph Naming convention", the "Adobe +// document [for] Unicode and Glyph Names" or "PostScript glyph names". +// +// It returns ErrNotFound if the glyph index is out of range. +func (f *Font) GlyphName(b *Buffer, x GlyphIndex) (string, error) { + if int(x) >= f.NumGlyphs() { + return "", ErrNotFound + } + if f.cached.postTableVersion != 0x20000 { + return "", nil + } + if b == nil { + b = &Buffer{} + } + + // The wire format for a Version 2 post table is documented at: + // https://www.microsoft.com/typography/otspec/post.htm + const glyphNameIndexOffset = 34 + + buf, err := b.view(&f.src, int(f.post.offset)+glyphNameIndexOffset+2*int(x), 2) + if err != nil { + return "", err + } + u := u16(buf) + if u < numBuiltInPostNames { + i := builtInPostNamesOffsets[u+0] + j := builtInPostNamesOffsets[u+1] + return builtInPostNamesData[i:j], nil + } + // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6post.html + // says that "32768 through 65535 are reserved for future use". + if u > 32767 { + return "", errUnsupportedPostTable + } + u -= numBuiltInPostNames + + // Iterate through the list of Pascal-formatted strings. A linear scan is + // clearly O(u), which isn't great (as the obvious loop, calling + // Font.GlyphName, to get all of the glyph names in a font has quadratic + // complexity), but the wire format doesn't suggest a better alternative. + + offset := glyphNameIndexOffset + 2*f.NumGlyphs() + buf, err = b.view(&f.src, int(f.post.offset)+offset, int(f.post.length)-offset) + if err != nil { + return "", err + } + + for { + if len(buf) == 0 { + return "", errInvalidPostTable + } + n := 1 + int(buf[0]) + if len(buf) < n { + return "", errInvalidPostTable + } + if u == 0 { + return string(buf[1:n]), nil + } + buf = buf[n:] + u-- + } +} + +// Kern returns the horizontal adjustment for the kerning pair (x0, x1). A +// positive kern means to move the glyphs further apart. ppem is the number of +// pixels in 1 em. +// +// It returns ErrNotFound if either glyph index is out of range. +func (f *Font) Kern(b *Buffer, x0, x1 GlyphIndex, ppem fixed.Int26_6, h font.Hinting) (fixed.Int26_6, error) { + // TODO: how should this work with the GPOS table and CFF fonts? + // https://www.microsoft.com/typography/otspec/kern.htm says that + // "OpenType™ fonts containing CFF outlines are not supported by the 'kern' + // table and must use the 'GPOS' OpenType Layout table." + + if n := f.NumGlyphs(); int(x0) >= n || int(x1) >= n { + return 0, ErrNotFound + } + // Not every font has a kern table. If it doesn't, there's no need to + // allocate a Buffer. + if f.kern.length == 0 { + return 0, nil + } + if b == nil { + b = &Buffer{} + } + + key := uint32(x0)<<16 | uint32(x1) + lo, hi := int32(0), f.cached.kernNumPairs + for lo < hi { + i := (lo + hi) / 2 + + // TODO: this view call inside the inner loop can lead to many small + // reads instead of fewer larger reads, which can be expensive. We + // should be able to do better, although we don't want to make (one) + // arbitrarily large read. Perhaps we should round up reads to 4K or 8K + // chunks. For reference, Arial.ttf's kern table is 5472 bytes. + // Times_New_Roman.ttf's kern table is 5220 bytes. + const entrySize = 6 + buf, err := b.view(&f.src, int(f.cached.kernOffset+i*entrySize), entrySize) + if err != nil { + return 0, err + } + + k := u32(buf) + if k < key { + lo = i + 1 + } else if k > key { + hi = i + } else { + kern := fixed.Int26_6(int16(u16(buf[4:]))) + kern = scale(kern*ppem, f.cached.unitsPerEm) + if h == font.HintingFull { + // Quantize the fixed.Int26_6 value to the nearest pixel. + kern = (kern + 32) &^ 63 + } + return kern, nil + } + } + return 0, nil +} + // Name returns the name value keyed by the given NameID. // // It returns ErrNotFound if there is no value for that key. @@ -512,14 +949,14 @@ func (f *Font) Name(b *Buffer, id NameID) (string, error) { if err != nil { return "", err } - nSubtables := u16(buf[2:]) - if f.name.length < headerSize+entrySize*uint32(nSubtables) { + numSubtables := u16(buf[2:]) + if f.name.length < headerSize+entrySize*uint32(numSubtables) { return "", errInvalidNameTable } stringOffset := u16(buf[4:]) seen := false - for i, n := 0, int(nSubtables); i < n; i++ { + for i, n := 0, int(numSubtables); i < n; i++ { buf, err := b.view(&f.src, int(f.name.offset)+headerSize+entrySize*i, entrySize) if err != nil { return "", err diff --git a/vendor/golang.org/x/image/font/sfnt/sfnt_test.go b/vendor/golang.org/x/image/font/sfnt/sfnt_test.go index 4ffd72f40d..85d96a96f1 100644 --- a/vendor/golang.org/x/image/font/sfnt/sfnt_test.go +++ b/vendor/golang.org/x/image/font/sfnt/sfnt_test.go @@ -6,6 +6,7 @@ package sfnt import ( "bytes" + "fmt" "io/ioutil" "path/filepath" "testing" @@ -14,52 +15,48 @@ import ( "golang.org/x/image/math/fixed" ) -func moveTo(xa, ya int) Segment { +func moveTo(xa, ya fixed.Int26_6) Segment { return Segment{ - Op: SegmentOpMoveTo, - Args: [6]fixed.Int26_6{ - 0: fixed.I(xa), - 1: fixed.I(ya), - }, + Op: SegmentOpMoveTo, + Args: [6]fixed.Int26_6{xa, ya}, } } -func lineTo(xa, ya int) Segment { +func lineTo(xa, ya fixed.Int26_6) Segment { return Segment{ - Op: SegmentOpLineTo, - Args: [6]fixed.Int26_6{ - 0: fixed.I(xa), - 1: fixed.I(ya), - }, + Op: SegmentOpLineTo, + Args: [6]fixed.Int26_6{xa, ya}, } } -func quadTo(xa, ya, xb, yb int) Segment { +func quadTo(xa, ya, xb, yb fixed.Int26_6) Segment { return Segment{ - Op: SegmentOpQuadTo, - Args: [6]fixed.Int26_6{ - 0: fixed.I(xa), - 1: fixed.I(ya), - 2: fixed.I(xb), - 3: fixed.I(yb), - }, + Op: SegmentOpQuadTo, + Args: [6]fixed.Int26_6{xa, ya, xb, yb}, } } -func cubeTo(xa, ya, xb, yb, xc, yc int) Segment { +func cubeTo(xa, ya, xb, yb, xc, yc fixed.Int26_6) Segment { return Segment{ - Op: SegmentOpCubeTo, - Args: [6]fixed.Int26_6{ - 0: fixed.I(xa), - 1: fixed.I(ya), - 2: fixed.I(xb), - 3: fixed.I(yb), - 4: fixed.I(xc), - 5: fixed.I(yc), - }, + Op: SegmentOpCubeTo, + Args: [6]fixed.Int26_6{xa, ya, xb, yb, xc, yc}, } } +func checkSegmentsEqual(got, want []Segment) error { + if len(got) != len(want) { + return fmt.Errorf("got %d elements, want %d\noverall:\ngot %v\nwant %v", + len(got), len(want), got, want) + } + for i, g := range got { + if w := want[i]; g != w { + return fmt.Errorf("element %d:\ngot %v\nwant %v\noverall:\ngot %v\nwant %v", + i, g, w, got, want) + } + } + return nil +} + func TestTrueTypeParse(t *testing.T) { f, err := Parse(goregular.TTF) if err != nil { @@ -88,6 +85,167 @@ func testTrueType(t *testing.T, f *Font) { } } +func TestGoRegularGlyphIndex(t *testing.T) { + f, err := Parse(goregular.TTF) + if err != nil { + t.Fatalf("Parse: %v", err) + } + + testCases := []struct { + r rune + want GlyphIndex + }{ + // Glyphs that aren't present in Go Regular. + {'\u001f', 0}, // U+001F + {'\u0200', 0}, // U+0200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE + {'\u2000', 0}, // U+2000 EN QUAD + + // The want values below can be verified by running the ttx tool on + // Go-Regular.ttf. + // + // The actual values are ad hoc, and result from whatever tools the + // Bigelow & Holmes type foundry used and the order in which they + // crafted the glyphs. They may change over time as newer versions of + // the font are released. In practice, though, running this test with + // coverage analysis suggests that it covers both the zero and non-zero + // cmapEntry16.offset cases for a format-4 cmap table. + + {'\u0020', 3}, // U+0020 SPACE + {'\u0021', 4}, // U+0021 EXCLAMATION MARK + {'\u0022', 5}, // U+0022 QUOTATION MARK + {'\u0023', 6}, // U+0023 NUMBER SIGN + {'\u0024', 223}, // U+0024 DOLLAR SIGN + {'\u0025', 7}, // U+0025 PERCENT SIGN + {'\u0026', 8}, // U+0026 AMPERSAND + {'\u0027', 9}, // U+0027 APOSTROPHE + + {'\u03bd', 423}, // U+03BD GREEK SMALL LETTER NU + {'\u03be', 424}, // U+03BE GREEK SMALL LETTER XI + {'\u03bf', 438}, // U+03BF GREEK SMALL LETTER OMICRON + {'\u03c0', 208}, // U+03C0 GREEK SMALL LETTER PI + {'\u03c1', 425}, // U+03C1 GREEK SMALL LETTER RHO + {'\u03c2', 426}, // U+03C2 GREEK SMALL LETTER FINAL SIGMA + } + + var b Buffer + for _, tc := range testCases { + got, err := f.GlyphIndex(&b, tc.r) + if err != nil { + t.Errorf("r=%q: %v", tc.r, err) + continue + } + if got != tc.want { + t.Errorf("r=%q: got %d, want %d", tc.r, got, tc.want) + continue + } + } +} + +func TestGlyphIndex(t *testing.T) { + data, err := ioutil.ReadFile(filepath.FromSlash("../testdata/cmapTest.ttf")) + if err != nil { + t.Fatal(err) + } + + for _, format := range []int{-1, 0, 4, 12} { + testGlyphIndex(t, data, format) + } +} + +func testGlyphIndex(t *testing.T, data []byte, cmapFormat int) { + if cmapFormat >= 0 { + originalSupportedCmapFormat := supportedCmapFormat + defer func() { + supportedCmapFormat = originalSupportedCmapFormat + }() + supportedCmapFormat = func(format, pid, psid uint16) bool { + return int(format) == cmapFormat && originalSupportedCmapFormat(format, pid, psid) + } + } + + f, err := Parse(data) + if err != nil { + t.Errorf("cmapFormat=%d: %v", cmapFormat, err) + return + } + + testCases := []struct { + r rune + want GlyphIndex + }{ + // Glyphs that aren't present in cmapTest.ttf. + {'?', 0}, + {'\ufffd', 0}, + {'\U0001f4a9', 0}, + + // For a .TTF file, FontForge maps: + // - ".notdef" to glyph index 0. + // - ".null" to glyph index 1. + // - "nonmarkingreturn" to glyph index 2. + + {'/', 0}, + {'0', 3}, + {'1', 4}, + {'2', 5}, + {'3', 0}, + + {'@', 0}, + {'A', 6}, + {'B', 7}, + {'C', 0}, + + {'`', 0}, + {'a', 8}, + {'b', 0}, + + // Of the remaining runes, only U+00FF LATIN SMALL LETTER Y WITH + // DIAERESIS is in both the Mac Roman encoding and the cmapTest.ttf + // font file. + {'\u00fe', 0}, + {'\u00ff', 9}, + {'\u0100', 10}, + {'\u0101', 11}, + {'\u0102', 0}, + + {'\u4e2c', 0}, + {'\u4e2d', 12}, + {'\u4e2e', 0}, + + {'\U0001f0a0', 0}, + {'\U0001f0a1', 13}, + {'\U0001f0a2', 0}, + + {'\U0001f0b0', 0}, + {'\U0001f0b1', 14}, + {'\U0001f0b2', 15}, + {'\U0001f0b3', 0}, + } + + var b Buffer + for _, tc := range testCases { + want := tc.want + switch { + case cmapFormat == 0 && tc.r > '\u007f' && tc.r != '\u00ff': + // cmap format 0, with the Macintosh Roman encoding, can only + // represent a limited set of non-ASCII runes, e.g. U+00FF. + want = 0 + case cmapFormat == 4 && tc.r > '\uffff': + // cmap format 4 only supports the Basic Multilingual Plane (BMP). + want = 0 + } + + got, err := f.GlyphIndex(&b, tc.r) + if err != nil { + t.Errorf("cmapFormat=%d, r=%q: %v", cmapFormat, tc.r, err) + continue + } + if got != want { + t.Errorf("cmapFormat=%d, r=%q: got %d, want %d", cmapFormat, tc.r, got, want) + continue + } + } +} + func TestPostScriptSegments(t *testing.T) { // wants' vectors correspond 1-to-1 to what's in the CFFTest.sfd file, // although OpenType/CFF and FontForge's SFD have reversed orders. @@ -226,40 +384,32 @@ func TestTrueTypeSegments(t *testing.T) { } func testSegments(t *testing.T, filename string, wants [][]Segment) { - data, err := ioutil.ReadFile(filepath.Join("..", "testdata", filename)) + data, err := ioutil.ReadFile(filepath.FromSlash("../testdata/" + filename)) if err != nil { - t.Fatal(err) + t.Fatalf("ReadFile: %v", err) } f, err := Parse(data) if err != nil { - t.Fatal(err) + t.Fatalf("Parse: %v", err) } + ppem := fixed.Int26_6(f.UnitsPerEm()) if ng := f.NumGlyphs(); ng != len(wants) { t.Fatalf("NumGlyphs: got %d, want %d", ng, len(wants)) } var b Buffer -loop: for i, want := range wants { - got, err := f.LoadGlyph(&b, GlyphIndex(i), nil) + got, err := f.LoadGlyph(&b, GlyphIndex(i), ppem, nil) if err != nil { t.Errorf("i=%d: LoadGlyph: %v", i, err) continue } - if len(got) != len(want) { - t.Errorf("i=%d: got %d elements, want %d\noverall:\ngot %v\nwant %v", - i, len(got), len(want), got, want) + if err := checkSegmentsEqual(got, want); err != nil { + t.Errorf("i=%d: %v", i, err) continue } - for j, g := range got { - if w := want[j]; g != w { - t.Errorf("i=%d: element %d:\ngot %v\nwant %v\noverall:\ngot %v\nwant %v", - i, j, g, w, got, want) - continue loop - } - } } - if _, err := f.LoadGlyph(nil, 0xffff, nil); err != ErrNotFound { + if _, err := f.LoadGlyph(nil, 0xffff, ppem, nil); err != ErrNotFound { t.Errorf("LoadGlyph(..., 0xffff, ...):\ngot %v\nwant %v", err, ErrNotFound) } @@ -270,3 +420,131 @@ loop: t.Errorf("Name:\ngot %q\nwant %q", name, want) } } + +func TestPPEM(t *testing.T) { + data, err := ioutil.ReadFile(filepath.FromSlash("../testdata/glyfTest.ttf")) + if err != nil { + t.Fatalf("ReadFile: %v", err) + } + f, err := Parse(data) + if err != nil { + t.Fatalf("Parse: %v", err) + } + var b Buffer + x, err := f.GlyphIndex(&b, '1') + if err != nil { + t.Fatalf("GlyphIndex: %v", err) + } + if x == 0 { + t.Fatalf("GlyphIndex: no glyph index found for the rune '1'") + } + + testCases := []struct { + ppem fixed.Int26_6 + want []Segment + }{{ + ppem: fixed.Int26_6(12 << 6), + want: []Segment{ + moveTo(77, 0), + lineTo(77, 614), + lineTo(230, 614), + lineTo(230, 0), + lineTo(77, 0), + }, + }, { + ppem: fixed.Int26_6(2048), + want: []Segment{ + moveTo(205, 0), + lineTo(205, 1638), + lineTo(614, 1638), + lineTo(614, 0), + lineTo(205, 0), + }, + }} + + for i, tc := range testCases { + got, err := f.LoadGlyph(&b, x, tc.ppem, nil) + if err != nil { + t.Errorf("i=%d: LoadGlyph: %v", i, err) + continue + } + if err := checkSegmentsEqual(got, tc.want); err != nil { + t.Errorf("i=%d: %v", i, err) + continue + } + } +} + +func TestGlyphName(t *testing.T) { + f, err := Parse(goregular.TTF) + if err != nil { + t.Fatalf("Parse: %v", err) + } + + testCases := []struct { + r rune + want string + }{ + {'\x00', "NULL"}, + {'!', "exclam"}, + {'A', "A"}, + {'{', "braceleft"}, + {'\u00c4', "Adieresis"}, // U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS + {'\u2020', "dagger"}, // U+2020 DAGGER + {'\u2660', "spade"}, // U+2660 BLACK SPADE SUIT + {'\uf800', "gopher"}, // U+F800 + {'\ufffe', ".notdef"}, // Not in the Go Regular font, so GlyphIndex returns (0, nil). + } + + var b Buffer + for _, tc := range testCases { + x, err := f.GlyphIndex(&b, tc.r) + if err != nil { + t.Errorf("r=%q: GlyphIndex: %v", tc.r, err) + continue + } + got, err := f.GlyphName(&b, x) + if err != nil { + t.Errorf("r=%q: GlyphName: %v", tc.r, err) + continue + } + if got != tc.want { + t.Errorf("r=%q: got %q, want %q", tc.r, got, tc.want) + continue + } + } +} + +func TestBuiltInPostNames(t *testing.T) { + testCases := []struct { + x GlyphIndex + want string + }{ + {0, ".notdef"}, + {1, ".null"}, + {2, "nonmarkingreturn"}, + {13, "asterisk"}, + {36, "A"}, + {93, "z"}, + {123, "ocircumflex"}, + {202, "Edieresis"}, + {255, "Ccaron"}, + {256, "ccaron"}, + {257, "dcroat"}, + {258, ""}, + {999, ""}, + {0xffff, ""}, + } + + for _, tc := range testCases { + if tc.x >= numBuiltInPostNames { + continue + } + i := builtInPostNamesOffsets[tc.x+0] + j := builtInPostNamesOffsets[tc.x+1] + got := builtInPostNamesData[i:j] + if got != tc.want { + t.Errorf("x=%d: got %q, want %q", tc.x, got, tc.want) + } + } +} diff --git a/vendor/golang.org/x/image/font/sfnt/truetype.go b/vendor/golang.org/x/image/font/sfnt/truetype.go index 851904d103..c0eefba562 100644 --- a/vendor/golang.org/x/image/font/sfnt/truetype.go +++ b/vendor/golang.org/x/image/font/sfnt/truetype.go @@ -113,6 +113,11 @@ func appendGlyfSegments(dst []Segment, data []byte) ([]Segment, error) { return nil, errInvalidGlyphData } + // TODO: support compound glyphs. + if numContours < 0 { + return nil, errUnsupportedCompoundGlyph + } + // Skip the hinting instructions. index += 2 if index > len(data) { @@ -124,19 +129,14 @@ func appendGlyfSegments(dst []Segment, data []byte) ([]Segment, error) { return nil, errInvalidGlyphData } - // TODO: support compound glyphs. - if numContours < 0 { - return nil, errUnsupportedCompoundGlyph - } - // For simple (non-compound) glyphs, the remainder of the glyf data // consists of (flags, x, y) points: the Bézier curve segments. These are - // stored in columns (all the flags first, then all the x co-ordinates, - // then all the y co-ordinates), not rows, as it compresses better. + // stored in columns (all the flags first, then all the x coordinates, then + // all the y coordinates), not rows, as it compresses better. // // Decoding those points in row order involves two passes. The first pass // determines the indexes (relative to the data slice) of where the flags, - // the x co-ordinates and the y co-ordinates each start. + // the x coordinates and the y coordinates each start. flagIndex := int32(index) xIndex, yIndex, ok := findXYIndexes(data, index, numPoints) if !ok { @@ -357,9 +357,18 @@ func (g *glyfIter) nextSegment() (ok bool) { return true } + // Convert the tuple (g.x, g.y) to a fixed.Point26_6, since the latter + // is what's held in a Segment. The input (g.x, g.y) is a pair of int16 + // values, measured in font units, since that is what the underlying + // format provides. The output is a pair of fixed.Int26_6 values. A + // fixed.Int26_6 usually represents a 26.6 fixed number of pixels, but + // this here is just a straight numerical conversion, with no scaling + // factor. A later step scales the Segment.Args values by such a factor + // to convert e.g. 1792 font units to 10.5 pixels at 2048 font units + // per em and 12 ppem (pixels per em). p := fixed.Point26_6{ - X: fixed.Int26_6(g.x) << 6, - Y: fixed.Int26_6(g.y) << 6, + X: fixed.Int26_6(g.x), + Y: fixed.Int26_6(g.y), } if !g.firstOnCurveValid { diff --git a/vendor/golang.org/x/image/font/testdata/cmapTest.sfd b/vendor/golang.org/x/image/font/testdata/cmapTest.sfd new file mode 100644 index 0000000000..34c7cd6594 --- /dev/null +++ b/vendor/golang.org/x/image/font/testdata/cmapTest.sfd @@ -0,0 +1,265 @@ +SplineFontDB: 3.0 +FontName: cmapTest +FullName: cmapTest +FamilyName: cmapTest +Weight: Regular +Copyright: Copyright 2016 The Go Authors. All rights reserved.\nUse of this font is governed by a BSD-style license that can be found at https://golang.org/LICENSE. +Version: 001.000 +ItalicAngle: -11.25 +UnderlinePosition: -204 +UnderlineWidth: 102 +Ascent: 1638 +Descent: 410 +LayerCount: 2 +Layer: 0 1 "Back" 1 +Layer: 1 1 "Fore" 0 +XUID: [1021 367 888937226 7862908] +FSType: 8 +OS2Version: 0 +OS2_WeightWidthSlopeOnly: 0 +OS2_UseTypoMetrics: 1 +CreationTime: 1484386143 +ModificationTime: 1486021330 +PfmFamily: 17 +TTFWeight: 400 +TTFWidth: 5 +LineGap: 184 +VLineGap: 0 +OS2TypoAscent: 0 +OS2TypoAOffset: 1 +OS2TypoDescent: 0 +OS2TypoDOffset: 1 +OS2TypoLinegap: 184 +OS2WinAscent: 0 +OS2WinAOffset: 1 +OS2WinDescent: 0 +OS2WinDOffset: 1 +HheadAscent: 0 +HheadAOffset: 1 +HheadDescent: 0 +HheadDOffset: 1 +OS2Vendor: 'PfEd' +MarkAttachClasses: 1 +DEI: 91125 +LangName: 1033 +Encoding: UnicodeFull +UnicodeInterp: none +NameList: Adobe Glyph List +DisplaySize: -24 +AntiAlias: 1 +FitToEm: 1 +WinInfo: 126976 32 23 +BeginPrivate: 0 +EndPrivate +TeXData: 1 0 0 346030 173015 115343 0 -1048576 115343 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144 +BeginChars: 1114112 13 + +StartChar: zero +Encoding: 48 48 0 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: one +Encoding: 49 49 1 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: two +Encoding: 50 50 2 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: A +Encoding: 65 65 3 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: uni4E2D +Encoding: 20013 20013 4 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: u1F0A1 +Encoding: 127137 127137 5 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: ydieresis +Encoding: 255 255 6 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: Amacron +Encoding: 256 256 7 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: amacron +Encoding: 257 257 8 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: B +Encoding: 66 66 9 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: a +Encoding: 97 97 10 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: u1F0B1 +Encoding: 127153 127153 11 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar + +StartChar: u1F0B2 +Encoding: 127154 127154 12 +Width: 800 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +0 0 m 29,0,-1 + 400 800 l 25,1,-1 + 800 0 l 25,2,-1 + 0 0 l 29,0,-1 +EndSplineSet +Validated: 1 +EndChar +EndChars +EndSplineFont diff --git a/vendor/golang.org/x/image/font/testdata/cmapTest.ttf b/vendor/golang.org/x/image/font/testdata/cmapTest.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ebe6be200c38f0944875d06dfb97da6737d2fe68 GIT binary patch literal 2528 zcmeHJO>7%g5T3U`c9J$}0+bU9FI9>-H1^u9QW1qxC$`f{C7|X<;sV*&>s?FsuJNv; z=2kBJTp&_~R79l+goJ7dGluHJ(~m(4bXYgX{lJ8f3o%Zbs)W0fj%^oFBItj4MTqi`tVb8>8$fzbc{%N z(3eVeyV3vBXYWD31-f2Zi6rICAtL=t*bUbX8|^kCQ|~3{J#KBa(*H{9BiPyhs^{3{ zeH+gog6%iZxCfwjN`D!)QRt&yJv!IBM0w~O@6lRNvW)@#GUi`{eyDDrYtTGB2Ky=K z(zokQ|1$@dh|G`S(`p1^G`arBYgqpX>;ds!K`%bx?mTy3@(w?$Kb!je; zMm?a;z#Je%Te@Tb?=n5W((W)+?7`hRJX0v_B&C#>p-ZtwCiR#{%{S<{7-rti=|50K zyN|Gx*}EGp*|#eaJzXi3=>@Xd?L=j#LR%^mwGYljWh6;}qfRO}&Tp?_vKxqN!VA?@ zoKR^7@bDh!{NU%-EE0~jIYiez8yakbczGQ62gh})B!DDBPc(V>x{!y`i@ zc}?z&iiU&*{Hc7w-EHcbopA$i}ju z9`REwYm^j!#Bw19lIYDagW^Q^;PZOyl8|Yif>* zjCqeP&@*%zH7d|7)-Ld`#dOeEZB|_`l36P=F6TW*&IB^oioBp1rev;Glgb>*rV~2N z6{no)TL>K)RAl5;Ls<#@NP@e;iqrI+vRq!3ww#*FkA=}{&5^Zg$?@SId3GdAwl9|* z%xU>$3EhjLMmUj9yFtzN-Bi$Y(`Qak7iQ-Q$gD(lq|ZOPT>c0E{sPQ9A*8c_Tq*y%dpzBPZmY#UN(K@K_l*+#9DW zr9~{pZB$h$NVFUWO(||61zL2PVKwljWo1&9WdYeE8cqaGaQpX9sV(rW<68~4!B$K(iU1|n?(vEq{uO2I8^NCibXyr1BO~owBaRq*B kwfKbcsecfd0YWAU72rG+zxMds->|a1zJ5dTtqW)W2JJ_Dr~m)} literal 0 HcmV?d00001 diff --git a/vendor/golang.org/x/image/testdata/go-turns-two-down-ab.png b/vendor/golang.org/x/image/testdata/go-turns-two-down-ab.png index 317c3afa150cc94b05cb6235deded60c0ed902e0..ed5a2f6b23d6ed1938b8428d5e0694fa8e1a51c8 100644 GIT binary patch literal 21092 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 diff --git a/vendor/golang.org/x/image/testdata/go-turns-two-down-cr.png b/vendor/golang.org/x/image/testdata/go-turns-two-down-cr.png index ad1c20a2f03cb0ae8571f15f69de6be3c3509158..633354d5230abe8e2cc225aea7378c41c5ee2ece 100644 GIT binary patch literal 19141 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 UYZCkOLI3~&07*qoM6N<$g3`8@qW}N^ literal 19519 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 J%7&2qXKx)qTigmeJa z+adECDwr|)>sp$(5~W?VWrT1_ouAdlO@_}@fD*5G1ziyCgdG1W00960f-pghNr$&A P00000NkvXXu0mjfJn*VZ literal 21504 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

    *F5ca|KKkJyuyo2 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 diff --git a/vendor/golang.org/x/image/testdata/go-turns-two-rotate-ab.png b/vendor/golang.org/x/image/testdata/go-turns-two-rotate-ab.png index 04fceaa77cf773ccef36f3291f55dfeceb7f226c..a3703a92af89dcc369858e2fe732dc7213e362e0 100644 GIT binary patch literal 7417 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 literal 7654 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 UQNQP(A^-pY07*qoM6N<$f+6j@VgLXD diff --git a/vendor/golang.org/x/image/testdata/go-turns-two-rotate-bl.png b/vendor/golang.org/x/image/testdata/go-turns-two-rotate-bl.png index c8b717e2220c3dd6c36eff35eabd7fb0394141d9..23105b3bd9eb839b3750685c1b59aab4df374f09 100644 GIT binary patch literal 7421 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%0DH4N|CRC8C8@&;u3iA?0rs&l~(HvauQain6AgB z1!0NV@GZI3HRiM4)$U6o^JgW3LddV3!{sqqDgr8a7h)UJxQxq^lI_%Pmbjo_u(3~b&o2VQ0WnI%4t4cLQW7D@GUeAxJH_WnL}*x)wE%phi$sS_7>xM)p1=fjRP=c!{uN zNP$!25R25hr@5bTW9Ri4cNVDK^pBkM<@p1COr@A7R*KPHuC|gYZ6uSkpZ)Kc+?8X0l6SsdoyRkz9 z?|mRIKg9J&SPx)D9DrkSh~*QJDTHC38%u5UT@F2`2C^YGol=cWNx~2v23t4Sre&GN z1wzD_w<0@|EpZRg%_&drCw}KEH#O{Q*-f6^dH;h#>eH`Z{obvJ6>ta*LR-Ug(g98Y4FDU1N}2MxbOen?XUJNT6qn;*=E;V^E{BbuwV(Aet9jWn+bk`J zQ$<}QrGKg$Z+y&e(w^3V@()#HpL)IYd>ujuI4hNiM1V3|pBf)~l-4Te^zq_gj-x#e zZWuPpWc*;~+03)^L8;P%I^ZUxL_{hBsHZgMZ)s2W@hac~rUY zh+4q-2sp3XhsbC#dVc*JVr-6MbDXw|S4&VnC?Bl|5+jl#&`3!{$!)99|I2RaVPo&R zmjUvx9~wl$km&q?^;wdBT3Au$oEPuLNtRfj0#YuiXYT6EKQW*Z{%a4+?Tq%D*&RI8 z^-I&X?ph!+iZ%^c%?L4;4lwx;$9X=EF($5i9oM}d8RReByN$WfKiF>jIi&#b9o_NE z{sa*u<$Qj`I){ZQ#7rSlNH&XAiV3A|46R!y?w-`0J&1a>ulN&SzFP4i$RIi87y@Tr z_Z6WkNh^W;;OQM_tJUtnv%Y5Uaitso%GiSlCQ)^c8IV|EUDqfk2(-?5y$$T{AD;i7 ze!PMqK!{qY`UtyvQWy%U51!ui4!$R~yY#HD*?Tq<0DSr2VBPUn7kt*8BX1W@)$TH9 zeM9@w-oEjOA`p=8I!$*yqOaTA4%TX4yeyLHJ5S?X59IgR-RG=tXm2-6tG!J<>+NZ8 vQ_p&P+A~+Zc(b(+2R>KEU?c0FUmbNuSwY97*E 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 O0000k literal 7808 zcmV-`9)ID9P)#P=t^Ogi%N!q=1lk2@kv? zBpwh#2!zD!A;j%Y(uq5^X}1$Pi61~AV7L4Bt>M%;dt4*mzjnFP58Zaxy)|^uU48DU zy4Clb+Uwi@@O}UPucO#^9k561?JaTJ7w}tYJp$_z>k(L&SdYNE#CinQCDtRbF0meg zb&2%|tV^s%U|nL}8d&!~`|NG~>IYu@R^-kbk-GasAG`Src(8Rlmc{vRet-PzZy6K2 z1!!il{p@owu^0&}f^5DBz$K+rc&Nn(KX{YZ zbE&0n`1c9HQ%pc-Mhc+iZ;}Lbg7KKTFMg2=RzLlL8@{l&vu-qIO)oqTusGuxCKe*I zJ`FZ>qu&p%AKm1<3n9kXed&dpys)>qZq%}bfCKW#Qi#cUW<#2+?+Bv+2+Kk*nxd(6 zVT4k={o*gcQx_lj&`n<9w_Z0Fv%(jjhbcK9VM@akMjJ;LyTP5eV>?*bT2q;WRk>M} zi&~cjA{gR+4s0x~o_R;a{+qKbPwquvP4K(HwWIIHaNbVa{Q$5KycV_b@WF(CR>lat zRK_a-vi1u6xUoxpt93(Q?SJ;O&H)H+eS}Q`sa*$~n$GqkENh&+Qix_kE31_h zWKu9HUKpt*qrW9Se(C4&KlJ;5|IJ+Ro35Jx>*S|D<9)>TBNHKVJbd7A#$9KDSKE68 zd!>mt2&sHvK(nw>sYE$52_&`e*u9{eBbRrb`xO5nIMRH$3jRhWk`uTpR6My zVYF`QYPqQ3iLfR`IH?e&^#GSi!IWY_F{7AfOyUh+`aI|b|K8ts0~i0sb?sn%<5Qo) zh8fuf2S^-=PA9Dc3`vkN$&$-OQyp#=hwG*)wb8QB@JGQUN4ks-FHTCP(l9&<#dU^E z!Rr3UFY@2}1J`~1Z(P?77EFpf5O$R$j}j&W>IulSQl-(0IsvlPqB%NPZdOfM8h`~z z@jCCrIJt3(J^(CMdDg&xfmei;r6K_`o?iX}-GtwBL!|$D!Fu&mpAIB$c)-R|#!Co< zFZd*ks;&!dl+k9jtT*dLT~}pU7!9N0)`iheoele*5-2>ebixKuGgcX1gaibO7z=`$ zr(ga8z~%3`b}PF^uugyazhO%uFc-Ov0=$z;IH5=YOqrq#OR~6Bm1eQ17j;>bMNyRS zQlL2o*E_fE*y%1>8xYj1BK4Lnt*lKdH9cy>>mtEtVRv|^>BZ0E*EJuw#@K(2U`c`S z46@Ef$9l&+=SuTZNQz1o!B*ELNI_A^x+>Os8#lZR^|Kfq#`+tQTst zluf}a!vNW`6w699r6>(z9R0=+(#g;N+|h@wi;-OySlx5af&>7m!KL#)?GSoctSf{p zVM_cbYDTh0iU{TjZl$y~28mEdkWdhf2qhHuoj*Buubzy+3!VtD?r!wqN-itj6l`6K zz7gwME-Fz$A>~L1yuR@q6*k`W(T`mDrmhPtT&^di7?8TZi)TGTmS2KjsbmUKmLTZD zsH8=bf{GA`>InKd58zLnA1Q`iYrl4{f9-UHk!}|H@gwv2p}xCThfC?azyrYgAbll) z7i9)2`hcONuYc}y0PnYb^rKg}scQkNefF~sBH6KaNT*!{Sf?Ek@yUB8K-L3NAxMBS zvM^BBnSx!^KeFFOFPYcEi{!g@I6mpV{@UmQJ6~vgLA;0g01wa$VqPjq3G);n8~CA^ zi?BR#x&`ds&pZbN@BH8&ypnxg3s~3;_SQ}89C4>(Ctce0RF$y+i&;sri~{woG+`{_?Y=~>T^=653pSa|GVUwc1I zsgT}|K}NrnekEN6({L)5TpI)}(%9#nJ>5+w=Xi|2{AZ6XP4Uzd)$e#} zb@vFmNFOYV$BxRQgL1P}tCBS(XawFoN~)Dbl2;V!Ddv&T%5bS%obA8#d3;|#{eX~N zF<7`dWU|SL&hj1HaA55S2$0n5zH>6M{eFzrl&NfZ0omgxSyf^NYYNDl?sz-Cb~e6p zJpAuh+E3P7rjsU zGVm3QSRyGa0aH_?NvTA(`^D#1Kky)4d6i(D{@4E$Vst@(E_9Z`4e^Zl(hlLQwP$Bw znqh0W?KHO~_f_nH9me)|*4?|j!1-)xo@ z@G1)lst<;%Wh|hv$*cmIlSdXtk_e-t!dZ-9C(LN10)b~m#DpZ+@$)|eSAFcmm&=t` z2^OqABw>9TJ+aWAFqg$uIu2wMtI6Kxh2!ej1b zfbOpr<)SeMn`*r*no1q6ipP)YRbwU~gU8A; zNWv>u%Tg}DzWUs=PkiJOE#4~w>+C=Odu)BqgOlTf15z9W!beI~l&LbIpGMGgxQqvr z+^nGrbx{hTlfPD|u=FVYZL+Zy=RRy9u7yuUNLS2A`QWAvA;rF>09K+t7F+-TaT{i&pnJKG0%|uC zbZBOooCqmWQ^%zNc9%6acCIDzBoRtcVJC{SLdvwL<-UtT$YmqIU14poiCkz-lsggm z-87A32sV+OLUaN_w(IS7Hy&^MeLGIpW%(&L3j@gnn*wox_X0t{_2fr?=oY}*e)7M} z1-=L;N&?E6P=kI3UXak(ofL(ZxM&d&TRQysK|umI!(hkbk+_j!H=l~)K6^RjfB@(x7`hJRroKQ7r_fw zS(5N3GWGz*bp>FZf9BJ3a~W|17t1~IL!btj;71nW7B-VFPE)XzKnOS1`!Ec4929d2 zG`<0cOrf_f`2a65N>xj-GNNrD0~p-dn5enuFiJatxFWxSwE|v-P(F5jzlWJojn&jX zDEKAf)$!Tzjn~c*xfZnsJO_*7a9M_m8gaOoCqMRwZUL-Z28CgBMfyWx=L&AYutQ=4 zj=;(Rl^9RVu{Ajtd))jj+b!a-EJ7^-FAr1fI){*ha9@LT*0s?!<0WVNfm26z5Z#Wq zDyXOn=t$-f`wF~F1mgSN0RxC8Ttfj7lz7*>lkM1cqg|ON4r`ZtM+kJ_H&6YMKl}ju zd|0q{pZpY2W*SzYdLF_}39x$Hy9k)zhWX-%D8g`vT}KMXHiWkGyRAQO{BB`eElW79 z>pG~Lt_SBT4;GDB%c_RcxWroI(@8)9a5r%`q!A%sQZE*oNu^LAy=qExlHy|I8nF?1 za+=}*y5f=&k_sC_WSKyP!w1{!!-7S33bzwCG&2}-HjbbKvx+dE0BVS<4uMBc+&UXr zCa%HSI1ZuP$MdZ}10)mdr5pEq*LSd*vWjajiiGP^EkGV(w@*GP+xKa#;!uWFv0P{b zK}GRS@~W&f?hsV90=XLp*Y|E1ahs3_i-T3QUX&$SBgb$5?jQc6w*c1JfB26PDW4oH zQn-evFoYP<_OTx*g@aBf@Mz#gvX;%FH|sZ|Q645{eb=U~W`&Qnu+e#)Ld8-Yr)3;; zl=wjb>gA#vLJzCz6dQX!m1!vBSfqt1N}>_amk0tr$;l@;_~}`HayIn62je(gnY#zg zW(lkmN%aRctA_>4!K~&IJKT#4@Pt14`<*!6rt^J-7X%097&2F+ij~q*dzqrlLm?3n zZ9n>L7d8c7sR##BRLDX20*aFx2E57#6DN+Gnx-(cvB&QkO`3{06bz7!1w0k*PyI43 zee$hk$Hx;C_}R9ftgj1b@9J<>ElPuT#&tgZBY)x+!1~(1{WlX*8W8fJf|-j(aqir` zR@~e1^Nu6s=iwqQav>Bvh&CmufaNBjn}*=ehR~?E(5#V3*P(!)PTmFRNAM@FYCFhs zJF328edo{4$g|G08rCqYib0eQMOi5>>3zXR0#~~+y>frNciio}Npc1@3x)+c3QkMz z@8SdR_rbyX^?&^@t@j{PljYdJXsOaL27We**E)GR$k8c=cngt19vFa?NFWW$PO>+A z=&)0S|F9jS;m+^?c5jDJvylyO;8w9vK%vxw)6G7alR>_( zHF$Au`Pq~@L~|jjuO$$1cr_uQgMHzl{iKFkwtLyPeC%+m-8mI)Krh`^yDId2Y}44W z=)pvINsatTmOCrIe(C|%@wo#@+3u!sBI&nX6$RK=M0!mDZYcCV$kUOZ4-^&_g{(`Y zN0M3Ag+KFmKk+a~Js?=W_OJd0(m80sevBt=I@uxg;IELuybHV!B1%=1McLFaEf4p! z9@2zG#}U)LvW@J4S52g8>Ovar9+7>r$6=7R7h^Bn1S5nZ4hnQWfn#<-9q-eaB#Qn5jku7ORB(?dDngM$?&=Wtn0o=;Q= zJ?TEO4(Js-=$$6rq=hZJ!_Ne zLL4FjHAFF0RCR(aM&&INdn;^G)W(QZ|GBq!V`L|-uVB4YeJ4}0$&Zky(v&sTAT**G z$s(9l{OkYtM{fbFmw)0X{OS2rEV@waM!B8D-pk(e$xFvn5(p3)4!EfCpyn1rHW(C? zNpRB1=mj*3z@4vD(G+PYQdg!{vvY8%DYOV&AdwTO2qY1wkz9kwC!$t?Yf~Z*5T`}1 zfN5`s)ca8CWE6Bb7)he)A3`Hf3&oB8W^*ipkUTt4mj~-tKK94L|NM<`=do#d)X8=0 z>dxwkNjxljqq{@U-qJN z63K%FCZo_y)2@;4lz|jCSvf_L0i+BdyusldGy^zCmh1ShEEL`pd=-|(sA?4c!9V@+ zTL6pwum6*Fz1vRXf$QtoNp6|+(RglxfWDL3=&CYEKo!y-BV`zMmrK$^>*aJGq zaTWm!W)fitAxj@m(JPB1BJ)Hi6?Ir?0!f2df|^kyi?_pIu}^9TN|lAWpyr?=;{gOZ zDVPlM;Jm0!t3**KAa$@R50_N#v8k7s?*45svQdlLiNdQKX z-hi9b6|yx%KTL*tUm=(00$ElT`!Scv6P0>l4fAuNIxj(o|G!=>rqMY|MHHn+;7pAf z8swr@15m<)s>fM@N`xv{EOn%*=ZN^&)cRmmK;OW!aNB_I-~VTS^Qw@#1XwSfO6p;8 zq%~{#Xyq7+F*V57l9@_W4Yt$hw5V8JAU!2I8bD#?!lp7_kb@UUF=`#>mfqYyW;D=e zU>XMDrdTd(;=4kO6L>4t$+G3~nf+5omHse3AI!+F&y(R)4n0_z&9Ye58W7KKd<$UZ zGb9XqaLhYtLuqM}oscR;1DXu0=Svlq##frA))GaNfB*|ypusGTc%7>b>Ea*?Y)59i z2sp?^@C3<9Ljiwm3hNv&rr|$uB)BEPLJuzH0|)7Kr129)9?Dk>bGR;!R>fwavsv-K z_D}xmEr9jnSwUDu$lnOKf^^ARstn;u5u9;PYXg0^Qfwh(AxJqRIDrz;-Bo!4AwS5j zsDDA_K!TqIV2{x-UkJa{e4%0m_Rh%dBDq_n$u;T) z3u>bB#2wAH<=#5XCI_CpX959vk-7*fB}2S`-Xi4wGK-Ka8CgbdIFDS;r5<`Ueo|_2 zv^Gy1RgWK*2v~)oM$jkz;a|E1u!u_Mb4fAZ@JMqPk<+{*MRDaPIklw)S5l=+3J4~0 zS?~s$$j)OLxbt~uG!TUEa?K{@Nf-XQ1`)H3C;<-&4V@mCjf)Cm%(>kD!-Y^T5j^*n zh1pciex0Ks9h?mQdOnaM$TbtRcEkZR!c)-@T%kb+Xag@JlA4_rW(IEE=CRr&DUYdagD|&3or?CI_@p^ENLEV%~vKpw&3sD$fpkVW@8i-Wj+}tb7Vvq zefOVx*rL^gfc2~6CTl8K2RRm4A%r|%!`u(d!CJ2>w$c%Jtxc!Z&a-{zs8@~zKMgQ?N!C4Z;=+ zy|tlt)95W6rohH{p7Oj%@NquBlcQ3iT2&$oin)zAyW;%2(uF4`SQaY~p$s21?|7PM zG|kJz7g`<^xJO|nT}kI)vs}6`TK+pf{_$G?>tbC*WR}rVBq*9%)s2K;EsOyshC2}^ z--}^L?cVJM*cR6{B~8XmDoLSaW<^yc@YxG&5(Oboqg)|3rsyE>H_=KL_C;kWNgX!g zcXo1u+GJFkR>_;>grAa=iNb`UKC}?u@rgfstw_B&STHM|k-7jZW5u$N&E%5KWhv-> z%4#-@ZS1YPznkvw$K5za6?KEOKRH)cwbBMq%nXxAX7uv`av~y*x{AcxvgPIz_`oKQ zWs3|NRVjkAewy4c5?F)ceb3rX?mG?YP;wWg$fA6Xde^?*1gzg(p5gh|hRqyh*vzsK zhJE1U$o4H?R&r{@*r$&9eVWeN{?)VoxE;pWv%;E=_oL~Cvaa*-l6jmnWsd1*dKGiC z^P*so<_2u;!O9Ej8uO$YgrW6R5St4;{g}2byT6qXG}06+CAZ6>*Yg0t3}6n^MBeFoXgt&hhLquQuU%3dRnt5qXUHEm^3n6b zvneozpN056fBDC50;;!Jb$Iu(`|7qLLzwH5(1_E-&v)L)Az0hCao_rWvNl<6Cex&5 zt(F_UT=QlTi!$WXsY2!tQ2|U^b85QMKpPcC=Z_B&S(TGeQYr8$&%jLiLmqfOt-_V2 zc&0eg3*dv#Qj!1x6xT}^-niawJ?q_@0naa=l-YOaz9Z7oNEtG^9nCbF0gBo)@O;&# zeu#F8ZVDErR`a4rAlKA+P!W5MhT|d0H%Uz997$!GM00!in@g}AHcZi4x-YOV%A>h9 zT2`u}!*+&_;?ae~5B%*bs~UgXb-9Mc_Z*FQ{t6)Txb-5@tWhjuSh|4t;vAJF629d6 z42WlPW1Q+xR=g}(QADkoDI$#@d8*mxQl7Y=S_o>0N;I-ylNdZ7r!-k$9wv+6g_k5{ zL{m_oxisX}c-b?5=WksLDsQnKq{;f;qw&kfhSVatMXD$u6R8kF>A-5nI`910ladZL zxgkzfuoe6<6?AYU#!|3S(ul3PIG2<~B#mh^4x%j7sS-gn31`76h{3`zxbFm?qwRC2LMsTI772x0?GUArmSAxvd51;FBU z!()TME_6cNR=K@HOoEE9FwfAr)Cbmqr37lzPt@7>2u_s%YiFy@RC_CnkVN>{PyXbU zLhl0|B`@6xosA_Ok6u3!N7Jx76M z$a1>{+Ex@Sm5D*;Rw1@Aw%&Ci*WC?5y8}SwvZzu4xQa@c+8};GRx;-L0orH`}TF^sf*KTa0UGPw=R8^{28e#NkxCiHzPRCx^UJj$^CplUJuu|G2zhQBG=D_3>dms(eOcIUl!D64(x-o;-*qcrCwV;0vu=?2Qyt0_*F54?nhqqeXeC=-;Z_(Kt3Y)!DPD5?Du86 zZ-$ojdp)%EFk0*Bv<1KwtjMitijM66JFw>U%;WsO->2FO;+LVxPab{ZgH^k}+_q-j z>ZYUtzpmG(yJFiex*_(1?E7-)9TFtagog+gIHLawTn`b1XD-rRejH5a}3$B>niE;%2V) zt=5fxK;rxEI7X0}eAXL;)5Tp!XQf3#))UU^ekv!=eNr^YC+IT`AiM<)Z~w{7P1Hia z^}6ZLDP>tIy?9@ze3Uayj#`6su#yP`FFHa;U0p3zqED@((*O|VIj-M6Shw>*)bslC ziOEH-d^B~AN+CcTQ6U)t3m_`U0hks0$ST~{MZR&}f@QtF-giW5{Fk=ne6Td~O#OkM zVsnctTO7abu>PCt_CGxTdpF};rpbeo`P^cjij+c-!cOc%t1Ft!e&}_Zmi792&zfqA zzqBv25@&gyhO@cFd($~44 zA;sPaG3!m&`w!f0U&5QLcc^8(GuJ!Rvfi2N5m=X4kHEUbdIZ)b*8d9t0RR8p_X<-M SqJYu>0000s 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%0ASwP?=#Yiz#7U;mxU;Ve=x%tJUs&QepdwIXf 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 Z|Nj%1BL$8#CdmK*002ovPDHLkV1h6wLahJ* literal 9633 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 X6PP0fBqreu00000NkvXXu0mjfFf-^$ diff --git a/vendor/golang.org/x/image/testdata/go-turns-two-up-bl.png b/vendor/golang.org/x/image/testdata/go-turns-two-up-bl.png index c1bf630f43cab231766bc2621700425f9a1bb19b..4a2323dd16d17c226cade3af021a808d39628808 100644 GIT binary patch literal 9427 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 Z|NjaCD*st0Af^BS002ovPDHLkV1i_+eZ&9& literal 9639 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 diff --git a/vendor/golang.org/x/image/testdata/go-turns-two-up-cr.png b/vendor/golang.org/x/image/testdata/go-turns-two-up-cr.png index 0ac83002f18322b45d411a2415d7622318f37212..1d9603332d99c0fe610fbd69058dde3219f221e4 100644 GIT binary patch literal 10694 zcmV;%DLK}OP)003kN0ssI2LDpJc001eCNkl+ z>6YZijz5MaBFN0DZb|og?(zFSkRQQc{%4NuGj}9a;L>e;M)r^Zs`9b5i$Fn7zx4u$q>Lm{RUvB7B4XWl@Q23goN`IpYS`zW8)n- zulUvGWvU=*qBcaw&>{Y_#i?4OTNhF-h00T4tJ%2@u_xs(zVl^6nbNs_eo`J?zO^WO<+Z~@gf16+DH^YN? z@EQIiK2G`*{T^??lZU~4|Cr&) zkYkgA!dRSdjVio|^e>CmpWhht96M;H{_l7aJ|AUz3YDES0Hl-2$3DHb(BJJJ6*V*v zJ46?d{vvDh<1e{G1bJ;Z#`<0?@Mq&(4W8dWCFzv-_)`BX{H8Lmr5&H~T?n4V!|fYa zf_DdvFByaMTEe&YI?q&Xgkp3x5vSJm$Q1yl8XQ`2D&C8dLy!&yv_nsVw1b{w1;@s} zzV⩔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 diff --git a/vendor/golang.org/x/image/testdata/tux-rotate-ab.png b/vendor/golang.org/x/image/testdata/tux-rotate-ab.png index 181966caecc87ea63e6fd78b0f6aad3edda257b9..d604ec912da6ee9636acc2465416a09f8c6cbb89 100644 GIT binary patch literal 3340 zcma)9_dgVl8#i;L;<_Saugo)#oJh_JM_fks2-!QUGmdgxR(CSX*(2qI&}E)=g(xyF zk-bN@`}+I`-yfd!dY)h2@7MEsMxu$a?j;s378)9wOZs}+56-R2e*&O8*VJe_dKwzm zVSVkp=1+51b3FY(79rgOYopMdG({n1;VrP916=@K#mbq#i!c_fY9A~2ugOrvxMy6_ z*@l5f9RCi*S#$Rq5NPJ`86hg{&+-6xOH9g>F}^CUHsEa)nmz^wHQ>Sw1{Sdw=Id%~ z80{%?=?I~II@&$@*|NOc^aL}Xe>|#MIzWudi6N03J!lJiXr8d{e+ocRqTD8a zR$BN@HT@hNg$(`VJ{xaYgFseV`uNIBc;ngW)I%}zX+pXcm6dBD&C+eV7rOn!(o36vna1`9&#p5qE-t1DdpJ2cMMg$a&rYEO zEhpP#Zir7O^G609dS|bOiAo~YO|5_7>#xX&k&mdT#leDZKIG>wU-Cq3q9W8`=+9TjFXOV zAVB()@~vrQWSIWV!>jWB`ORd`3rq0$_WWpk+4gpT)-HS#3I`l67N$II(m01P{}>cj zQ45kbDmN=N#%5-61BF?borFd8(|Im;<6%jttgxMLkeE~+%e*T!+SiUmhpNMfcKHid zI8sJ322)-kfp)UBof;f8QRGr8O4Jtgz>L}>)vXF$vAIb<)i2X)jn_#(s{dpolihS{&rCk7Q?wPe@4M;^sC}m*m3Ccm19!XaH*2fPB;;R!3=0nPm1qnW@l%ItWO?pb@PdxdIkk4LgIR?8D-1C zpu>NGE8JXM3D2L?$7luy?ijwg#z5g#bO zOMl6k$fKpwBo5i>4~`w*3w0^sE7Ax==<2Vuccz9S!%mp4aX8fyL~;N>UFgqSUtf=7 zx?YYw}V-`J{1>}4u1ar?OHxV=;+7+Y-w&@ByNzPD@UItb@NUbb+ffKnzEtc{|6p0i2 z!|lI;f2d2FRMWxz=Wz#19nY`WfAX6laoBr#deTRqcb5sXu)c(hjE|@11i>|FV$F^i z9vl(Td=@yM%VIQFlLI~emuCG@{Ae?Jn&%~*#tIy8PPCx?Kk%exg{Lk!1eGtj8KOwtyVw5ZPAE*|5M3}ogN34*K6SLL?24dgHJoh(tXXMI*Jmemq|A&A`IeQ=Mo3nqOSdzUSqq7Q-(f zL{*%X98AV4rSR6#)jIa3zCl-x`5Rwq|pp50d%W#Wtc5VkXa-ZFF7P^o7d zcyUx}iN}oJ(;j5l*!w%r>!>hAaJAA40{t(JZ?I9Hm){ko$pPXZmJ9zeGEwiHGxQyg zmwM@x?uEt@P6)v(BYP{Oqd$Idnq|%Dn$XdJJCC++*PV^sRz10a*TniLOlD}V(%+<< zEyzmVD`4vYrwiM*Jc}Bwwq1()>r!wlN3yt&NP=gV*oXbacJoFU4lAPAV5T~9@uH5L zU5{%Ur+iYnJGLs@Z8g~(>U=Naw%gXdN z#GgC4`ulvU++rGl?yw4UuIzCY8YMU`kG(KJv32{ic5Fg@f7nZrhZMbwsB{9JPVB^f zWx8)=!k9^vobmlf<-JKI9?pktgFOd3b5Z<{O8T>_65}1#CmT6uhlU;?5E#GvPZWu1 z$$dpSoU=s_y7rdBx1iJy%;6=y)-#^YeSLk&VuckIPZTmDyRad0hdq*YX(PQO?;h2< zQsa7FyQ$k%*MF8Ykz%8%ijmNwY*H{25I-I_C||M1?IrsJ$s5MIsoFTMqFxPs*QKH2 zECN#5MW>34yxo6|ewHSbRCzKP8ZDt^zV*O}I96}D9HZH*5f0@&=g*(VXjnM@xftOi zf1cfw-Ti&H&NHj@81TuOZ(=T!C1ms3-amXPqFfhyf}R`oD>@=YN6APfe;J`rG?bOE zCy_v~?}|owa{@D2^}H!^>&wdqD^1PK+$W7s%^f%0ojf>Q)`%OO>~z|+Bx#dbTG+N^ zzi`aQHy& zz@3~C>iK3Huk%E1|AkYj_rM)O&jqw%*oYo2wyd#(69Q9vWcC)|2I3Dbj8)v}J=f?J z7y5C=I+x>~o}SK5?PY18Gn8CrxK>|KKue=-y1KG*Obq7c4F=WDeupM$X_`g%mPNlj zl{_}YuGS=Sl2Lk`_c_Uy8Hz?4-CESkfEO$cu`OTyWSXaZT#j7Sv3)@U%WG@i-rj4g ztDpB1fx2!~48`(rB}Vft9{&denLe2Fl8KeO8jQoxaxk&(O*!|EhZZHSPrD;ESsCZ_ z-UAg*R$ktD!tf$qEQ@}|PlXGE#*32!puFeXDP7n((>fa|QmZB~_p8QvKf-WTc5Sqs zW^iZ-$PzCPMq8yevP`$d7RBm(sT;kJy=kwJ`y0*JC2ca93OdYo;AdtM1PG?-sqo;0 zZ#BAi_~%9e3qR|<17Bcbg7{8HwiNbe1@4j|{ zO&J;BRJp@8h$oFt1WwIZpir9mndGVQVju8S!T#yPm0yjjDisVc)qmaWJUN#3pIS_&C znI;ArWsQ=^uYMw|D`t3$jiAp#s@n@~%^xE6*H3)e^Mx(cs4m}3`ZntVH%O}@t=p}? zqVYjB2Dp<{SK`NasF}~KE6ysuzuorWM2Mgs$bRUadNDXn|0b_YIkggqNfDZWKQg)tI_Di;fPAi?wYXJ%)1c6ZJ>NV5lqOaOiW1qB6@v5}s|RdxBlpr^XZ z@6W#Fqo#_GPTfnq|o69O*4jd1Ih&6~4TXt5wjd)BP>Ngr1f5 zVXpE>kC2N*i98wtrY=F4j`}2X?tLCr zQ7`T3@V9E3y(R_OXe1Tn)=?XESK)O3%mU!$IU(FOQ3NAR_C5H z*Mw6!iWwXi2)kX^UU(s$UGB;&8YR(2v1^fybbE`*)2#s$6tiDr>CbA z2n5{(W-Jb;ak<}fL)nX!nw`qxwuE-2=!bpC-;g&!%1am}Nym=k2`~e7LGBTBAWfDMO0&bInE-fvMkDJpl4b`w^RX%Er_pf_x5&%oIT-;3zNK-$B z`TO7Lkxx>JTW^n#r$qwW3nnisAhG zJSD89z4BcJk?Y5slLfRb)CCuN9puS}n(Bys!SyeAhX{2S2Wo2SIYwbOzScBg8tIK0qG|nh;t~quM`q~5p1Ox{w`zzFCq^C!<6saXia*j+9 zQh8nlKY#u>$NzBEm~nGx9#?j?Ujny$UlEISrt&GiKy&oJL6c6*)D-PrKr-9L}fVjuXas#*(zxLj*d&isSHm@cZva^5cHN#V3 zOb-A#|Dm2OI|-djB6z8+IEh66N#c@{&v)9jq*8ShVsr|N`5eQGe*1Qbd;pT9?jmf? z3bB=np2#i2nC^c5C!7hahtN6GJ^eN_qf)3~knE}6-@@Dj62=e7b=aAkn_F10-=l^} z5NygiUF>9`J|RCZ$@Ve;@-;c}7n1sqs$KH(AKEwHp|41MY9#)nVSjdKzVV@lN3a2- zA)A%7Q=E5)*L;Kb$Qvar7AsnfzHYBW6PrY}ojG*;CTlGm-@<8%SXSx}1f@$ap0He! zGIbog^{z*>hMphpF1CowPq-9IV(w!X&enk`&XYLP=L>#xi4;r_V`E%dffglL=b9X% zNHXZtha4kLw)0m@5yaLX=S|=LBu`k}YW4Zqp9=CZ`p`xp(~zZ5p8(7=sRR6qyN95h zPT^Bz)*usg*Cc&H4-i*#`uX{JddjMF7xee{-`&`%~$Xfh03kA&(6j=aAm!OX_Uvx40)N7?RIAhM<@KrdX zfyI$xkjih0Rf(B}hHyewq5-PC?>!l0IVJs6`yYpkid^NvknJKZgxu!F#rJAg^*r+z z8UP-K*=%PMQAfQ-dKbb2{$??|qxF$wYjSDvM(2}DLbYV3ys;?OG2jVFF?O_IWB3JC z#2Qh+;fCK#c(NBq?Tt>#98TOLx*B?5e%_P7pdfuLdD4n=VSoEK!gRCuwT=aYwap#O ze!KD#e)N2fCSAtnSM_S<%D4>g_a8q5C#Vo&p-C)T+`D|AZl%>UHK`VDPET7;RP_}D z^c(5GtVjpMZkK`{ykgyBQaXH?5|X#f3~wD9Jtx*;;CE*SBF59CT2YBot?itXt7(xp z#>2tjp}nmK%hRk=8>e>=XK@m37ted9UDaGEDj1PxqT_N08s?pZEbw@)b)9z|*+u#H zZWh56qD2@tJg7%5-!`qPtFN!LYr0ePH!3R1bqLdT^!0*Fx@y<3h$<4$jZaOGh6DZP zx5M!Bf4%O5+qZ!?iyf@KKkDGK ztm$($7goQ%Zb^9KWfR=eR#jD1Sm<;Kcx0gq9fA&$mI=O&l*b#zY3+Un4DKlgZ(ZG1 zf8XK#lg=@%KXztdyHjk>yoc%;n^R45cE~?0W5cJcK3lIITI=R#HHgX*(c!%f2NDy;nsfV?2z+!NkEa7v zi=&nMU!lgtvYd9J10l00b5vCEyJ!lQp~ITh&^=jK-F5i($6D{0lq}wqSmlAScrDB0bhmYc^(dp6?h*@i zFX;Q!6el;gH57W^QpA#OWBw`VBq;FdQMjk{@>n#K7E!3y*b`G0)C8>6Y-6XbpZjA8 zR#w2W>rSXhL%22=*b-MoE+ss{8m@Qw30XXHa6Qh8t~6#;^c3tQU@qzJkQd;Nzytz* zI@RyvB@sT7#}(-cKxMGp>mYjfyF5;rUGT7U|ErryOv}fAeXAa_LQe8Evu!(1pb!wm z&dfFaQscg%fMf56px#koymylg9%H(^9z$$?#7!I=ybpP|{rrM`!=1@Ch{lquyJK8X zlS#=8O01JNDNzvi^RF`*4b$5X0_5o)Kc`ngBn+q~Wxw@2vq?8t%zb+|q7==u#)Y*r z+1opKeJ4>eu4EWCEZX(P%V4&~i`EKKi#5t zcSe!wd{TUQEC9Pj88&YQ==4(oF6bhdiA(AM%QlF!^cGVjkDWz^3~|*V<@qmwYB@aV zaGX}tv`6vp-9EN%^Vp+i{*f2+Z$O`9NA=Z*8uSSSL$<^ma)fos6ENCK>r?*tL(b(Zf}J)Ir#EEjCtODucD! zXyzUgH~2e|3{~^>H_Yz3{p&c-Ku-7}_<*!C>O#qf10&JvNN7IoD&J2D4lN`dm`%VE zK+Gn5Th*`MlrSfGrbjDXk5bRShG4yEQPdsHh;%j+60=KSxA|Wr`2Q>1$yX+XOm;<; W)w=U&^j+Bx3S<2TdR01((f7|AeSgpAI^Q^BLv1E{Zh8O!z@)3AVM;k&|0hAz zl>G`#4Fmvgbm?lSn+N4?=GdZmEwa(X;-~ZDaxZ7M7<`1}8)0$&K7YFIb!;+H zvG&v+>LC4PD!LDe-8{-wM{Y8#vFRKlP|ixrck`TqUEkDVTtR8AZ0<90w_JLgrnVbf zXXh>KC;dn8tvbCm!`ry$O<(UH_KR9%wr-e*o)OEgE-VNUM~Xjpdm|>!0GF!2`u!q= z25Ix5oI$mAKmSjc4O(gKy|KhJyIBRK^A)K3H#aq8TE z(=9^nT~pJ`6EM0NlYUp(0c&BiJ=J!LygbWL%2hRb(oj+>!{b^{;9-sHPBT(D zT}qHVIy!nfQ}2mFVPLW{GCzL&pb>cS4Sy#A*61>O#85htL^J@JGdOq)B^akjQ2Uj$ zZ7qB~|MRP>HE;_rIW|50YBBWq@bGZH*|$py)6&vHcra?y2@%SEbh%&mKI)1sg8=FK z{m#Qeb}saI{tYwV_U0x=>;13i5QMNUYp-vd#!?rvs-3mZ#UnRJAq&r7V2y{ zJi*^QaVOH95engdW-c3BbTa2p^qHv_fiUW&MuD9%>n(;L-#I2`X7@T9O%wV-DTDpC zTgT9&#}B;naf&5R`S6O0ih29!VRLd-!=?{HsR%<$c z*|<5KHjy_r6p|vrmdN4Z;jc$C-oX@M)VTCg`o2BiN{Ltb1(e9o-zJl}xw%C-65=$z z)mE5`5Y>U&MP(p4v>zVh=C!Y=XEDoJ~?c7z^W&_w-9ZzzclAuunw^ zlxk^Po7g;)%T_S!J=Rcm4n`?ek5Db#i%DX9=Gfe;5 zarTH(d`Cw|1n@d}z&e9HPGcctfB4~>8#WmPUpre{TU|>7YXckNB|-Ahl0jEjS8upK z>dBK5V_`^)I>=^su*Mp-v+y-pc~3|AHgUy|L?Wr^Vt)5l2S)2`9S35CZU>(ru5=2G z`&^~@LjH8Ng`NlHbJ9eBS(AGULXV~=9l|MZWOQ^Cc@H=MkMOGVs-?!M29sY1IIu1c ztp?>cLA^g$JeR-t#vplcbR-LhueYek$;l}wC{P6Qd_AXNK7fuS8Iq{FIJMi+Xn3{} z&fPaEVLurh92}~`CqP44G6r?!<@%`~yeF$Dg3Any=kKsEinKJypdN-P@pxCInLyNH z1@;nH-K!HyM=V0rK|AeNmvRe1F2wu?AOQr3xL*s^es5x7A=K-a@$bEOk zQVRO>v;0%r%)-LsOQA@xAMe`n`9D~l8tb8?+5#Pu2tN{+ALCuKOeBSJGL? zY^@5J*^Vi?@(`8q-6aB|@Oim7pH-xvBfM1U8rAg9{I2rV-k>C(;){B_OXVs5J}5>xUgr0#CY=R6 z{3@JX!j(Wsy8S>=UcR|rfX^zY8o%^b&~zwAP~_8>Jv}2MBN=W2M2U2kS{&&D7O1F= zifP#UCR;u%1pwDXdPnb1_4~{U`-NaUt*bxb4OEtGt&Buwl*p=QI)4t&h|i z9;FIiC2jjq;KMGY|2vKojt}ys}6e8)#(UE^ksHJtR(ULKVD9`ZD5NUvg(2y6Fqv@^6en6zbgd%c&r{ZzYsj zy23hg2l$3IxGO5;LqC7#?P)Fz-p}e6D-WW-QY!yPjK5ZB8+Kz;#+J<0 zOV=V&a=#34%KV^Rh`X7tG-R)-4q4Q|9l!rhOG4!9JpE6jw+AlBS8>=;&TLduXv~ znVp1{Cno~(=lbg+Rrimom(WW{m|ecb_Ra97S^1L`k*EmXt2oIsEAZfoo}UKeA{*-T zbB9FTk9MeV>IiopcH`()wV;^Ts&i5=1E)mD#cpr99(^V(GU-|N$6U%TXlb2k zdnQ@LJDD4#Y99>H9NUTF zX=`iSd1i#G@d-wuP?Mp@xjeexvk$uYxNHDmj-S&;t#qqY%RqpXp1~6y90Y^Q#QfQ_ z*Shq7+=>(VVfztFnP-keOP!lZV~}8;Vf*=ZD;pb|e%Rrkwl`HFa^_NAz7`iOwfs=k z9#ECRdlUx>W1KY!puuqCxQhj0p3|J@FE$rIcqvvfUs~4x_2#l!`U3^3hM-0L5DGk{ zq@FMLv6M0n(p^k!&9095w^SV;9B3eZEl)KBI1oiS{mX_grQ(w9zg2k5vHS>fHGN|2 z#cFz_$>g;WUAnqvY znslI($}FHE(%>`u%F8J(Z=j9K1&>d{V7~l4nvE~Q$?EccJYItr*VM3h1WIJiHoaWj zk<1_4Dn5Q{l{a3l_y=N~A^OhcFY0&8!lv0b1a^iV_7oDWq9>yVfTOFHJY9HtzPQ

    ~J9b!W>`!@EcAlB-hgT79kQ!myAJmpCu6s3}q^D!`92|aLM~dbW&WF^( zH{Oz&DnD*;6m43Xq<~Y2Ys3Q8@Z~=2cWp+!lBXG5AVHmo40P&H6KPYB}GSd%m>-&H3J??R_w(=-)9?%Z3K$2 zxS+flPIH1QWB6|&;n*oj1w%5fZ4>pI6M^2R8UjX9X#l7g->Na;fBU@JeMR1&0wg6S z+HbZW5Xwkqit*gZ2qSRLIK|ASX=UV|9Dh~Y; zaE$56g4$oU*X=-R4+*;wOsI-t)5`Mr6sJ(K!)KVYdP~d>z4^z>wD6S(3``9`0~XHC z)-$*WNS3%xB}Cm#6@?al*~etG>&)vLW>|4NzJ>P=9U`8oDx7srPDniG}R1_iXH5@`=+ z#e(iJ%_3y(l4Bo&Z9wTrDi3w*N9qvm&%0M=flymJ&dvrcBeBfu(zDKyb-#mHXS2t- zp?a^QQzG8cV(HMdg|u&V>8%V8lbK7s{$`KFSFGy;S1`!&sVtTday&b=m%a|Enhv|J z!2z!$4^28aNPjZ?l+ZLeaW+1+kQFAFc?p;7BasuCZHFS z_CyIAcZrX}Yk6Pr$RA4A_k22&cw*0(E5`5JQ39ySoSS$0I^cJ$HlU|P>D?jb|7q_2 hcSG2DMME*NSLs_WzxAF)%1~S_Kv&aHqYB~p`oGGjXOaK_ literal 3751 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

    5# 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 literal 3055 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 iy8h?Ddrf= udpHeaderLen { @@ -149,6 +149,9 @@ func testOSVM(t *testing.T, filter []bpf.Instruction) (virtualMachine, func()) { p := ipv4.NewPacketConn(l) if err = p.SetBPF(prog); err != nil { + if err.Error() == "operation not supported" { // TODO: gross. remove once 19051 fixed. + t.Skip("Skipping until Issue 19051 is fixed.") + } t.Fatalf("failed to attach BPF program to listener: %v", err) } diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go index 134654cf7e..f143ed6a1e 100644 --- a/vendor/golang.org/x/net/context/context.go +++ b/vendor/golang.org/x/net/context/context.go @@ -7,7 +7,7 @@ // and between processes. // // Incoming requests to a server should create a Context, and outgoing calls to -// servers should accept a Context. The chain of function calls between must +// servers should accept a Context. The chain of function calls between must // propagate the Context, optionally replacing it with a modified copy created // using WithDeadline, WithTimeout, WithCancel, or WithValue. // @@ -16,14 +16,14 @@ // propagation: // // Do not store Contexts inside a struct type; instead, pass a Context -// explicitly to each function that needs it. The Context should be the first +// explicitly to each function that needs it. The Context should be the first // parameter, typically named ctx: // // func DoSomething(ctx context.Context, arg Arg) error { // // ... use ctx ... // } // -// Do not pass a nil Context, even if a function permits it. Pass context.TODO +// Do not pass a nil Context, even if a function permits it. Pass context.TODO // if you are unsure about which Context to use. // // Use context Values only for request-scoped data that transits processes and @@ -44,13 +44,13 @@ import "time" // Context's methods may be called by multiple goroutines simultaneously. type Context interface { // Deadline returns the time when work done on behalf of this context - // should be canceled. Deadline returns ok==false when no deadline is - // set. Successive calls to Deadline return the same results. + // should be canceled. Deadline returns ok==false when no deadline is + // set. Successive calls to Deadline return the same results. Deadline() (deadline time.Time, ok bool) // Done returns a channel that's closed when work done on behalf of this - // context should be canceled. Done may return nil if this context can - // never be canceled. Successive calls to Done return the same value. + // context should be canceled. Done may return nil if this context can + // never be canceled. Successive calls to Done return the same value. // // WithCancel arranges for Done to be closed when cancel is called; // WithDeadline arranges for Done to be closed when the deadline @@ -79,24 +79,24 @@ type Context interface { // a Done channel for cancelation. Done() <-chan struct{} - // Err returns a non-nil error value after Done is closed. Err returns + // Err returns a non-nil error value after Done is closed. Err returns // Canceled if the context was canceled or DeadlineExceeded if the - // context's deadline passed. No other values for Err are defined. + // context's deadline passed. No other values for Err are defined. // After Done is closed, successive calls to Err return the same value. Err() error // Value returns the value associated with this context for key, or nil - // if no value is associated with key. Successive calls to Value with + // if no value is associated with key. Successive calls to Value with // the same key returns the same result. // // Use context values only for request-scoped data that transits // processes and API boundaries, not for passing optional parameters to // functions. // - // A key identifies a specific value in a Context. Functions that wish + // A key identifies a specific value in a Context. Functions that wish // to store values in Context typically allocate a key in a global // variable then use that key as the argument to context.WithValue and - // Context.Value. A key can be any type that supports equality; + // Context.Value. A key can be any type that supports equality; // packages should define keys as an unexported type to avoid // collisions. // @@ -115,7 +115,7 @@ type Context interface { // // This prevents collisions with keys defined in other packages. // type key int // - // // userKey is the key for user.User values in Contexts. It is + // // userKey is the key for user.User values in Contexts. It is // // unexported; clients use user.NewContext and user.FromContext // // instead of using this key directly. // var userKey key = 0 @@ -134,14 +134,14 @@ type Context interface { } // Background returns a non-nil, empty Context. It is never canceled, has no -// values, and has no deadline. It is typically used by the main function, +// values, and has no deadline. It is typically used by the main function, // initialization, and tests, and as the top-level Context for incoming // requests. func Background() Context { return background } -// TODO returns a non-nil, empty Context. Code should use context.TODO when +// TODO returns a non-nil, empty Context. Code should use context.TODO when // it's unclear which Context to use or it is not yet available (because the // surrounding function has not yet been extended to accept a Context // parameter). TODO is recognized by static analysis tools that determine diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go index 9f0f90f1bc..72411b1b67 100644 --- a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go +++ b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_17_test.go @@ -19,6 +19,7 @@ func TestGo17Context(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "ok") })) + defer ts.Close() ctx := context.Background() resp, err := Get(ctx, http.DefaultClient, ts.URL) if resp == nil || err != nil { diff --git a/vendor/golang.org/x/net/context/go17.go b/vendor/golang.org/x/net/context/go17.go index f8cda19ada..d20f52b7de 100644 --- a/vendor/golang.org/x/net/context/go17.go +++ b/vendor/golang.org/x/net/context/go17.go @@ -35,8 +35,8 @@ func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { } // WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned // context's Done channel is closed when the deadline expires, when the returned // cancel function is called, or when the parent context's Done channel is // closed, whichever happens first. diff --git a/vendor/golang.org/x/net/context/pre_go17.go b/vendor/golang.org/x/net/context/pre_go17.go index 5a30acabd0..0f35592df5 100644 --- a/vendor/golang.org/x/net/context/pre_go17.go +++ b/vendor/golang.org/x/net/context/pre_go17.go @@ -13,7 +13,7 @@ import ( "time" ) -// An emptyCtx is never canceled, has no values, and has no deadline. It is not +// An emptyCtx is never canceled, has no values, and has no deadline. It is not // struct{}, since vars of this type must have distinct addresses. type emptyCtx int @@ -104,7 +104,7 @@ func propagateCancel(parent Context, child canceler) { } // parentCancelCtx follows a chain of parent references until it finds a -// *cancelCtx. This function understands how each of the concrete types in this +// *cancelCtx. This function understands how each of the concrete types in this // package represents its parent. func parentCancelCtx(parent Context) (*cancelCtx, bool) { for { @@ -134,14 +134,14 @@ func removeChild(parent Context, child canceler) { p.mu.Unlock() } -// A canceler is a context type that can be canceled directly. The +// A canceler is a context type that can be canceled directly. The // implementations are *cancelCtx and *timerCtx. type canceler interface { cancel(removeFromParent bool, err error) Done() <-chan struct{} } -// A cancelCtx can be canceled. When canceled, it also cancels any children +// A cancelCtx can be canceled. When canceled, it also cancels any children // that implement canceler. type cancelCtx struct { Context @@ -193,8 +193,8 @@ func (c *cancelCtx) cancel(removeFromParent bool, err error) { } // WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned // context's Done channel is closed when the deadline expires, when the returned // cancel function is called, or when the parent context's Done channel is // closed, whichever happens first. @@ -226,8 +226,8 @@ func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { return c, func() { c.cancel(true, Canceled) } } -// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to -// implement Done and Err. It implements cancel by stopping its timer then +// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to +// implement Done and Err. It implements cancel by stopping its timer then // delegating to cancelCtx.cancel. type timerCtx struct { *cancelCtx @@ -281,7 +281,7 @@ func WithValue(parent Context, key interface{}, val interface{}) Context { return &valueCtx{parent, key, val} } -// A valueCtx carries a key-value pair. It implements Value for that key and +// A valueCtx carries a key-value pair. It implements Value for that key and // delegates all other calls to the embedded Context. type valueCtx struct { Context diff --git a/vendor/golang.org/x/net/dns/dnsmessage/message.go b/vendor/golang.org/x/net/dns/dnsmessage/message.go new file mode 100644 index 0000000000..da43b0ba48 --- /dev/null +++ b/vendor/golang.org/x/net/dns/dnsmessage/message.go @@ -0,0 +1,1418 @@ +// 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. + +// Package dnsmessage provides a mostly RFC 1035 compliant implementation of +// DNS message packing and unpacking. +// +// This implementation is designed to minimize heap allocations and avoid +// unnecessary packing and unpacking as much as possible. +package dnsmessage + +import ( + "errors" +) + +// Packet formats + +// A Type is a type of DNS request and response. +type Type uint16 + +// A Class is a type of network. +type Class uint16 + +// An OpCode is a DNS operation code. +type OpCode uint16 + +// An RCode is a DNS response status code. +type RCode uint16 + +// Wire constants. +const ( + // ResourceHeader.Type and Question.Type + TypeA Type = 1 + TypeNS Type = 2 + TypeCNAME Type = 5 + TypeSOA Type = 6 + TypePTR Type = 12 + TypeMX Type = 15 + TypeTXT Type = 16 + TypeAAAA Type = 28 + TypeSRV Type = 33 + + // Question.Type + TypeWKS Type = 11 + TypeHINFO Type = 13 + TypeMINFO Type = 14 + TypeAXFR Type = 252 + TypeALL Type = 255 + + // ResourceHeader.Class and Question.Class + ClassINET Class = 1 + ClassCSNET Class = 2 + ClassCHAOS Class = 3 + ClassHESIOD Class = 4 + + // Question.Class + ClassANY Class = 255 + + // Message.Rcode + RCodeSuccess RCode = 0 + RCodeFormatError RCode = 1 + RCodeServerFailure RCode = 2 + RCodeNameError RCode = 3 + RCodeNotImplemented RCode = 4 + RCodeRefused RCode = 5 +) + +var ( + // ErrNotStarted indicates that the prerequisite information isn't + // available yet because the previous records haven't been appropriately + // parsed or skipped. + ErrNotStarted = errors.New("parsing of this type isn't available yet") + + // ErrSectionDone indicated that all records in the section have been + // parsed. + ErrSectionDone = errors.New("parsing of this section has completed") + + errBaseLen = errors.New("insufficient data for base length type") + errCalcLen = errors.New("insufficient data for calculated length type") + errReserved = errors.New("segment prefix is reserved") + errTooManyPtr = errors.New("too many pointers (>10)") + errInvalidPtr = errors.New("invalid pointer") + errResourceLen = errors.New("insufficient data for resource body length") + errSegTooLong = errors.New("segment length too long") + errZeroSegLen = errors.New("zero length segment") + errResTooLong = errors.New("resource length too long") + errTooManyQuestions = errors.New("too many Questions to pack (>65535)") + errTooManyAnswers = errors.New("too many Answers to pack (>65535)") + errTooManyAuthorities = errors.New("too many Authorities to pack (>65535)") + errTooManyAdditionals = errors.New("too many Additionals to pack (>65535)") +) + +type nestedError struct { + // s is the current level's error message. + s string + + // err is the nested error. + err error +} + +// nestedError implements error.Error. +func (e *nestedError) Error() string { + return e.s + ": " + e.err.Error() +} + +// Header is a representation of a DNS message header. +type Header struct { + ID uint16 + Response bool + OpCode OpCode + Authoritative bool + Truncated bool + RecursionDesired bool + RecursionAvailable bool + RCode RCode +} + +func (m *Header) pack() (id uint16, bits uint16) { + id = m.ID + bits = uint16(m.OpCode)<<11 | uint16(m.RCode) + if m.RecursionAvailable { + bits |= headerBitRA + } + if m.RecursionDesired { + bits |= headerBitRD + } + if m.Truncated { + bits |= headerBitTC + } + if m.Authoritative { + bits |= headerBitAA + } + if m.Response { + bits |= headerBitQR + } + return +} + +// Message is a representation of a DNS message. +type Message struct { + Header + Questions []Question + Answers []Resource + Authorities []Resource + Additionals []Resource +} + +type section uint8 + +const ( + sectionHeader section = iota + sectionQuestions + sectionAnswers + sectionAuthorities + sectionAdditionals + sectionDone + + headerBitQR = 1 << 15 // query/response (response=1) + headerBitAA = 1 << 10 // authoritative + headerBitTC = 1 << 9 // truncated + headerBitRD = 1 << 8 // recursion desired + headerBitRA = 1 << 7 // recursion available +) + +var sectionNames = map[section]string{ + sectionHeader: "header", + sectionQuestions: "Question", + sectionAnswers: "Answer", + sectionAuthorities: "Authority", + sectionAdditionals: "Additional", +} + +// header is the wire format for a DNS message header. +type header struct { + id uint16 + bits uint16 + questions uint16 + answers uint16 + authorities uint16 + additionals uint16 +} + +func (h *header) count(sec section) uint16 { + switch sec { + case sectionQuestions: + return h.questions + case sectionAnswers: + return h.answers + case sectionAuthorities: + return h.authorities + case sectionAdditionals: + return h.additionals + } + return 0 +} + +func (h *header) pack(msg []byte) []byte { + msg = packUint16(msg, h.id) + msg = packUint16(msg, h.bits) + msg = packUint16(msg, h.questions) + msg = packUint16(msg, h.answers) + msg = packUint16(msg, h.authorities) + return packUint16(msg, h.additionals) +} + +func (h *header) unpack(msg []byte, off int) (int, error) { + newOff := off + var err error + if h.id, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"id", err} + } + if h.bits, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"bits", err} + } + if h.questions, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"questions", err} + } + if h.answers, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"answers", err} + } + if h.authorities, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"authorities", err} + } + if h.additionals, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"additionals", err} + } + return newOff, nil +} + +func (h *header) header() Header { + return Header{ + ID: h.id, + Response: (h.bits & headerBitQR) != 0, + OpCode: OpCode(h.bits>>11) & 0xF, + Authoritative: (h.bits & headerBitAA) != 0, + Truncated: (h.bits & headerBitTC) != 0, + RecursionDesired: (h.bits & headerBitRD) != 0, + RecursionAvailable: (h.bits & headerBitRA) != 0, + RCode: RCode(h.bits & 0xF), + } +} + +// A Resource is a DNS resource record. +type Resource interface { + // Header return's the Resource's ResourceHeader. + Header() *ResourceHeader + + // pack packs a Resource except for its header. + pack(msg []byte, compression map[string]int) ([]byte, error) + + // realType returns the actual type of the Resource. This is used to + // fill in the header Type field. + realType() Type +} + +func packResource(msg []byte, resource Resource, compression map[string]int) ([]byte, error) { + oldMsg := msg + resource.Header().Type = resource.realType() + msg, length, err := resource.Header().pack(msg, compression) + if err != nil { + return msg, &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + msg, err = resource.pack(msg, compression) + if err != nil { + return msg, &nestedError{"content", err} + } + conLen := len(msg) - preLen + if conLen > int(^uint16(0)) { + return oldMsg, errResTooLong + } + // Fill in the length now that we know how long the content is. + packUint16(length[:0], uint16(conLen)) + resource.Header().Length = uint16(conLen) + return msg, nil +} + +// A Parser allows incrementally parsing a DNS message. +// +// When parsing is started, the Header is parsed. Next, each Question can be +// either parsed or skipped. Alternatively, all Questions can be skipped at +// once. When all Questions have been parsed, attempting to parse Questions +// will return (nil, nil) and attempting to skip Questions will return +// (true, nil). After all Questions have been either parsed or skipped, all +// Answers, Authorities and Additionals can be either parsed or skipped in the +// same way, and each type of Resource must be fully parsed or skipped before +// proceeding to the next type of Resource. +// +// Note that there is no requirement to fully skip or parse the message. +type Parser struct { + msg []byte + header header + + section section + off int + index int + resHeaderValid bool + resHeader ResourceHeader +} + +// Start parses the header and enables the parsing of Questions. +func (p *Parser) Start(msg []byte) (Header, error) { + if p.msg != nil { + *p = Parser{} + } + p.msg = msg + var err error + if p.off, err = p.header.unpack(msg, 0); err != nil { + return Header{}, &nestedError{"unpacking header", err} + } + p.section = sectionQuestions + return p.header.header(), nil +} + +func (p *Parser) checkAdvance(sec section) error { + if p.section < sec { + return ErrNotStarted + } + if p.section > sec { + return ErrSectionDone + } + p.resHeaderValid = false + if p.index == int(p.header.count(sec)) { + p.index = 0 + p.section++ + return ErrSectionDone + } + return nil +} + +func (p *Parser) resource(sec section) (Resource, error) { + var r Resource + hdr, err := p.resourceHeader(sec) + if err != nil { + return r, err + } + p.resHeaderValid = false + r, p.off, err = unpackResource(p.msg, p.off, hdr) + if err != nil { + return nil, &nestedError{"unpacking " + sectionNames[sec], err} + } + p.index++ + return r, nil +} + +func (p *Parser) resourceHeader(sec section) (ResourceHeader, error) { + if p.resHeaderValid { + return p.resHeader, nil + } + if err := p.checkAdvance(sec); err != nil { + return ResourceHeader{}, err + } + var hdr ResourceHeader + off, err := hdr.unpack(p.msg, p.off) + if err != nil { + return ResourceHeader{}, err + } + p.resHeaderValid = true + p.resHeader = hdr + p.off = off + return hdr, nil +} + +func (p *Parser) skipResource(sec section) error { + if p.resHeaderValid { + newOff := p.off + int(p.resHeader.Length) + if newOff > len(p.msg) { + return errResourceLen + } + p.off = newOff + p.resHeaderValid = false + p.index++ + return nil + } + if err := p.checkAdvance(sec); err != nil { + return err + } + var err error + p.off, err = skipResource(p.msg, p.off) + if err != nil { + return &nestedError{"skipping: " + sectionNames[sec], err} + } + p.index++ + return nil +} + +// Question parses a single Question. +func (p *Parser) Question() (Question, error) { + if err := p.checkAdvance(sectionQuestions); err != nil { + return Question{}, err + } + name, off, err := unpackName(p.msg, p.off) + if err != nil { + return Question{}, &nestedError{"unpacking Question.Name", err} + } + typ, off, err := unpackType(p.msg, off) + if err != nil { + return Question{}, &nestedError{"unpacking Question.Type", err} + } + class, off, err := unpackClass(p.msg, off) + if err != nil { + return Question{}, &nestedError{"unpacking Question.Class", err} + } + p.off = off + p.index++ + return Question{name, typ, class}, nil +} + +// AllQuestions parses all Questions. +func (p *Parser) AllQuestions() ([]Question, error) { + qs := make([]Question, 0, p.header.questions) + for { + q, err := p.Question() + if err == ErrSectionDone { + return qs, nil + } + if err != nil { + return nil, err + } + qs = append(qs, q) + } +} + +// SkipQuestion skips a single Question. +func (p *Parser) SkipQuestion() error { + if err := p.checkAdvance(sectionQuestions); err != nil { + return err + } + off, err := skipName(p.msg, p.off) + if err != nil { + return &nestedError{"skipping Question Name", err} + } + if off, err = skipType(p.msg, off); err != nil { + return &nestedError{"skipping Question Type", err} + } + if off, err = skipClass(p.msg, off); err != nil { + return &nestedError{"skipping Question Class", err} + } + p.off = off + p.index++ + return nil +} + +// SkipAllQuestions skips all Questions. +func (p *Parser) SkipAllQuestions() error { + for { + if err := p.SkipQuestion(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// AnswerHeader parses a single Answer ResourceHeader. +func (p *Parser) AnswerHeader() (ResourceHeader, error) { + return p.resourceHeader(sectionAnswers) +} + +// Answer parses a single Answer Resource. +func (p *Parser) Answer() (Resource, error) { + return p.resource(sectionAnswers) +} + +// AllAnswers parses all Answer Resources. +func (p *Parser) AllAnswers() ([]Resource, error) { + as := make([]Resource, 0, p.header.answers) + for { + a, err := p.Answer() + if err == ErrSectionDone { + return as, nil + } + if err != nil { + return nil, err + } + as = append(as, a) + } +} + +// SkipAnswer skips a single Answer Resource. +func (p *Parser) SkipAnswer() error { + return p.skipResource(sectionAnswers) +} + +// SkipAllAnswers skips all Answer Resources. +func (p *Parser) SkipAllAnswers() error { + for { + if err := p.SkipAnswer(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// AuthorityHeader parses a single Authority ResourceHeader. +func (p *Parser) AuthorityHeader() (ResourceHeader, error) { + return p.resourceHeader(sectionAuthorities) +} + +// Authority parses a single Authority Resource. +func (p *Parser) Authority() (Resource, error) { + return p.resource(sectionAuthorities) +} + +// AllAuthorities parses all Authority Resources. +func (p *Parser) AllAuthorities() ([]Resource, error) { + as := make([]Resource, 0, p.header.authorities) + for { + a, err := p.Authority() + if err == ErrSectionDone { + return as, nil + } + if err != nil { + return nil, err + } + as = append(as, a) + } +} + +// SkipAuthority skips a single Authority Resource. +func (p *Parser) SkipAuthority() error { + return p.skipResource(sectionAuthorities) +} + +// SkipAllAuthorities skips all Authority Resources. +func (p *Parser) SkipAllAuthorities() error { + for { + if err := p.SkipAuthority(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// AdditionalHeader parses a single Additional ResourceHeader. +func (p *Parser) AdditionalHeader() (ResourceHeader, error) { + return p.resourceHeader(sectionAdditionals) +} + +// Additional parses a single Additional Resource. +func (p *Parser) Additional() (Resource, error) { + return p.resource(sectionAdditionals) +} + +// AllAdditionals parses all Additional Resources. +func (p *Parser) AllAdditionals() ([]Resource, error) { + as := make([]Resource, 0, p.header.additionals) + for { + a, err := p.Additional() + if err == ErrSectionDone { + return as, nil + } + if err != nil { + return nil, err + } + as = append(as, a) + } +} + +// SkipAdditional skips a single Additional Resource. +func (p *Parser) SkipAdditional() error { + return p.skipResource(sectionAdditionals) +} + +// SkipAllAdditionals skips all Additional Resources. +func (p *Parser) SkipAllAdditionals() error { + for { + if err := p.SkipAdditional(); err == ErrSectionDone { + return nil + } else if err != nil { + return err + } + } +} + +// Unpack parses a full Message. +func (m *Message) Unpack(msg []byte) error { + var p Parser + var err error + if m.Header, err = p.Start(msg); err != nil { + return err + } + if m.Questions, err = p.AllQuestions(); err != nil { + return err + } + if m.Answers, err = p.AllAnswers(); err != nil { + return err + } + if m.Authorities, err = p.AllAuthorities(); err != nil { + return err + } + if m.Additionals, err = p.AllAdditionals(); err != nil { + return err + } + return nil +} + +// Pack packs a full Message. +func (m *Message) Pack() ([]byte, error) { + // Validate the lengths. It is very unlikely that anyone will try to + // pack more than 65535 of any particular type, but it is possible and + // we should fail gracefully. + if len(m.Questions) > int(^uint16(0)) { + return nil, errTooManyQuestions + } + if len(m.Answers) > int(^uint16(0)) { + return nil, errTooManyAnswers + } + if len(m.Authorities) > int(^uint16(0)) { + return nil, errTooManyAuthorities + } + if len(m.Additionals) > int(^uint16(0)) { + return nil, errTooManyAdditionals + } + + var h header + h.id, h.bits = m.Header.pack() + + h.questions = uint16(len(m.Questions)) + h.answers = uint16(len(m.Answers)) + h.authorities = uint16(len(m.Authorities)) + h.additionals = uint16(len(m.Additionals)) + + // The starting capacity doesn't matter too much, but most DNS responses + // Will be <= 512 bytes as it is the limit for DNS over UDP. + msg := make([]byte, 0, 512) + + msg = h.pack(msg) + + // RFC 1035 allows (but does not require) compression for packing. RFC + // 1035 requires unpacking implementations to support compression, so + // unconditionally enabling it is fine. + // + // DNS lookups are typically done over UDP, and RFC 1035 states that UDP + // DNS packets can be a maximum of 512 bytes long. Without compression, + // many DNS response packets are over this limit, so enabling + // compression will help ensure compliance. + compression := map[string]int{} + + for _, q := range m.Questions { + var err error + msg, err = q.pack(msg, compression) + if err != nil { + return nil, &nestedError{"packing Question", err} + } + } + for _, a := range m.Answers { + var err error + msg, err = packResource(msg, a, compression) + if err != nil { + return nil, &nestedError{"packing Answer", err} + } + } + for _, a := range m.Authorities { + var err error + msg, err = packResource(msg, a, compression) + if err != nil { + return nil, &nestedError{"packing Authority", err} + } + } + for _, a := range m.Additionals { + var err error + msg, err = packResource(msg, a, compression) + if err != nil { + return nil, &nestedError{"packing Additional", err} + } + } + + return msg, nil +} + +// An ResourceHeader is the header of a DNS resource record. There are +// many types of DNS resource records, but they all share the same header. +type ResourceHeader struct { + // Name is the domain name for which this resource record pertains. + Name string + + // Type is the type of DNS resource record. + // + // This field will be set automatically during packing. + Type Type + + // Class is the class of network to which this DNS resource record + // pertains. + Class Class + + // TTL is the length of time (measured in seconds) which this resource + // record is valid for (time to live). All Resources in a set should + // have the same TTL (RFC 2181 Section 5.2). + TTL uint32 + + // Length is the length of data in the resource record after the header. + // + // This field will be set automatically during packing. + Length uint16 +} + +// Header implements Resource.Header. +func (h *ResourceHeader) Header() *ResourceHeader { + return h +} + +// pack packs all of the fields in a ResourceHeader except for the length. The +// length bytes are returned as a slice so they can be filled in after the rest +// of the Resource has been packed. +func (h *ResourceHeader) pack(oldMsg []byte, compression map[string]int) (msg []byte, length []byte, err error) { + msg = oldMsg + if msg, err = packName(msg, h.Name, compression); err != nil { + return oldMsg, nil, &nestedError{"Name", err} + } + msg = packType(msg, h.Type) + msg = packClass(msg, h.Class) + msg = packUint32(msg, h.TTL) + lenBegin := len(msg) + msg = packUint16(msg, h.Length) + return msg, msg[lenBegin:], nil +} + +func (h *ResourceHeader) unpack(msg []byte, off int) (int, error) { + newOff := off + var err error + if h.Name, newOff, err = unpackName(msg, newOff); err != nil { + return off, &nestedError{"Name", err} + } + if h.Type, newOff, err = unpackType(msg, newOff); err != nil { + return off, &nestedError{"Type", err} + } + if h.Class, newOff, err = unpackClass(msg, newOff); err != nil { + return off, &nestedError{"Class", err} + } + if h.TTL, newOff, err = unpackUint32(msg, newOff); err != nil { + return off, &nestedError{"TTL", err} + } + if h.Length, newOff, err = unpackUint16(msg, newOff); err != nil { + return off, &nestedError{"Length", err} + } + return newOff, nil +} + +func skipResource(msg []byte, off int) (int, error) { + newOff, err := skipName(msg, off) + if err != nil { + return off, &nestedError{"Name", err} + } + if newOff, err = skipType(msg, newOff); err != nil { + return off, &nestedError{"Type", err} + } + if newOff, err = skipClass(msg, newOff); err != nil { + return off, &nestedError{"Class", err} + } + if newOff, err = skipUint32(msg, newOff); err != nil { + return off, &nestedError{"TTL", err} + } + length, newOff, err := unpackUint16(msg, newOff) + if err != nil { + return off, &nestedError{"Length", err} + } + if newOff += int(length); newOff > len(msg) { + return off, errResourceLen + } + return newOff, nil +} + +func packUint16(msg []byte, field uint16) []byte { + return append(msg, byte(field>>8), byte(field)) +} + +func unpackUint16(msg []byte, off int) (uint16, int, error) { + if off+2 > len(msg) { + return 0, off, errBaseLen + } + return uint16(msg[off])<<8 | uint16(msg[off+1]), off + 2, nil +} + +func skipUint16(msg []byte, off int) (int, error) { + if off+2 > len(msg) { + return off, errBaseLen + } + return off + 2, nil +} + +func packType(msg []byte, field Type) []byte { + return packUint16(msg, uint16(field)) +} + +func unpackType(msg []byte, off int) (Type, int, error) { + t, o, err := unpackUint16(msg, off) + return Type(t), o, err +} + +func skipType(msg []byte, off int) (int, error) { + return skipUint16(msg, off) +} + +func packClass(msg []byte, field Class) []byte { + return packUint16(msg, uint16(field)) +} + +func unpackClass(msg []byte, off int) (Class, int, error) { + c, o, err := unpackUint16(msg, off) + return Class(c), o, err +} + +func skipClass(msg []byte, off int) (int, error) { + return skipUint16(msg, off) +} + +func packUint32(msg []byte, field uint32) []byte { + return append( + msg, + byte(field>>24), + byte(field>>16), + byte(field>>8), + byte(field), + ) +} + +func unpackUint32(msg []byte, off int) (uint32, int, error) { + if off+4 > len(msg) { + return 0, off, errBaseLen + } + v := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3]) + return v, off + 4, nil +} + +func skipUint32(msg []byte, off int) (int, error) { + if off+4 > len(msg) { + return off, errBaseLen + } + return off + 4, nil +} + +func packText(msg []byte, field string) []byte { + for len(field) > 0 { + l := len(field) + if l > 255 { + l = 255 + } + msg = append(msg, byte(l)) + msg = append(msg, field[:l]...) + field = field[l:] + } + return msg +} + +func unpackText(msg []byte, off int) (string, int, error) { + if off >= len(msg) { + return "", off, errBaseLen + } + beginOff := off + 1 + endOff := beginOff + int(msg[off]) + if endOff > len(msg) { + return "", off, errCalcLen + } + return string(msg[beginOff:endOff]), endOff, nil +} + +func skipText(msg []byte, off int) (int, error) { + if off >= len(msg) { + return off, errBaseLen + } + endOff := off + 1 + int(msg[off]) + if endOff > len(msg) { + return off, errCalcLen + } + return endOff, nil +} + +func packBytes(msg []byte, field []byte) []byte { + return append(msg, field...) +} + +func unpackBytes(msg []byte, off int, field []byte) (int, error) { + newOff := off + len(field) + if newOff > len(msg) { + return off, errBaseLen + } + copy(field, msg[off:newOff]) + return newOff, nil +} + +func skipBytes(msg []byte, off int, field []byte) (int, error) { + newOff := off + len(field) + if newOff > len(msg) { + return off, errBaseLen + } + return newOff, nil +} + +// packName packs a domain name. +// +// Domain names are a sequence of counted strings split at the dots. They end +// with a zero-length string. Compression can be used to reuse domain suffixes. +// +// The compression map will be updated with new domain suffixes. If compression +// is nil, compression will not be used. +func packName(msg []byte, name string, compression map[string]int) ([]byte, error) { + oldMsg := msg + + // Add a trailing dot to canonicalize name. + if n := len(name); n == 0 || name[n-1] != '.' { + name += "." + } + + // Allow root domain. + if name == "." { + return append(msg, 0), nil + } + + // Emit sequence of counted strings, chopping at dots. + for i, begin := 0, 0; i < len(name); i++ { + // Check for the end of the segment. + if name[i] == '.' { + // The two most significant bits have special meaning. + // It isn't allowed for segments to be long enough to + // need them. + if i-begin >= 1<<6 { + return oldMsg, errSegTooLong + } + + // Segments must have a non-zero length. + if i-begin == 0 { + return oldMsg, errZeroSegLen + } + + msg = append(msg, byte(i-begin)) + + for j := begin; j < i; j++ { + msg = append(msg, name[j]) + } + + begin = i + 1 + continue + } + + // We can only compress domain suffixes starting with a new + // segment. A pointer is two bytes with the two most significant + // bits set to 1 to indicate that it is a pointer. + if (i == 0 || name[i-1] == '.') && compression != nil { + if ptr, ok := compression[name[i:]]; ok { + // Hit. Emit a pointer instead of the rest of + // the domain. + return append(msg, byte(ptr>>8|0xC0), byte(ptr)), nil + } + + // Miss. Add the suffix to the compression table if the + // offset can be stored in the available 14 bytes. + if len(msg) <= int(^uint16(0)>>2) { + compression[name[i:]] = len(msg) + } + } + } + return append(msg, 0), nil +} + +// unpackName unpacks a domain name. +func unpackName(msg []byte, off int) (string, int, error) { + // currOff is the current working offset. + currOff := off + + // newOff is the offset where the next record will start. Pointers lead + // to data that belongs to other names and thus doesn't count towards to + // the usage of this name. + newOff := off + + // name is the domain name being unpacked. + name := make([]byte, 0, 255) + + // ptr is the number of pointers followed. + var ptr int +Loop: + for { + if currOff >= len(msg) { + return "", off, errBaseLen + } + c := int(msg[currOff]) + currOff++ + switch c & 0xC0 { + case 0x00: // String segment + if c == 0x00 { + // A zero length signals the end of the name. + break Loop + } + endOff := currOff + c + if endOff > len(msg) { + return "", off, errCalcLen + } + name = append(name, msg[currOff:endOff]...) + name = append(name, '.') + currOff = endOff + case 0xC0: // Pointer + if currOff >= len(msg) { + return "", off, errInvalidPtr + } + c1 := msg[currOff] + currOff++ + if ptr == 0 { + newOff = currOff + } + // Don't follow too many pointers, maybe there's a loop. + if ptr++; ptr > 10 { + return "", off, errTooManyPtr + } + currOff = (c^0xC0)<<8 | int(c1) + default: + // Prefixes 0x80 and 0x40 are reserved. + return "", off, errReserved + } + } + if len(name) == 0 { + name = append(name, '.') + } + if ptr == 0 { + newOff = currOff + } + return string(name), newOff, nil +} + +func skipName(msg []byte, off int) (int, error) { + // newOff is the offset where the next record will start. Pointers lead + // to data that belongs to other names and thus doesn't count towards to + // the usage of this name. + newOff := off + +Loop: + for { + if newOff >= len(msg) { + return off, errBaseLen + } + c := int(msg[newOff]) + newOff++ + switch c & 0xC0 { + case 0x00: + if c == 0x00 { + // A zero length signals the end of the name. + break Loop + } + // literal string + newOff += c + if newOff > len(msg) { + return off, errCalcLen + } + case 0xC0: + // Pointer to somewhere else in msg. + + // Pointers are two bytes. + newOff++ + + // Don't follow the pointer as the data here has ended. + break Loop + default: + // Prefixes 0x80 and 0x40 are reserved. + return off, errReserved + } + } + + return newOff, nil +} + +// A Question is a DNS query. +type Question struct { + Name string + Type Type + Class Class +} + +func (q *Question) pack(msg []byte, compression map[string]int) ([]byte, error) { + msg, err := packName(msg, q.Name, compression) + if err != nil { + return msg, &nestedError{"Name", err} + } + msg = packType(msg, q.Type) + return packClass(msg, q.Class), nil +} + +func unpackResource(msg []byte, off int, hdr ResourceHeader) (Resource, int, error) { + var ( + r Resource + err error + name string + ) + switch hdr.Type { + case TypeA: + r, err = unpackAResource(hdr, msg, off) + name = "A" + case TypeNS: + r, err = unpackNSResource(hdr, msg, off) + name = "NS" + case TypeCNAME: + r, err = unpackCNAMEResource(hdr, msg, off) + name = "CNAME" + case TypeSOA: + r, err = unpackSOAResource(hdr, msg, off) + name = "SOA" + case TypePTR: + r, err = unpackPTRResource(hdr, msg, off) + name = "PTR" + case TypeMX: + r, err = unpackMXResource(hdr, msg, off) + name = "MX" + case TypeTXT: + r, err = unpackTXTResource(hdr, msg, off) + name = "TXT" + case TypeAAAA: + r, err = unpackAAAAResource(hdr, msg, off) + name = "AAAA" + case TypeSRV: + r, err = unpackSRVResource(hdr, msg, off) + name = "SRV" + } + if err != nil { + return nil, off, &nestedError{name + " record", err} + } + if r != nil { + return r, off + int(hdr.Length), nil + } + return nil, off, errors.New("invalid resource type: " + string(hdr.Type+'0')) +} + +// A CNAMEResource is a CNAME Resource record. +type CNAMEResource struct { + ResourceHeader + + CNAME string +} + +func (r *CNAMEResource) realType() Type { + return TypeCNAME +} + +func (r *CNAMEResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return packName(msg, r.CNAME, compression) +} + +func unpackCNAMEResource(hdr ResourceHeader, msg []byte, off int) (*CNAMEResource, error) { + cname, _, err := unpackName(msg, off) + if err != nil { + return nil, err + } + return &CNAMEResource{hdr, cname}, nil +} + +// An MXResource is an MX Resource record. +type MXResource struct { + ResourceHeader + + Pref uint16 + MX string +} + +func (r *MXResource) realType() Type { + return TypeMX +} + +func (r *MXResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + oldMsg := msg + msg = packUint16(msg, r.Pref) + msg, err := packName(msg, r.MX, compression) + if err != nil { + return oldMsg, &nestedError{"MXResource.MX", err} + } + return msg, nil +} + +func unpackMXResource(hdr ResourceHeader, msg []byte, off int) (*MXResource, error) { + pref, off, err := unpackUint16(msg, off) + if err != nil { + return nil, &nestedError{"Pref", err} + } + mx, _, err := unpackName(msg, off) + if err != nil { + return nil, &nestedError{"MX", err} + } + return &MXResource{hdr, pref, mx}, nil +} + +// An NSResource is an NS Resource record. +type NSResource struct { + ResourceHeader + + NS string +} + +func (r *NSResource) realType() Type { + return TypeNS +} + +func (r *NSResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return packName(msg, r.NS, compression) +} + +func unpackNSResource(hdr ResourceHeader, msg []byte, off int) (*NSResource, error) { + ns, _, err := unpackName(msg, off) + if err != nil { + return nil, err + } + return &NSResource{hdr, ns}, nil +} + +// A PTRResource is a PTR Resource record. +type PTRResource struct { + ResourceHeader + + PTR string +} + +func (r *PTRResource) realType() Type { + return TypePTR +} + +func (r *PTRResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return packName(msg, r.PTR, compression) +} + +func unpackPTRResource(hdr ResourceHeader, msg []byte, off int) (*PTRResource, error) { + ptr, _, err := unpackName(msg, off) + if err != nil { + return nil, err + } + return &PTRResource{hdr, ptr}, nil +} + +// An SOAResource is an SOA Resource record. +type SOAResource struct { + ResourceHeader + + NS string + MBox string + Serial uint32 + Refresh uint32 + Retry uint32 + Expire uint32 + + // MinTTL the is the default TTL of Resources records which did not + // contain a TTL value and the TTL of negative responses. (RFC 2308 + // Section 4) + MinTTL uint32 +} + +func (r *SOAResource) realType() Type { + return TypeSOA +} + +func (r *SOAResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + oldMsg := msg + msg, err := packName(msg, r.NS, compression) + if err != nil { + return oldMsg, &nestedError{"SOAResource.NS", err} + } + msg, err = packName(msg, r.MBox, compression) + if err != nil { + return oldMsg, &nestedError{"SOAResource.MBox", err} + } + msg = packUint32(msg, r.Serial) + msg = packUint32(msg, r.Refresh) + msg = packUint32(msg, r.Retry) + msg = packUint32(msg, r.Expire) + return packUint32(msg, r.MinTTL), nil +} + +func unpackSOAResource(hdr ResourceHeader, msg []byte, off int) (*SOAResource, error) { + ns, off, err := unpackName(msg, off) + if err != nil { + return nil, &nestedError{"NS", err} + } + mbox, off, err := unpackName(msg, off) + if err != nil { + return nil, &nestedError{"MBox", err} + } + serial, off, err := unpackUint32(msg, off) + if err != nil { + return nil, &nestedError{"Serial", err} + } + refresh, off, err := unpackUint32(msg, off) + if err != nil { + return nil, &nestedError{"Refresh", err} + } + retry, off, err := unpackUint32(msg, off) + if err != nil { + return nil, &nestedError{"Retry", err} + } + expire, off, err := unpackUint32(msg, off) + if err != nil { + return nil, &nestedError{"Expire", err} + } + minTTL, _, err := unpackUint32(msg, off) + if err != nil { + return nil, &nestedError{"MinTTL", err} + } + return &SOAResource{hdr, ns, mbox, serial, refresh, retry, expire, minTTL}, nil +} + +// A TXTResource is a TXT Resource record. +type TXTResource struct { + ResourceHeader + + Txt string // Not a domain name. +} + +func (r *TXTResource) realType() Type { + return TypeTXT +} + +func (r *TXTResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return packText(msg, r.Txt), nil +} + +func unpackTXTResource(hdr ResourceHeader, msg []byte, off int) (*TXTResource, error) { + var txt string + for n := uint16(0); n < hdr.Length; { + var t string + var err error + if t, off, err = unpackText(msg, off); err != nil { + return nil, &nestedError{"text", err} + } + // Check if we got too many bytes. + if hdr.Length-n < uint16(len(t))+1 { + return nil, errCalcLen + } + n += uint16(len(t)) + 1 + txt += t + } + return &TXTResource{hdr, txt}, nil +} + +// An SRVResource is an SRV Resource record. +type SRVResource struct { + ResourceHeader + + Priority uint16 + Weight uint16 + Port uint16 + Target string // Not compressed as per RFC 2782. +} + +func (r *SRVResource) realType() Type { + return TypeSRV +} + +func (r *SRVResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + oldMsg := msg + msg = packUint16(msg, r.Priority) + msg = packUint16(msg, r.Weight) + msg = packUint16(msg, r.Port) + msg, err := packName(msg, r.Target, nil) + if err != nil { + return oldMsg, &nestedError{"SRVResource.Target", err} + } + return msg, nil +} + +func unpackSRVResource(hdr ResourceHeader, msg []byte, off int) (*SRVResource, error) { + priority, off, err := unpackUint16(msg, off) + if err != nil { + return nil, &nestedError{"Priority", err} + } + weight, off, err := unpackUint16(msg, off) + if err != nil { + return nil, &nestedError{"Weight", err} + } + port, off, err := unpackUint16(msg, off) + if err != nil { + return nil, &nestedError{"Port", err} + } + target, _, err := unpackName(msg, off) + if err != nil { + return nil, &nestedError{"Target", err} + } + return &SRVResource{hdr, priority, weight, port, target}, nil +} + +// An AResource is an A Resource record. +type AResource struct { + ResourceHeader + + A [4]byte +} + +func (r *AResource) realType() Type { + return TypeA +} + +func (r *AResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return packBytes(msg, r.A[:]), nil +} + +func unpackAResource(hdr ResourceHeader, msg []byte, off int) (*AResource, error) { + var a [4]byte + if _, err := unpackBytes(msg, off, a[:]); err != nil { + return nil, err + } + return &AResource{hdr, a}, nil +} + +// An AAAAResource is an AAAA Resource record. +type AAAAResource struct { + ResourceHeader + + AAAA [16]byte +} + +func (r *AAAAResource) realType() Type { + return TypeAAAA +} + +func (r *AAAAResource) pack(msg []byte, compression map[string]int) ([]byte, error) { + return packBytes(msg, r.AAAA[:]), nil +} + +func unpackAAAAResource(hdr ResourceHeader, msg []byte, off int) (*AAAAResource, error) { + var aaaa [16]byte + if _, err := unpackBytes(msg, off, aaaa[:]); err != nil { + return nil, err + } + return &AAAAResource{hdr, aaaa}, nil +} diff --git a/vendor/golang.org/x/net/dns/dnsmessage/message_test.go b/vendor/golang.org/x/net/dns/dnsmessage/message_test.go new file mode 100644 index 0000000000..46edd72436 --- /dev/null +++ b/vendor/golang.org/x/net/dns/dnsmessage/message_test.go @@ -0,0 +1,575 @@ +// 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. + +package dnsmessage + +import ( + "fmt" + "net" + "reflect" + "strings" + "testing" +) + +func (m *Message) String() string { + s := fmt.Sprintf("Message: %#v\n", &m.Header) + if len(m.Questions) > 0 { + s += "-- Questions\n" + for _, q := range m.Questions { + s += fmt.Sprintf("%#v\n", q) + } + } + if len(m.Answers) > 0 { + s += "-- Answers\n" + for _, a := range m.Answers { + s += fmt.Sprintf("%#v\n", a) + } + } + if len(m.Authorities) > 0 { + s += "-- Authorities\n" + for _, ns := range m.Authorities { + s += fmt.Sprintf("%#v\n", ns) + } + } + if len(m.Additionals) > 0 { + s += "-- Additionals\n" + for _, e := range m.Additionals { + s += fmt.Sprintf("%#v\n", e) + } + } + return s +} + +func TestQuestionPackUnpack(t *testing.T) { + want := Question{ + Name: ".", + Type: TypeA, + Class: ClassINET, + } + buf, err := want.pack(make([]byte, 1, 50), map[string]int{}) + if err != nil { + t.Fatal("Packing failed:", err) + } + var p Parser + p.msg = buf + p.header.questions = 1 + p.section = sectionQuestions + p.off = 1 + got, err := p.Question() + if err != nil { + t.Fatalf("Unpacking failed: %v\n%s", err, string(buf[1:])) + } + if p.off != len(buf) { + t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", p.off, len(buf)) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("Got = %+v, want = %+v", got, want) + } +} + +func TestNamePackUnpack(t *testing.T) { + tests := []struct { + in string + want string + err error + }{ + {"", ".", nil}, + {".", ".", nil}, + {"google..com", "", errZeroSegLen}, + {"google.com", "google.com.", nil}, + {"google..com.", "", errZeroSegLen}, + {"google.com.", "google.com.", nil}, + {".google.com.", "", errZeroSegLen}, + {"www..google.com.", "", errZeroSegLen}, + {"www.google.com.", "www.google.com.", nil}, + } + + for _, test := range tests { + buf, err := packName(make([]byte, 0, 30), test.in, map[string]int{}) + if err != test.err { + t.Errorf("Packing of %s: got err = %v, want err = %v", test.in, err, test.err) + continue + } + if test.err != nil { + continue + } + got, n, err := unpackName(buf, 0) + if err != nil { + t.Errorf("Unpacking for %s failed: %v", test.in, err) + continue + } + if n != len(buf) { + t.Errorf( + "Unpacked different amount than packed for %s: got n = %d, want = %d", + test.in, + n, + len(buf), + ) + } + if got != test.want { + t.Errorf("Unpacking packing of %s: got = %s, want = %s", test.in, got, test.want) + } + } +} + +func TestDNSPackUnpack(t *testing.T) { + wants := []Message{ + { + Questions: []Question{ + { + Name: ".", + Type: TypeAAAA, + Class: ClassINET, + }, + }, + Answers: []Resource{}, + Authorities: []Resource{}, + Additionals: []Resource{}, + }, + largeTestMsg(), + } + for i, want := range wants { + b, err := want.Pack() + if err != nil { + t.Fatalf("%d: packing failed: %v", i, err) + } + var got Message + err = got.Unpack(b) + if err != nil { + t.Fatalf("%d: unpacking failed: %v", i, err) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("%d: got = %+v, want = %+v", i, &got, &want) + } + } +} + +func TestSkipAll(t *testing.T) { + msg := largeTestMsg() + buf, err := msg.Pack() + if err != nil { + t.Fatal("Packing large test message:", err) + } + var p Parser + if _, err := p.Start(buf); err != nil { + t.Fatal(err) + } + + tests := []struct { + name string + f func() error + }{ + {"SkipAllQuestions", p.SkipAllQuestions}, + {"SkipAllAnswers", p.SkipAllAnswers}, + {"SkipAllAuthorities", p.SkipAllAuthorities}, + {"SkipAllAdditionals", p.SkipAllAdditionals}, + } + for _, test := range tests { + for i := 1; i <= 3; i++ { + if err := test.f(); err != nil { + t.Errorf("Call #%d to %s(): %v", i, test.name, err) + } + } + } +} + +func TestSkipNotStarted(t *testing.T) { + var p Parser + + tests := []struct { + name string + f func() error + }{ + {"SkipAllQuestions", p.SkipAllQuestions}, + {"SkipAllAnswers", p.SkipAllAnswers}, + {"SkipAllAuthorities", p.SkipAllAuthorities}, + {"SkipAllAdditionals", p.SkipAllAdditionals}, + } + for _, test := range tests { + if err := test.f(); err != ErrNotStarted { + t.Errorf("Got %s() = %v, want = %v", test.name, err, ErrNotStarted) + } + } +} + +func TestTooManyRecords(t *testing.T) { + const recs = int(^uint16(0)) + 1 + tests := []struct { + name string + msg Message + want error + }{ + { + "Questions", + Message{ + Questions: make([]Question, recs), + }, + errTooManyQuestions, + }, + { + "Answers", + Message{ + Answers: make([]Resource, recs), + }, + errTooManyAnswers, + }, + { + "Authorities", + Message{ + Authorities: make([]Resource, recs), + }, + errTooManyAuthorities, + }, + { + "Additionals", + Message{ + Additionals: make([]Resource, recs), + }, + errTooManyAdditionals, + }, + } + + for _, test := range tests { + if _, got := test.msg.Pack(); got != test.want { + t.Errorf("Packing %d %s: got = %v, want = %v", recs, test.name, got, test.want) + } + } +} + +func TestVeryLongTxt(t *testing.T) { + want := &TXTResource{ + ResourceHeader: ResourceHeader{ + Name: "foo.bar.example.com.", + Type: TypeTXT, + Class: ClassINET, + }, + Txt: loremIpsum, + } + buf, err := packResource(make([]byte, 0, 8000), want, map[string]int{}) + if err != nil { + t.Fatal("Packing failed:", err) + } + var hdr ResourceHeader + off, err := hdr.unpack(buf, 0) + if err != nil { + t.Fatal("Unpacking ResourceHeader failed:", err) + } + got, n, err := unpackResource(buf, off, hdr) + if err != nil { + t.Fatal("Unpacking failed:", err) + } + if n != len(buf) { + t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", n, len(buf)) + } + if !reflect.DeepEqual(got, want) { + t.Errorf("Got = %+v, want = %+v", got, want) + } +} + +func ExampleHeaderSearch() { + msg := Message{ + Header: Header{Response: true, Authoritative: true}, + Questions: []Question{ + { + Name: "foo.bar.example.com.", + Type: TypeA, + Class: ClassINET, + }, + { + Name: "bar.example.com.", + Type: TypeA, + Class: ClassINET, + }, + }, + Answers: []Resource{ + &AResource{ + ResourceHeader: ResourceHeader{ + Name: "foo.bar.example.com.", + Type: TypeA, + Class: ClassINET, + }, + A: [4]byte{127, 0, 0, 1}, + }, + &AResource{ + ResourceHeader: ResourceHeader{ + Name: "bar.example.com.", + Type: TypeA, + Class: ClassINET, + }, + A: [4]byte{127, 0, 0, 2}, + }, + }, + } + + buf, err := msg.Pack() + if err != nil { + panic(err) + } + + wantName := "bar.example.com." + + var p Parser + if _, err := p.Start(buf); err != nil { + panic(err) + } + + for { + q, err := p.Question() + if err == ErrSectionDone { + break + } + if err != nil { + panic(err) + } + + if q.Name != wantName { + continue + } + + fmt.Println("Found question for name", wantName) + if err := p.SkipAllQuestions(); err != nil { + panic(err) + } + break + } + + var gotIPs []net.IP + for { + h, err := p.AnswerHeader() + if err == ErrSectionDone { + break + } + if err != nil { + panic(err) + } + + if (h.Type != TypeA && h.Type != TypeAAAA) || h.Class != ClassINET { + continue + } + + if !strings.EqualFold(h.Name, wantName) { + if err := p.SkipAnswer(); err != nil { + panic(err) + } + continue + } + a, err := p.Answer() + if err != nil { + panic(err) + } + + switch r := a.(type) { + default: + panic(fmt.Sprintf("unknown type: %T", r)) + case *AResource: + gotIPs = append(gotIPs, r.A[:]) + case *AAAAResource: + gotIPs = append(gotIPs, r.AAAA[:]) + } + } + + fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs) + + // Output: + // Found question for name bar.example.com. + // Found A/AAAA records for name bar.example.com.: [127.0.0.2] +} + +func largeTestMsg() Message { + return Message{ + Header: Header{Response: true, Authoritative: true}, + Questions: []Question{ + { + Name: "foo.bar.example.com.", + Type: TypeA, + Class: ClassINET, + }, + }, + Answers: []Resource{ + &AResource{ + ResourceHeader: ResourceHeader{ + Name: "foo.bar.example.com.", + Type: TypeA, + Class: ClassINET, + }, + A: [4]byte{127, 0, 0, 1}, + }, + &AResource{ + ResourceHeader: ResourceHeader{ + Name: "foo.bar.example.com.", + Type: TypeA, + Class: ClassINET, + }, + A: [4]byte{127, 0, 0, 2}, + }, + }, + Authorities: []Resource{ + &NSResource{ + ResourceHeader: ResourceHeader{ + Name: "foo.bar.example.com.", + Type: TypeNS, + Class: ClassINET, + }, + NS: "ns1.example.com.", + }, + &NSResource{ + ResourceHeader: ResourceHeader{ + Name: "foo.bar.example.com.", + Type: TypeNS, + Class: ClassINET, + }, + NS: "ns2.example.com.", + }, + }, + Additionals: []Resource{ + &TXTResource{ + ResourceHeader: ResourceHeader{ + Name: "foo.bar.example.com.", + Type: TypeTXT, + Class: ClassINET, + }, + Txt: "So Long, and Thanks for All the Fish", + }, + &TXTResource{ + ResourceHeader: ResourceHeader{ + Name: "foo.bar.example.com.", + Type: TypeTXT, + Class: ClassINET, + }, + Txt: "Hamster Huey and the Gooey Kablooie", + }, + }, + } +} + +const loremIpsum = ` +Lorem ipsum dolor sit amet, nec enim antiopam id, an ullum choro +nonumes qui, pro eu debet honestatis mediocritatem. No alia enim eos, +magna signiferumque ex vis. Mei no aperiri dissentias, cu vel quas +regione. Malorum quaeque vim ut, eum cu semper aliquid invidunt, ei +nam ipsum assentior. + +Nostrum appellantur usu no, vis ex probatus adipiscing. Cu usu illum +facilis eleifend. Iusto conceptam complectitur vim id. Tale omnesque +no usu, ei oblique sadipscing vim. At nullam voluptua usu, mei laudem +reformidans et. Qui ei eros porro reformidans, ius suas veritus +torquatos ex. Mea te facer alterum consequat. + +Soleat torquatos democritum sed et, no mea congue appareat, facer +aliquam nec in. Has te ipsum tritani. At justo dicta option nec, movet +phaedrum ad nam. Ea detracto verterem liberavisse has, delectus +suscipiantur in mei. Ex nam meliore complectitur. Ut nam omnis +honestatis quaerendum, ea mea nihil affert detracto, ad vix rebum +mollis. + +Ut epicurei praesent neglegentur pri, prima fuisset intellegebat ad +vim. An habemus comprehensam usu, at enim dignissim pro. Eam reque +vivendum adipisci ea. Vel ne odio choro minimum. Sea admodum +dissentiet ex. Mundi tamquam evertitur ius cu. Homero postea iisque ut +pro, vel ne saepe senserit consetetur. + +Nulla utamur facilisis ius ea, in viderer diceret pertinax eum. Mei no +enim quodsi facilisi, ex sed aeterno appareat mediocritatem, eum +sententiae deterruisset ut. At suas timeam euismod cum, offendit +appareat interpretaris ne vix. Vel ea civibus albucius, ex vim quidam +accusata intellegebat, noluisse instructior sea id. Nec te nonumes +habemus appellantur, quis dignissim vituperata eu nam. + +At vix apeirian patrioque vituperatoribus, an usu agam assum. Debet +iisque an mea. Per eu dicant ponderum accommodare. Pri alienum +placerat senserit an, ne eum ferri abhorreant vituperatoribus. Ut mea +eligendi disputationi. Ius no tation everti impedit, ei magna quidam +mediocritatem pri. + +Legendos perpetua iracundia ne usu, no ius ullum epicurei intellegam, +ad modus epicuri lucilius eam. In unum quaerendum usu. Ne diam paulo +has, ea veri virtute sed. Alia honestatis conclusionemque mea eu, ut +iudico albucius his. + +Usu essent probatus eu, sed omnis dolor delicatissimi ex. No qui augue +dissentias dissentiet. Laudem recteque no usu, vel an velit noluisse, +an sed utinam eirmod appetere. Ne mea fuisset inimicus ocurreret. At +vis dicant abhorreant, utinam forensibus nec ne, mei te docendi +consequat. Brute inermis persecuti cum id. Ut ipsum munere propriae +usu, dicit graeco disputando id has. + +Eros dolore quaerendum nam ei. Timeam ornatus inciderint pro id. Nec +torquatos sadipscing ei, ancillae molestie per in. Malis principes duo +ea, usu liber postulant ei. + +Graece timeam voluptatibus eu eam. Alia probatus quo no, ea scripta +feugiat duo. Congue option meliore ex qui, noster invenire appellantur +ea vel. Eu exerci legendos vel. Consetetur repudiandae vim ut. Vix an +probo minimum, et nam illud falli tempor. + +Cum dico signiferumque eu. Sed ut regione maiorum, id veritus insolens +tacimates vix. Eu mel sint tamquam lucilius, duo no oporteat +tacimates. Atqui augue concludaturque vix ei, id mel utroque menandri. + +Ad oratio blandit aliquando pro. Vis et dolorum rationibus +philosophia, ad cum nulla molestie. Hinc fuisset adversarium eum et, +ne qui nisl verear saperet, vel te quaestio forensibus. Per odio +option delenit an. Alii placerat has no, in pri nihil platonem +cotidieque. Est ut elit copiosae scaevola, debet tollit maluisset sea +an. + +Te sea hinc debet pericula, liber ridens fabulas cu sed, quem mutat +accusam mea et. Elitr labitur albucius et pri, an labore feugait mel. +Velit zril melius usu ea. Ad stet putent interpretaris qui. Mel no +error volumus scripserit. In pro paulo iudico, quo ei dolorem +verterem, affert fabellas dissentiet ea vix. + +Vis quot deserunt te. Error aliquid detraxit eu usu, vis alia eruditi +salutatus cu. Est nostrud bonorum an, ei usu alii salutatus. Vel at +nisl primis, eum ex aperiri noluisse reformidans. Ad veri velit +utroque vis, ex equidem detraxit temporibus has. + +Inermis appareat usu ne. Eros placerat periculis mea ad, in dictas +pericula pro. Errem postulant at usu, ea nec amet ornatus mentitum. Ad +mazim graeco eum, vel ex percipit volutpat iudicabit, sit ne delicata +interesset. Mel sapientem prodesset abhorreant et, oblique suscipit +eam id. + +An maluisset disputando mea, vidit mnesarchum pri et. Malis insolens +inciderint no sea. Ea persius maluisset vix, ne vim appellantur +instructior, consul quidam definiebas pri id. Cum integre feugiat +pericula in, ex sed persius similique, mel ne natum dicit percipitur. + +Primis discere ne pri, errem putent definitionem at vis. Ei mel dolore +neglegentur, mei tincidunt percipitur ei. Pro ad simul integre +rationibus. Eu vel alii honestatis definitiones, mea no nonumy +reprehendunt. + +Dicta appareat legendos est cu. Eu vel congue dicunt omittam, no vix +adhuc minimum constituam, quot noluisse id mel. Eu quot sale mutat +duo, ex nisl munere invenire duo. Ne nec ullum utamur. Pro alterum +debitis nostrum no, ut vel aliquid vivendo. + +Aliquip fierent praesent quo ne, id sit audiam recusabo delicatissimi. +Usu postulant incorrupte cu. At pro dicit tibique intellegam, cibo +dolore impedit id eam, et aeque feugait assentior has. Quando sensibus +nec ex. Possit sensibus pri ad, unum mutat periculis cu vix. + +Mundi tibique vix te, duo simul partiendo qualisque id, est at vidit +sonet tempor. No per solet aeterno deseruisse. Petentium salutandi +definiebas pri cu. Munere vivendum est in. Ei justo congue eligendi +vis, modus offendit omittantur te mel. + +Integre voluptaria in qui, sit habemus tractatos constituam no. Utinam +melius conceptam est ne, quo in minimum apeirian delicata, ut ius +porro recusabo. Dicant expetenda vix no, ludus scripserit sed ex, eu +his modo nostro. Ut etiam sonet his, quodsi inciderint philosophia te +per. Nullam lobortis eu cum, vix an sonet efficiendi repudiandae. Vis +ad idque fabellas intellegebat. + +Eum commodo senserit conclusionemque ex. Sed forensibus sadipscing ut, +mei in facer delicata periculis, sea ne hinc putent cetero. Nec ne +alia corpora invenire, alia prima soleat te cum. Eleifend posidonium +nam at. + +Dolorum indoctum cu quo, ex dolor legendos recteque eam, cu pri zril +discere. Nec civibus officiis dissentiunt ex, est te liber ludus +elaboraret. Cum ea fabellas invenire. Ex vim nostrud eripuit +comprehensam, nam te inermis delectus, saepe inermis senserit. +` diff --git a/vendor/golang.org/x/net/http2/client_conn_pool.go b/vendor/golang.org/x/net/http2/client_conn_pool.go index b13941258a..bdf5652b01 100644 --- a/vendor/golang.org/x/net/http2/client_conn_pool.go +++ b/vendor/golang.org/x/net/http2/client_conn_pool.go @@ -247,7 +247,7 @@ func filterOutClientConn(in []*ClientConn, exclude *ClientConn) []*ClientConn { } // noDialClientConnPool is an implementation of http2.ClientConnPool -// which never dials. We let the HTTP/1.1 client dial and use its TLS +// which never dials. We let the HTTP/1.1 client dial and use its TLS // connection instead. type noDialClientConnPool struct{ *clientConnPool } diff --git a/vendor/golang.org/x/net/http2/databuffer.go b/vendor/golang.org/x/net/http2/databuffer.go new file mode 100644 index 0000000000..a3067f8de7 --- /dev/null +++ b/vendor/golang.org/x/net/http2/databuffer.go @@ -0,0 +1,146 @@ +// 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 ( + "errors" + "fmt" + "sync" +) + +// Buffer chunks are allocated from a pool to reduce pressure on GC. +// The maximum wasted space per dataBuffer is 2x the largest size class, +// which happens when the dataBuffer has multiple chunks and there is +// one unread byte in both the first and last chunks. We use a few size +// classes to minimize overheads for servers that typically receive very +// small request bodies. +// +// TODO: Benchmark to determine if the pools are necessary. The GC may have +// improved enough that we can instead allocate chunks like this: +// make([]byte, max(16<<10, expectedBytesRemaining)) +var ( + dataChunkSizeClasses = []int{ + 1 << 10, + 2 << 10, + 4 << 10, + 8 << 10, + 16 << 10, + } + dataChunkPools = [...]sync.Pool{ + {New: func() interface{} { return make([]byte, 1<<10) }}, + {New: func() interface{} { return make([]byte, 2<<10) }}, + {New: func() interface{} { return make([]byte, 4<<10) }}, + {New: func() interface{} { return make([]byte, 8<<10) }}, + {New: func() interface{} { return make([]byte, 16<<10) }}, + } +) + +func getDataBufferChunk(size int64) []byte { + i := 0 + for ; i < len(dataChunkSizeClasses)-1; i++ { + if size <= int64(dataChunkSizeClasses[i]) { + break + } + } + return dataChunkPools[i].Get().([]byte) +} + +func putDataBufferChunk(p []byte) { + for i, n := range dataChunkSizeClasses { + if len(p) == n { + dataChunkPools[i].Put(p) + return + } + } + panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) +} + +// dataBuffer is an io.ReadWriter backed by a list of data chunks. +// Each dataBuffer is used to read DATA frames on a single stream. +// The buffer is divided into chunks so the server can limit the +// total memory used by a single connection without limiting the +// request body size on any single stream. +type dataBuffer struct { + chunks [][]byte + r int // next byte to read is chunks[0][r] + w int // next byte to write is chunks[len(chunks)-1][w] + size int // total buffered bytes + expected int64 // we expect at least this many bytes in future Write calls (ignored if <= 0) +} + +var errReadEmpty = errors.New("read from empty dataBuffer") + +// Read copies bytes from the buffer into p. +// It is an error to read when no data is available. +func (b *dataBuffer) Read(p []byte) (int, error) { + if b.size == 0 { + return 0, errReadEmpty + } + var ntotal int + for len(p) > 0 && b.size > 0 { + readFrom := b.bytesFromFirstChunk() + n := copy(p, readFrom) + p = p[n:] + ntotal += n + b.r += n + b.size -= n + // If the first chunk has been consumed, advance to the next chunk. + if b.r == len(b.chunks[0]) { + putDataBufferChunk(b.chunks[0]) + end := len(b.chunks) - 1 + copy(b.chunks[:end], b.chunks[1:]) + b.chunks[end] = nil + b.chunks = b.chunks[:end] + b.r = 0 + } + } + return ntotal, nil +} + +func (b *dataBuffer) bytesFromFirstChunk() []byte { + if len(b.chunks) == 1 { + return b.chunks[0][b.r:b.w] + } + return b.chunks[0][b.r:] +} + +// Len returns the number of bytes of the unread portion of the buffer. +func (b *dataBuffer) Len() int { + return b.size +} + +// Write appends p to the buffer. +func (b *dataBuffer) Write(p []byte) (int, error) { + ntotal := len(p) + for len(p) > 0 { + // If the last chunk is empty, allocate a new chunk. Try to allocate + // enough to fully copy p plus any additional bytes we expect to + // receive. However, this may allocate less than len(p). + want := int64(len(p)) + if b.expected > want { + want = b.expected + } + chunk := b.lastChunkOrAlloc(want) + n := copy(chunk[b.w:], p) + p = p[n:] + b.w += n + b.size += n + b.expected -= int64(n) + } + return ntotal, nil +} + +func (b *dataBuffer) lastChunkOrAlloc(want int64) []byte { + if len(b.chunks) != 0 { + last := b.chunks[len(b.chunks)-1] + if b.w < len(last) { + return last + } + } + chunk := getDataBufferChunk(want) + b.chunks = append(b.chunks, chunk) + b.w = 0 + return chunk +} diff --git a/vendor/golang.org/x/net/http2/databuffer_test.go b/vendor/golang.org/x/net/http2/databuffer_test.go new file mode 100644 index 0000000000..ca227b5288 --- /dev/null +++ b/vendor/golang.org/x/net/http2/databuffer_test.go @@ -0,0 +1,155 @@ +// Copyright 2017 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" + "reflect" + "testing" +) + +func fmtDataChunk(chunk []byte) string { + out := "" + var last byte + var count int + for _, c := range chunk { + if c != last { + if count > 0 { + out += fmt.Sprintf(" x %d ", count) + count = 0 + } + out += string([]byte{c}) + last = c + } + count++ + } + if count > 0 { + out += fmt.Sprintf(" x %d", count) + } + return out +} + +func fmtDataChunks(chunks [][]byte) string { + var out string + for _, chunk := range chunks { + out += fmt.Sprintf("{%q}", fmtDataChunk(chunk)) + } + return out +} + +func testDataBuffer(t *testing.T, wantBytes []byte, setup func(t *testing.T) *dataBuffer) { + // Run setup, then read the remaining bytes from the dataBuffer and check + // that they match wantBytes. We use different read sizes to check corner + // cases in Read. + for _, readSize := range []int{1, 2, 1 * 1024, 32 * 1024} { + t.Run(fmt.Sprintf("ReadSize=%d", readSize), func(t *testing.T) { + b := setup(t) + buf := make([]byte, readSize) + var gotRead bytes.Buffer + for { + n, err := b.Read(buf) + gotRead.Write(buf[:n]) + if err == errReadEmpty { + break + } + if err != nil { + t.Fatalf("error after %v bytes: %v", gotRead.Len(), err) + } + } + if got, want := gotRead.Bytes(), wantBytes; !bytes.Equal(got, want) { + t.Errorf("FinalRead=%q, want %q", fmtDataChunk(got), fmtDataChunk(want)) + } + }) + } +} + +func TestDataBufferAllocation(t *testing.T) { + writes := [][]byte{ + bytes.Repeat([]byte("a"), 1*1024-1), + []byte{'a'}, + bytes.Repeat([]byte("b"), 4*1024-1), + []byte{'b'}, + bytes.Repeat([]byte("c"), 8*1024-1), + []byte{'c'}, + bytes.Repeat([]byte("d"), 16*1024-1), + []byte{'d'}, + bytes.Repeat([]byte("e"), 32*1024), + } + var wantRead bytes.Buffer + for _, p := range writes { + wantRead.Write(p) + } + + testDataBuffer(t, wantRead.Bytes(), func(t *testing.T) *dataBuffer { + b := &dataBuffer{} + for _, p := range writes { + if n, err := b.Write(p); n != len(p) || err != nil { + t.Fatalf("Write(%q x %d)=%v,%v want %v,nil", p[:1], len(p), n, err, len(p)) + } + } + want := [][]byte{ + bytes.Repeat([]byte("a"), 1*1024), + bytes.Repeat([]byte("b"), 4*1024), + bytes.Repeat([]byte("c"), 8*1024), + bytes.Repeat([]byte("d"), 16*1024), + bytes.Repeat([]byte("e"), 16*1024), + bytes.Repeat([]byte("e"), 16*1024), + } + if !reflect.DeepEqual(b.chunks, want) { + t.Errorf("dataBuffer.chunks\ngot: %s\nwant: %s", fmtDataChunks(b.chunks), fmtDataChunks(want)) + } + return b + }) +} + +func TestDataBufferAllocationWithExpected(t *testing.T) { + writes := [][]byte{ + bytes.Repeat([]byte("a"), 1*1024), // allocates 16KB + bytes.Repeat([]byte("b"), 14*1024), + bytes.Repeat([]byte("c"), 15*1024), // allocates 16KB more + bytes.Repeat([]byte("d"), 2*1024), + bytes.Repeat([]byte("e"), 1*1024), // overflows 32KB expectation, allocates just 1KB + } + var wantRead bytes.Buffer + for _, p := range writes { + wantRead.Write(p) + } + + testDataBuffer(t, wantRead.Bytes(), func(t *testing.T) *dataBuffer { + b := &dataBuffer{expected: 32 * 1024} + for _, p := range writes { + if n, err := b.Write(p); n != len(p) || err != nil { + t.Fatalf("Write(%q x %d)=%v,%v want %v,nil", p[:1], len(p), n, err, len(p)) + } + } + want := [][]byte{ + append(bytes.Repeat([]byte("a"), 1*1024), append(bytes.Repeat([]byte("b"), 14*1024), bytes.Repeat([]byte("c"), 1*1024)...)...), + append(bytes.Repeat([]byte("c"), 14*1024), bytes.Repeat([]byte("d"), 2*1024)...), + bytes.Repeat([]byte("e"), 1*1024), + } + if !reflect.DeepEqual(b.chunks, want) { + t.Errorf("dataBuffer.chunks\ngot: %s\nwant: %s", fmtDataChunks(b.chunks), fmtDataChunks(want)) + } + return b + }) +} + +func TestDataBufferWriteAfterPartialRead(t *testing.T) { + testDataBuffer(t, []byte("cdxyz"), func(t *testing.T) *dataBuffer { + b := &dataBuffer{} + if n, err := b.Write([]byte("abcd")); n != 4 || err != nil { + t.Fatalf("Write(\"abcd\")=%v,%v want 4,nil", n, err) + } + p := make([]byte, 2) + if n, err := b.Read(p); n != 2 || err != nil || !bytes.Equal(p, []byte("ab")) { + t.Fatalf("Read()=%q,%v,%v want \"ab\",2,nil", p, n, err) + } + if n, err := b.Write([]byte("xyz")); n != 3 || err != nil { + t.Fatalf("Write(\"xyz\")=%v,%v want 3,nil", n, err) + } + return b + }) +} diff --git a/vendor/golang.org/x/net/http2/fixed_buffer.go b/vendor/golang.org/x/net/http2/fixed_buffer.go deleted file mode 100644 index 47da0f0bf7..0000000000 --- a/vendor/golang.org/x/net/http2/fixed_buffer.go +++ /dev/null @@ -1,60 +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 ( - "errors" -) - -// fixedBuffer is an io.ReadWriter backed by a fixed size buffer. -// It never allocates, but moves old data as new data is written. -type fixedBuffer struct { - buf []byte - r, w int -} - -var ( - errReadEmpty = errors.New("read from empty fixedBuffer") - errWriteFull = errors.New("write on full fixedBuffer") -) - -// Read copies bytes from the buffer into p. -// It is an error to read when no data is available. -func (b *fixedBuffer) Read(p []byte) (n int, err error) { - if b.r == b.w { - return 0, errReadEmpty - } - n = copy(p, b.buf[b.r:b.w]) - b.r += n - if b.r == b.w { - b.r = 0 - b.w = 0 - } - return n, nil -} - -// Len returns the number of bytes of the unread portion of the buffer. -func (b *fixedBuffer) Len() int { - return b.w - b.r -} - -// Write copies bytes from p into the buffer. -// It is an error to write more data than the buffer can hold. -func (b *fixedBuffer) Write(p []byte) (n int, err error) { - // Slide existing data to beginning. - if b.r > 0 && len(p) > len(b.buf)-b.w { - copy(b.buf, b.buf[b.r:b.w]) - b.w -= b.r - b.r = 0 - } - - // Write new data. - n = copy(b.buf[b.w:], p) - b.w += n - if n < len(p) { - err = errWriteFull - } - return n, err -} diff --git a/vendor/golang.org/x/net/http2/fixed_buffer_test.go b/vendor/golang.org/x/net/http2/fixed_buffer_test.go deleted file mode 100644 index f5432f8d86..0000000000 --- a/vendor/golang.org/x/net/http2/fixed_buffer_test.go +++ /dev/null @@ -1,128 +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 ( - "reflect" - "testing" -) - -var bufferReadTests = []struct { - buf fixedBuffer - read, wn int - werr error - wp []byte - wbuf fixedBuffer -}{ - { - fixedBuffer{[]byte{'a', 0}, 0, 1}, - 5, 1, nil, []byte{'a'}, - fixedBuffer{[]byte{'a', 0}, 0, 0}, - }, - { - fixedBuffer{[]byte{0, 'a'}, 1, 2}, - 5, 1, nil, []byte{'a'}, - fixedBuffer{[]byte{0, 'a'}, 0, 0}, - }, - { - fixedBuffer{[]byte{'a', 'b'}, 0, 2}, - 1, 1, nil, []byte{'a'}, - fixedBuffer{[]byte{'a', 'b'}, 1, 2}, - }, - { - fixedBuffer{[]byte{}, 0, 0}, - 5, 0, errReadEmpty, []byte{}, - fixedBuffer{[]byte{}, 0, 0}, - }, -} - -func TestBufferRead(t *testing.T) { - for i, tt := range bufferReadTests { - read := make([]byte, tt.read) - n, err := tt.buf.Read(read) - if n != tt.wn { - t.Errorf("#%d: wn = %d want %d", i, n, tt.wn) - continue - } - if err != tt.werr { - t.Errorf("#%d: werr = %v want %v", i, err, tt.werr) - continue - } - read = read[:n] - if !reflect.DeepEqual(read, tt.wp) { - t.Errorf("#%d: read = %+v want %+v", i, read, tt.wp) - } - if !reflect.DeepEqual(tt.buf, tt.wbuf) { - t.Errorf("#%d: buf = %+v want %+v", i, tt.buf, tt.wbuf) - } - } -} - -var bufferWriteTests = []struct { - buf fixedBuffer - write, wn int - werr error - wbuf fixedBuffer -}{ - { - buf: fixedBuffer{ - buf: []byte{}, - }, - wbuf: fixedBuffer{ - buf: []byte{}, - }, - }, - { - buf: fixedBuffer{ - buf: []byte{1, 'a'}, - }, - write: 1, - wn: 1, - wbuf: fixedBuffer{ - buf: []byte{0, 'a'}, - w: 1, - }, - }, - { - buf: fixedBuffer{ - buf: []byte{'a', 1}, - r: 1, - w: 1, - }, - write: 2, - wn: 2, - wbuf: fixedBuffer{ - buf: []byte{0, 0}, - w: 2, - }, - }, - { - buf: fixedBuffer{ - buf: []byte{}, - }, - write: 5, - werr: errWriteFull, - wbuf: fixedBuffer{ - buf: []byte{}, - }, - }, -} - -func TestBufferWrite(t *testing.T) { - for i, tt := range bufferWriteTests { - n, err := tt.buf.Write(make([]byte, tt.write)) - if n != tt.wn { - t.Errorf("#%d: wrote %d bytes; want %d", i, n, tt.wn) - continue - } - if err != tt.werr { - t.Errorf("#%d: error = %v; want %v", i, err, tt.werr) - continue - } - if !reflect.DeepEqual(tt.buf, tt.wbuf) { - t.Errorf("#%d: buf = %+v; want %+v", i, tt.buf, tt.wbuf) - } - } -} diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go index 358833fedf..3b14890728 100644 --- a/vendor/golang.org/x/net/http2/frame.go +++ b/vendor/golang.org/x/net/http2/frame.go @@ -122,7 +122,7 @@ var flagName = map[FrameType]map[Flags]string{ // a frameParser parses a frame given its FrameHeader and payload // bytes. The length of payload will always equal fh.Length (which // might be 0). -type frameParser func(fh FrameHeader, payload []byte) (Frame, error) +type frameParser func(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error) var frameParsers = map[FrameType]frameParser{ FrameData: parseDataFrame, @@ -312,7 +312,7 @@ type Framer struct { MaxHeaderListSize uint32 // TODO: track which type of frame & with which flags was sent - // last. Then return an error (unless AllowIllegalWrites) if + // last. Then return an error (unless AllowIllegalWrites) if // we're in the middle of a header block and a // non-Continuation or Continuation on a different stream is // attempted to be written. @@ -323,6 +323,8 @@ type Framer struct { debugFramerBuf *bytes.Buffer debugReadLoggerf func(string, ...interface{}) debugWriteLoggerf func(string, ...interface{}) + + frameCache *frameCache // nil if frames aren't reused (default) } func (fr *Framer) maxHeaderListSize() uint32 { @@ -398,6 +400,27 @@ const ( maxFrameSize = 1<<24 - 1 ) +// SetReuseFrames allows the Framer to reuse Frames. +// If called on a Framer, Frames returned by calls to ReadFrame are only +// valid until the next call to ReadFrame. +func (fr *Framer) SetReuseFrames() { + if fr.frameCache != nil { + return + } + fr.frameCache = &frameCache{} +} + +type frameCache struct { + dataFrame DataFrame +} + +func (fc *frameCache) getDataFrame() *DataFrame { + if fc == nil { + return &DataFrame{} + } + return &fc.dataFrame +} + // NewFramer returns a Framer that writes frames to w and reads them from r. func NewFramer(w io.Writer, r io.Reader) *Framer { fr := &Framer{ @@ -477,7 +500,7 @@ func (fr *Framer) ReadFrame() (Frame, error) { if _, err := io.ReadFull(fr.r, payload); err != nil { return nil, err } - f, err := typeFrameParser(fh.Type)(fh, payload) + f, err := typeFrameParser(fh.Type)(fr.frameCache, fh, payload) if err != nil { if ce, ok := err.(connError); ok { return nil, fr.connError(ce.Code, ce.Reason) @@ -565,7 +588,7 @@ func (f *DataFrame) Data() []byte { return f.data } -func parseDataFrame(fh FrameHeader, payload []byte) (Frame, error) { +func parseDataFrame(fc *frameCache, fh FrameHeader, payload []byte) (Frame, error) { if fh.StreamID == 0 { // DATA frames MUST be associated with a stream. If a // DATA frame is received whose stream identifier @@ -574,9 +597,9 @@ func parseDataFrame(fh FrameHeader, payload []byte) (Frame, error) { // PROTOCOL_ERROR. return nil, connError{ErrCodeProtocol, "DATA frame with stream ID 0"} } - f := &DataFrame{ - FrameHeader: fh, - } + f := fc.getDataFrame() + f.FrameHeader = fh + var padSize byte if fh.Flags.Has(FlagDataPadded) { var err error @@ -600,6 +623,7 @@ var ( errStreamID = errors.New("invalid stream ID") errDepStreamID = errors.New("invalid dependent stream ID") errPadLength = errors.New("pad length too large") + errPadBytes = errors.New("padding bytes must all be zeros unless AllowIllegalWrites is enabled") ) func validStreamIDOrZero(streamID uint32) bool { @@ -623,6 +647,7 @@ func (f *Framer) WriteData(streamID uint32, endStream bool, data []byte) error { // // If pad is nil, the padding bit is not sent. // The length of pad must not exceed 255 bytes. +// The bytes of pad must all be zero, unless f.AllowIllegalWrites is set. // // It will perform exactly one Write to the underlying Writer. // It is the caller's responsibility not to violate the maximum frame size @@ -631,8 +656,18 @@ func (f *Framer) WriteDataPadded(streamID uint32, endStream bool, data, pad []by if !validStreamID(streamID) && !f.AllowIllegalWrites { return errStreamID } - if len(pad) > 255 { - return errPadLength + if len(pad) > 0 { + if len(pad) > 255 { + return errPadLength + } + if !f.AllowIllegalWrites { + for _, b := range pad { + if b != 0 { + // "Padding octets MUST be set to zero when sending." + return errPadBytes + } + } + } } var flags Flags if endStream { @@ -660,10 +695,10 @@ type SettingsFrame struct { p []byte } -func parseSettingsFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseSettingsFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { if fh.Flags.Has(FlagSettingsAck) && fh.Length > 0 { // When this (ACK 0x1) bit is set, the payload of the - // SETTINGS frame MUST be empty. Receipt of a + // SETTINGS frame MUST be empty. Receipt of a // SETTINGS frame with the ACK flag set and a length // field value other than 0 MUST be treated as a // connection error (Section 5.4.1) of type @@ -672,7 +707,7 @@ func parseSettingsFrame(fh FrameHeader, p []byte) (Frame, error) { } if fh.StreamID != 0 { // SETTINGS frames always apply to a connection, - // never a single stream. The stream identifier for a + // never a single stream. The stream identifier for a // SETTINGS frame MUST be zero (0x0). If an endpoint // receives a SETTINGS frame whose stream identifier // field is anything other than 0x0, the endpoint MUST @@ -762,7 +797,7 @@ type PingFrame struct { func (f *PingFrame) IsAck() bool { return f.Flags.Has(FlagPingAck) } -func parsePingFrame(fh FrameHeader, payload []byte) (Frame, error) { +func parsePingFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) { if len(payload) != 8 { return nil, ConnectionError(ErrCodeFrameSize) } @@ -802,7 +837,7 @@ func (f *GoAwayFrame) DebugData() []byte { return f.debugData } -func parseGoAwayFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseGoAwayFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { if fh.StreamID != 0 { return nil, ConnectionError(ErrCodeProtocol) } @@ -842,7 +877,7 @@ func (f *UnknownFrame) Payload() []byte { return f.p } -func parseUnknownFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseUnknownFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { return &UnknownFrame{fh, p}, nil } @@ -853,7 +888,7 @@ type WindowUpdateFrame struct { Increment uint32 // never read with high bit set } -func parseWindowUpdateFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseWindowUpdateFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { if len(p) != 4 { return nil, ConnectionError(ErrCodeFrameSize) } @@ -918,12 +953,12 @@ func (f *HeadersFrame) HasPriority() bool { return f.FrameHeader.Flags.Has(FlagHeadersPriority) } -func parseHeadersFrame(fh FrameHeader, p []byte) (_ Frame, err error) { +func parseHeadersFrame(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) { hf := &HeadersFrame{ FrameHeader: fh, } if fh.StreamID == 0 { - // HEADERS frames MUST be associated with a stream. If a HEADERS frame + // HEADERS frames MUST be associated with a stream. If a HEADERS frame // is received whose stream identifier field is 0x0, the recipient MUST // respond with a connection error (Section 5.4.1) of type // PROTOCOL_ERROR. @@ -1045,7 +1080,7 @@ type PriorityParam struct { Exclusive bool // Weight is the stream's zero-indexed weight. It should be - // set together with StreamDep, or neither should be set. Per + // set together with StreamDep, or neither should be set. Per // the spec, "Add one to the value to obtain a weight between // 1 and 256." Weight uint8 @@ -1055,7 +1090,7 @@ func (p PriorityParam) IsZero() bool { return p == PriorityParam{} } -func parsePriorityFrame(fh FrameHeader, payload []byte) (Frame, error) { +func parsePriorityFrame(_ *frameCache, fh FrameHeader, payload []byte) (Frame, error) { if fh.StreamID == 0 { return nil, connError{ErrCodeProtocol, "PRIORITY frame with stream ID 0"} } @@ -1102,7 +1137,7 @@ type RSTStreamFrame struct { ErrCode ErrCode } -func parseRSTStreamFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseRSTStreamFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { if len(p) != 4 { return nil, ConnectionError(ErrCodeFrameSize) } @@ -1132,7 +1167,7 @@ type ContinuationFrame struct { headerFragBuf []byte } -func parseContinuationFrame(fh FrameHeader, p []byte) (Frame, error) { +func parseContinuationFrame(_ *frameCache, fh FrameHeader, p []byte) (Frame, error) { if fh.StreamID == 0 { return nil, connError{ErrCodeProtocol, "CONTINUATION frame with stream ID 0"} } @@ -1182,7 +1217,7 @@ func (f *PushPromiseFrame) HeadersEnded() bool { return f.FrameHeader.Flags.Has(FlagPushPromiseEndHeaders) } -func parsePushPromise(fh FrameHeader, p []byte) (_ Frame, err error) { +func parsePushPromise(_ *frameCache, fh FrameHeader, p []byte) (_ Frame, err error) { pp := &PushPromiseFrame{ FrameHeader: fh, } diff --git a/vendor/golang.org/x/net/http2/frame_test.go b/vendor/golang.org/x/net/http2/frame_test.go index 7b1933d962..37266bc58f 100644 --- a/vendor/golang.org/x/net/http2/frame_test.go +++ b/vendor/golang.org/x/net/http2/frame_test.go @@ -141,7 +141,7 @@ func TestWriteDataPadded(t *testing.T) { streamID: 1, endStream: false, data: []byte("foo"), - pad: []byte("bar"), + pad: []byte{0, 0, 0}, wantHeader: FrameHeader{ Type: FrameData, Flags: FlagDataPadded, @@ -1096,6 +1096,95 @@ func TestMetaFrameHeader(t *testing.T) { } } +func TestSetReuseFrames(t *testing.T) { + fr, buf := testFramer() + fr.SetReuseFrames() + + // Check that DataFrames are reused. Note that + // SetReuseFrames only currently implements reuse of DataFrames. + firstDf := readAndVerifyDataFrame("ABC", 3, fr, buf, t) + + for i := 0; i < 10; i++ { + df := readAndVerifyDataFrame("XYZ", 3, fr, buf, t) + if df != firstDf { + t.Errorf("Expected Framer to return references to the same DataFrame. Have %v and %v", &df, &firstDf) + } + } + + for i := 0; i < 10; i++ { + df := readAndVerifyDataFrame("", 0, fr, buf, t) + if df != firstDf { + t.Errorf("Expected Framer to return references to the same DataFrame. Have %v and %v", &df, &firstDf) + } + } + + for i := 0; i < 10; i++ { + df := readAndVerifyDataFrame("HHH", 3, fr, buf, t) + if df != firstDf { + t.Errorf("Expected Framer to return references to the same DataFrame. Have %v and %v", &df, &firstDf) + } + } +} + +func TestSetReuseFramesMoreThanOnce(t *testing.T) { + fr, buf := testFramer() + fr.SetReuseFrames() + + firstDf := readAndVerifyDataFrame("ABC", 3, fr, buf, t) + fr.SetReuseFrames() + + for i := 0; i < 10; i++ { + df := readAndVerifyDataFrame("XYZ", 3, fr, buf, t) + // SetReuseFrames should be idempotent + fr.SetReuseFrames() + if df != firstDf { + t.Errorf("Expected Framer to return references to the same DataFrame. Have %v and %v", &df, &firstDf) + } + } +} + +func TestNoSetReuseFrames(t *testing.T) { + fr, buf := testFramer() + const numNewDataFrames = 10 + dfSoFar := make([]interface{}, numNewDataFrames) + + // Check that DataFrames are not reused if SetReuseFrames wasn't called. + // SetReuseFrames only currently implements reuse of DataFrames. + for i := 0; i < numNewDataFrames; i++ { + df := readAndVerifyDataFrame("XYZ", 3, fr, buf, t) + for _, item := range dfSoFar { + if df == item { + t.Errorf("Expected Framer to return new DataFrames since SetNoReuseFrames not set.") + } + } + dfSoFar[i] = df + } +} + +func readAndVerifyDataFrame(data string, length byte, fr *Framer, buf *bytes.Buffer, t *testing.T) *DataFrame { + var streamID uint32 = 1<<24 + 2<<16 + 3<<8 + 4 + fr.WriteData(streamID, true, []byte(data)) + wantEnc := "\x00\x00" + string(length) + "\x00\x01\x01\x02\x03\x04" + data + if buf.String() != wantEnc { + t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc) + } + f, err := fr.ReadFrame() + if err != nil { + t.Fatal(err) + } + df, ok := f.(*DataFrame) + if !ok { + t.Fatalf("got %T; want *DataFrame", f) + } + if !bytes.Equal(df.Data(), []byte(data)) { + t.Errorf("got %q; want %q", df.Data(), []byte(data)) + } + if f.Header().Flags&1 == 0 { + t.Errorf("didn't see END_STREAM flag") + } + return df +} + func encodeHeaderRaw(t *testing.T, pairs ...string) []byte { var he hpackEncoder return he.encodeHeaderRaw(t, pairs...) diff --git a/vendor/golang.org/x/net/http2/go18.go b/vendor/golang.org/x/net/http2/go18.go index 633202c39f..73cc2381f3 100644 --- a/vendor/golang.org/x/net/http2/go18.go +++ b/vendor/golang.org/x/net/http2/go18.go @@ -12,7 +12,11 @@ import ( "net/http" ) -func cloneTLSConfig(c *tls.Config) *tls.Config { return c.Clone() } +func cloneTLSConfig(c *tls.Config) *tls.Config { + c2 := c.Clone() + c2.GetClientCertificate = c.GetClientCertificate // golang.org/issue/19264 + return c2 +} var _ http.Pusher = (*responseWriter)(nil) diff --git a/vendor/golang.org/x/net/http2/go18_test.go b/vendor/golang.org/x/net/http2/go18_test.go index 836550597a..30e3b038bf 100644 --- a/vendor/golang.org/x/net/http2/go18_test.go +++ b/vendor/golang.org/x/net/http2/go18_test.go @@ -7,6 +7,7 @@ package http2 import ( + "crypto/tls" "net/http" "testing" "time" @@ -64,3 +65,15 @@ func TestConfigureServerIdleTimeout_Go18(t *testing.T) { } } } + +func TestCertClone(t *testing.T) { + c := &tls.Config{ + GetClientCertificate: func(*tls.CertificateRequestInfo) (*tls.Certificate, error) { + panic("shouldn't be called") + }, + } + c2 := cloneTLSConfig(c) + if c2.GetClientCertificate == nil { + t.Error("GetClientCertificate is nil") + } +} diff --git a/vendor/golang.org/x/net/http2/hpack/encode.go b/vendor/golang.org/x/net/http2/hpack/encode.go index f9bb033984..54726c2a3c 100644 --- a/vendor/golang.org/x/net/http2/hpack/encode.go +++ b/vendor/golang.org/x/net/http2/hpack/encode.go @@ -39,13 +39,14 @@ func NewEncoder(w io.Writer) *Encoder { tableSizeUpdate: false, w: w, } + e.dynTab.table.init() e.dynTab.setMaxSize(initialHeaderTableSize) return e } // WriteField encodes f into a single Write to e's underlying Writer. // This function may also produce bytes for "Header Table Size Update" -// if necessary. If produced, it is done before encoding f. +// if necessary. If produced, it is done before encoding f. func (e *Encoder) WriteField(f HeaderField) error { e.buf = e.buf[:0] @@ -88,29 +89,17 @@ func (e *Encoder) WriteField(f HeaderField) error { // only name matches, i points to that index and nameValueMatch // becomes false. func (e *Encoder) searchTable(f HeaderField) (i uint64, nameValueMatch bool) { - for idx, hf := range staticTable { - if !constantTimeStringCompare(hf.Name, f.Name) { - continue - } - if i == 0 { - i = uint64(idx + 1) - } - if f.Sensitive { - continue - } - if !constantTimeStringCompare(hf.Value, f.Value) { - continue - } - i = uint64(idx + 1) - nameValueMatch = true - return + i, nameValueMatch = staticTable.search(f) + if nameValueMatch { + return i, true } - j, nameValueMatch := e.dynTab.search(f) + j, nameValueMatch := e.dynTab.table.search(f) if nameValueMatch || (i == 0 && j != 0) { - i = j + uint64(len(staticTable)) + return j + uint64(staticTable.len()), nameValueMatch } - return + + return i, false } // SetMaxDynamicTableSize changes the dynamic header table size to v. diff --git a/vendor/golang.org/x/net/http2/hpack/encode_test.go b/vendor/golang.org/x/net/http2/hpack/encode_test.go index 92286f3bad..05f12db9cd 100644 --- a/vendor/golang.org/x/net/http2/hpack/encode_test.go +++ b/vendor/golang.org/x/net/http2/hpack/encode_test.go @@ -7,6 +7,8 @@ package hpack import ( "bytes" "encoding/hex" + "fmt" + "math/rand" "reflect" "strings" "testing" @@ -101,17 +103,20 @@ func TestEncoderSearchTable(t *testing.T) { wantMatch bool }{ // Name and Value match - {pair("foo", "bar"), uint64(len(staticTable) + 3), true}, - {pair("blake", "miz"), uint64(len(staticTable) + 2), true}, + {pair("foo", "bar"), uint64(staticTable.len()) + 3, true}, + {pair("blake", "miz"), uint64(staticTable.len()) + 2, true}, {pair(":method", "GET"), 2, true}, - // Only name match because Sensitive == true - {HeaderField{":method", "GET", true}, 2, false}, + // Only name match because Sensitive == true. This is allowed to match + // any ":method" entry. The current implementation uses the last entry + // added in newStaticTable. + {HeaderField{":method", "GET", true}, 3, false}, // Only Name matches - {pair("foo", "..."), uint64(len(staticTable) + 3), false}, - {pair("blake", "..."), uint64(len(staticTable) + 2), false}, - {pair(":method", "..."), 2, false}, + {pair("foo", "..."), uint64(staticTable.len()) + 3, false}, + {pair("blake", "..."), uint64(staticTable.len()) + 2, false}, + // As before, this is allowed to match any ":method" entry. + {pair(":method", "..."), 3, false}, // None match {pair("foo-", "bar"), 0, false}, @@ -328,3 +333,54 @@ func TestEncoderSetMaxDynamicTableSizeLimit(t *testing.T) { func removeSpace(s string) string { return strings.Replace(s, " ", "", -1) } + +func BenchmarkEncoderSearchTable(b *testing.B) { + e := NewEncoder(nil) + + // A sample of possible header fields. + // This is not based on any actual data from HTTP/2 traces. + var possible []HeaderField + for _, f := range staticTable.ents { + if f.Value == "" { + possible = append(possible, f) + continue + } + // Generate 5 random values, except for cookie and set-cookie, + // which we know can have many values in practice. + num := 5 + if f.Name == "cookie" || f.Name == "set-cookie" { + num = 25 + } + for i := 0; i < num; i++ { + f.Value = fmt.Sprintf("%s-%d", f.Name, i) + possible = append(possible, f) + } + } + for k := 0; k < 10; k++ { + f := HeaderField{ + Name: fmt.Sprintf("x-header-%d", k), + Sensitive: rand.Int()%2 == 0, + } + for i := 0; i < 5; i++ { + f.Value = fmt.Sprintf("%s-%d", f.Name, i) + possible = append(possible, f) + } + } + + // Add a random sample to the dynamic table. This very loosely simulates + // a history of 100 requests with 20 header fields per request. + for r := 0; r < 100*20; r++ { + f := possible[rand.Int31n(int32(len(possible)))] + // Skip if this is in the staticTable verbatim. + if _, has := staticTable.search(f); !has { + e.dynTab.add(f) + } + } + + b.ResetTimer() + for n := 0; n < b.N; n++ { + for _, f := range possible { + e.searchTable(f) + } + } +} diff --git a/vendor/golang.org/x/net/http2/hpack/hpack.go b/vendor/golang.org/x/net/http2/hpack/hpack.go index 135b9f62cd..176644acda 100644 --- a/vendor/golang.org/x/net/http2/hpack/hpack.go +++ b/vendor/golang.org/x/net/http2/hpack/hpack.go @@ -61,7 +61,7 @@ func (hf HeaderField) String() string { func (hf HeaderField) Size() uint32 { // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1 // "The size of the dynamic table is the sum of the size of - // its entries. The size of an entry is the sum of its name's + // its entries. The size of an entry is the sum of its name's // length in octets (as defined in Section 5.2), its value's // length in octets (see Section 5.2), plus 32. The size of // an entry is calculated using the length of the name and @@ -102,6 +102,7 @@ func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decod emit: emitFunc, emitEnabled: true, } + d.dynTab.table.init() d.dynTab.allowedMaxSize = maxDynamicTableSize d.dynTab.setMaxSize(maxDynamicTableSize) return d @@ -154,12 +155,9 @@ func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) { } type dynamicTable struct { - // ents is the FIFO described at // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2 - // The newest (low index) is append at the end, and items are - // evicted from the front. - ents []HeaderField - size uint32 + table headerFieldTable + size uint32 // in bytes maxSize uint32 // current maxSize allowedMaxSize uint32 // maxSize may go up to this, inclusive } @@ -169,95 +167,45 @@ func (dt *dynamicTable) setMaxSize(v uint32) { dt.evict() } -// TODO: change dynamicTable to be a struct with a slice and a size int field, -// per http://http2.github.io/http2-spec/compression.html#rfc.section.4.1: -// -// -// Then make add increment the size. maybe the max size should move from Decoder to -// dynamicTable and add should return an ok bool if there was enough space. -// -// Later we'll need a remove operation on dynamicTable. - func (dt *dynamicTable) add(f HeaderField) { - dt.ents = append(dt.ents, f) + dt.table.addEntry(f) dt.size += f.Size() dt.evict() } -// If we're too big, evict old stuff (front of the slice) +// If we're too big, evict old stuff. func (dt *dynamicTable) evict() { - base := dt.ents // keep base pointer of slice - for dt.size > dt.maxSize { - dt.size -= dt.ents[0].Size() - dt.ents = dt.ents[1:] + var n int + for dt.size > dt.maxSize && n < dt.table.len() { + dt.size -= dt.table.ents[n].Size() + n++ } - - // Shift slice contents down if we evicted things. - if len(dt.ents) != len(base) { - copy(base, dt.ents) - dt.ents = base[:len(dt.ents)] - } -} - -// constantTimeStringCompare compares string a and b in a constant -// time manner. -func constantTimeStringCompare(a, b string) bool { - if len(a) != len(b) { - return false - } - - c := byte(0) - - for i := 0; i < len(a); i++ { - c |= a[i] ^ b[i] - } - - return c == 0 -} - -// Search searches f in the table. The return value i is 0 if there is -// no name match. If there is name match or name/value match, i is the -// index of that entry (1-based). If both name and value match, -// nameValueMatch becomes true. -func (dt *dynamicTable) search(f HeaderField) (i uint64, nameValueMatch bool) { - l := len(dt.ents) - for j := l - 1; j >= 0; j-- { - ent := dt.ents[j] - if !constantTimeStringCompare(ent.Name, f.Name) { - continue - } - if i == 0 { - i = uint64(l - j) - } - if f.Sensitive { - continue - } - if !constantTimeStringCompare(ent.Value, f.Value) { - continue - } - i = uint64(l - j) - nameValueMatch = true - return - } - return + dt.table.evictOldest(n) } func (d *Decoder) maxTableIndex() int { - return len(d.dynTab.ents) + len(staticTable) + // This should never overflow. RFC 7540 Section 6.5.2 limits the size of + // the dynamic table to 2^32 bytes, where each entry will occupy more than + // one byte. Further, the staticTable has a fixed, small length. + return d.dynTab.table.len() + staticTable.len() } func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) { - if i < 1 { + // See Section 2.3.3. + if i == 0 { return } + if i <= uint64(staticTable.len()) { + return staticTable.ents[i-1], true + } if i > uint64(d.maxTableIndex()) { return } - if i <= uint64(len(staticTable)) { - return staticTable[i-1], true - } - dents := d.dynTab.ents - return dents[len(dents)-(int(i)-len(staticTable))], true + // In the dynamic table, newer entries have lower indices. + // However, dt.ents[0] is the oldest entry. Hence, dt.ents is + // the reversed dynamic table. + dt := d.dynTab.table + return dt.ents[dt.len()-(int(i)-staticTable.len())], true } // Decode decodes an entire block. @@ -307,7 +255,7 @@ func (d *Decoder) Write(p []byte) (n int, err error) { err = d.parseHeaderFieldRepr() if err == errNeedMore { // Extra paranoia, making sure saveBuf won't - // get too large. All the varint and string + // get too large. All the varint and string // reading code earlier should already catch // overlong things and return ErrStringLength, // but keep this as a last resort. diff --git a/vendor/golang.org/x/net/http2/hpack/hpack_test.go b/vendor/golang.org/x/net/http2/hpack/hpack_test.go index 4c7b17bfb1..c2f8fd102b 100644 --- a/vendor/golang.org/x/net/http2/hpack/hpack_test.go +++ b/vendor/golang.org/x/net/http2/hpack/hpack_test.go @@ -5,117 +5,16 @@ package hpack import ( - "bufio" "bytes" "encoding/hex" "fmt" "math/rand" "reflect" - "regexp" - "strconv" "strings" "testing" "time" ) -func TestStaticTable(t *testing.T) { - fromSpec := ` - +-------+-----------------------------+---------------+ - | 1 | :authority | | - | 2 | :method | GET | - | 3 | :method | POST | - | 4 | :path | / | - | 5 | :path | /index.html | - | 6 | :scheme | http | - | 7 | :scheme | https | - | 8 | :status | 200 | - | 9 | :status | 204 | - | 10 | :status | 206 | - | 11 | :status | 304 | - | 12 | :status | 400 | - | 13 | :status | 404 | - | 14 | :status | 500 | - | 15 | accept-charset | | - | 16 | accept-encoding | gzip, deflate | - | 17 | accept-language | | - | 18 | accept-ranges | | - | 19 | accept | | - | 20 | access-control-allow-origin | | - | 21 | age | | - | 22 | allow | | - | 23 | authorization | | - | 24 | cache-control | | - | 25 | content-disposition | | - | 26 | content-encoding | | - | 27 | content-language | | - | 28 | content-length | | - | 29 | content-location | | - | 30 | content-range | | - | 31 | content-type | | - | 32 | cookie | | - | 33 | date | | - | 34 | etag | | - | 35 | expect | | - | 36 | expires | | - | 37 | from | | - | 38 | host | | - | 39 | if-match | | - | 40 | if-modified-since | | - | 41 | if-none-match | | - | 42 | if-range | | - | 43 | if-unmodified-since | | - | 44 | last-modified | | - | 45 | link | | - | 46 | location | | - | 47 | max-forwards | | - | 48 | proxy-authenticate | | - | 49 | proxy-authorization | | - | 50 | range | | - | 51 | referer | | - | 52 | refresh | | - | 53 | retry-after | | - | 54 | server | | - | 55 | set-cookie | | - | 56 | strict-transport-security | | - | 57 | transfer-encoding | | - | 58 | user-agent | | - | 59 | vary | | - | 60 | via | | - | 61 | www-authenticate | | - +-------+-----------------------------+---------------+ -` - bs := bufio.NewScanner(strings.NewReader(fromSpec)) - re := regexp.MustCompile(`\| (\d+)\s+\| (\S+)\s*\| (\S(.*\S)?)?\s+\|`) - for bs.Scan() { - l := bs.Text() - if !strings.Contains(l, "|") { - continue - } - m := re.FindStringSubmatch(l) - if m == nil { - continue - } - i, err := strconv.Atoi(m[1]) - if err != nil { - t.Errorf("Bogus integer on line %q", l) - continue - } - if i < 1 || i > len(staticTable) { - t.Errorf("Bogus index %d on line %q", i, l) - continue - } - if got, want := staticTable[i-1].Name, m[2]; got != want { - t.Errorf("header index %d name = %q; want %q", i, got, want) - } - if got, want := staticTable[i-1].Value, m[3]; got != want { - t.Errorf("header index %d value = %q; want %q", i, got, want) - } - } - if err := bs.Err(); err != nil { - t.Error(err) - } -} - func (d *Decoder) mustAt(idx int) HeaderField { if hf, ok := d.at(uint64(idx)); !ok { panic(fmt.Sprintf("bogus index %d", idx)) @@ -132,10 +31,10 @@ func TestDynamicTableAt(t *testing.T) { } d.dynTab.add(pair("foo", "bar")) d.dynTab.add(pair("blake", "miz")) - if got, want := at(len(staticTable)+1), (pair("blake", "miz")); got != want { + if got, want := at(staticTable.len()+1), (pair("blake", "miz")); got != want { t.Errorf("at(dyn 1) = %v; want %v", got, want) } - if got, want := at(len(staticTable)+2), (pair("foo", "bar")); got != want { + if got, want := at(staticTable.len()+2), (pair("foo", "bar")); got != want { t.Errorf("at(dyn 2) = %v; want %v", got, want) } if got, want := at(3), (pair(":method", "POST")); got != want { @@ -143,41 +42,6 @@ func TestDynamicTableAt(t *testing.T) { } } -func TestDynamicTableSearch(t *testing.T) { - dt := dynamicTable{} - dt.setMaxSize(4096) - - dt.add(pair("foo", "bar")) - dt.add(pair("blake", "miz")) - dt.add(pair(":method", "GET")) - - tests := []struct { - hf HeaderField - wantI uint64 - wantMatch bool - }{ - // Name and Value match - {pair("foo", "bar"), 3, true}, - {pair(":method", "GET"), 1, true}, - - // Only name match because of Sensitive == true - {HeaderField{"blake", "miz", true}, 2, false}, - - // Only Name matches - {pair("foo", "..."), 3, false}, - {pair("blake", "..."), 2, false}, - {pair(":method", "..."), 1, false}, - - // None match - {pair("foo-", "bar"), 0, false}, - } - for _, tt := range tests { - if gotI, gotMatch := dt.search(tt.hf); gotI != tt.wantI || gotMatch != tt.wantMatch { - t.Errorf("d.search(%+v) = %v, %v; want %v, %v", tt.hf, gotI, gotMatch, tt.wantI, tt.wantMatch) - } - } -} - func TestDynamicTableSizeEvict(t *testing.T) { d := NewDecoder(4096, nil) if want := uint32(0); d.dynTab.size != want { @@ -196,7 +60,7 @@ func TestDynamicTableSizeEvict(t *testing.T) { if want := uint32(6 + 32); d.dynTab.size != want { t.Fatalf("after setMaxSize, size = %d; want %d", d.dynTab.size, want) } - if got, want := d.mustAt(len(staticTable)+1), (pair("foo", "bar")); got != want { + if got, want := d.mustAt(staticTable.len()+1), (pair("foo", "bar")); got != want { t.Errorf("at(dyn 1) = %v; want %v", got, want) } add(pair("long", strings.Repeat("x", 500))) @@ -255,9 +119,9 @@ func TestDecoderDecode(t *testing.T) { } func (dt *dynamicTable) reverseCopy() (hf []HeaderField) { - hf = make([]HeaderField, len(dt.ents)) + hf = make([]HeaderField, len(dt.table.ents)) for i := range hf { - hf[i] = dt.ents[len(dt.ents)-1-i] + hf[i] = dt.table.ents[len(dt.table.ents)-1-i] } return } diff --git a/vendor/golang.org/x/net/http2/hpack/tables.go b/vendor/golang.org/x/net/http2/hpack/tables.go index b9283a0233..8701592444 100644 --- a/vendor/golang.org/x/net/http2/hpack/tables.go +++ b/vendor/golang.org/x/net/http2/hpack/tables.go @@ -4,73 +4,199 @@ package hpack +import ( + "fmt" +) + +// headerFieldTable implements a list of HeaderFields. +// This is used to implement the static and dynamic tables. +type headerFieldTable struct { + // For static tables, entries are never evicted. + // + // For dynamic tables, entries are evicted from ents[0] and added to the end. + // Each entry has a unique id that starts at one and increments for each + // entry that is added. This unique id is stable across evictions, meaning + // it can be used as a pointer to a specific entry. As in hpack, unique ids + // are 1-based. The unique id for ents[k] is k + evictCount + 1. + // + // Zero is not a valid unique id. + // + // evictCount should not overflow in any remotely practical situation. In + // practice, we will have one dynamic table per HTTP/2 connection. If we + // assume a very powerful server that handles 1M QPS per connection and each + // request adds (then evicts) 100 entries from the table, it would still take + // 2M years for evictCount to overflow. + ents []HeaderField + evictCount uint64 + + // byName maps a HeaderField name to the unique id of the newest entry with + // the same name. See above for a definition of "unique id". + byName map[string]uint64 + + // byNameValue maps a HeaderField name/value pair to the unique id of the newest + // entry with the same name and value. See above for a definition of "unique id". + byNameValue map[pairNameValue]uint64 +} + +type pairNameValue struct { + name, value string +} + +func (t *headerFieldTable) init() { + t.byName = make(map[string]uint64) + t.byNameValue = make(map[pairNameValue]uint64) +} + +// len reports the number of entries in the table. +func (t *headerFieldTable) len() int { + return len(t.ents) +} + +// addEntry adds a new entry. +func (t *headerFieldTable) addEntry(f HeaderField) { + id := uint64(t.len()) + t.evictCount + 1 + t.byName[f.Name] = id + t.byNameValue[pairNameValue{f.Name, f.Value}] = id + t.ents = append(t.ents, f) +} + +// evictOldest evicts the n oldest entries in the table. +func (t *headerFieldTable) evictOldest(n int) { + if n > t.len() { + panic(fmt.Sprintf("evictOldest(%v) on table with %v entries", n, t.len())) + } + for k := 0; k < n; k++ { + f := t.ents[k] + id := t.evictCount + uint64(k) + 1 + if t.byName[f.Name] == id { + t.byName[f.Name] = 0 + } + if p := (pairNameValue{f.Name, f.Value}); t.byNameValue[p] == id { + t.byNameValue[p] = 0 + } + } + copy(t.ents, t.ents[n:]) + for k := t.len() - n; k < t.len(); k++ { + t.ents[k] = HeaderField{} // so strings can be garbage collected + } + t.ents = t.ents[:t.len()-n] + if t.evictCount+uint64(n) < t.evictCount { + panic("evictCount overflow") + } + t.evictCount += uint64(n) +} + +// search finds f in the table. If there is no match, i is 0. +// If both name and value match, i is the matched index and nameValueMatch +// becomes true. If only name matches, i points to that index and +// nameValueMatch becomes false. +// +// The returned index is a 1-based HPACK index. For dynamic tables, HPACK says +// that index 1 should be the newest entry, but t.ents[0] is the oldest entry, +// meaning t.ents is reversed for dynamic tables. Hence, when t is a dynamic +// table, the return value i actually refers to the entry t.ents[t.len()-i]. +// +// All tables are assumed to be a dynamic tables except for the global +// staticTable pointer. +// +// See Section 2.3.3. +func (t *headerFieldTable) search(f HeaderField) (i uint64, nameValueMatch bool) { + if !f.Sensitive { + if id := t.byNameValue[pairNameValue{f.Name, f.Value}]; id != 0 { + return t.idToIndex(id), true + } + } + if id := t.byName[f.Name]; id != 0 { + return t.idToIndex(id), false + } + return 0, false +} + +// idToIndex converts a unique id to an HPACK index. +// See Section 2.3.3. +func (t *headerFieldTable) idToIndex(id uint64) uint64 { + if id <= t.evictCount { + panic(fmt.Sprintf("id (%v) <= evictCount (%v)", id, t.evictCount)) + } + k := id - t.evictCount - 1 // convert id to an index t.ents[k] + if t != staticTable { + return uint64(t.len()) - k // dynamic table + } + return k + 1 +} + func pair(name, value string) HeaderField { return HeaderField{Name: name, Value: value} } // http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B -var staticTable = [...]HeaderField{ - pair(":authority", ""), // index 1 (1-based) - pair(":method", "GET"), - pair(":method", "POST"), - pair(":path", "/"), - pair(":path", "/index.html"), - pair(":scheme", "http"), - pair(":scheme", "https"), - pair(":status", "200"), - pair(":status", "204"), - pair(":status", "206"), - pair(":status", "304"), - pair(":status", "400"), - pair(":status", "404"), - pair(":status", "500"), - pair("accept-charset", ""), - pair("accept-encoding", "gzip, deflate"), - pair("accept-language", ""), - pair("accept-ranges", ""), - pair("accept", ""), - pair("access-control-allow-origin", ""), - pair("age", ""), - pair("allow", ""), - pair("authorization", ""), - pair("cache-control", ""), - pair("content-disposition", ""), - pair("content-encoding", ""), - pair("content-language", ""), - pair("content-length", ""), - pair("content-location", ""), - pair("content-range", ""), - pair("content-type", ""), - pair("cookie", ""), - pair("date", ""), - pair("etag", ""), - pair("expect", ""), - pair("expires", ""), - pair("from", ""), - pair("host", ""), - pair("if-match", ""), - pair("if-modified-since", ""), - pair("if-none-match", ""), - pair("if-range", ""), - pair("if-unmodified-since", ""), - pair("last-modified", ""), - pair("link", ""), - pair("location", ""), - pair("max-forwards", ""), - pair("proxy-authenticate", ""), - pair("proxy-authorization", ""), - pair("range", ""), - pair("referer", ""), - pair("refresh", ""), - pair("retry-after", ""), - pair("server", ""), - pair("set-cookie", ""), - pair("strict-transport-security", ""), - pair("transfer-encoding", ""), - pair("user-agent", ""), - pair("vary", ""), - pair("via", ""), - pair("www-authenticate", ""), +var staticTable = newStaticTable() + +func newStaticTable() *headerFieldTable { + t := &headerFieldTable{} + t.init() + t.addEntry(pair(":authority", "")) + t.addEntry(pair(":method", "GET")) + t.addEntry(pair(":method", "POST")) + t.addEntry(pair(":path", "/")) + t.addEntry(pair(":path", "/index.html")) + t.addEntry(pair(":scheme", "http")) + t.addEntry(pair(":scheme", "https")) + t.addEntry(pair(":status", "200")) + t.addEntry(pair(":status", "204")) + t.addEntry(pair(":status", "206")) + t.addEntry(pair(":status", "304")) + t.addEntry(pair(":status", "400")) + t.addEntry(pair(":status", "404")) + t.addEntry(pair(":status", "500")) + t.addEntry(pair("accept-charset", "")) + t.addEntry(pair("accept-encoding", "gzip, deflate")) + t.addEntry(pair("accept-language", "")) + t.addEntry(pair("accept-ranges", "")) + t.addEntry(pair("accept", "")) + t.addEntry(pair("access-control-allow-origin", "")) + t.addEntry(pair("age", "")) + t.addEntry(pair("allow", "")) + t.addEntry(pair("authorization", "")) + t.addEntry(pair("cache-control", "")) + t.addEntry(pair("content-disposition", "")) + t.addEntry(pair("content-encoding", "")) + t.addEntry(pair("content-language", "")) + t.addEntry(pair("content-length", "")) + t.addEntry(pair("content-location", "")) + t.addEntry(pair("content-range", "")) + t.addEntry(pair("content-type", "")) + t.addEntry(pair("cookie", "")) + t.addEntry(pair("date", "")) + t.addEntry(pair("etag", "")) + t.addEntry(pair("expect", "")) + t.addEntry(pair("expires", "")) + t.addEntry(pair("from", "")) + t.addEntry(pair("host", "")) + t.addEntry(pair("if-match", "")) + t.addEntry(pair("if-modified-since", "")) + t.addEntry(pair("if-none-match", "")) + t.addEntry(pair("if-range", "")) + t.addEntry(pair("if-unmodified-since", "")) + t.addEntry(pair("last-modified", "")) + t.addEntry(pair("link", "")) + t.addEntry(pair("location", "")) + t.addEntry(pair("max-forwards", "")) + t.addEntry(pair("proxy-authenticate", "")) + t.addEntry(pair("proxy-authorization", "")) + t.addEntry(pair("range", "")) + t.addEntry(pair("referer", "")) + t.addEntry(pair("refresh", "")) + t.addEntry(pair("retry-after", "")) + t.addEntry(pair("server", "")) + t.addEntry(pair("set-cookie", "")) + t.addEntry(pair("strict-transport-security", "")) + t.addEntry(pair("transfer-encoding", "")) + t.addEntry(pair("user-agent", "")) + t.addEntry(pair("vary", "")) + t.addEntry(pair("via", "")) + t.addEntry(pair("www-authenticate", "")) + return t } var huffmanCodes = [256]uint32{ diff --git a/vendor/golang.org/x/net/http2/hpack/tables_test.go b/vendor/golang.org/x/net/http2/hpack/tables_test.go new file mode 100644 index 0000000000..7f40d9a420 --- /dev/null +++ b/vendor/golang.org/x/net/http2/hpack/tables_test.go @@ -0,0 +1,188 @@ +// Copyright 2017 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 hpack + +import ( + "bufio" + "regexp" + "strconv" + "strings" + "testing" +) + +func TestHeaderFieldTable(t *testing.T) { + table := &headerFieldTable{} + table.init() + table.addEntry(pair("key1", "value1-1")) + table.addEntry(pair("key2", "value2-1")) + table.addEntry(pair("key1", "value1-2")) + table.addEntry(pair("key3", "value3-1")) + table.addEntry(pair("key4", "value4-1")) + table.addEntry(pair("key2", "value2-2")) + + // Tests will be run twice: once before evicting anything, and + // again after evicting the three oldest entries. + tests := []struct { + f HeaderField + beforeWantStaticI uint64 + beforeWantMatch bool + afterWantStaticI uint64 + afterWantMatch bool + }{ + {HeaderField{"key1", "value1-1", false}, 1, true, 0, false}, + {HeaderField{"key1", "value1-2", false}, 3, true, 0, false}, + {HeaderField{"key1", "value1-3", false}, 3, false, 0, false}, + {HeaderField{"key2", "value2-1", false}, 2, true, 3, false}, + {HeaderField{"key2", "value2-2", false}, 6, true, 3, true}, + {HeaderField{"key2", "value2-3", false}, 6, false, 3, false}, + {HeaderField{"key4", "value4-1", false}, 5, true, 2, true}, + // Name match only, because sensitive. + {HeaderField{"key4", "value4-1", true}, 5, false, 2, false}, + // Key not found. + {HeaderField{"key5", "value5-x", false}, 0, false, 0, false}, + } + + staticToDynamic := func(i uint64) uint64 { + if i == 0 { + return 0 + } + return uint64(table.len()) - i + 1 // dynamic is the reversed table + } + + searchStatic := func(f HeaderField) (uint64, bool) { + old := staticTable + staticTable = table + defer func() { staticTable = old }() + return staticTable.search(f) + } + + searchDynamic := func(f HeaderField) (uint64, bool) { + return table.search(f) + } + + for _, test := range tests { + gotI, gotMatch := searchStatic(test.f) + if wantI, wantMatch := test.beforeWantStaticI, test.beforeWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("before evictions: searchStatic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + gotI, gotMatch = searchDynamic(test.f) + wantDynamicI := staticToDynamic(test.beforeWantStaticI) + if wantI, wantMatch := wantDynamicI, test.beforeWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("before evictions: searchDynamic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + } + + table.evictOldest(3) + + for _, test := range tests { + gotI, gotMatch := searchStatic(test.f) + if wantI, wantMatch := test.afterWantStaticI, test.afterWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("after evictions: searchStatic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + gotI, gotMatch = searchDynamic(test.f) + wantDynamicI := staticToDynamic(test.afterWantStaticI) + if wantI, wantMatch := wantDynamicI, test.afterWantMatch; gotI != wantI || gotMatch != wantMatch { + t.Errorf("after evictions: searchDynamic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) + } + } +} + +func TestStaticTable(t *testing.T) { + fromSpec := ` + +-------+-----------------------------+---------------+ + | 1 | :authority | | + | 2 | :method | GET | + | 3 | :method | POST | + | 4 | :path | / | + | 5 | :path | /index.html | + | 6 | :scheme | http | + | 7 | :scheme | https | + | 8 | :status | 200 | + | 9 | :status | 204 | + | 10 | :status | 206 | + | 11 | :status | 304 | + | 12 | :status | 400 | + | 13 | :status | 404 | + | 14 | :status | 500 | + | 15 | accept-charset | | + | 16 | accept-encoding | gzip, deflate | + | 17 | accept-language | | + | 18 | accept-ranges | | + | 19 | accept | | + | 20 | access-control-allow-origin | | + | 21 | age | | + | 22 | allow | | + | 23 | authorization | | + | 24 | cache-control | | + | 25 | content-disposition | | + | 26 | content-encoding | | + | 27 | content-language | | + | 28 | content-length | | + | 29 | content-location | | + | 30 | content-range | | + | 31 | content-type | | + | 32 | cookie | | + | 33 | date | | + | 34 | etag | | + | 35 | expect | | + | 36 | expires | | + | 37 | from | | + | 38 | host | | + | 39 | if-match | | + | 40 | if-modified-since | | + | 41 | if-none-match | | + | 42 | if-range | | + | 43 | if-unmodified-since | | + | 44 | last-modified | | + | 45 | link | | + | 46 | location | | + | 47 | max-forwards | | + | 48 | proxy-authenticate | | + | 49 | proxy-authorization | | + | 50 | range | | + | 51 | referer | | + | 52 | refresh | | + | 53 | retry-after | | + | 54 | server | | + | 55 | set-cookie | | + | 56 | strict-transport-security | | + | 57 | transfer-encoding | | + | 58 | user-agent | | + | 59 | vary | | + | 60 | via | | + | 61 | www-authenticate | | + +-------+-----------------------------+---------------+ +` + bs := bufio.NewScanner(strings.NewReader(fromSpec)) + re := regexp.MustCompile(`\| (\d+)\s+\| (\S+)\s*\| (\S(.*\S)?)?\s+\|`) + for bs.Scan() { + l := bs.Text() + if !strings.Contains(l, "|") { + continue + } + m := re.FindStringSubmatch(l) + if m == nil { + continue + } + i, err := strconv.Atoi(m[1]) + if err != nil { + t.Errorf("Bogus integer on line %q", l) + continue + } + if i < 1 || i > staticTable.len() { + t.Errorf("Bogus index %d on line %q", i, l) + continue + } + if got, want := staticTable.ents[i-1].Name, m[2]; got != want { + t.Errorf("header index %d name = %q; want %q", i, got, want) + } + if got, want := staticTable.ents[i-1].Value, m[3]; got != want { + t.Errorf("header index %d value = %q; want %q", i, got, want) + } + } + if err := bs.Err(); err != nil { + t.Error(err) + } +} diff --git a/vendor/golang.org/x/net/http2/pipe.go b/vendor/golang.org/x/net/http2/pipe.go index 53b7a1daf6..914aaf8a7f 100644 --- a/vendor/golang.org/x/net/http2/pipe.go +++ b/vendor/golang.org/x/net/http2/pipe.go @@ -10,7 +10,7 @@ import ( "sync" ) -// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like +// pipe is a goroutine-safe io.Reader/io.Writer pair. It's like // io.Pipe except there are no PipeReader/PipeWriter halves, and the // underlying buffer is an interface. (io.Pipe is always unbuffered) type pipe struct { diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 3c6b90ccd5..550427dda6 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -110,11 +110,38 @@ type Server struct { // activity for the purposes of IdleTimeout. IdleTimeout time.Duration + // MaxUploadBufferPerConnection is the size of the initial flow + // control window for each connections. The HTTP/2 spec does not + // allow this to be smaller than 65535 or larger than 2^32-1. + // If the value is outside this range, a default value will be + // used instead. + MaxUploadBufferPerConnection int32 + + // MaxUploadBufferPerStream is the size of the initial flow control + // window for each stream. The HTTP/2 spec does not allow this to + // be larger than 2^32-1. If the value is zero or larger than the + // maximum, a default value will be used instead. + MaxUploadBufferPerStream int32 + // NewWriteScheduler constructs a write scheduler for a connection. // If nil, a default scheduler is chosen. NewWriteScheduler func() WriteScheduler } +func (s *Server) initialConnRecvWindowSize() int32 { + if s.MaxUploadBufferPerConnection > initialWindowSize { + return s.MaxUploadBufferPerConnection + } + return 1 << 20 +} + +func (s *Server) initialStreamRecvWindowSize() int32 { + if s.MaxUploadBufferPerStream > 0 { + return s.MaxUploadBufferPerStream + } + return 1 << 20 +} + func (s *Server) maxReadFrameSize() uint32 { if v := s.MaxReadFrameSize; v >= minMaxFrameSize && v <= maxFrameSize { return v @@ -255,27 +282,27 @@ 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 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, + 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(), + initialStreamSendWindowSize: initialWindowSize, + maxFrameSize: initialMaxFrameSize, + headerTableSize: initialHeaderTableSize, + serveG: newGoroutineLock(), + pushEnabled: true, } // The net/http package sets the write deadline from the @@ -294,6 +321,9 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) { sc.writeSched = NewRandomWriteScheduler() } + // These start at the RFC-specified defaults. If there is a higher + // configured value for inflow, that will be updated when we send a + // WINDOW_UPDATE shortly after sending SETTINGS. sc.flow.add(initialWindowSize) sc.inflow.add(initialWindowSize) sc.hpackEncoder = hpack.NewEncoder(&sc.headerWriteBuf) @@ -387,34 +417,34 @@ type serverConn struct { writeSched WriteScheduler // Everything following is owned by the serve loop; use serveG.check(): - serveG goroutineLock // used to verify funcs are on serve() - pushEnabled bool - sawFirstSettings bool // got the initial SETTINGS frame after the preface - needToSendSettingsAck bool - 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 - 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 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 - 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 - idleTimer *time.Timer // nil if unused - idleTimerCh <-chan time.Time // nil if unused + serveG goroutineLock // used to verify funcs are on serve() + pushEnabled bool + sawFirstSettings bool // got the initial SETTINGS frame after the preface + needToSendSettingsAck bool + 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 + 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 + initialStreamSendWindowSize int32 + maxFrameSize int32 + headerTableSize uint32 + peerMaxHeaderListSize uint32 // zero means unknown (default) + canonHeader map[string]string // http2-lower-case -> Go-Canonical-Case + 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 + 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 + idleTimer *time.Timer // nil if unused + idleTimerCh <-chan time.Time // nil if unused // Owned by the writeFrameAsync goroutine: headerWriteBuf bytes.Buffer @@ -463,10 +493,9 @@ type stream struct { numTrailerValues int64 weight uint8 state streamState - resetQueued bool // RST_STREAM queued for write; set by sc.resetStream - 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 + resetQueued bool // RST_STREAM queued for write; set by sc.resetStream + gotTrailerHeader bool // HEADER frame for trailers was seen + wroteHeaders bool // whether we wrote headers (not status 100) trailer http.Header // accumulated trailers reqTrailer http.Header // handler's Request.Trailer @@ -696,21 +725,23 @@ func (sc *serverConn) serve() { {SettingMaxFrameSize, sc.srv.maxReadFrameSize()}, {SettingMaxConcurrentStreams, sc.advMaxStreams}, {SettingMaxHeaderListSize, sc.maxHeaderListSize()}, - - // TODO: more actual settings, notably - // SettingInitialWindowSize, but then we also - // want to bump up the conn window size the - // same amount here right after the settings + {SettingInitialWindowSize, uint32(sc.srv.initialStreamRecvWindowSize())}, }, }) sc.unackedSettings++ + // Each connection starts with intialWindowSize inflow tokens. + // If a higher value is configured, we add more tokens. + if diff := sc.srv.initialConnRecvWindowSize() - initialWindowSize; diff > 0 { + sc.sendWindowUpdate(nil, int(diff)) + } + if err := sc.readPreface(); err != nil { sc.condlogf(err, "http2: server: error reading preface from client %v: %v", sc.conn.RemoteAddr(), err) return } // Now that we've got the preface, get us out of the - // "StateNew" state. We can't go directly to idle, though. + // "StateNew" state. We can't go directly to idle, though. // Active means we read some data and anticipate a request. We'll // do another Active when we get a HEADERS frame. sc.setConnState(http.StateActive) @@ -1395,9 +1426,9 @@ func (sc *serverConn) processSettingInitialWindowSize(val uint32) error { // adjust the size of all stream flow control windows that it // maintains by the difference between the new value and the // old value." - old := sc.initialWindowSize - sc.initialWindowSize = int32(val) - growth := sc.initialWindowSize - old // may be negative + old := sc.initialStreamSendWindowSize + sc.initialStreamSendWindowSize = int32(val) + growth := int32(val) - old // may be negative for _, st := range sc.streams { if !st.flow.add(growth) { // 6.9.2 Initial Flow Control Window Size @@ -1719,9 +1750,9 @@ func (sc *serverConn) newStream(id, pusherID uint32, state streamState) *stream } 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 + st.flow.add(sc.initialStreamSendWindowSize) + st.inflow.conn = &sc.inflow // link to conn-level counter + st.inflow.add(sc.srv.initialStreamRecvWindowSize()) sc.streams[id] = st sc.writeSched.OpenStream(st.id, OpenStreamOptions{PusherID: pusherID}) @@ -1785,16 +1816,14 @@ func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*res 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 } + req.Body.(*requestBody).pipe = &pipe{ + b: &dataBuffer{expected: req.ContentLength}, + } } return rw, req, nil } @@ -1890,24 +1919,6 @@ func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*r return rw, req, nil } -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: - } -} - // Run on its own goroutine. func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler func(http.ResponseWriter, *http.Request)) { didPanic := true @@ -2003,12 +2014,6 @@ func (sc *serverConn) noteBodyReadFromHandler(st *stream, n int, err error) { 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) - } - } } func (sc *serverConn) noteBodyRead(st *stream, n int) { @@ -2103,8 +2108,8 @@ func (b *requestBody) Read(p []byte) (n int, err error) { return } -// responseWriter is the http.ResponseWriter implementation. It's -// intentionally small (1 pointer wide) to minimize garbage. The +// responseWriter is the http.ResponseWriter implementation. It's +// intentionally small (1 pointer wide) to minimize garbage. The // responseWriterState pointer inside is zeroed at the end of a // request (in handlerDone) and calls on the responseWriter thereafter // simply crash (caller's mistake), but the much larger responseWriterState @@ -2278,7 +2283,7 @@ const TrailerPrefix = "Trailer:" // says you SHOULD (but not must) predeclare any trailers in the // header, the official ResponseWriter rules said trailers in Go must // be predeclared, and then we reuse the same ResponseWriter.Header() -// map to mean both Headers and Trailers. When it's time to write the +// map to mean both Headers and Trailers. When it's time to write the // Trailers, we pick out the fields of Headers that were declared as // trailers. That worked for a while, until we found the first major // user of Trailers in the wild: gRPC (using them only over http2), diff --git a/vendor/golang.org/x/net/http2/server_test.go b/vendor/golang.org/x/net/http2/server_test.go index dfa4cff2ea..407fafc6d5 100644 --- a/vendor/golang.org/x/net/http2/server_test.go +++ b/vendor/golang.org/x/net/http2/server_test.go @@ -80,6 +80,7 @@ type serverTesterOpt string var optOnlyServer = serverTesterOpt("only_server") var optQuiet = serverTesterOpt("quiet_logging") +var optFramerReuseFrames = serverTesterOpt("frame_reuse_frames") func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{}) *serverTester { resetHooks() @@ -91,7 +92,7 @@ func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{} NextProtos: []string{NextProtoTLS}, } - var onlyServer, quiet bool + var onlyServer, quiet, framerReuseFrames bool h2server := new(Server) for _, opt := range opts { switch v := opt.(type) { @@ -107,6 +108,8 @@ func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{} onlyServer = true case optQuiet: quiet = true + case optFramerReuseFrames: + framerReuseFrames = true } case func(net.Conn, http.ConnState): ts.Config.ConnState = v @@ -149,6 +152,9 @@ func newServerTester(t testing.TB, handler http.HandlerFunc, opts ...interface{} } st.cc = cc st.fr = NewFramer(cc, cc) + if framerReuseFrames { + st.fr.SetReuseFrames() + } if !logFrameReads && !logFrameWrites { st.fr.debugReadLoggerf = func(m string, v ...interface{}) { m = time.Now().Format("2006-01-02 15:04:05.999999999 ") + strings.TrimPrefix(m, "http2: ") + "\n" @@ -254,11 +260,52 @@ func (st *serverTester) Close() { // greet initiates the client's HTTP/2 connection into a state where // frames may be sent. func (st *serverTester) greet() { + st.greetAndCheckSettings(func(Setting) error { return nil }) +} + +func (st *serverTester) greetAndCheckSettings(checkSetting func(s Setting) error) { st.writePreface() st.writeInitialSettings() - st.wantSettings() + st.wantSettings().ForeachSetting(checkSetting) st.writeSettingsAck() - st.wantSettingsAck() + + // The initial WINDOW_UPDATE and SETTINGS ACK can come in any order. + var gotSettingsAck bool + var gotWindowUpdate bool + + for i := 0; i < 2; i++ { + f, err := st.readFrame() + if err != nil { + st.t.Fatal(err) + } + switch f := f.(type) { + case *SettingsFrame: + if !f.Header().Flags.Has(FlagSettingsAck) { + st.t.Fatal("Settings Frame didn't have ACK set") + } + gotSettingsAck = true + + case *WindowUpdateFrame: + if f.FrameHeader.StreamID != 0 { + st.t.Fatalf("WindowUpdate StreamID = %d; want 0", f.FrameHeader.StreamID, 0) + } + incr := uint32((&Server{}).initialConnRecvWindowSize() - initialWindowSize) + if f.Increment != incr { + st.t.Fatalf("WindowUpdate increment = %d; want %d", f.Increment, incr) + } + gotWindowUpdate = true + + default: + st.t.Fatalf("Wanting a settings ACK or window update, received a %T", f) + } + } + + if !gotSettingsAck { + st.t.Fatalf("Didn't get a settings ACK") + } + if !gotWindowUpdate { + st.t.Fatalf("Didn't get a window update") + } } func (st *serverTester) writePreface() { @@ -318,7 +365,7 @@ 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 +// 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. The :authority header // defaults to st.ts.Listener.Addr(). @@ -578,12 +625,7 @@ func TestServer(t *testing.T) { server sends in the HTTP/2 connection. `) - st.writePreface() - st.writeInitialSettings() - st.wantSettings() - st.writeSettingsAck() - st.wantSettingsAck() - + st.greet() st.writeHeaders(HeadersFrameParam{ StreamID: 1, // clients send odd numbers BlockFragment: st.encodeHeader(), @@ -656,7 +698,7 @@ func TestServer_Request_Get_PathSlashes(t *testing.T) { } // TODO: add a test with EndStream=true on the HEADERS but setting a -// Content-Length anyway. Should we just omit it and force it to +// Content-Length anyway. Should we just omit it and force it to // zero? func TestServer_Request_Post_NoContentLength_EndStream(t *testing.T) { @@ -1192,7 +1234,7 @@ func TestServer_Handler_Sends_WindowUpdate_Padding(t *testing.T) { EndStream: false, EndHeaders: true, }) - st.writeDataPadded(1, false, []byte("abcdef"), []byte("1234")) + st.writeDataPadded(1, false, []byte("abcdef"), []byte{0, 0, 0, 0}) // Expect to immediately get our 5 bytes of padding back for // both the connection and stream (4 bytes of padding + 1 byte of length) @@ -2595,11 +2637,9 @@ func TestServerDoS_MaxHeaderListSize(t *testing.T) { defer st.Close() // shake hands - st.writePreface() - st.writeInitialSettings() frameSize := defaultMaxReadFrameSize var advHeaderListSize *uint32 - st.wantSettings().ForeachSetting(func(s Setting) error { + st.greetAndCheckSettings(func(s Setting) error { switch s.ID { case SettingMaxFrameSize: if s.Val < minMaxFrameSize { @@ -2614,8 +2654,6 @@ func TestServerDoS_MaxHeaderListSize(t *testing.T) { } return nil }) - st.writeSettingsAck() - st.wantSettingsAck() if advHeaderListSize == nil { t.Errorf("server didn't advertise a max header list size") @@ -2994,6 +3032,89 @@ func BenchmarkServerPosts(b *testing.B) { } } +// Send a stream of messages from server to client in separate data frames. +// Brings up performance issues seen in long streams. +// Created to show problem in go issue #18502 +func BenchmarkServerToClientStreamDefaultOptions(b *testing.B) { + benchmarkServerToClientStream(b) +} + +// Justification for Change-Id: Iad93420ef6c3918f54249d867098f1dadfa324d8 +// Expect to see memory/alloc reduction by opting in to Frame reuse with the Framer. +func BenchmarkServerToClientStreamReuseFrames(b *testing.B) { + benchmarkServerToClientStream(b, optFramerReuseFrames) +} + +func benchmarkServerToClientStream(b *testing.B, newServerOpts ...interface{}) { + defer disableGoroutineTracking()() + b.ReportAllocs() + const msgLen = 1 + // default window size + const windowSize = 1<<16 - 1 + + // next message to send from the server and for the client to expect + nextMsg := func(i int) []byte { + msg := make([]byte, msgLen) + msg[0] = byte(i) + if len(msg) != msgLen { + panic("invalid test setup msg length") + } + return msg + } + + 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) + } + for i := 0; i < b.N; i += 1 { + w.Write(nextMsg(i)) + w.(http.Flusher).Flush() + } + }, newServerOpts...) + defer st.Close() + st.greet() + + const id = uint32(1) + + st.writeHeaders(HeadersFrameParam{ + StreamID: id, + BlockFragment: st.encodeHeader(":method", "POST"), + EndStream: false, + EndHeaders: true, + }) + + st.writeData(id, true, nil) + st.wantHeaders() + + var pendingWindowUpdate = uint32(0) + + for i := 0; i < b.N; i += 1 { + expected := nextMsg(i) + df := st.wantData() + if bytes.Compare(expected, df.data) != 0 { + b.Fatalf("Bad message received; want %v; got %v", expected, df.data) + } + // try to send infrequent but large window updates so they don't overwhelm the test + pendingWindowUpdate += uint32(len(df.data)) + if pendingWindowUpdate >= windowSize/2 { + if err := st.fr.WriteWindowUpdate(0, pendingWindowUpdate); err != nil { + b.Fatal(err) + } + if err := st.fr.WriteWindowUpdate(id, pendingWindowUpdate); err != nil { + b.Fatal(err) + } + pendingWindowUpdate = 0 + } + } + df := st.wantData() + if !df.StreamEnded() { + b.Fatalf("DATA didn't have END_STREAM; got %v", df) + } +} + // go-fuzz bug, originally reported at https://github.com/bradfitz/http2/issues/53 // Verify we don't hang. func TestIssue53(t *testing.T) { diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 0c7e859db1..84d042d469 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -575,7 +575,7 @@ func (cc *ClientConn) canTakeNewRequestLocked() bool { cc.nextStreamID < math.MaxInt32 } -// onIdleTimeout is called from a time.AfterFunc goroutine. It will +// 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 @@ -809,8 +809,8 @@ func (cc *ClientConn) RoundTrip(req *http.Request) (*http.Response, error) { // 2xx, however, then assume the server DOES potentially // want our body (e.g. full-duplex streaming: // golang.org/issue/13444). If it turns out the server - // doesn't, they'll RST_STREAM us soon enough. This is a - // heuristic to avoid adding knobs to Transport. Hopefully + // doesn't, they'll RST_STREAM us soon enough. This is a + // heuristic to avoid adding knobs to Transport. Hopefully // we can keep it. bodyWriter.cancel() cs.abortRequestBodyWrite(errStopReqBodyWrite) @@ -1528,8 +1528,7 @@ func (rl *clientConnReadLoop) handleResponse(cs *clientStream, f *MetaHeadersFra return res, nil } - buf := new(bytes.Buffer) // TODO(bradfitz): recycle this garbage - cs.bufPipe = pipe{b: buf} + cs.bufPipe = pipe{b: &dataBuffer{expected: res.ContentLength}} cs.bytesRemain = res.ContentLength res.Body = transportResponseBody{cs} go cs.awaitRequestCancel(cs.req) diff --git a/vendor/golang.org/x/net/http2/transport_test.go b/vendor/golang.org/x/net/http2/transport_test.go index 8ef4f33883..7ae8ff787a 100644 --- a/vendor/golang.org/x/net/http2/transport_test.go +++ b/vendor/golang.org/x/net/http2/transport_test.go @@ -2406,7 +2406,7 @@ func TestTransportReturnsDataPaddingFlowControl(t *testing.T) { EndStream: false, BlockFragment: buf.Bytes(), }) - pad := []byte("12345") + pad := make([]byte, 5) ct.fr.WriteDataPadded(hf.StreamID, false, make([]byte, 5000), pad) // without ending stream f, err := ct.readNonSettingsFrame() diff --git a/vendor/golang.org/x/net/internal/netreflect/socket.go b/vendor/golang.org/x/net/internal/netreflect/socket.go index e82e51c447..1495b65f59 100644 --- a/vendor/golang.org/x/net/internal/netreflect/socket.go +++ b/vendor/golang.org/x/net/internal/netreflect/socket.go @@ -2,8 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build !go1.9 + // Package netreflect implements run-time reflection for the // facilities of net package. +// +// This package works only for Go 1.8 or below. package netreflect import ( diff --git a/vendor/golang.org/x/net/internal/netreflect/socket_19.go b/vendor/golang.org/x/net/internal/netreflect/socket_19.go new file mode 100644 index 0000000000..74df52e1ab --- /dev/null +++ b/vendor/golang.org/x/net/internal/netreflect/socket_19.go @@ -0,0 +1,37 @@ +// Copyright 2017 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.9 + +package netreflect + +import ( + "errors" + "net" +) + +var ( + errInvalidType = errors.New("invalid type") + errOpNoSupport = errors.New("operation not supported") +) + +// SocketOf returns the socket descriptor of c. +func SocketOf(c net.Conn) (uintptr, error) { + switch c.(type) { + case *net.TCPConn, *net.UDPConn, *net.IPConn, *net.UnixConn: + return 0, errOpNoSupport + default: + return 0, errInvalidType + } +} + +// PacketSocketOf returns the socket descriptor of c. +func PacketSocketOf(c net.PacketConn) (uintptr, error) { + switch c.(type) { + case *net.UDPConn, *net.IPConn, *net.UnixConn: + return 0, errOpNoSupport + default: + return 0, errInvalidType + } +} diff --git a/vendor/golang.org/x/net/internal/netreflect/socket_posix.go b/vendor/golang.org/x/net/internal/netreflect/socket_posix.go index df475a2b22..410c0924d2 100644 --- a/vendor/golang.org/x/net/internal/netreflect/socket_posix.go +++ b/vendor/golang.org/x/net/internal/netreflect/socket_posix.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build !go1.9 // +build darwin dragonfly freebsd linux netbsd openbsd solaris windows package netreflect diff --git a/vendor/golang.org/x/net/internal/netreflect/socket_stub.go b/vendor/golang.org/x/net/internal/netreflect/socket_stub.go index 85adb4b7f4..17b20c4783 100644 --- a/vendor/golang.org/x/net/internal/netreflect/socket_stub.go +++ b/vendor/golang.org/x/net/internal/netreflect/socket_stub.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build !go1.9 // +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows package netreflect diff --git a/vendor/golang.org/x/net/internal/netreflect/socket_test.go b/vendor/golang.org/x/net/internal/netreflect/socket_test.go index 49b97ed540..b3aad0d92d 100644 --- a/vendor/golang.org/x/net/internal/netreflect/socket_test.go +++ b/vendor/golang.org/x/net/internal/netreflect/socket_test.go @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build !go1.9 +// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows + package netreflect_test import ( diff --git a/vendor/golang.org/x/net/internal/timeseries/timeseries.go b/vendor/golang.org/x/net/internal/timeseries/timeseries.go index 1119f34482..685f0e7ea2 100644 --- a/vendor/golang.org/x/net/internal/timeseries/timeseries.go +++ b/vendor/golang.org/x/net/internal/timeseries/timeseries.go @@ -371,7 +371,7 @@ func (ts *timeSeries) ComputeRange(start, finish time.Time, num int) []Observabl } } - // Failed to find a level that covers the desired range. So just + // Failed to find a level that covers the desired range. So just // extract from the last level, even if it doesn't cover the entire // desired range. ts.extract(ts.levels[len(ts.levels)-1], start, finish, num, results) diff --git a/vendor/golang.org/x/net/ipv4/doc.go b/vendor/golang.org/x/net/ipv4/doc.go index b4ce40fbc6..b43935a5ae 100644 --- a/vendor/golang.org/x/net/ipv4/doc.go +++ b/vendor/golang.org/x/net/ipv4/doc.go @@ -21,7 +21,7 @@ // // The options for unicasting are available for net.TCPConn, // net.UDPConn and net.IPConn which are created as network connections -// that use the IPv4 transport. When a single TCP connection carrying +// that use the IPv4 transport. When a single TCP connection carrying // a data flow of multiple packets needs to indicate the flow is // important, Conn is used to set the type-of-service field on the // IPv4 header for each packet. @@ -56,7 +56,7 @@ // // The options for multicasting are available for net.UDPConn and // net.IPconn which are created as network connections that use the -// IPv4 transport. A few network facilities must be prepared before +// IPv4 transport. A few network facilities must be prepared before // you begin multicasting, at a minimum joining network interfaces and // multicast groups. // @@ -80,7 +80,7 @@ // defer c.Close() // // Second, the application joins multicast groups, starts listening to -// the groups on the specified network interfaces. Note that the +// the groups on the specified network interfaces. Note that the // service port for transport layer protocol does not matter with this // operation as joining groups affects only network and link layer // protocols, such as IPv4 and Ethernet. @@ -94,7 +94,7 @@ // } // // The application might set per packet control message transmissions -// between the protocol stack within the kernel. When the application +// between the protocol stack within the kernel. When the application // needs a destination address on an incoming packet, // SetControlMessage of PacketConn is used to enable control message // transmissions. @@ -145,7 +145,7 @@ // More multicasting // // An application that uses PacketConn or RawConn may join multiple -// multicast groups. For example, a UDP listener with port 1024 might +// multicast groups. For example, a UDP listener with port 1024 might // join two different groups across over two different network // interfaces by using: // @@ -166,7 +166,7 @@ // } // // It is possible for multiple UDP listeners that listen on the same -// UDP port to join the same multicast group. The net package will +// UDP port to join the same multicast group. The net package will // provide a socket that listens to a wildcard address with reusable // UDP port when an appropriate multicast address prefix is passed to // the net.ListenPacket or net.ListenUDP. diff --git a/vendor/golang.org/x/net/ipv4/endpoint.go b/vendor/golang.org/x/net/ipv4/endpoint.go index 01c4e399bf..8f7e07ac48 100644 --- a/vendor/golang.org/x/net/ipv4/endpoint.go +++ b/vendor/golang.org/x/net/ipv4/endpoint.go @@ -38,8 +38,8 @@ func NewConn(c net.Conn) *Conn { } // A PacketConn represents a packet network endpoint that uses the -// IPv4 transport. It is used to control several IP-level socket -// options including multicasting. It also provides datagram based +// IPv4 transport. It is used to control several IP-level socket +// options including multicasting. It also provides datagram based // network I/O methods specific to the IPv4 and higher layer protocols // such as UDP. type PacketConn struct { @@ -118,8 +118,8 @@ func NewPacketConn(c net.PacketConn) *PacketConn { } // A RawConn represents a packet network endpoint that uses the IPv4 -// transport. It is used to control several IP-level socket options -// including IPv4 header manipulation. It also provides datagram +// transport. It is used to control several IP-level socket options +// including IPv4 header manipulation. It also provides datagram // based network I/O methods specific to the IPv4 and higher layer // protocols that handle IPv4 datagram directly such as OSPF, GRE. type RawConn struct { diff --git a/vendor/golang.org/x/net/ipv4/go19_test.go b/vendor/golang.org/x/net/ipv4/go19_test.go new file mode 100644 index 0000000000..82a27b1136 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/go19_test.go @@ -0,0 +1,11 @@ +// Copyright 2017 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.9 + +package ipv4 + +func init() { + disableTests = true +} diff --git a/vendor/golang.org/x/net/ipv4/ipv4_test.go b/vendor/golang.org/x/net/ipv4/ipv4_test.go new file mode 100644 index 0000000000..9172992832 --- /dev/null +++ b/vendor/golang.org/x/net/ipv4/ipv4_test.go @@ -0,0 +1,22 @@ +// Copyright 2017 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 ( + "fmt" + "os" + "testing" +) + +var disableTests = false + +func TestMain(m *testing.M) { + if disableTests { + fmt.Fprintf(os.Stderr, "ipv4 tests disabled in Go 1.9 until netreflect is fixed. (Issue 19051)\n") + os.Exit(0) + } + // call flag.Parse() here if TestMain uses flags + os.Exit(m.Run()) +} diff --git a/vendor/golang.org/x/net/ipv4/packet.go b/vendor/golang.org/x/net/ipv4/packet.go index 7f3bf48982..d43723ca95 100644 --- a/vendor/golang.org/x/net/ipv4/packet.go +++ b/vendor/golang.org/x/net/ipv4/packet.go @@ -21,7 +21,7 @@ type packetHandler struct { func (c *packetHandler) ok() bool { return c != nil && c.c != nil } // ReadFrom reads an IPv4 datagram from the endpoint c, copying the -// datagram into b. It returns the received datagram as the IPv4 +// datagram into b. It returns the received datagram as the IPv4 // header h, the payload p and the control message cm. func (c *packetHandler) ReadFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) { if !c.ok() { @@ -57,9 +57,9 @@ func slicePacket(b []byte) (h, p []byte, err error) { } // WriteTo writes an IPv4 datagram through the endpoint c, copying the -// datagram from the IPv4 header h and the payload p. The control +// datagram from the IPv4 header h and the payload p. The control // message cm allows the datagram path and the outgoing interface to be -// specified. Currently only Darwin and Linux support this. The cm +// specified. Currently only Darwin and Linux support this. The cm // may be nil if control of the outgoing datagram is not required. // // The IPv4 header h must contain appropriate fields that include: diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/vendor/golang.org/x/net/ipv4/payload_cmsg.go index 9bcde8f9a4..5e6e55c20b 100644 --- a/vendor/golang.org/x/net/ipv4/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_cmsg.go @@ -12,7 +12,7 @@ import ( ) // ReadFrom reads a payload of the received IPv4 datagram, from the -// endpoint c, copying the payload into b. It returns the number of +// endpoint c, copying the payload into b. It returns the number of // bytes copied into b, the control message cm and the source address // src of the received datagram. func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { @@ -53,10 +53,10 @@ func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net. } // WriteTo writes a payload of the IPv4 datagram, to the destination -// address dst through the endpoint c, copying the payload from b. It -// returns the number of bytes written. The control message cm allows +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows // the datagram path and the outgoing interface to be specified. -// Currently only Darwin and Linux support this. The cm may be nil if +// Currently only Darwin and Linux support this. The cm may be nil if // control of the outgoing datagram is not required. func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { if !c.ok() { diff --git a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go index 6f1b402f72..6f9d5b0efd 100644 --- a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go @@ -12,7 +12,7 @@ import ( ) // ReadFrom reads a payload of the received IPv4 datagram, from the -// endpoint c, copying the payload into b. It returns the number of +// endpoint c, copying the payload into b. It returns the number of // bytes copied into b, the control message cm and the source address // src of the received datagram. func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { @@ -26,10 +26,10 @@ func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net. } // WriteTo writes a payload of the IPv4 datagram, to the destination -// address dst through the endpoint c, copying the payload from b. It -// returns the number of bytes written. The control message cm allows +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows // the datagram path and the outgoing interface to be specified. -// Currently only Darwin and Linux support this. The cm may be nil if +// Currently only Darwin and Linux support this. The cm may be nil if // control of the outgoing datagram is not required. func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { if !c.ok() { diff --git a/vendor/golang.org/x/net/ipv6/control.go b/vendor/golang.org/x/net/ipv6/control.go index 56303f08d3..674628d3f0 100644 --- a/vendor/golang.org/x/net/ipv6/control.go +++ b/vendor/golang.org/x/net/ipv6/control.go @@ -11,7 +11,7 @@ import ( ) // Note that RFC 3542 obsoletes RFC 2292 but OS X Snow Leopard and the -// former still support RFC 2292 only. Please be aware that almost +// former still support RFC 2292 only. Please be aware that almost // all protocol implementations prohibit using a combination of RFC // 2292 and RFC 3542 for some practical reasons. diff --git a/vendor/golang.org/x/net/ipv6/dgramopt_posix.go b/vendor/golang.org/x/net/ipv6/dgramopt_posix.go index 5714308488..a448cbaa58 100644 --- a/vendor/golang.org/x/net/ipv6/dgramopt_posix.go +++ b/vendor/golang.org/x/net/ipv6/dgramopt_posix.go @@ -227,7 +227,7 @@ func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source } // Checksum reports whether the kernel will compute, store or verify a -// checksum for both incoming and outgoing packets. If on is true, it +// checksum for both incoming and outgoing packets. If on is true, it // returns an offset in bytes into the data of where the checksum // field is located. func (c *dgramOpt) Checksum() (on bool, offset int, err error) { @@ -248,7 +248,7 @@ func (c *dgramOpt) Checksum() (on bool, offset int, err error) { return true, offset, nil } -// SetChecksum enables the kernel checksum processing. If on is ture, +// SetChecksum enables the kernel checksum processing. If on is ture, // the offset should be an offset in bytes into the data of where the // checksum field is located. func (c *dgramOpt) SetChecksum(on bool, offset int) error { diff --git a/vendor/golang.org/x/net/ipv6/dgramopt_stub.go b/vendor/golang.org/x/net/ipv6/dgramopt_stub.go index bc3290ad84..82b0686ae9 100644 --- a/vendor/golang.org/x/net/ipv6/dgramopt_stub.go +++ b/vendor/golang.org/x/net/ipv6/dgramopt_stub.go @@ -94,14 +94,14 @@ func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source } // Checksum reports whether the kernel will compute, store or verify a -// checksum for both incoming and outgoing packets. If on is true, it +// checksum for both incoming and outgoing packets. If on is true, it // returns an offset in bytes into the data of where the checksum // field is located. func (c *dgramOpt) Checksum() (on bool, offset int, err error) { return false, 0, errOpNoSupport } -// SetChecksum enables the kernel checksum processing. If on is ture, +// SetChecksum enables the kernel checksum processing. If on is ture, // the offset should be an offset in bytes into the data of where the // checksum field is located. func (c *dgramOpt) SetChecksum(on bool, offset int) error { diff --git a/vendor/golang.org/x/net/ipv6/doc.go b/vendor/golang.org/x/net/ipv6/doc.go index 88383e9156..eaa24c580e 100644 --- a/vendor/golang.org/x/net/ipv6/doc.go +++ b/vendor/golang.org/x/net/ipv6/doc.go @@ -22,7 +22,7 @@ // // The options for unicasting are available for net.TCPConn, // net.UDPConn and net.IPConn which are created as network connections -// that use the IPv6 transport. When a single TCP connection carrying +// that use the IPv6 transport. When a single TCP connection carrying // a data flow of multiple packets needs to indicate the flow is // important, Conn is used to set the traffic class field on the IPv6 // header for each packet. @@ -57,7 +57,7 @@ // // The options for multicasting are available for net.UDPConn and // net.IPconn which are created as network connections that use the -// IPv6 transport. A few network facilities must be prepared before +// IPv6 transport. A few network facilities must be prepared before // you begin multicasting, at a minimum joining network interfaces and // multicast groups. // @@ -81,7 +81,7 @@ // defer c.Close() // // Second, the application joins multicast groups, starts listening to -// the groups on the specified network interfaces. Note that the +// the groups on the specified network interfaces. Note that the // service port for transport layer protocol does not matter with this // operation as joining groups affects only network and link layer // protocols, such as IPv6 and Ethernet. @@ -95,7 +95,7 @@ // } // // The application might set per packet control message transmissions -// between the protocol stack within the kernel. When the application +// between the protocol stack within the kernel. When the application // needs a destination address on an incoming packet, // SetControlMessage of PacketConn is used to enable control message // transmissions. @@ -144,7 +144,7 @@ // More multicasting // // An application that uses PacketConn may join multiple multicast -// groups. For example, a UDP listener with port 1024 might join two +// groups. For example, a UDP listener with port 1024 might join two // different groups across over two different network interfaces by // using: // @@ -165,7 +165,7 @@ // } // // It is possible for multiple UDP listeners that listen on the same -// UDP port to join the same multicast group. The net package will +// UDP port to join the same multicast group. The net package will // provide a socket that listens to a wildcard address with reusable // UDP port when an appropriate multicast address prefix is passed to // the net.ListenPacket or net.ListenUDP. diff --git a/vendor/golang.org/x/net/ipv6/endpoint.go b/vendor/golang.org/x/net/ipv6/endpoint.go index f6a68ab41f..ce0b0ce278 100644 --- a/vendor/golang.org/x/net/ipv6/endpoint.go +++ b/vendor/golang.org/x/net/ipv6/endpoint.go @@ -55,8 +55,8 @@ func NewConn(c net.Conn) *Conn { } // A PacketConn represents a packet network endpoint that uses IPv6 -// transport. It is used to control several IP-level socket options -// including IPv6 header manipulation. It also provides datagram +// transport. It is used to control several IP-level socket options +// including IPv6 header manipulation. It also provides datagram // based network I/O methods specific to the IPv6 and higher layer // protocols such as OSPF, GRE, and UDP. type PacketConn struct { diff --git a/vendor/golang.org/x/net/ipv6/go19_test.go b/vendor/golang.org/x/net/ipv6/go19_test.go new file mode 100644 index 0000000000..c7cb057d23 --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/go19_test.go @@ -0,0 +1,11 @@ +// Copyright 2017 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.9 + +package ipv6 + +func init() { + disableTests = true +} diff --git a/vendor/golang.org/x/net/ipv6/ipv6_test.go b/vendor/golang.org/x/net/ipv6/ipv6_test.go new file mode 100644 index 0000000000..8d2d23542d --- /dev/null +++ b/vendor/golang.org/x/net/ipv6/ipv6_test.go @@ -0,0 +1,22 @@ +// Copyright 2017 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 ( + "fmt" + "os" + "testing" +) + +var disableTests = false + +func TestMain(m *testing.M) { + if disableTests { + fmt.Fprintf(os.Stderr, "ipv6 tests disabled in Go 1.9 until netreflect is fixed (Issue 19051)\n") + os.Exit(0) + } + // call flag.Parse() here if TestMain uses flags + os.Exit(m.Run()) +} diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/vendor/golang.org/x/net/ipv6/payload_cmsg.go index 3a33585ef3..e853c80590 100644 --- a/vendor/golang.org/x/net/ipv6/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_cmsg.go @@ -12,7 +12,7 @@ import ( ) // ReadFrom reads a payload of the received IPv6 datagram, from the -// endpoint c, copying the payload into b. It returns the number of +// endpoint c, copying the payload into b. It returns the number of // bytes copied into b, the control message cm and the source address // src of the received datagram. func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { @@ -43,9 +43,9 @@ func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net. } // WriteTo writes a payload of the IPv6 datagram, to the destination -// address dst through the endpoint c, copying the payload from b. It -// returns the number of bytes written. The control message cm allows -// the IPv6 header fields and the datagram path to be specified. The +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the IPv6 header fields and the datagram path to be specified. The // cm may be nil if control of the outgoing datagram is not required. func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { if !c.ok() { diff --git a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go index 9731cba437..99a43542b4 100644 --- a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go @@ -12,7 +12,7 @@ import ( ) // ReadFrom reads a payload of the received IPv6 datagram, from the -// endpoint c, copying the payload into b. It returns the number of +// endpoint c, copying the payload into b. It returns the number of // bytes copied into b, the control message cm and the source address // src of the received datagram. func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { @@ -26,9 +26,9 @@ func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net. } // WriteTo writes a payload of the IPv6 datagram, to the destination -// address dst through the endpoint c, copying the payload from b. It -// returns the number of bytes written. The control message cm allows -// the IPv6 header fields and the datagram path to be specified. The +// address dst through the endpoint c, copying the payload from b. It +// returns the number of bytes written. The control message cm allows +// the IPv6 header fields and the datagram path to be specified. The // cm may be nil if control of the outgoing datagram is not required. func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { if !c.ok() { diff --git a/vendor/golang.org/x/net/lif/address.go b/vendor/golang.org/x/net/lif/address.go index f9b34aed03..afb957fd8e 100644 --- a/vendor/golang.org/x/net/lif/address.go +++ b/vendor/golang.org/x/net/lif/address.go @@ -67,7 +67,7 @@ func Addrs(af int, name string) ([]Addr, error) { continue } sa := (*sockaddrStorage)(unsafe.Pointer(&lifr.Lifru[0])) - l := int(littleEndian.Uint32(lifr.Lifru1[:4])) + l := int(nativeEndian.Uint32(lifr.Lifru1[:4])) if l == 0 { continue } @@ -77,7 +77,7 @@ func Addrs(af int, name string) ([]Addr, error) { 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]))} + a := &Inet6Addr{PrefixLen: l, ZoneID: int(nativeEndian.Uint32(lifr.Lifru[24:28]))} copy(a.IP[:], lifr.Lifru[8:24]) as = append(as, a) } diff --git a/vendor/golang.org/x/net/lif/binary.go b/vendor/golang.org/x/net/lif/binary.go index aade9eafa2..738a94f422 100644 --- a/vendor/golang.org/x/net/lif/binary.go +++ b/vendor/golang.org/x/net/lif/binary.go @@ -12,7 +12,10 @@ package lif // library. Therefore the package set used in the package must be the // same as net package. -var littleEndian binaryLittleEndian +var ( + littleEndian binaryLittleEndian + bigEndian binaryBigEndian +) type binaryByteOrder interface { Uint16([]byte) uint16 @@ -66,3 +69,47 @@ func (binaryLittleEndian) PutUint64(b []byte, v uint64) { b[6] = byte(v >> 48) b[7] = byte(v >> 56) } + +type binaryBigEndian struct{} + +func (binaryBigEndian) Uint16(b []byte) uint16 { + _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 + return uint16(b[1]) | uint16(b[0])<<8 +} + +func (binaryBigEndian) PutUint16(b []byte, v uint16) { + _ = b[1] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 8) + b[1] = byte(v) +} + +func (binaryBigEndian) Uint32(b []byte) uint32 { + _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 + return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 +} + +func (binaryBigEndian) PutUint32(b []byte, v uint32) { + _ = b[3] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 24) + b[1] = byte(v >> 16) + b[2] = byte(v >> 8) + b[3] = byte(v) +} + +func (binaryBigEndian) Uint64(b []byte) uint64 { + _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | + uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 +} + +func (binaryBigEndian) PutUint64(b []byte, v uint64) { + _ = b[7] // early bounds check to guarantee safety of writes below + b[0] = byte(v >> 56) + b[1] = byte(v >> 48) + b[2] = byte(v >> 40) + b[3] = byte(v >> 32) + b[4] = byte(v >> 24) + b[5] = byte(v >> 16) + b[6] = byte(v >> 8) + b[7] = byte(v) +} diff --git a/vendor/golang.org/x/net/lif/link.go b/vendor/golang.org/x/net/lif/link.go index 76fa6c6875..fce6b2147f 100644 --- a/vendor/golang.org/x/net/lif/link.go +++ b/vendor/golang.org/x/net/lif/link.go @@ -31,15 +31,15 @@ func (ll *Link) fetch(s uintptr) { } ioc := int64(sysSIOCGLIFINDEX) if err := ioctl(s, uintptr(ioc), unsafe.Pointer(&lifr)); err == nil { - ll.Index = int(littleEndian.Uint32(lifr.Lifru[:4])) + ll.Index = int(nativeEndian.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])) + ll.Flags = int(nativeEndian.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])) + ll.MTU = int(nativeEndian.Uint32(lifr.Lifru[:4])) } switch ll.Type { case sysIFT_IPV4, sysIFT_IPV6, sysIFT_6TO4: @@ -84,7 +84,11 @@ func links(eps []endpoint, name string) ([]Link, error) { 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])))) + if len(lifc.Lifcu) == 8 { + nativeEndian.PutUint64(lifc.Lifcu[:], uint64(uintptr(unsafe.Pointer(&b[0])))) + } else { + nativeEndian.PutUint32(lifc.Lifcu[:], uint32(uintptr(unsafe.Pointer(&b[0])))) + } ioc = int64(sysSIOCGLIFCONF) if err := ioctl(ep.s, uintptr(ioc), unsafe.Pointer(&lifc)); err != nil { continue diff --git a/vendor/golang.org/x/net/lif/sys.go b/vendor/golang.org/x/net/lif/sys.go new file mode 100644 index 0000000000..c896041b7b --- /dev/null +++ b/vendor/golang.org/x/net/lif/sys.go @@ -0,0 +1,21 @@ +// Copyright 2017 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" + +var nativeEndian binaryByteOrder + +func init() { + i := uint32(1) + b := (*[4]byte)(unsafe.Pointer(&i)) + if b[0] == 1 { + nativeEndian = littleEndian + } else { + nativeEndian = bigEndian + } +} diff --git a/vendor/golang.org/x/net/lif/sys_solaris_amd64.s b/vendor/golang.org/x/net/lif/sys_solaris_amd64.s index 1ebca37391..39d76af794 100644 --- a/vendor/golang.org/x/net/lif/sys_solaris_amd64.s +++ b/vendor/golang.org/x/net/lif/sys_solaris_amd64.s @@ -6,6 +6,3 @@ 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 index 5fe073620a..aadab2e14b 100644 --- a/vendor/golang.org/x/net/lif/syscall.go +++ b/vendor/golang.org/x/net/lif/syscall.go @@ -19,13 +19,8 @@ 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) } diff --git a/vendor/golang.org/x/net/proxy/socks5.go b/vendor/golang.org/x/net/proxy/socks5.go index 9b9628239a..973f57f197 100644 --- a/vendor/golang.org/x/net/proxy/socks5.go +++ b/vendor/golang.org/x/net/proxy/socks5.go @@ -72,24 +72,28 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { if err != nil { return nil, err } - closeConn := &conn - defer func() { - if closeConn != nil { - (*closeConn).Close() - } - }() - - host, portStr, err := net.SplitHostPort(addr) - if err != nil { + if err := s.connect(conn, addr); err != nil { + conn.Close() return nil, err } + return conn, nil +} + +// connect takes an existing connection to a socks5 proxy server, +// and commands the server to extend that connection to target, +// which must be a canonical address with a host and port. +func (s *socks5) connect(conn net.Conn, target string) error { + host, portStr, err := net.SplitHostPort(target) + if err != nil { + return err + } port, err := strconv.Atoi(portStr) if err != nil { - return nil, errors.New("proxy: failed to parse port number: " + portStr) + return errors.New("proxy: failed to parse port number: " + portStr) } if port < 1 || port > 0xffff { - return nil, errors.New("proxy: port number out of range: " + portStr) + return errors.New("proxy: port number out of range: " + portStr) } // the size here is just an estimate @@ -103,17 +107,17 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { } if _, err := conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) } if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } if buf[0] != 5 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) } if buf[1] == 0xff { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") } if buf[1] == socks5AuthPassword { @@ -125,15 +129,15 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { buf = append(buf, s.password...) if _, err := conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) } if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } if buf[1] != 0 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") } } @@ -150,7 +154,7 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { buf = append(buf, ip...) } else { if len(host) > 255 { - return nil, errors.New("proxy: destination hostname too long: " + host) + return errors.New("proxy: destination hostname too long: " + host) } buf = append(buf, socks5Domain) buf = append(buf, byte(len(host))) @@ -159,11 +163,11 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { buf = append(buf, byte(port>>8), byte(port)) if _, err := conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) } if _, err := io.ReadFull(conn, buf[:4]); err != nil { - return nil, errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } failure := "unknown error" @@ -172,7 +176,7 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { } if len(failure) > 0 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) + return errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) } bytesToDiscard := 0 @@ -184,11 +188,11 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { case socks5Domain: _, err := io.ReadFull(conn, buf[:1]) if err != nil { - return nil, errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } bytesToDiscard = int(buf[0]) default: - return nil, errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) + return errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) } if cap(buf) < bytesToDiscard { @@ -197,14 +201,13 @@ func (s *socks5) Dial(network, addr string) (net.Conn, error) { buf = buf[:bytesToDiscard] } if _, err := io.ReadFull(conn, buf); err != nil { - return nil, errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } // Also need to discard the port number if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) + return errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) } - closeConn = nil - return conn, nil + return nil } diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go index bf20c036bb..5db1e69863 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 915565885d0fbd25caf7d8b339cd3478f558da94 (2016-10-19T08:16:09Z)" +const version = "publicsuffix.org's public_suffix_list.dat, git revision 45a2bf8ef3e22000fbe4bfa5f9252db41d777001 (2017-01-18T01:04:06Z)" const ( nodesBitsChildren = 9 @@ -23,446 +23,447 @@ const ( ) // numTLD is the number of top level domains. -const numTLD = 1553 +const numTLD = 1554 // Text is the combined text of all labels. -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-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" +const text = "bikedagestangeorgeorgiaxagrocerybnikahokutobishimaizuruhreportar" + + "nobrzegyptianaturalhistorymuseumcentereviewskrakoweddinggfarmers" + + "einexus-2bilbaogakievenesalangenikiiyamanouchikuhokuryugasakitau" + + "rayasudabillustrationikkoebenhavnikolaevennodessagamiharabiomuta" + + "shinainfinitintuitattoolsztynsettlersalondonetskarpaczeladzjcbre" + + "mangerbirdartcenterprisesakikuchikuseikarugapartmentsaltdalimoli" + + "serniabirkenesoddtangenovaravennagasukeverbankaruizawabirthplace" + + "vje-og-hornnesalvadordalibabajddarchaeologyusuisserveexchangebja" + + "rkoyuufcfanikonantanangerbjerkreimbalsanagochihayaakasakawaharau" + + "malopolskanlandds3-us-west-1bjugninohekinannestadrangedalindasda" + + "burblockbusternidray-dnsupdaterbloombergbauerninomiyakonojosoyro" + + "rosalzburgjovikarumaifarmsteadraydnsamegawabloxcmsamnangerblueda" + + "ncebmoattachmentsamsclubindalindesnesamsungladell-ogliastraderbm" + + "sandvikcoromantovalle-d-aostatic-accessanfranciscofreakunemurora" + + "ngeiseiyoichiropracticasinordre-landrivelandrobaknoluoktabuseekl" + + "ogesurancertmgretachikawakkanaibetsubamericanfamilydscloudcontro" + + "lledekafjordrudunsangoppdalivornobmweirbnpparibaselburglassassin" + + "ationalheritagematsubarakawagoebnrwfarsundupontariobonnirasakinu" + + "yamashinashikitchenishiazainvestmentsanjournalismailillesandefjo" + + "rdurbanamexhibitionishigobookingliwicebootsannanishiharaboschaef" + + "flerdalomzaporizhzhegurinzais-a-bulls-fanishiizunazukis-a-candid" + + "atebostikasaokamiminersannohelplfinancialorenskoglobalashovhachi" + + "nohedmarkashibatakasakiyokawarabostonakijinsekikogentinglobodoes" + + "-itvedestrandurhamburglogowhalingloppenzaogashimadachicagoboatsa" + + "nokashiharabotanicalgardenishikatakayamatta-varjjataxihuanishika" + + "tsuragithubusercontentgoryuzawabotanicgardenishikawazukamitondab" + + "ayashiogamagoriziabotanybouncemerckmsdnipropetrovskjakdnepropetr" + + "ovskiervaapsteiermarkashiwarabounty-fullensakerrypropertiesantab" + + "arbaraboutiquebecngmbhartiffanybozentsujiiebradescorporationishi" + + "merabrandywinevalleybrasiliabresciabrindisibenikebristoloslocalh" + + "istoryggeelvinckashiwazakiyosatokashikiyosemitebritishcolumbialo" + + "wiezachpomorskienishinomiyashironobroadcastlefrakkestadvrcambrid" + + "gestonextdirectjeldsundvrdnsantacruzsantafedextraspacekitagataji" + + "rittogoldpoint2thisamitsukebroadwaybroke-itjmaxxxboxenapponazure" + + "-mobilebrokerbronnoysundwgminakamichiharabrothermesaverdeatnurem" + + "bergmodellingmxfinitybrowsersafetymarketsanukis-a-catererbrumund" + + "dalotenkawabrunelasticbeanstalkasukabedzin-the-bandaikawachinaga" + + "noharamcoalaskanittedallasalleasinglest-mon-blogueurovisionthewi" + + "fiat-band-campaniabrusselsaotomemergencyberlevagangaviikanonjis-" + + "a-celticsfanishinoomotegobruxellesapodlasiellakasamatsudovre-eik" + + "erbryanskjervoyagebrynewhampshirebungoonordlandyndns-at-workingg" + + "roupalacebuskerudinewjerseybuzenishinoshimattelefonicarbonia-igl" + + "esias-carboniaiglesiascarboniabuzzlgrimstadyndns-blogdnsapporobw" + + "hoswhokksundyndns-freebox-ostrowiecateringebuilderschmidtre-gaul" + + "dalottebzhitomirumalselvendrellottokonamegatakasugais-a-chefashi" + + "onishiokoppegardyndns-homednsardegnamsskoganeis-a-conservativefs" + + "nillfjordyndns-ipaleocondoshichinohealth-carereformitakeharaconf" + + "erenceconstructionconsuladoesntexistanbullensvanguardyndns-wikin" + + "dlegokasells-for-lessaudaconsultanthropologyconsultingvolluxuryc" + + "ontactoyookanmakiwakunigamifunecontemporaryarteducationalchikugo" + + "doharuovatoyosatoyakokonoecontractorskenconventureshinodesashibe" + + "tsuikinderoycookingchannelblagdenesnaaseralingenkainanaejrietisa" + + "latinabenonichernihivanovodkagoshimalvikasumigaurawa-mazowszexjc" + + "palermomahachijorpelandyndns-mailouvreisenishitosashimizunaminam" + + "iashigaracoolkuszkoladbrokesauheradyndns-workisboringrpamperedch" + + "efastlylbaltimore-og-romsdalwaysdatabaseballangenoamishirasatoch" + + "igiessenebakkeshibechambagriculturennebudejjudygarlandigitalavan" + + "genavigationavuotnaklodzkodairamusementarumizusawabruzzoologyeon" + + "gbuk12cooperaunitemasekatsushikabeeldengeluidyndns1copenhagencyc" + + "lopedichernivtsiciliacorsicagliarightathomeftpanamacorvettenriku" + + "zentakataitogliattiresavannahgacosenzaganquannakadomaritimekeepi" + + "ngatlantaijis-a-financialadvisor-aurdaluzerncosidnsfor-better-th" + + "anawawildlifedjeffersoncostumedio-campidano-mediocampidanomedioc" + + "ouchpotatofriesaves-the-whalessandria-trani-barletta-andriatrani" + + "barlettaandriacouncilvivano-frankivskatsuyamasfjordencouponsavon" + + "aplesaxocoursesbschokoladencq-acranbrookuwanalyticscholarshipsch" + + "oolcreditcardynnschulezajskydivingruecreditunioncremonashorokana" + + "iecrewilliamhillcricketrzyncrimeastcoastaldefencecrotonewyorkshi" + + "recipesaro-urbino-pesarourbinopesaromasvuotnaharimamurogawacrown" + + "providercrsvpanasonichernovtsykkylvenetogakushimotoganewportllig" + + "atjxn--0trq7p7nnishiwakis-a-cpadoval-daostavalleycruiseschwarzgw" + + "angjuegoshikiminokamoenairtraffichiryukyuragifuchungbukasuyaltak" + + "ashimaseratis-a-cubicle-slavellinowtvalleaostatoilowiczest-le-pa" + + "trondheimmobilienissandnessjoenissayokoshibahikariwanumatakazaki" + + "s-a-democratkmaxxn--11b4c3dyndns-office-on-the-webcampobassociat" + + "esardiniacryptonomichigangwoncuisinellahppiacenzakopanerairguard" + + "ynv6culturalcentertainmentoyotaris-a-geekgalaxycuneocupcakecxn--" + + "1ctwolominamatakkokaminokawanishiaizubangecymrussiacyonabarulsan" + + "doycyouthdfcbankaufenfiguerestaurantoyotomiyazakis-a-greenfilate" + + "liafilminamiawajikis-a-guruslivinghistoryfinalfinancefineartscie" + + "ntistoragefinlandfinnoyfirebaseapparliamentoyotsukaidownloadfire" + + "nzefirestonefirmdaleirfjordfishingolffanscjohnsonfitjarqhachioji" + + "yahikobeatscotlandfitnessettlementoyourafjalerflesbergushikamifu" + + "ranoshiroomuraflickragerotikakamigaharaflightscrapper-siteflirfl" + + "ogintogurafloraflorencefloridavvesiidazaifudaigojomedizinhistori" + + "schescrappingxn--1lqs71dfloristanohatakahamaniwakuratexascolipic" + + "enord-aurdalipayflorogerserveftparmaflowerservegame-serversaille" + + "servehalflifestyleflynnhubambleclercartoonartdecoldwarmiamibugat" + + "tipschlesisches3-us-west-2fndfoodnetworkshoppingfor-ourfor-somee" + + "thnologyfor-theaterforexrothruherecreationforgotdnservehttparoch" + + "erkasyno-dservehumourforli-cesena-forlicesenaforlikescandynamic-" + + "dnserveirchitachinakagawatchandclockaszubyforsaleirvikazoforsand" + + "asuoloftoystre-slidrettozawafortmissoulair-traffic-controlleyfor" + + "tworthachirogatakahatakaishimogosenforuminamibosogndalfosneserve" + + "minecraftozsdev-myqnapcloudcontrolappspotagerfotaruis-a-hard-wor" + + "kerfoxfordedyn-ip24freeboxoservemp3utilitiesquarezzoologicalvink" + + "lein-addrammenuernbergdyniabogadocscbnl-o-g-i-nativeamericananti" + + "ques3-ap-northeast-1kappchizippodhaleangaviikadenadexeterepbodyn" + + "athomebuilt3l3p0rtargets-itargiving12000emmafanconagawakayamadri" + + "dvagsoyericssonyoursidealerimo-i-ranaamesjevuemielno-ip6freemaso" + + "nryfreiburgfreightcminamidaitomangotsukisosakitagawafreseniuscou" + + "ntryestateofdelawaredstonefribourgfriuli-v-giuliafriuli-ve-giuli" + + "afriuli-vegiuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-" + + "vgiuliafriuliv-giuliafriulive-giuliafriulivegiuliafriulivenezia-" + + "giuliafriuliveneziagiuliafriulivgiuliafrlfroganservep2parservepi" + + "cservequakefrognfrolandfrom-akrehamnfrom-alfrom-arfrom-azwinbana" + + "narepublicasadelamonedatsunanjoburgjerstadotsuruokakegawasnesodd" + + "enmarkhangelskiptveterinairealtychyattorneyagawalmartatamotors3-" + + "ap-south-1from-capebretonamiastapleservesarcasmatartanddesignfro" + + "m-collectionfrom-ctrani-andria-barletta-trani-andriafrom-dchitos" + + "etogitsuldalucaniafrom-defenseljordfrom-flanderservicesettsurgeo" + + "nshalloffamemorialfrom-gausdalfrom-higashiagatsumagoizumizakiraf" + + "rom-iafrom-idfrom-ilfrom-incheonfrom-ksevastopolefrom-kyowariasa" + + "hikawafrom-lajollamericanexpressexyfrom-mannortonsbergfrom-mdfro" + + "m-megurokunohealthcareersevenassisicilyfrom-midoris-a-hunterfrom" + + "-mnfrom-mochizukirkenesewindmillfrom-msfranziskanerdpolicefrom-m" + + "tnfrom-nchloefrom-ndfrom-nefrom-nhktraniandriabarlettatraniandri" + + "afrom-njelenia-gorafrom-nminamiechizenfrom-nvalled-aostavangerfr" + + "om-nyfrom-ohkurafrom-oketohmansionshangrilanciafrom-orfrom-pader" + + "bornfrom-pratohnoshoooshikamaishimodatextileitungsenfrom-ris-a-k" + + "nightpointtokaizukameokameyamatotakadafrom-schoenbrunnfrom-sdfro" + + "m-tnfrom-txn--1qqw23afrom-utazuerichardlillehammerfeste-ipartis-" + + "a-landscaperfrom-vaksdalfrom-vtranoyfrom-wafrom-wielunnerfrom-wv" + + "alledaostavernfrom-wyfrosinonefrostalowa-wolawafroyahababyglandf" + + "stcgroupartnersharis-a-lawyerfujiiderafujikawaguchikonefujiminoh" + + "tawaramotoineppubolognakanotoddenfujinomiyadafujiokayamanxn--2m4" + + "a15efujisatoshonairportland-4-salernoboribetsucksharpartshawaiij" + + "imarugame-hostrodawarafujisawafujishiroishidakabiratoridegreefuj" + + "itsurugashimamateramodalenfujixeroxn--30rr7yfujiyoshidafukayabea" + + "rdubaiduckdnshellaspeziafukuchiyamadafukudominichocolatelevision" + + "issedaluccapitalonewmexicoffeedbackplaneapplinzis-a-designerimar" + + "umorimachidafukuis-a-liberalfukumitsubishigakirovogradoyfukuokaz" + + "akiryuohadanotaireshimojis-a-libertarianfukuroishikarikaturindal" + + "fukusakisarazurewebsiteshikagamiishibukawafukuyamagatakaharustka" + + "noyakagefunabashiriuchinadafunagatakahashimamakishiwadafunahashi" + + "kamiamakusatsumasendaisennangonohejis-a-linux-useranishiaritabas" + + "hijonawatefundaciofuoiskujukuriyamaoris-a-llamarylandfuosskoczow" + + "indowshimokawafurnituredumbrellanbibaidarfurubiraquarelleborkang" + + "erfurudonostiaarpartyfurukawairtelecityeatshimokitayamafusodegau" + + "rafussaikisofukushimapasadenamsosnowiechofunatorientexpressarluc" + + "ernefutabayamaguchinomigawafutboldlygoingnowhere-for-moregontrai" + + "lroadfuttsurugimperiafuturehostingfuturemailingfvgfyis-a-musicia" + + "nfylkesbiblackfridayfyresdalhangglidinghangoutsystemscloudfrontd" + + "oorhannanmokuizumodenakasatsunais-a-painteractivegarsheis-a-pats" + + "fanhannotteroyhanyuzenhapmirhareidsbergenharstadharvestcelebrati" + + "onhasamarnardalhasaminami-alpssells-itransportransurlhashbanghas" + + "udahasura-appassenger-associationhasvikazunohatogayahoohatoyamaz" + + "akitahiroshimarriottrapaniimimatakatoris-a-personaltrainerhatsuk" + + "aichikaiseis-a-photographerokuappaviancargodaddynaliascoli-picen" + + "oipirangamvikddielddanuorrissagaeroclubmedecincinnationwidealsta" + + "haugesunderseaportsinfolldalabamagasakishimabarackmazehattfjelld" + + "alhayashimamotobungotakadapliernewhollandhazuminobusellsyourhome" + + "goodshimotsumahboehringerikehelsinkitakamiizumisanofidelitysvard" + + "ollshinichinanhembygdsforbundhemneshinjournalistjohnhemsedalhepf" + + "orgeherokussldheroyhgtvallee-aosteroyhigashichichibunkyonanaoshi" + + "mageandsoundandvisionhigashihiroshimanehigashiizumozakitakatakam" + + "oriokalmykiahigashikagawahigashikagurasoedahigashikawakitaaikita" + + "kyushuaiahigashikurumeiwamarshallstatebankfhappouhigashimatsushi" + + "maritimodernhigashimatsuyamakitaakitadaitoigawahigashimurayamamo" + + "torcycleshinjukumanohigashinarusembokukitamidsundhigashinehigash" + + "iomihachimanchesterhigashiosakasayamanakakogawahigashishirakawam" + + "atakanabeautydalhigashisumiyoshikawaminamiaikitamotosumitakagild" + + "eskaliszhigashitsunowruzhgorodeohigashiurausukitanakagusukumodum" + + "inamiiselectravelchannelhigashiyamatokoriyamanashifteditchyourip" + + "fizerhigashiyodogawahigashiyoshinogaris-a-playerhiraizumisatohob" + + "by-sitehirakatashinagawahiranais-a-republicancerresearchaeologic" + + "aliforniahirarahiratsukagawahirayaitakanezawahistorichouseshinka" + + "migotoyohashimotoshimahitachiomiyaginankokubunjis-a-rockstaracho" + + "wicehitachiotagooglecodespotravelersinsurancehitraeumtgeradeloit" + + "tevadsoccertificationhjartdalhjelmelandholeckobierzyceholidayhom" + + "eipgfoggiahomelinkhakassiahomelinuxn--32vp30haebaruminamifuranoh" + + "omeofficehomesecuritymaceratakaokaluganskodjejuifminamiizukamiok" + + "amikitayamatsuris-a-socialistmein-vigorgehomesecuritypccwinnersh" + + "inshinotsurgeryhomesenseminehomeunixn--3bst00minamimakis-a-soxfa" + + "nhondahoneywellbeingzonehongopocznosegawahonjyoitakarazukamakura" + + "zakitashiobarahornindalhorseoulminamiminowahortendofinternet-dns" + + "hinshirohospitalhoteleshintokushimahotmailhoyangerhoylandetroits" + + "kolelhumanitieshintomikasaharahurdalhurumajis-a-studentalhyllest" + + "adhyogoris-a-teacherkassymantechnologyhyugawarahyundaiwafunehzch" + + "onanbuildingripescaravantaajlchoyodobashichikashukujitawarajlljm" + + "pharmacienshirakofuefukihaboromskoguchikuzenjnjeonnamerikawauejo" + + "yokaichibahcavuotnagaranzannefrankfurtrentino-alto-adigejpmorgan" + + "jpnjprshiranukamogawajuniperjurkoshunantokigawakosugekotohiradom" + + "ainsureggiocalabriakotourakouhokutamakis-an-artisteinkjerusalemb" + + "roiderykounosupplieshiraokanagawakouyamashikokuchuokouzushimasoy" + + "kozagawakozakis-an-engineeringkpnkppspdnshiratakahagivestbytomar" + + "idagawassamukawataricohdatingkrasnodarkredirectmeldalkristiansan" + + "dcatshishikuis-an-entertainerkristiansundkrodsheradkrokstadelval" + + "daostarostwodzislawioshisognekryminamisanrikubetsupportrentino-a" + + "ltoadigekumatorinokumejimasudakumenanyokkaichirurgiens-dentistes" + + "-en-francekunisakis-bykunitachiarailwaykunitomigusukumamotoyamas" + + "sa-carrara-massacarraramassabusinessebyklegallocus-1kunneppulawy" + + "kunstsammlungkunstunddesignkuokgrouphdkureggioemiliaromagnakayam" + + "atsumaebashikshacknetrentino-s-tirollagrigentomologyeonggiehtavu" + + "oatnagaivuotnagaokakyotambabia-goracleaningkurgankurobelaudibleb" + + "timnetzkurogimilanokuroisoftwarendalenugkuromatsunais-certifiedo" + + "gawarabikomaezakirunorthwesternmutualkurotakikawasakis-foundatio" + + "nkushirogawakusupplykutchanelkutnokuzumakis-gonekvafjordkvalsund" + + "kvamfamberkeleykvanangenkvinesdalkvinnheradkviteseidskogkvitsoyk" + + "wpspiegelkzmissilevangermisugitokorozawamitourismolancastermitoy" + + "oakemiuramiyazumiyotamanomjondalenmlbfanmonmouthagebostadmonster" + + "monticellombardiamondshisuifuelveruminamitanemontrealestatefarme" + + "quipmentrentino-stirolmonza-brianzaporizhzhiamonza-e-della-brian" + + "zapposhitaramamonzabrianzaptokuyamatsusakahoginowaniihamatamakaw" + + "ajimarburgmonzaebrianzaramonzaedellabrianzamoparachutingmordovia" + + "jessheiminamiuonumatsumotofukemoriyamatsushigemoriyoshimilitarym" + + "ormoneymoroyamatsuuramortgagemoscowitdkmpspbarcelonagasakijobser" + + "verisignieznord-odalaziobihirosakikamijimassnasaarlandd-dnshome-" + + "webservercellikes-piedmontblancomeeres3-ap-southeast-1moseushist" + + "orymosjoenmoskeneshizukuishimofusaitamatsukuris-into-gamessinats" + + "ukigatakasagotembaixadamosshizuokananporovigotpantheonsitemosvik" + + "nx-serveronakatsugawamoteginozawaonsenmoviemovistargardmtpchrist" + + "masakikugawatchesarufutsunomiyawakasaikaitakoelniyodogawamtranby" + + "muenstermugithubcloudusercontentrentino-sud-tirolmuikamisatokama" + + "chippubetsubetsugarumukochikushinonsenergymulhouservebeermunakat" + + "anemuncieszynmuosattemuphiladelphiaareadmyblogsitemurmanskolobrz" + + "egersundmurotorcraftrentino-sudtirolmusashimurayamatsuzakis-leet" + + "rdmusashinoharamuseetrentino-sued-tirolmuseumverenigingmutsuzawa" + + "mutuellewismillermy-vigorlicemy-wanggouvicenzamyactivedirectorym" + + "yasustor-elvdalmycdn77-securechtrainingmydissentrentino-suedtiro" + + "lmydrobofagemydshoujis-lostre-toteneis-a-techietis-a-therapistoi" + + "amyeffectrentinoa-adigemyfirewallonieruchomoscienceandindustrynm" + + "yfritzmyftpaccesshowamyfusionmyhome-serverrankoshigayamelhusgard" + + "enmykolaivaolbia-tempio-olbiatempioolbialystokkepnogiftshowtimet" + + "eorapphilatelymymediapchromedicaltanissettairamyokohamamatsudamy" + + "pepsongdalenviknakanojohanamakinoharamypetshriramlidlugolekagami" + + "nogatagajobojis-not-certifieducatorahimeshimakanegasakinkobayash" + + "ikaoirminamiogunicomcastresistancemyphotoshibahccavuotnagareyama" + + "lborkdalvdalcesienarashinomypsxn--3e0b707emysecuritycamerakermys" + + "hopblocksigdalmyvnchryslerpictetrentinoaadigepicturesimple-urlpi" + + "emontepilotsirdalpimientaketomisatolgapinkomakiyosunndalpioneerp" + + "ippuphoenixn--3oq18vl8pn36apiszpittsburghofauskedsmokorsetagayas" + + "ells-for-ulvikautokeinopiwatepizzapkomatsushimashikizunokunimiho" + + "boleslawiechristiansburgriwataraidyndns-picsarpsborgroks-thisaya" + + "manobeokakudamatsueplanetariuminamiyamashirokawanabellevuelosang" + + "elesjaguarchitecturealtorlandplantationplantslingplatforminanopl" + + "aystationplazaplchungnamdalseidfjordyndns-remotewdyndns-serverda" + + "luroyplombardynamisches-dnslupskomforbarclaycards3-website-ap-no" + + "rtheast-1plumbingopmnpodzonepohlpoivronpokerpokrovskommunalforbu" + + "ndpolitiendapolkowicepoltavalle-aostathellexusdecorativeartsnoas" + + "aitomobellunorddalpomorzeszowithgoogleapisa-hockeynutsiracusakat" + + "akinouepordenonepornporsangerporsanguidelmenhorstalbansokanazawa" + + "porsgrunnanpoznanpraxis-a-bookkeeperugiaprdpreservationpresidiop" + + "rgmrprimeloyalistockholmestrandprincipeprivatizehealthinsurancep" + + "rochowiceproductionsokndalprofbsbxn--1lqs03nprogressivegasiaproj" + + "ectrentinoalto-adigepromombetsurfbx-ostrowwlkpmgulenpropertyprot" + + "ectionprotonetrentinoaltoadigeprudentialpruszkowithyoutubentleyp" + + "rzeworskogptplusterpvtrentinos-tirolpwchurchaseljeepostfoldnavyp" + + "zqldqponqslgbtrentinostirolquicksytesolarssonqvcirclegnicafedera" + + "tionstufftoread-booksnesolundbeckommunestuttgartrentoyokawasusak" + + "is-slickharkovalleeaosteigensusonosuzakaneyamazoesuzukaniepcesuz" + + "ukis-uberleetrentino-a-adigesvalbardunloppacificircustomersveios" + + "velvikomvuxn--3ds443gsvizzeraswedenswidnicarrierswiebodzindianap" + + "olis-a-bloggerswiftcoversicherungswinoujscienceandhistoryswisshi" + + "kis-very-badaddjamisonsynology-dsolutionsolognetuscanytushuissie" + + "r-justicetuvalle-daostaticsootuxfamilyvenneslaskerrylogisticsopo" + + "trentinosud-tirolvestfoldvestnesor-odalvestre-slidreamhostersor-" + + "varangervestre-totennishiawakuravestvagoyvevelstadvibo-valentiav" + + "ibovalentiavideovillaskoyabearalvahkihokumakogengerdalpha-myqnap" + + "cloudapplebesbydgoszczecinemakeupowiathletajimabariakembuchikuma" + + "gayagawakuyabukicks-assedicitadeliveryvinnicartiervinnytsiavipsi" + + "naapphonefossilkomaganevirginiavirtualvirtueeldomeindianmarketin" + + "gvirtuelvisakegawavistaprinternationalfirearmsorfoldviterboltroa" + + "ndinosaurepaircraftrevisohughesomavivoldavlaanderenvladikavkazim" + + "ierz-dolnyvladimirvlogoiphotographysiovolkswagentsorreisahayakaw" + + "akamiichikawamisatotalvologdanskongsvingervolvolkenkundenvolyngd" + + "alvossevangenvotevotingvotoyonakagyokutoursortlandworldworse-tha" + + "ndawowiwatsukiyonowritesthisblogsytewroclawloclawekoninjavald-ao" + + "starnbergwtciticatholicheltenham-radio-opencraftranagatorodoywtf" + + "bxosciencecentersciencehistorywuozuwwwmflabsorumincommbanklabudh" + + "abikinokawabarthagakhanamigawawzmiuwajimaxn--4gq48lf9jetztrentin" + + "o-aadigexn--4it168dxn--4it797konsulatrobeepilepsydneyxn--4pvxsou" + + "thcarolinazawaxn--54b7fta0ccivilizationxn--55qw42gxn--55qx5dxn--" + + "5js045dxn--5rtp49civilwarmanagementmpalmspringsakerxn--5rtq34kon" + + "yvelolxn--5su34j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2r" + + "xn--6qq986b3xlxn--7t0a264claimsasayamaxn--80adxhksouthwestfalenx" + + "n--80ao21axn--80aqecdr1axn--80asehdbarefootballooningjesdalillyo" + + "mbondiscountysnes3-website-ap-southeast-2xn--80aswgxn--80audneda" + + "lnxn--8ltr62kooris-an-actorxn--8pvr4uxn--8y0a063axn--90a3academy" + + "-firewall-gatewayxn--90aishobaraomoriguchiharahkkeravjuedischesa" + + "peakebayernrtrogstadxn--90azhytomyrxn--9dbhblg6dietcimdbargainst" + + "itutelemarkaratsuginamikatagamiharuconnectatarantottoribestadisc" + + "overyomitanobirastronomy-gatewayokosukanzakiwienaturalsciencesna" + + "turelles3-ap-southeast-2xn--9dbq2axn--9et52uxn--9krt00axn--andy-" + + "iraxn--aroport-byanaizuxn--asky-iraxn--aurskog-hland-jnbarreauct" + + "ionayorovnobninskarelianceu-1xn--avery-yuasakuhokkaidontexistein" + + "geekopervikhmelnitskiyamashikexn--b-5gaxn--b4w605ferdxn--bck1b9a" + + "5dre4clickatowicexn--bdddj-mrabdxn--bearalvhki-y4axn--berlevg-jx" + + "axn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachikatsuuraxn-" + + "-bievt-0qa2xn--bjarky-fyandexn--3pxu8konskowolayangroupharmacysh" + + "iraois-an-accountantshinyoshitomiokamitsuexn--bjddar-ptamayufuet" + + "tertdasnetzxn--blt-elabourxn--bmlo-graingerxn--bod-2naroyxn--brn" + + "ny-wuaccident-investigation-aptibleaseating-organicbcn-north-1xn" + + "--brnnysund-m8accident-prevention-webhopenairbusantiquest-a-la-m" + + "aisondre-landebudapest-a-la-masionionjukudoyamagazineat-urlxn--b" + + "rum-voagatromsakakinokiaxn--btsfjord-9zaxn--c1avgxn--c2br7gxn--c" + + "3s14mintelligencexn--cck2b3barrel-of-knowledgemologicallyngenvir" + + "onmentalconservationflfanfshostrolekamisunagawaugustowadaegubs3-" + + "ca-central-1xn--cg4bkis-very-evillagexn--ciqpnxn--clchc0ea0b2g2a" + + "9gcdn77-sslattumisakis-into-carshioyanagawaxn--comunicaes-v6a2ox" + + "n--correios-e-telecomunicaes-ghc29axn--czr694barrell-of-knowledg" + + "eologyonagoyaukraanghkeymachineustarhubalestrandabergamoareke164" + + "xn--czrs0tromsojaworznoxn--czru2dxn--czrw28bashkiriaurskog-holan" + + "droverhalla-speziaeroportalaheadjudaicaaarborteaches-yogasawarac" + + "ingroks-theatree12xn--d1acj3basilicataniaustevollarvikarasjokara" + + "suyamarylhurstjordalshalsenaturbruksgymnaturhistorisches3-eu-cen" + + "tral-1xn--d1alfaromeoxn--d1atrusteexn--d5qv7z876clinichernigover" + + "nmentjometlifeinsurancexn--davvenjrga-y4axn--djrs72d6uyxn--djty4" + + "koryokamikawanehonbetsurutaharaxn--dnna-grajewolterskluwerxn--dr" + + "bak-wuaxn--dyry-iraxn--e1a4cliniquenoharaxn--eckvdtc9dxn--efvn9s" + + "owaxn--efvy88haibarakitahatakamatsukawaxn--ehqz56nxn--elqq16hair" + + "-surveillancexn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct429ko" + + "saigawaxn--fhbeiarnxn--finny-yuaxn--fiq228c5hspjelkavikomonoxn--" + + "fiq64basketballfinanzgoraustinnatuurwetenschappenaumburgjemnes3-" + + "eu-west-1xn--fiqs8spreadbettingxn--fiqz9spydebergxn--fjord-lraxn" + + "--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--fpcrj9c3dxn--frde-" + + "grandrapidsrlxn--frna-woaraisaijotrvarggatritonxn--frya-hraxn--f" + + "zc2c9e2clintonoshoesaseboknowsitallutskypexn--fzys8d69uvgmailxn-" + + "-g2xx48clothingrondarxn--gckr3f0fermobilyxn--gecrj9cloudnsdojoet" + + "suwanouchikujogaszczytnore-og-uvdaluxembourgrongaxn--ggaviika-8y" + + "a47hakatanotogawaxn--gildeskl-g0axn--givuotna-8yaotsurreyxn--gjv" + + "ik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050is-very-goodhandsonxn" + + "--gmqw5axn--h-2failxn--h1aeghakodatexn--h2brj9cnsaskatchewanxn--" + + "hbmer-xqaxn--hcesuolo-7ya35batodayonaguniversityoriikariyakumold" + + "eltaiwanairlinedre-eikerxn--hery-iraxn--hgebostad-g3axn--hmmrfea" + + "sta-s4acctrysiljan-mayenxn--hnefoss-q1axn--hobl-iraxn--holtlen-h" + + "xaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b" + + "6b1a6a2exn--imr513nxn--indery-fyasakaiminatoyonezawaxn--io0a7is-" + + "very-nicexn--j1aeferraraxn--j1amhakonexn--j6w193gxn--jlq61u9w7ba" + + "tsfjordishakotankarlsoyoshiokarasjohkamikoaniikappugliaustraliai" + + "sondriodejaneirochesterhcloudfunctions3-external-1xn--jlster-bya" + + "sugis-very-sweetpepperxn--jrpeland-54axn--jvr189misasaguris-into" + + "-cartoonshirahamatonbetsurnadalxn--k7yn95exn--karmy-yuaxn--kbrq7" + + "oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dx" + + "n--kltx9axn--klty5xn--42c2d9axn--koluokta-7ya57hakubadajozorahol" + + "taleniwaizumiotsukumiyamazonawsabaerobaticketshimonosekikawaxn--" + + "kprw13dxn--kpry57dxn--kpu716ferrarivnexn--kput3is-with-thebandoo" + + "mdnsiskinkyotobetsumidatlantichoseiroumuenchenisshingugexn--krag" + + "er-gyasuokanraxn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxaxn" + + "--krjohka-hwab49jevnakershuscultureggio-emilia-romagnakatombetsu" + + "my-routerxn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyatomitamamurax" + + "n--kvnangen-k0axn--l-1fairwindsrtrentinosudtirolxn--l1accenturek" + + "lamborghiniizaxn--laheadju-7yatsukanumazuryxn--langevg-jxaxn--lc" + + "vr32dxn--ldingen-q1axn--leagaviika-52bauhausposts-and-telecommun" + + "icationsncfdivtasvuodnakaiwamizawaustrheimatunduhrennesoyokotebi" + + "nagisochildrensgardenaustdalavagiskebinorfolkebibleikangerxn--le" + + "sund-huaxn--lgbbat1ad8jewelryxn--lgrd-poacoachampionshiphoptobam" + + "agentositelekommunikationlinebraskaunjargallupinbbcaseihichisobe" + + "tsuitainairforceoceanographics3-website-eu-west-1xn--lhppi-xqaxn" + + "--linds-pramericanartulangevagrarboretumbriamallamaintenancechir" + + "ealminnesotaketakatsukis-into-animelbournexn--lns-qlansrvareserv" + + "eblogspotrentinosued-tirolxn--loabt-0qaxn--lrdal-sraxn--lrenskog" + + "-54axn--lt-liacntoyonoxn--lten-granexn--lury-iraxn--mely-iraxn--" + + "merker-kuaxn--mgb2ddestordalxn--mgb9awbferreroticanonoichinomiya" + + "kexn--mgba3a3ejtunesomnaritakurashikis-savedunetbankharkivguccip" + + "rianiigataishinomakimobetsuliguriaxn--mgba3a4f16axn--mgba3a4fran" + + "amizuholdingsmileksvikosakaerodromegalsacebetsukubankhmelnytskyi" + + "vanylvenicexn--mgba7c0bbn0axn--mgbaakc7dvfetsundynvpnxn--mgbaam7" + + "a8hakuis-a-nascarfanxn--mgbab2bdxn--mgbai9a5eva00bbtateshinanoma" + + "chintaifun-dnsaliaskimitsubatamicable-modembetsukuibigawauthorda" + + "landroiddnskingjerdrumckinseyokozebizenakaniikawatanaguraetnagah" + + "amaroygardendoftheinternetflixilovecollegefantasyleaguernseyboml" + + "oans3-ap-northeast-2xn--mgbai9azgqp6jewishartgalleryxn--mgbayh7g" + + "padualstackspace-to-rentalstomakomaibaraxn--mgbb9fbpobanazawaxn-" + + "-mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgberp4a5d4a87gxn--m" + + "gberp4a5d4arxn--mgbi4ecexposedxn--mgbpl2fhskleppiagetmyiphilipsy" + + "nology-diskstationxn--mgbqly7c0a67fbcolonialwilliamsburgrossetou" + + "chijiwadellogliastradingroundhandlingroznyxn--mgbqly7cvafredriks" + + "tadtvstoreitrentinosuedtirolxn--mgbt3dhdxn--mgbtf8flatangerxn--m" + + "gbtx2bbvacationswatch-and-clockerxn--mgbx4cd0abbottunkongsbergxn" + + "--mix082fgunmarcheaparisor-fronxn--mix891fhvalerxn--mjndalen-64a" + + "xn--mk0axindustriesteambulancexn--mk1bu44coloradoplateaudioxn--m" + + "kru45isleofmandalxn--mlatvuopmi-s4axn--mli-tlanxesstorfjordxn--m" + + "lselv-iuaxn--moreke-juaxn--mori-qsakuragawaxn--mosjen-eyatsushir" + + "oxn--mot-tlapyxn--mre-og-romsdal-qqbeppublishproxyzgorzeleccolog" + + "newspaperxn--msy-ula0hakusandiegoodyearthadselfipassagenshimonit" + + "ayanagitlaborxn--mtta-vrjjat-k7afamilycompanycolumbusheyxn--muos" + + "t-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--45brj9ci" + + "vilaviationxn--nit225koseis-an-actresshiojirishirifujiedaxn--nme" + + "sjevuemie-tcbalatinord-frontierxn--nnx388axn--nodexn--nqv7fs00em" + + "axn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nttery-byaeservecount" + + "erstrikexn--nvuotna-hwaxn--nyqy26axn--o1achattanooganordreisa-ge" + + "ekosherbrookegawaxn--o3cw4haldenxn--od0algxn--od0aq3bernuorockar" + + "tuzyukibmdivttasvuotnakamagayachts3-website-sa-east-1xn--ogbpf8f" + + "lekkefjordxn--oppegrd-ixaxn--ostery-fyawaraxn--osyro-wuaxn--p1ac" + + "fidonnakamuratajimicrolightinguovdageaidnunzenxn--p1aissmarterth" + + "anyouxn--pbt977communitysfjordyndns-weberlincolnxn--pgbs0dhlxn--" + + "porsgu-sta26fieldyroyrvikinguitarschweizparaglidingujolsterxn--p" + + "ssu33lxn--pssy2uxn--q9jyb4comobaraxn--qcka1pmcdonaldstpetersburg" + + "xn--qqqt11misconfusedxn--qxamuneuestreamsterdamnserverbaniaxn--r" + + "ady-iraxn--rdal-poaxn--rde-ulaquilancashirehabmerxn--rdy-0nabari" + + "wchoshibuyachiyodavvenjargaulardalukowiiheyaizuwakamatsubushikus" + + "akadogawaxn--rennesy-v1axn--rhkkervju-01aflakstadaokagakibichuox" + + "n--rholt-mragowoodsidexn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn" + + "--risa-5narusawaxn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmsk" + + "og-byawatahamaxn--rny31halsaintlouis-a-anarchistoireggio-calabri" + + "axn--rovu88beskidyn-vpncasertaipeiheijiinetnedalimanowarudautomo" + + "tivecodyn-o-saurlandes3-fips-us-gov-west-1xn--rros-granvindafjor" + + "dxn--rskog-uuaxn--rst-0narutokyotangovturystykannamihamadaxn--rs" + + "ta-francaiseharaxn--ryken-vuaxn--ryrvik-byaxn--s-1faitheguardian" + + "xn--s9brj9comparemarkerryhotelsassaris-a-doctorayxn--sandnessjen" + + "-ogbizxn--sandy-yuaxn--seral-lraxn--ses554gxn--sgne-gratangenxn-" + + "-skierv-utazaskvolloabathsbcompute-1xn--skjervy-v1axn--skjk-soax" + + "n--sknit-yqaxn--sknland-fxaxn--slat-5narviikamishihoronobeauxart" + + "sandcraftstudioxn--slt-elabbvieeexn--smla-hraxn--smna-gratis-a-b" + + "ruinsfanxn--snase-nraxn--sndre-land-0cbstudyndns-at-homedepotenz" + + "amamicrosoftbankomorotsukaminoyamaxunusualpersonxn--snes-poaxn--" + + "snsa-roaxn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1axn--sr-va" + + "ranger-ggbestbuyshouses3-website-us-east-1xn--srfold-byaxn--srre" + + "isa-q1axn--srum-grazxn--stfold-9xaxn--stjrdal-s1axn--stjrdalshal" + + "sen-sqbetainaboxfusejnynysadodgeometre-experts-comptables3-websi" + + "te-us-west-1xn--stre-toten-zcbieigersundiyukuhashimoichinosekiga" + + "harautoscanadaejeonbukaratehimeji234xn--t60b56axn--tckweathercha" + + "nnelxn--tiq49xqyjfkhersonxn--tjme-hraxn--tn0agrinet-freakstuff-4" + + "-salexn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trgstad-r1axn--t" + + "rna-woaxn--troms-zuaxn--tysvr-vraxn--uc0atvaroyxn--uc0ay4axn--ui" + + "st22hammarfeastafricapetownnews-stagingxn--uisz3gxn--unjrga-rtao" + + "baokinawashirosatochiokinoshimalatvuopmiasakuchinotsuchiurakawal" + + "brzycharternopilawalesundxn--unup4yxn--uuwu58axn--vads-jraxn--va" + + "rd-jraxn--vegrshei-c0axn--vermgensberater-ctbielawalterxn--vermg" + + "ensberatung-pwbiellaakesvuemielecceu-2xn--vestvgy-ixa6oxn--vg-yi" + + "abcgxn--vgan-qoaxn--vgsy-qoa0jgoraxn--vgu402computerhistoryofsci" + + "ence-fictionxn--vhquvbarclays3-website-ap-southeast-1xn--vler-qo" + + "axn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861bieszczad" + + "ygeyachimataikikonaioirasebastopologyeongnamegawakeisenbahnhlfan" + + "hs3-website-us-west-2xn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dx" + + "n--wgbh1comsecuritytacticsatxn--1ck2e1balsfjordgcahcesuolodingen" + + "aval-d-aosta-valleyolasitemrxn--wgbl6axn--xhq521bievatmallorcada" + + "quesakuraiitatebayashiibaghdadultateyamaveroykenglanddnss3-sa-ea" + + "st-1xn--xkc2al3hye2axn--xkc2dl3a5ee0hamurakamigoriginshimosuwalk" + + "is-a-nurservebbshimotsukexn--y9a3aquariumishimatsunoxn--yer-znar" + + "vikoshimizumakis-an-anarchistoricalsocietyxn--yfro4i67oxn--ygard" + + "en-p1axn--ygbi2ammxn--45q11civilisationxn--ystre-slidre-ujbifuka" + + "gawarszawashingtondclkarmoyurihonjoyentatsunoceanographiquevents" + + "akyotanabeneventoeidsvollimitednpagefrontappagespeedmobilizerodd" + + "avocatanzarowegroweibolzanordkappgafanpachigasakidsmynasushiobar" + + "agusarts3-us-east-2xn--zbx025dxn--zf0ao64axn--zf0avxn--4gbrimini" + + "ngxn--zfr164bihorologyusuharavoues3-us-gov-west-1xperiaxz" // 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 @@ -482,8141 +483,8127 @@ const text = "biellaakesvuemieleccebieszczadygeyachimatainaircraftraeumtgerade" // [15 bits] text index // [ 6 bits] text length var nodes = [...]uint32{ - 0x29e943, - 0x364444, - 0x28af46, - 0x371983, - 0x371986, - 0x394246, - 0x3a4103, - 0x202f04, - 0x24f607, - 0x28ab88, - 0x1a00882, - 0x309dc7, - 0x3533c9, - 0x2fb3ca, - 0x2fb3cb, - 0x22fe43, - 0x28cac6, - 0x2352c5, - 0x1e00702, - 0x211ac4, - 0x2c7a83, - 0x226bc5, - 0x2200d42, - 0x2a0f43, - 0x2707e44, - 0x368485, - 0x2a00c42, - 0x3797ce, - 0x24a483, - 0x38b406, - 0x2e04642, - 0x2a5907, - 0x237d46, - 0x3200a42, - 0x2ae043, - 0x2ae044, - 0x280f86, - 0x36f448, - 0x283a46, - 0x386144, - 0x3601002, - 0x326a09, - 0x363a07, - 0x3351c6, - 0x355049, - 0x293988, - 0x367104, - 0x3a6606, - 0x20e306, - 0x3a02e02, - 0x241d0f, - 0x33174e, - 0x212484, - 0x2bb945, - 0x202e05, - 0x2ea589, - 0x23e889, - 0x325747, - 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, - 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, - 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, - 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, - 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, + 0x32f983, + 0x28a344, + 0x30e286, + 0x371b43, + 0x371b46, + 0x394646, + 0x3a5003, + 0x367844, + 0x260687, + 0x30dec8, + 0x1a04cc2, + 0x316e47, + 0x355d89, + 0x32228a, + 0x32228b, + 0x22eec3, + 0x28fac6, + 0x2327c5, + 0x1e04e02, + 0x217c04, + 0x2a90c3, + 0x3ac705, + 0x2203942, + 0x329e03, + 0x26957c4, + 0x368e05, + 0x2a10182, + 0x3787ce, + 0x253343, + 0x3a03c6, + 0x2e00142, + 0x30e407, + 0x23ae46, + 0x3200c42, + 0x22a343, + 0x254b04, + 0x325a86, + 0x35c208, + 0x28a706, + 0x21ad04, + 0x3601442, + 0x332309, + 0x207587, + 0x256286, + 0x339309, + 0x29d788, + 0x328d44, + 0x364906, + 0x36b606, + 0x3a02942, + 0x27144f, + 0x20f94e, + 0x2131c4, + 0x2c6085, + 0x367745, + 0x385989, + 0x241a89, + 0x368047, + 0x23c9c6, + 0x273a43, + 0x3e02342, + 0x2df283, + 0x205aca, + 0x221d83, + 0x303145, + 0x289c02, + 0x289c09, + 0x4200f82, + 0x203d84, + 0x2250c6, + 0x2eb205, + 0x34cbc4, + 0x4a04c04, + 0x205283, + 0x231ac4, + 0x4e02e02, + 0x209f04, + 0x52f4e04, + 0x24ae0a, + 0x5601342, + 0x303907, + 0x26b8c8, + 0x6202f82, + 0x31cf07, + 0x2c2e04, + 0x2c2e07, + 0x373d85, + 0x357a47, + 0x367e06, + 0x2e8384, + 0x39c0c5, + 0x294847, + 0x7206cc2, + 0x34f703, + 0x200582, + 0x200583, + 0x76125c2, + 0x221ec5, + 0x7a02302, + 0x27bd84, + 0x2810c5, + 0x213107, + 0x269f0e, + 0x224bc4, + 0x206a84, + 0x211503, + 0x2ceac9, + 0x2ed94b, + 0x3a6548, + 0x3148c8, + 0x318dc8, + 0x237908, + 0x33914a, + 0x357947, 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, + 0x7ea4fc2, + 0x35bc03, + 0x366c43, + 0x371144, + 0x3a5043, + 0x324cc3, + 0x171f542, + 0x8203682, + 0x252185, + 0x2a11c6, + 0x2d6d44, + 0x2f6e07, + 0x382986, + 0x319dc4, + 0x398247, + 0x20f7c3, + 0x86c8902, + 0x8b124c2, + 0x8e1c502, + 0x21c506, + 0x9200002, + 0x359b85, + 0x320a83, + 0x200004, + 0x2ee344, + 0x2ee345, + 0x203e43, + 0x9768883, + 0x9a07f42, + 0x28e245, + 0x28e24b, + 0x2d0686, + 0x20a0cb, + 0x225b04, + 0x20a7c9, + 0x20be84, + 0x9e0c0c2, + 0x20cf83, + 0x210843, + 0x1600802, + 0x260903, + 0x2109ca, + 0xa211cc2, + 0x217e85, + 0x2983ca, + 0x2dc184, + 0x369f03, + 0x315044, + 0x213643, + 0x213644, + 0x213647, + 0x213985, + 0x213e05, + 0x2150c6, + 0x2167c6, + 0x2182c3, + 0x21c188, + 0x221c43, + 0xa601082, + 0x21cac8, + 0x21ff0b, + 0x2216c8, + 0x2221c6, + 0x222a47, + 0x226488, + 0xb2413c2, + 0xb6c2fc2, + 0x326388, + 0x257ec7, + 0x22bac5, + 0x22bac8, + 0x2bf708, + 0x3871c3, + 0x22a784, + 0x371182, + 0xba2af82, + 0xbe5ba02, + 0xc62c1c2, + 0x22c1c3, + 0xca0e542, + 0x367803, + 0x2f8e04, + 0x218443, + 0x328d04, + 0x25fe4b, + 0x21fe43, + 0x2e4d06, 0x226284, - 0x2d4ac6, - 0x2d5048, - 0x234b03, - 0x252ec3, - 0x252ec4, - 0x2d70c4, - 0x2d7487, - 0x2d8185, - 0x4ced82c2, - 0x4d206a42, - 0x209285, - 0x2990c4, - 0x2dac8b, - 0x2dbd48, - 0x2e6804, - 0x243702, - 0x4da80b82, - 0x2b0c03, + 0x2a5a8e, + 0x361c05, + 0x3a04c8, + 0x282247, + 0x28224a, + 0x229d03, + 0x2b3447, + 0x2edb05, + 0x22ea44, + 0x272486, + 0x272487, + 0x32b704, + 0x304ac7, + 0x26a244, + 0x35bc84, + 0x35bc86, + 0x386904, + 0x20e546, + 0x223c83, + 0x22b888, + 0x30c3c8, + 0x24e2c3, + 0x2608c3, + 0x204f04, + 0x395943, + 0xce0d882, + 0xd2db442, + 0x20c043, + 0x201806, + 0x35c383, + 0x28bfc4, + 0xd6081c2, + 0x2081c3, + 0x358243, + 0x219942, + 0xda02ac2, + 0x2c55c6, + 0x2334c7, + 0x2f7a85, + 0x37da44, + 0x3723c5, + 0x367007, + 0x274205, + 0x2d3e89, + 0x2e0586, + 0x2e5488, + 0x2f7986, + 0xde0db42, + 0x362f48, + 0x2f8bc6, + 0x20db45, + 0x304687, + 0x30c2c4, + 0x30c2c5, + 0x28a8c4, + 0x28a8c8, + 0xe20a182, + 0xe60c502, + 0x313646, + 0x2c28c8, + 0x31f145, + 0x332c06, + 0x3356c8, + 0x33e1c8, + 0xea0fd45, + 0xee0c504, + 0x2958c7, + 0xf20bbc2, + 0xf61c402, + 0x1060d1c2, + 0x35aa45, + 0x2a8505, + 0x282606, + 0x3698c7, + 0x376ec7, + 0x10ed0783, + 0x2e3447, + 0x30dc88, + 0x3823c9, + 0x378987, + 0x390287, + 0x3a5b08, + 0x3aa206, + 0x22e546, + 0x22f18c, + 0x230b0a, + 0x230fc7, + 0x23268b, + 0x233307, + 0x23330e, + 0x236244, + 0x23a184, + 0x23b547, + 0x264f47, + 0x240d46, + 0x240d47, + 0x241207, + 0x18a20802, + 0x2420c6, + 0x2420ca, + 0x24294b, + 0x243407, + 0x244ec5, + 0x245203, + 0x246c46, + 0x246c47, + 0x241c43, + 0x18e38702, + 0x24b74a, + 0x19356fc2, + 0x196acdc2, + 0x19a4cec2, + 0x19e26982, + 0x24da85, + 0x24e0c4, + 0x1a604d02, + 0x209f85, + 0x294ac3, + 0x20bf85, + 0x237804, + 0x20a684, + 0x2ba5c6, + 0x26a546, + 0x28e443, + 0x3b1484, + 0x209383, + 0x1aa03b02, + 0x263544, + 0x263546, + 0x295e45, + 0x27fdc6, + 0x304788, + 0x20cb44, + 0x2a8e88, + 0x343fc5, + 0x24a108, + 0x2b1cc6, + 0x2bddc7, + 0x26cdc4, + 0x26cdc6, + 0x25e303, + 0x382e43, + 0x2c9388, + 0x318bc4, + 0x238d47, + 0x220246, + 0x2dad89, + 0x315108, + 0x319f08, + 0x349184, + 0x39b9c3, + 0x23e342, + 0x1ba34682, + 0x1be16102, + 0x3b2783, + 0x1c204a42, + 0x2607c4, + 0x390a46, + 0x39a6c5, + 0x2a4383, + 0x232004, + 0x2b6f47, + 0x26aa43, + 0x250d08, + 0x20e8c5, + 0x370083, + 0x281045, + 0x281184, + 0x2fb8c6, + 0x210384, + 0x211a46, + 0x213046, + 0x263004, + 0x21fd83, + 0x2225c3, + 0x1c604e42, + 0x377905, + 0x222e03, + 0x1ca1c3c2, + 0x22f143, + 0x210085, + 0x231b83, + 0x231b89, + 0x1ce07d02, + 0x1d601142, + 0x28d9c5, + 0x21a746, + 0x2d6906, + 0x2b94c8, + 0x2b94cb, + 0x20538b, + 0x2f7c85, + 0x2e1045, + 0x2c9fc9, + 0x1600742, + 0x2631c8, + 0x206044, + 0x1de001c2, + 0x25fa83, + 0x1e665106, + 0x20f088, + 0x1ea04782, + 0x233ec8, + 0x1ee01742, + 0x225c4a, + 0x1f2d0e43, + 0x3b1e86, + 0x206988, + 0x207d48, + 0x39a9c6, + 0x36d5c7, + 0x271647, + 0x220b0a, 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, - 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, - 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, + 0x3423c4, + 0x355589, + 0x1fb8fc85, + 0x20fb46, + 0x208203, + 0x251944, + 0x201e44, + 0x201e47, + 0x22cec7, + 0x237044, + 0x220a45, + 0x2826c8, + 0x350707, + 0x3619c7, + 0x1fe041c2, + 0x226004, + 0x298cc8, + 0x381004, + 0x24f0c4, + 0x24fa45, + 0x24fb87, + 0x215809, + 0x2505c4, + 0x2510c9, + 0x251308, + 0x2516c4, + 0x2516c7, + 0x20251c43, + 0x252487, + 0x16101c2, + 0x179d442, + 0x253386, + 0x2539c7, + 0x253e84, + 0x255607, + 0x256907, + 0x257483, + 0x2abc02, + 0x229c02, + 0x258743, + 0x258744, + 0x25874b, + 0x3149c8, + 0x25f184, + 0x2594c5, + 0x25ba87, + 0x25d8c5, + 0x2c4dca, + 0x25f0c3, + 0x2060da42, + 0x22b484, + 0x264d09, + 0x268983, + 0x268a47, + 0x28ee89, + 0x37b5c8, + 0x2d8483, + 0x27ff47, + 0x280689, + 0x2316c3, + 0x288284, + 0x289389, + 0x28c6c6, + 0x28dc83, + 0x2023c2, + 0x24ca43, + 0x36ab47, + 0x2bfa85, + 0x35ba06, + 0x256bc4, + 0x2d1d45, + 0x205a83, + 0x218506, + 0x20a9c2, + 0x391084, + 0x22ad02, + 0x22ad03, + 0x20a00182, + 0x29b083, + 0x216c44, + 0x216c47, + 0x200306, + 0x201e02, + 0x20e01dc2, + 0x21e184, + 0x2123b882, + 0x21600502, + 0x2dfcc4, + 0x2dfcc5, + 0x2b9cc5, + 0x262746, + 0x21a0ca82, + 0x20ca85, + 0x210d85, + 0x225883, + 0x215c06, + 0x216dc5, + 0x21c482, + 0x33de05, + 0x21c484, + 0x2230c3, + 0x223303, + 0x21e097c2, + 0x294a47, + 0x221144, + 0x221149, + 0x251844, + 0x228903, + 0x341cc9, + 0x3777c8, + 0x2a8384, + 0x2a8386, + 0x210503, + 0x259b43, + 0x332ec3, + 0x222ebc02, + 0x30eb82, + 0x22600642, + 0x3238c8, + 0x35c588, + 0x394d86, + 0x24ed45, + 0x2b32c5, + 0x200647, + 0x228fc5, + 0x2630c2, + 0x22a9a502, + 0x1614502, + 0x38fe08, + 0x362e85, + 0x351d04, + 0x2f18c5, + 0x3836c7, + 0x24f5c4, + 0x246f82, + 0x22e01182, + 0x336f04, + 0x2173c7, + 0x28e9c7, + 0x357a04, + 0x298383, + 0x24e204, + 0x24e208, + 0x22e886, + 0x27230a, + 0x2156c4, + 0x298708, + 0x259784, + 0x222b46, + 0x29a4c4, + 0x35ad46, + 0x221409, + 0x25b287, + 0x234483, + 0x23274842, + 0x274843, + 0x20c2c2, + 0x23651b02, + 0x2f0b06, + 0x364148, + 0x2a9d87, + 0x395d09, + 0x297f09, + 0x2ab245, + 0x2ad3c9, + 0x2ae045, + 0x2ae189, + 0x2af5c5, + 0x2b0208, + 0x27f284, + 0x23a8d6c7, + 0x294403, + 0x2b0407, + 0x390646, + 0x2b08c7, + 0x2a6d45, + 0x2a7f83, + 0x23e00dc2, + 0x392604, + 0x2423b8c2, + 0x264403, + 0x24618d82, + 0x307646, + 0x26b845, + 0x2b2bc7, + 0x37f183, + 0x324c44, + 0x2138c3, + 0x2386c3, + 0x24a0a3c2, + 0x25201a02, + 0x394744, + 0x2abbc3, + 0x38c985, + 0x226d85, + 0x25602282, + 0x25e00bc2, + 0x280286, + 0x318d04, + 0x2491c4, + 0x2491ca, + 0x26601d42, + 0x37324a, + 0x204148, + 0x26a964c4, + 0x201d43, + 0x25ff43, + 0x318f09, + 0x2a8909, + 0x2b7046, + 0x26e04303, + 0x328145, + 0x30664d, + 0x204306, + 0x21268b, + 0x27203482, + 0x295048, + 0x27e1c282, + 0x282051c2, + 0x37aa85, + 0x28600b02, + 0x2a3147, + 0x212b87, + 0x201503, + 0x22f848, + 0x28a02f02, + 0x202f04, + 0x217043, + 0x38d045, + 0x386fc3, + 0x2eb106, + 0x30bdc4, + 0x204ec3, + 0x234f83, + 0x28e07042, + 0x2f7c04, + 0x30ed45, + 0x35a587, + 0x27dbc3, + 0x2b36c3, + 0x2b3ec3, + 0x1621ac2, + 0x2b3f83, + 0x2b4b03, + 0x2920ae42, + 0x2cee84, + 0x26a746, + 0x33c7c3, + 0x2b4f83, + 0x296b5e02, + 0x2b5e08, + 0x2b60c4, + 0x2470c6, + 0x2b6547, + 0x24e3c6, + 0x295304, + 0x37200082, + 0x39050b, + 0x2ffbce, + 0x21bb0f, + 0x29da43, + 0x37a4ca02, + 0x166b142, + 0x37e02442, + 0x29c243, + 0x2472c3, + 0x233106, + 0x22ff46, + 0x212307, + 0x31aa84, + 0x3821a882, + 0x3860ec02, + 0x2d4ac5, + 0x2e88c7, + 0x37e046, + 0x38a82882, + 0x2f5b04, + 0x2b9783, + 0x38e01b02, + 0x39352883, + 0x2ba984, + 0x2c06c9, + 0x16c6fc2, + 0x39642682, + 0x351245, + 0x39ac7242, + 0x39e02682, + 0x341687, + 0x2364c9, + 0x35600b, + 0x271405, + 0x2c7c89, + 0x276a46, + 0x2d06c7, + 0x3a2092c4, + 0x32ef49, + 0x374b07, + 0x2255c7, + 0x234003, + 0x37b386, + 0x30f887, + 0x265383, + 0x27c5c6, + 0x3aa022c2, + 0x3ae31e02, + 0x220443, + 0x324845, + 0x257747, + 0x21fac6, + 0x2bfa05, + 0x230044, + 0x2efa45, + 0x2f8284, + 0x3b205e82, + 0x349f07, + 0x2e1c44, + 0x23e244, + 0x33328d, + 0x257249, + 0x381588, + 0x25ac04, + 0x314e85, + 0x3b2607, + 0x205e84, + 0x382a47, + 0x20c705, + 0x3b6aa384, + 0x36dec5, + 0x267644, + 0x24f706, + 0x3696c5, + 0x3ba24742, + 0x369fc4, + 0x369fc5, + 0x3716c6, + 0x2bfb45, + 0x25c104, + 0x3120c3, + 0x204986, + 0x22c085, + 0x22c785, + 0x3697c4, + 0x215743, + 0x21574c, + 0x3be8d002, + 0x3c2045c2, + 0x3c605d82, + 0x205d83, + 0x205d84, + 0x3ca032c2, + 0x2f9648, + 0x35bac5, + 0x33f884, + 0x230e46, + 0x3ce073c2, + 0x3d20fc42, + 0x3d600c02, + 0x321e85, + 0x262ec6, + 0x20b484, + 0x325fc6, + 0x3036c6, + 0x202983, + 0x3db1164a, + 0x264785, + 0x28b4c3, + 0x223886, + 0x305e09, + 0x223887, + 0x293308, + 0x29d649, + 0x248108, + 0x229a46, + 0x208843, + 0x3de017c2, + 0x384b03, + 0x384b09, + 0x368548, + 0x3e2513c2, + 0x3e601f02, + 0x22d603, + 0x2e0405, + 0x258f44, + 0x35e849, + 0x226784, + 0x26f288, + 0x205c03, + 0x2602c4, + 0x2784c3, + 0x21a788, + 0x3331c7, + 0x3ea0f302, + 0x2432c2, + 0x257d85, + 0x3960c9, + 0x20fbc3, + 0x281ac4, + 0x328104, + 0x219e03, + 0x28380a, + 0x3ef73102, + 0x3f2c0202, + 0x2c8883, + 0x374fc3, + 0x1649202, + 0x262a43, + 0x3f60bcc2, + 0x3fa05f02, + 0x3fe22044, + 0x222046, + 0x33e8c6, + 0x277844, + 0x2474c3, + 0x39bc83, + 0x235143, + 0x242cc6, + 0x2ce085, + 0x2c8e47, + 0x2d0589, + 0x2ccac5, + 0x2cdfc6, + 0x2ce548, + 0x2ce746, + 0x245bc4, + 0x29ef8b, + 0x2d3983, + 0x2d3985, + 0x2d3ac8, + 0x226302, + 0x341982, + 0x4024db02, + 0x4060b602, + 0x21a8c3, + 0x40a73fc2, + 0x273fc3, + 0x2d3dc4, + 0x2d4e43, + 0x41201682, + 0x41601686, + 0x2c47c6, + 0x2da008, + 0x41a95242, + 0x41e10882, + 0x42223342, + 0x4265e402, + 0x42a14202, + 0x42e01302, + 0x234103, + 0x261c05, + 0x32d1c6, + 0x43213184, + 0x295c4a, + 0x201306, + 0x2f7ec4, + 0x269ec3, + 0x43e0c002, + 0x202082, + 0x231743, + 0x44204ac3, + 0x362b47, + 0x3695c7, + 0x45a58847, + 0x32d747, + 0x228543, + 0x2977ca, + 0x377004, + 0x220144, + 0x22014a, + 0x202085, + 0x45e04182, + 0x3294c3, + 0x462002c2, + 0x2104c3, + 0x274803, + 0x46a00842, + 0x2e33c4, + 0x21db44, + 0x208285, + 0x30bd05, + 0x249406, + 0x249786, + 0x46e09282, + 0x47201002, + 0x3274c5, + 0x2c44d2, + 0x271ac6, + 0x248803, + 0x2a2486, + 0x248805, + 0x1610a02, + 0x4f611802, + 0x3522c3, + 0x211803, + 0x278203, + 0x4fa11f82, + 0x378ac3, + 0x4fe14602, + 0x200a83, + 0x2ceec8, + 0x24a843, + 0x24a846, + 0x3a1087, + 0x321b06, + 0x321b0b, + 0x2f7e07, + 0x392404, + 0x50603ec2, + 0x364805, + 0x50a04a83, + 0x239f83, + 0x326805, + 0x35b5c3, + 0x35b5c6, + 0x26334a, + 0x2774c3, + 0x23ad04, + 0x2c2806, + 0x20df46, + 0x50e00383, + 0x324b07, + 0x28bb8d, + 0x3adbc7, + 0x2a0685, + 0x250b46, + 0x22c0c3, + 0x52a15e43, + 0x52e04c82, + 0x3b2804, + 0x236d8c, + 0x245309, + 0x24bcc7, + 0x3724c5, + 0x268d84, + 0x27c1c8, + 0x27ed05, + 0x5328a405, + 0x377c09, + 0x256343, + 0x2acd44, + 0x53617902, + 0x21aac3, + 0x53a99f82, + 0x2a3fc6, + 0x16aa082, + 0x53e943c2, + 0x321d88, + 0x2c08c3, + 0x36de07, + 0x305105, + 0x2943c5, + 0x30860b, + 0x2e3906, + 0x308806, + 0x36dbc6, + 0x268f84, + 0x2e5686, + 0x2e5b48, + 0x23e943, + 0x23cf83, + 0x23cf84, + 0x2e6984, + 0x2e6e07, + 0x2e8745, + 0x542e8882, + 0x54606ec2, + 0x206ec5, + 0x2a4a84, + 0x2ebf8b, + 0x2ee248, + 0x2f7304, + 0x290602, + 0x54eb6042, + 0x38c543, + 0x2ee704, + 0x2ee9c5, + 0x2ef087, + 0x2f1404, + 0x2f7cc4, + 0x552054c2, + 0x35d209, + 0x2f2445, + 0x2716c5, + 0x2f3105, + 0x5561aa03, + 0x2f4244, + 0x2f424b, + 0x2f4684, + 0x2f4b0b, + 0x2f5505, + 0x21bc4a, + 0x2f5d08, + 0x2f5f0a, + 0x2f6783, + 0x2f678a, + 0x55a1b282, + 0x55e01202, + 0x26a103, + 0x562f7902, + 0x2f7903, + 0x5673aa42, + 0x56b21202, + 0x2f8104, + 0x21c2c6, + 0x325d05, + 0x2f8b43, + 0x32ff46, + 0x30c845, + 0x2e9784, + 0x56e00e02, + 0x2d7904, + 0x2c9c4a, + 0x2eb487, + 0x26b686, + 0x244007, + 0x236ec3, + 0x265488, + 0x28954b, + 0x386a45, + 0x235905, + 0x235906, + 0x370204, + 0x31d488, + 0x215a83, + 0x2b5984, + 0x36b507, + 0x307206, + 0x200e06, + 0x2a58ca, + 0x24e684, + 0x24e68a, + 0x57201946, + 0x201947, + 0x259547, + 0x279804, + 0x279809, + 0x2ba485, + 0x23b80b, + 0x2769c3, + 0x211c03, + 0x2a3f43, + 0x22ec44, + 0x57600682, + 0x259f06, + 0x2a7d05, + 0x2a26c5, + 0x2564c6, + 0x2531c4, + 0x57a01f82, + 0x245244, + 0x57e00d42, + 0x200d44, + 0x224303, + 0x58211842, + 0x3398c3, + 0x2478c6, + 0x58602602, + 0x2cfb88, + 0x223704, + 0x223706, + 0x375846, + 0x25bb44, + 0x204905, + 0x20c408, + 0x20c907, + 0x20d007, + 0x20d00f, + 0x298bc6, + 0x227843, + 0x227844, + 0x28be84, + 0x210e83, + 0x222c84, + 0x241104, + 0x58a36b82, + 0x28e183, + 0x241383, + 0x58e0c4c2, + 0x22a543, + 0x260883, + 0x213e8a, + 0x22bc87, + 0x241c8c, + 0x241f46, + 0x242406, + 0x246dc7, + 0x592ddb07, + 0x251a09, + 0x21cc04, + 0x252284, + 0x59609f42, + 0x59a01702, + 0x2a5c86, + 0x324904, + 0x2db5c6, + 0x2ab348, + 0x20eec4, + 0x2a3186, + 0x2d68c5, + 0x26ebc8, + 0x205583, + 0x272605, + 0x273583, + 0x2717c3, + 0x2717c4, + 0x273983, + 0x59edeec2, + 0x5a200b42, + 0x276889, + 0x27ec05, + 0x27ee04, + 0x281305, + 0x212504, + 0x2c1247, + 0x33d3c5, + 0x258a04, + 0x258a08, + 0x2dc3c6, + 0x2de404, + 0x2dfdc8, + 0x2e1a87, + 0x5a60e5c2, + 0x305304, + 0x210f44, + 0x2257c7, + 0x5aa53d84, + 0x249682, + 0x5ae01ac2, + 0x21b083, + 0x351144, + 0x242643, + 0x33d945, + 0x5b21de42, + 0x2ebb05, + 0x212bc2, + 0x381dc5, + 0x364305, + 0x5b60c842, + 0x3581c4, + 0x5ba06342, + 0x2a9146, + 0x2ac506, + 0x396208, + 0x2c3608, + 0x3075c4, + 0x2f8905, + 0x2fe809, + 0x2e10c4, + 0x263304, + 0x20aec3, + 0x5be20c45, + 0x2c7087, + 0x25e944, + 0x33a48d, + 0x33c282, + 0x33c283, + 0x355783, + 0x5c200202, + 0x388b45, + 0x26c747, + 0x2a7e04, + 0x32d807, + 0x29d849, + 0x2c9d89, + 0x248ac7, + 0x243843, + 0x27c008, + 0x2f33c9, + 0x2500c7, + 0x370145, + 0x385886, + 0x394246, + 0x3959c5, + 0x257345, + 0x5c603102, + 0x27eb05, + 0x2b8308, + 0x2c5386, + 0x2bcc07, + 0x2f5744, + 0x2ad207, + 0x2faf46, + 0x5ca2fb02, + 0x3713c6, + 0x2fd38a, + 0x2fde45, + 0x5cee4742, + 0x5d245702, + 0x30fbc6, + 0x2b25c8, + 0x5d68eb87, + 0x5da04602, + 0x20edc3, + 0x38c706, + 0x2246c4, + 0x3a0f46, + 0x262446, + 0x26bd0a, + 0x319a45, + 0x204446, + 0x218c83, + 0x218c84, + 0x205302, + 0x30c283, + 0x5de05dc2, + 0x2ce903, + 0x3734c4, + 0x2b2704, + 0x2b270a, + 0x229b03, + 0x28a7c8, + 0x229b0a, + 0x23a407, + 0x301446, + 0x2a9004, + 0x296e42, + 0x219542, + 0x5e206e42, + 0x24e1c3, + 0x259307, + 0x330207, + 0x38fd4b, + 0x28a2c4, + 0x34f9c7, + 0x2ef186, + 0x21c607, + 0x258004, + 0x23c445, + 0x2c17c5, + 0x5e620382, + 0x221a86, + 0x246043, + 0x24a2c2, + 0x24a2c6, + 0x5ea04802, + 0x5ee05bc2, + 0x3abd45, + 0x5f222e82, + 0x5f600a42, + 0x343745, + 0x38e6c5, + 0x204505, + 0x270ac3, + 0x390b05, + 0x2e39c7, + 0x309445, + 0x30a985, + 0x3a05c4, + 0x24c646, + 0x25c1c4, + 0x5fa03382, + 0x6060ce05, + 0x36f447, + 0x2db7c8, + 0x2a32c6, + 0x2a32cd, + 0x2a86c9, + 0x2a86d2, + 0x332705, + 0x33c843, + 0x60a044c2, + 0x2f6d84, + 0x204383, + 0x3623c5, + 0x2fed85, + 0x60e17082, + 0x3700c3, + 0x6124d082, + 0x616c3142, + 0x61a18dc2, + 0x364c05, + 0x329ec3, + 0x319888, + 0x61e02d82, + 0x62206902, + 0x2e3386, + 0x34398a, + 0x272243, + 0x25c083, + 0x2ed703, + 0x62e016c2, + 0x71211fc2, + 0x71a19682, + 0x206602, + 0x3711c9, + 0x2c6404, + 0x22fb48, + 0x71ef8b82, + 0x72202502, + 0x2f4d45, + 0x232ac8, + 0x2cf008, + 0x2fd54c, + 0x23bd83, + 0x267002, + 0x726019c2, + 0x2ccf46, + 0x3022c5, + 0x239103, + 0x383586, + 0x302406, + 0x21e2c3, + 0x304ec3, + 0x3055c6, + 0x306204, + 0x225d46, + 0x2d3b45, + 0x30648a, + 0x240544, + 0x307884, + 0x307a4a, + 0x72a037c2, + 0x234605, + 0x30898a, + 0x309a85, + 0x30a344, + 0x30a446, + 0x30a5c4, + 0x228306, + 0x72e39342, + 0x2eadc6, + 0x3a2445, + 0x26bb87, + 0x3a3c46, + 0x246fc4, + 0x2da807, + 0x311586, + 0x25b5c5, + 0x2d4287, + 0x39cd87, + 0x39cd8e, + 0x24abc6, + 0x382905, + 0x285407, + 0x201c43, + 0x201c47, + 0x3b3445, + 0x2108c4, + 0x211882, + 0x22afc7, + 0x31ab04, + 0x22fec4, + 0x24314b, + 0x21d283, + 0x288fc7, + 0x21d284, + 0x2ace07, + 0x2824c3, + 0x334b4d, + 0x389388, + 0x228e04, + 0x258905, + 0x30ac85, + 0x30b0c3, + 0x73201a82, + 0x30c243, + 0x30cf43, + 0x221c04, + 0x280785, + 0x223387, + 0x218d06, + 0x373203, + 0x24a40b, + 0x3aa70b, + 0x27928b, + 0x28088a, + 0x2ad8cb, + 0x2fc28b, + 0x2e478c, + 0x2e7291, + 0x32170a, + 0x34e48b, + 0x379d0b, + 0x3b048a, + 0x3b4cca, + 0x30ea4d, + 0x31038e, + 0x3109cb, + 0x310c8a, + 0x312191, + 0x3125ca, + 0x312acb, + 0x31300e, + 0x31398c, + 0x313fcb, + 0x31428e, + 0x31460c, + 0x315a4a, + 0x31694c, + 0x73716c4a, + 0x317449, + 0x31b60a, + 0x31b88a, + 0x31bb0b, + 0x31e9ce, + 0x31ed51, + 0x327a09, + 0x327c4a, + 0x32844b, + 0x32a30a, + 0x32ab96, + 0x32c8cb, + 0x32e00a, + 0x32e5ca, + 0x33048b, + 0x332189, + 0x3354c9, + 0x335a4d, + 0x3360cb, + 0x33734b, + 0x337d0b, + 0x3381c9, + 0x33880e, + 0x338f0a, + 0x33a24a, + 0x33a7ca, + 0x33af8b, + 0x33b7cb, + 0x33ba8d, + 0x33cecd, + 0x33da90, + 0x33df4b, + 0x33e54c, + 0x33ea4b, + 0x34118b, + 0x34290b, + 0x3463cb, + 0x346e4f, + 0x34720b, + 0x347d0a, + 0x348249, + 0x348609, + 0x34898b, + 0x348c4e, + 0x34b98b, + 0x34d04f, + 0x34ff0b, + 0x3501cb, + 0x35048b, + 0x35098a, + 0x355c09, + 0x35a20f, + 0x36128c, + 0x36170c, + 0x36208e, + 0x36388f, + 0x363c4e, + 0x3652d0, + 0x3656cf, + 0x365d4e, + 0x36650c, + 0x366812, + 0x36a511, + 0x36ad0e, + 0x36ba0e, + 0x36bf4e, + 0x36c2cf, 0x36c68e, - 0x36ca0f, - 0x36cdce, - 0x36d153, - 0x36d611, - 0x36da4e, - 0x36decc, - 0x36e2d3, - 0x36f650, - 0x36ff0c, - 0x37020c, - 0x3706cb, - 0x37168e, + 0x36ca13, + 0x36ced1, + 0x36d30e, + 0x36d78c, + 0x36e493, + 0x36fa90, + 0x37070c, + 0x370a0c, + 0x370ecb, + 0x37184e, 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, + 0x3727cb, + 0x37378c, + 0x37914a, + 0x37950c, + 0x37980c, + 0x379b09, + 0x37b7cb, + 0x37ba88, + 0x37bc89, + 0x37bc8f, + 0x37d5cb, + 0x37e44a, + 0x37fd4c, + 0x380e09, + 0x381b88, + 0x38214b, + 0x382c0b, + 0x38418a, + 0x38440b, + 0x38488c, + 0x385548, + 0x38958b, + 0x38c04b, + 0x39000b, + 0x39180b, + 0x39c90b, + 0x39cbc9, + 0x39d10d, + 0x3a264a, + 0x3a3597, + 0x3a3dd8, + 0x3a6309, 0x3a7b4b, - 0x3a9414, - 0x3a990b, - 0x3a9e8a, - 0x3aa30a, - 0x3aa58b, - 0x3ab590, - 0x3ab991, - 0x3ac48a, - 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, - 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, - 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, - 0x880c8, - 0x1462d48, - 0x21eb03, - 0x225b41, - 0x20fd41, - 0x20c401, - 0x20c041, - 0x226fc1, - 0x26f541, - 0x252041, - 0x225c41, - 0x2d5901, - 0x2ff8c1, + 0x3a9554, + 0x3a9a4b, + 0x3a9fca, + 0x3ab70a, + 0x3ab98b, + 0x3ad110, + 0x3ad511, + 0x3ae64a, + 0x3afa8d, + 0x3b018d, + 0x3b508b, + 0x3b5c46, + 0x221b83, + 0x73b76c03, + 0x37f706, + 0x292c85, + 0x396787, + 0x3215c6, + 0x1639f02, + 0x2b3809, + 0x32fd44, + 0x2e0bc8, + 0x24e103, + 0x2f6cc7, + 0x241b82, + 0x2b2c03, + 0x73e06c82, + 0x2cb006, + 0x2cc544, + 0x3b2e84, + 0x2616c3, + 0x2616c5, + 0x746c7282, + 0x74aae504, + 0x279747, + 0x1669e02, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x20abc3, + 0x204cc2, + 0x15f048, + 0x20d1c2, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x213e83, + 0x324156, + 0x325393, + 0x34f849, + 0x2957c8, + 0x364689, + 0x308b06, + 0x336f50, + 0x25c9d3, + 0x3072c8, + 0x344207, + 0x27e407, + 0x2475ca, + 0x373549, + 0x239789, + 0x29258b, + 0x367e06, + 0x314aca, + 0x2221c6, + 0x32f943, + 0x294985, + 0x22b888, + 0x2a920d, + 0x35ab0c, + 0x3a2107, + 0x379f8d, + 0x20c504, + 0x22ef0a, + 0x23064a, + 0x230b0a, + 0x20fe87, + 0x240387, + 0x243084, + 0x26cdc6, + 0x3aab84, + 0x2e26c8, + 0x2267c9, + 0x2b94c6, + 0x2b94c8, + 0x24c34d, + 0x2c9fc9, + 0x207d48, + 0x271647, + 0x2f8e8a, + 0x2539c6, + 0x2642c7, + 0x2c96c4, + 0x28e807, + 0x332eca, + 0x36f5ce, + 0x228fc5, + 0x28e70b, + 0x262089, + 0x2a8909, + 0x2129c7, + 0x29998a, + 0x225707, + 0x2ffd09, + 0x326b48, + 0x35dc4b, + 0x2e0405, + 0x38144a, + 0x223109, + 0x23908a, + 0x2ccb4b, + 0x383a0b, + 0x292315, + 0x2e6185, + 0x2716c5, + 0x2f424a, + 0x25980a, + 0x261e07, + 0x21d743, + 0x2a5c08, + 0x2d828a, + 0x223706, + 0x24ff09, + 0x26ebc8, + 0x2de404, + 0x242649, + 0x2c3608, + 0x2b1c07, + 0x20ce06, + 0x36f447, + 0x293cc7, + 0x242ac5, + 0x228e0c, + 0x258905, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x20d1c2, + 0x2d0783, + 0x204ac3, + 0x20abc3, + 0x200383, + 0x2d0783, + 0x204ac3, + 0x24a843, + 0x200383, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x15f048, + 0x20d1c2, + 0x2000c2, + 0x230d42, + 0x202f02, + 0x202382, + 0x261e82, + 0x46d0783, + 0x231b83, + 0x2135c3, + 0x332ec3, + 0x204303, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x201383, + 0x15f048, + 0x32df04, + 0x260087, + 0x263d43, + 0x37aa84, + 0x214543, + 0x212a43, + 0x332ec3, + 0x13ecc7, + 0x204cc2, + 0x168883, + 0x5a0d1c2, + 0x8d54d, + 0x8d88d, + 0x230d42, + 0x964c4, + 0x200382, + 0x5e963c8, + 0xf39c4, + 0x15f048, + 0x14020c2, + 0x1509cc6, + 0x20e443, + 0x26ae03, + 0x66d0783, + 0x22ef04, + 0x6a31b83, + 0x6f32ec3, + 0x20a3c2, + 0x2964c4, + 0x204ac3, + 0x2fc883, + 0x201882, + 0x200383, + 0x21c802, + 0x2f8043, + 0x202602, + 0x203f83, + 0x26ec83, + 0x206d02, + 0x15f048, + 0x20e443, + 0x2fc883, + 0x201882, + 0x2f8043, + 0x202602, + 0x203f83, + 0x26ec83, + 0x206d02, + 0x2f8043, + 0x202602, + 0x203f83, + 0x26ec83, + 0x206d02, + 0x2d0783, + 0x368883, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x2964c4, + 0x204303, + 0x20fbc3, + 0x213184, + 0x204ac3, + 0x200383, + 0x210582, + 0x21aa03, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x368883, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x2964c4, + 0x204ac3, + 0x200383, + 0x370145, + 0x217082, + 0x204cc2, + 0x15f048, + 0x1491b48, + 0x332ec3, + 0x2461c1, + 0x2096c1, + 0x202201, + 0x209441, + 0x24a5c1, + 0x27e081, + 0x24c0c1, + 0x2462c1, + 0x2e7481, + 0x30ed01, 0x200141, 0x200001, - 0x880c8, - 0x200481, - 0x200741, - 0x200081, - 0x200c81, - 0x2007c1, - 0x200901, - 0x200041, - 0x204281, - 0x2001c1, + 0x15f048, + 0x200701, + 0x200101, 0x2000c1, - 0x200341, - 0x200ac1, - 0x201501, - 0x2014c1, - 0x204101, - 0x200b81, + 0x201e41, + 0x200181, + 0x200941, + 0x200041, + 0x204ec1, + 0x200081, + 0x201481, + 0x200c01, + 0x2002c1, + 0x200381, + 0x200e81, + 0x21c2c1, + 0x2003c1, + 0x200201, 0x200241, 0x200a01, - 0x2002c1, - 0x200281, - 0x204701, - 0x20dec1, - 0x200781, - 0x200641, - 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, + 0x2019c1, + 0x201a81, + 0x2005c1, + 0x2007c1, + 0x200cc1, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x200382, + 0x200383, + 0x13ecc7, + 0xfcc7, + 0x28b86, + 0x3dcca, + 0x8cc48, + 0x58dc8, + 0x59207, + 0x62a46, + 0xde185, + 0x63c85, + 0x177ac6, + 0x125886, + 0x24ae04, + 0x31cdc7, + 0x15f048, + 0x2da904, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x2135c3, + 0x332ec3, + 0x204303, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x217082, + 0x2c8dc3, + 0x21fd43, + 0x200603, + 0x202942, + 0x251d43, + 0x205283, + 0x21e743, 0x200001, - 0x207043, - 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, - 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, - 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, - 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, - 0x201102, - 0x2093c2, - 0xfa2d183, - 0x23e4c2, - 0x2343c3, - 0x2475c2, - 0x227982, - 0x21eb03, - 0x21c2c2, - 0x301dc2, - 0x2a7fc2, - 0x201142, - 0x289f82, - 0x206982, - 0x200902, - 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, - 0x67a47, - 0x67f07, - 0x68707, - 0x69207, - 0x693c7, - 0x699c7, - 0x69e87, - 0x6a087, - 0x6a347, - 0x6a507, - 0x6a6c7, - 0x6ac07, - 0x6b4c7, - 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, - 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, - 0x216582, - 0x201a42, - 0x206ac2, - 0x201f82, - 0x201502, - 0x201bc2, - 0x22d183, - 0x2343c3, - 0x21eb03, - 0x201603, - 0x238483, - 0x2264c3, - 0x880c8, - 0x22d183, - 0x2343c3, - 0x238483, - 0x2264c3, - 0x1d003, - 0x21eb03, - 0x200882, - 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, - 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, - 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, - 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, - 0x323ac3, - 0x1f216582, - 0x2358c4, - 0x201f82, - 0x211003, - 0x209f82, - 0x238483, - 0x201502, - 0x217643, - 0x223ec3, - 0x880c8, - 0x880c8, - 0x21eb03, - 0x200882, - 0x1fe16582, - 0x21eb03, - 0x266383, - 0x36b683, - 0x31f984, - 0x238483, - 0x2264c3, - 0x880c8, - 0x200882, - 0x20616582, - 0x22d183, - 0x238483, - 0x2264c3, - 0x4b42, - 0x2019c2, - 0x221e42, - 0x332683, - 0x2db083, - 0x200882, - 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, - 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, - 0x219f02, - 0x22c108, - 0x202d42, - 0x29d5c6, - 0x3345c4, - 0x249155, - 0x24e013, - 0x20a583, - 0x34868a, - 0x30e547, - 0x2e6089, - 0x20f507, - 0x24f882, - 0x200002, - 0x200006, - 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, - 0x254c8c, - 0x254f8b, - 0x2008c2, - 0x2dca86, - 0x206c02, - 0x2131c2, - 0x21dec2, - 0x216582, - 0x392904, - 0x23b147, - 0x200bc2, - 0x23f1c7, - 0x240447, - 0x214ec2, - 0x230542, - 0x242885, - 0x200682, - 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, - 0x20a805, - 0x208f46, - 0x201f82, - 0x26bdc7, - 0x21eb03, - 0x20b2c2, - 0x2c7448, - 0x36a851, - 0x36ac90, - 0x200942, - 0x22a647, - 0x2074c2, - 0x3328c7, - 0x209682, - 0x305dc9, - 0x3774c7, - 0x3615c8, - 0x228246, - 0x2daf83, - 0x34ad45, - 0x234642, - 0x200402, - 0x200405, - 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, - 0x39e205, - 0x39e206, - 0x250042, - 0x203042, - 0x217c86, - 0x2a9a83, - 0x332806, - 0x2bfb05, - 0x2bfb0d, - 0x2c00d5, - 0x2c0c0c, - 0x2c150d, - 0x2c18d2, - 0x20e842, - 0x200e02, - 0x200ac2, - 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, - 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, - 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, - 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, - 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, - 0x210143, - 0x39a7c7, - 0x31c448, - 0x2c7f86, - 0x2c514d, - 0x274dc6, - 0x292b85, - 0x2afd43, - 0x2b5789, - 0x212bc6, - 0x231246, - 0x29c2c4, - 0x237747, - 0x235b06, - 0x243245, + 0x203e43, + 0x225b04, + 0x37f1c3, + 0x318cc3, + 0x21c403, + 0x360383, + 0xaad0783, + 0x23a184, + 0x21c3c3, + 0x22f143, + 0x231b83, + 0x2318c3, + 0x23a943, + 0x2a85c3, + 0x318c43, + 0x233ec3, + 0x201e43, + 0x253f84, + 0x2abc02, + 0x258683, + 0x25eb43, + 0x27bfc3, + 0x262883, + 0x201dc3, + 0x332ec3, + 0x208803, + 0x209e43, + 0x204143, + 0x210203, + 0x2ff083, + 0xae30043, + 0x2b1083, + 0x2113c3, + 0x22d603, + 0x20fbc3, + 0x226302, + 0x201683, + 0x204ac3, + 0x160abc3, + 0x27d643, + 0x20ff03, 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, - 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, - 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, - 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, - 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, - 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, - 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, - 0x880c8, - 0x281045, - 0x2db108, - 0x2e7e08, - 0x216582, - 0x2a0f05, - 0x340ec7, - 0x200202, - 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, - 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, - 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, - 0x216582, - 0x21eb03, - 0x238483, - 0x2264c3, - 0x241f85, - 0x1835c6, - 0x224104, - 0x203e42, - 0x880c8, - 0x200882, - 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, - 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, - 0x2de107, - 0x23430c, - 0x39b60a, - 0x245dc4, - 0x3b08cd, - 0x258188, - 0x2ded8d, - 0x266b86, - 0x28a70b, - 0x209dc9, - 0x318407, - 0x31d846, - 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, - 0x20914a, - 0x2139c4, - 0x21a0c6, - 0x21aa49, - 0x21aa4f, - 0x21b00d, - 0x21b786, - 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, - 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, - 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, - 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, + 0x200383, + 0x3b37c3, + 0x21aa03, + 0x241f03, + 0x304f43, + 0x2f8203, + 0x30c845, + 0x2202c3, + 0x2f8243, + 0x35ed83, + 0x218c84, + 0x265203, + 0x311883, + 0x2d8fc3, + 0x201383, + 0x217082, + 0x23bd83, + 0x308484, + 0x22fec4, + 0x22a843, + 0x15f048, + 0x4cc2, + 0x1442, + 0x2942, + 0x5ac2, + 0x2302, + 0x702, + 0x4e242, + 0x1c2, + 0x8a42, + 0xc02, + 0xf302, + 0xb602, + 0x73fc2, + 0x4c82, + 0x61e82, + 0x17902, + 0x3cf82, + 0x54c2, + 0x18b82, + 0xfc2, + 0x682, + 0x1bb82, + 0x1f82, + 0xc4c2, + 0x1702, + 0x20c42, + 0xa42, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x20d1c2, + 0x200383, + 0xc2d0783, + 0x332ec3, + 0x20fbc3, + 0x20dc42, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x6c82, + 0x2031c2, + 0x24ac42, + 0x15f048, + 0xd1c2, + 0x233482, + 0x208842, + 0x22f942, + 0x204182, + 0x209282, + 0x63c85, + 0x204702, + 0x201882, + 0x211f82, + 0x2034c2, + 0x217902, + 0x384982, + 0x201ac2, + 0x245742, + 0x13ecc7, + 0x169a8d, + 0xde209, + 0x56bcb, + 0xe3888, + 0x55109, + 0x332ec3, + 0x15f048, + 0x15f048, + 0x59b46, + 0x204cc2, + 0x24ae04, + 0x20d1c2, + 0x2d0783, + 0x2000c2, + 0x231b83, + 0x208a42, + 0x2da904, + 0x204303, + 0x2513c2, + 0x204ac3, + 0x200382, + 0x200383, + 0x2716c6, + 0x31c0cf, + 0x70d8c3, + 0x15f048, + 0x20d1c2, + 0x2135c3, + 0x332ec3, + 0x20fbc3, + 0x155afcb, + 0xde548, + 0x14ff507, + 0x13ecc7, + 0x20d1c2, + 0x2d0783, + 0x332ec3, + 0x204ac3, + 0x204cc2, + 0x200902, + 0x207f42, + 0xfad0783, + 0x2416c2, + 0x231b83, + 0x2101c2, + 0x22ad02, + 0x332ec3, + 0x2630c2, + 0x255302, + 0x2ae4c2, + 0x203742, + 0x291e02, + 0x209902, + 0x200b82, + 0x274842, + 0x258142, + 0x251b02, + 0x2b36c2, + 0x242602, + 0x246082, + 0x263c42, + 0x20fbc3, + 0x205f02, + 0x204ac3, + 0x231302, + 0x27de02, + 0x200383, + 0x251dc2, + 0x20c4c2, + 0x209f42, + 0x200b42, + 0x20c842, + 0x2e4742, + 0x220382, + 0x24d082, + 0x234f42, + 0x310c8a, + 0x347d0a, + 0x37e80a, + 0x3b5dc2, + 0x2046c2, + 0x204e82, + 0xff4f589, + 0x10324d0a, + 0x15926c7, + 0x1410c43, + 0x243d0, + 0x9402, + 0x24fe44, + 0x10ad0783, + 0x231b83, + 0x251304, + 0x332ec3, + 0x2964c4, + 0x204303, + 0x20fbc3, + 0x204ac3, + 0x20abc3, + 0x200383, + 0x2202c3, + 0x24abc3, + 0x15f048, + 0x14629c4, + 0x614c5, + 0x5f88a, + 0x1168c2, + 0x1a03c6, + 0x102d11, + 0x1134f589, + 0x61548, + 0x82a08, + 0x5e887, + 0xf82, + 0x19a18a, + 0x2ac47, + 0x15f048, + 0x10b708, + 0xbac7, + 0x16c1b74b, + 0x1082, + 0x15de87, + 0xdb4a, + 0x5e58f, + 0xfd4f, + 0x1c402, + 0xd1c2, + 0xa8508, + 0x185b0a, + 0x1681c8, + 0x3b02, + 0x5e30f, + 0xa3d4b, + 0x1672c8, + 0x13edc7, + 0x15104a, + 0x2f64b, + 0x11dd09, + 0x150f47, + 0x100c4c, + 0x1b3c47, + 0x18d18a, + 0x94b88, + 0x195a8e, + 0x28b8e, + 0x2aa8b, + 0x2b2cb, + 0x2d3cb, + 0x2e209, + 0x3558b, + 0x4a68d, + 0xe984b, + 0xec8cd, + 0xecc4d, + 0x18274a, + 0x2fd0b, + 0x3688b, + 0x42305, + 0x14243d0, + 0x125d8f, + 0x1264cf, + 0x48dcd, + 0x25910, + 0x1742, + 0x17203988, + 0xfb48, + 0x176f4745, + 0x505cb, + 0x117050, + 0x57488, + 0x2b48a, + 0x5f4c9, + 0x695c7, + 0x69907, + 0x69ac7, + 0x6c287, + 0x6d307, + 0x6dd07, + 0x6e487, + 0x6e8c7, + 0x6f487, + 0x6f787, + 0x6ffc7, + 0x70187, + 0x70347, + 0x70507, + 0x70807, + 0x70c47, + 0x718c7, + 0x71d87, + 0x729c7, + 0x72f07, + 0x730c7, + 0x73807, + 0x73e87, + 0x74087, + 0x74347, + 0x74507, + 0x746c7, + 0x75047, + 0x754c7, + 0x75987, + 0x76147, + 0x76407, + 0x76bc7, + 0x76d87, + 0x77107, + 0x77d07, + 0x78987, + 0x78d87, + 0x78f47, + 0x79107, + 0x79547, + 0x7a307, + 0x7a607, + 0x7a907, + 0x7aac7, + 0x7ae47, + 0x7b387, + 0xa9c2, + 0x4c94a, + 0x16dc87, + 0x178d528b, + 0x14d5296, + 0x19151, + 0xf080a, + 0xa838a, + 0x59b46, + 0xd2acb, + 0x642, + 0x2e891, + 0x94609, + 0x9a109, + 0x74842, + 0xa4f4a, + 0xaa689, + 0xab24f, + 0xaca4e, + 0xad708, + 0x18d82, + 0x15da89, + 0x18b88e, + 0xfd08c, + 0xf254f, + 0x146ce, + 0x23b4c, + 0x2ccc9, + 0x2db51, + 0x465c8, + 0x482d2, + 0x49fcd, + 0x82bcd, + 0x19090b, + 0x3d2d5, + 0x4c809, + 0x4ec0a, + 0x4f489, + 0x5ecd0, + 0x72c4b, + 0x79f4f, + 0x7c48b, + 0x8340c, + 0x84610, + 0x8894a, + 0x8dd0d, + 0x16618e, + 0x1ae00a, + 0x8f7cc, + 0x93994, + 0x94291, + 0xa494b, + 0xa578f, + 0xa7bcd, + 0xac3ce, + 0xb1acc, + 0xb220c, + 0xdc90b, + 0xdcc0e, + 0x122110, + 0x11640b, + 0x17a64d, + 0x1af38f, + 0xb798c, + 0xb934e, + 0xbb311, + 0xc3ccc, + 0xc5a47, + 0x15e58d, + 0x12b50c, + 0x14be50, + 0xd1b4d, + 0xd8e47, + 0xe2350, + 0xfa008, + 0xfb08b, + 0x150bcf, + 0x17de88, + 0xf0a0d, + 0x181d50, + 0x17fb1846, + 0xb6003, + 0x1b02, + 0xd0309, + 0x5ac0a, + 0x1084c6, + 0x180dff49, + 0x13203, + 0xdab91, + 0xdafc9, 0xdc047, - 0xe26d8, - 0x108548, - 0x19104a, - 0x4114d, - 0x1402, - 0x161186, - 0x89948, - 0x180248, - 0x87f89, - 0x45e88, - 0x4da0e, - 0xe8f85, - 0x539c8, - 0x3282, - 0x155646, - 0x6c2, - 0xb81, - 0x3eae2f44, - 0x3ee90c43, + 0x5e40b, + 0xe4a90, + 0xe4f4c, + 0xe5385, + 0x126cc8, + 0x19dc0a, + 0x129607, + 0x1002, + 0x12464a, + 0x25e49, + 0x3a20a, + 0x8eacf, + 0x44f4b, + 0x1b280c, + 0x1b2ad2, + 0xaa085, + 0x2124a, + 0x186f2fc5, + 0x17698c, + 0x121203, + 0x184982, + 0xf86ca, + 0x96b88, + 0xeca88, + 0x14a587, + 0xd42, + 0x2602, + 0x3f390, + 0x1702, + 0x1aa2cf, + 0x177ac6, + 0x301ce, + 0xe7fcb, + 0x1ae208, + 0xd6c09, + 0x17cd92, + 0x7c0d, + 0x56608, + 0x56a89, + 0x5700d, + 0x59c89, + 0x5a28b, + 0x5b088, + 0x5f6c8, + 0x68bc8, + 0x68e49, + 0x6904a, + 0x6c8cc, + 0xe5d0a, + 0x104f87, + 0x16b2cd, + 0xf910b, + 0x12fb4c, + 0x1a05d0, + 0x6902, + 0x1968cd, + 0x16c2, + 0x11fc2, + 0x104eca, + 0xf070a, + 0xf6bcb, + 0x36a4c, + 0x10b48e, + 0x21ccd, + 0x1ab488, + 0x6c82, + 0x1166118e, + 0x11f6a18e, + 0x1266c00a, + 0x12ed0a0e, + 0x137156ce, + 0x13f2a00c, + 0x15926c7, + 0x15926c9, + 0x1410c43, + 0x14731e8c, + 0x14f3a009, + 0x1409402, + 0x610d1, + 0x16a0d1, + 0x6bf4d, + 0xd0951, + 0x11b1d1, + 0x129f4f, + 0x131dcf, + 0x139f4c, + 0x14a94d, + 0x18d555, + 0x1ace0c, + 0x1b41cc, + 0x1b5850, + 0x940c, + 0x5838c, + 0xedc19, + 0x1a6719, + 0x115419, + 0x15c754, + 0x17f854, + 0x198594, + 0x19ae14, + 0x1a9054, + 0x1577fb09, + 0x15d98849, + 0x167b4289, + 0x11b6b089, + 0x9402, + 0x1236b089, + 0x9402, + 0xedc0a, + 0x9402, + 0x12b6b089, + 0x9402, + 0xedc0a, + 0x9402, + 0x1336b089, + 0x9402, + 0x13b6b089, + 0x9402, + 0x1436b089, + 0x9402, + 0xedc0a, + 0x9402, + 0x14b6b089, + 0x9402, + 0xedc0a, + 0x9402, + 0x1536b089, + 0x9402, + 0x15b6b089, + 0x9402, + 0x1636b089, + 0x9402, + 0x16b6b089, + 0x9402, + 0xedc0a, + 0x9402, + 0x102d05, + 0x19a184, + 0x11d644, + 0x1a4884, + 0xbfc04, + 0x2144, + 0x5e884, + 0x1482283, + 0x1420183, + 0xffd84, + 0x1542b83, + 0x1742, + 0x21cc3, + 0x204cc2, + 0x20d1c2, + 0x2000c2, + 0x2041c2, + 0x208a42, + 0x200382, + 0x202602, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204143, + 0x204ac3, + 0x200383, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x204ac3, + 0x200383, + 0x3b943, + 0x332ec3, + 0x204cc2, + 0x368883, + 0x1a2d0783, + 0x20ef47, + 0x332ec3, + 0x205d83, + 0x213184, + 0x204ac3, + 0x200383, + 0x25084a, + 0x2716c5, + 0x21aa03, + 0x205bc2, + 0x15f048, + 0x15f048, + 0xd1c2, + 0x11f0c2, + 0x15dfc5, + 0x15f048, + 0xd0783, + 0x1ae3db07, + 0xcfd46, + 0x1b1acd05, + 0xcfe07, + 0xa54a, + 0xa408, + 0xb747, + 0x5f2c8, + 0x18c407, + 0xed30f, + 0x3ab07, + 0x165bc6, + 0x117050, + 0x122f0f, + 0x108544, + 0x1b4cfece, + 0xafd0c, + 0x11de8a, + 0xac687, + 0x12d54a, + 0x60989, + 0xc2f4a, + 0x77a8a, + 0x1084c6, + 0xac74a, + 0x11a58a, + 0x154009, + 0xda448, + 0xda746, + 0xde74d, + 0xb9905, + 0x5a107, + 0x16df94, + 0xfe58b, + 0x16710a, + 0xa8bcd, + 0x28b83, + 0x28b83, + 0x28b86, + 0x28b83, + 0x168883, + 0x15f048, + 0xd1c2, + 0x51304, + 0x8cdc3, + 0x170145, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x205283, + 0x2d0783, + 0x231b83, + 0x2135c3, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x29a2c3, + 0x24abc3, + 0x205283, + 0x24ae04, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x209103, + 0x2d0783, + 0x231b83, + 0x2041c3, + 0x2135c3, + 0x332ec3, + 0x2964c4, + 0x23a0c3, + 0x22d603, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x21aa03, + 0x38c743, + 0x1d2d0783, + 0x231b83, + 0x2c3ec3, + 0x332ec3, + 0x2075c3, + 0x22d603, + 0x200383, + 0x2054c3, + 0x343c44, + 0x15f048, + 0x1dad0783, + 0x231b83, + 0x2ad7c3, + 0x332ec3, + 0x20fbc3, + 0x213184, + 0x204ac3, + 0x200383, + 0x21d7c3, + 0x15f048, + 0x1e2d0783, + 0x231b83, + 0x2135c3, + 0x20abc3, + 0x200383, + 0x15f048, + 0x15926c7, + 0x368883, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x2964c4, + 0x213184, + 0x204ac3, + 0x200383, + 0x13ecc7, + 0x16e1cb, + 0xdb3c4, + 0xb9905, + 0x1491b48, + 0xae2cd, + 0x1f68a405, + 0x192c4, + 0x1a5c3, + 0x367fc5, + 0x15f048, + 0x1d202, + 0x2803, + 0xf7286, + 0x32f448, + 0x304507, + 0x24ae04, + 0x3b3006, + 0x3b5706, + 0x15f048, + 0x310683, + 0x2384c9, + 0x2bdad5, + 0xbdadf, + 0x2d0783, + 0x39a9d2, + 0xf5806, + 0x10cfc5, + 0x2b48a, + 0x5f4c9, + 0x39a78f, + 0x2da904, + 0x20f345, + 0x2fee50, + 0x2959c7, + 0x20abc3, + 0x2842c8, + 0x1257c6, + 0x2b400a, + 0x200e84, + 0x2f2a03, + 0x2716c6, + 0x205bc2, + 0x26b44b, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x2f74c3, + 0x20d1c2, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x205d83, + 0x223103, + 0x200383, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x204ac3, + 0x200383, + 0x204cc2, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x24ae04, + 0x2d0783, + 0x231b83, + 0x222044, + 0x204ac3, + 0x200383, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x2135c3, + 0x209e43, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x262fc3, + 0x1e303, + 0x5d83, + 0x204ac3, + 0x200383, + 0x310c8a, + 0x32a949, + 0x34184b, + 0x341f8a, + 0x347d0a, + 0x356e8b, + 0x37300a, + 0x37914a, + 0x37e80a, + 0x37ea8b, + 0x39d949, + 0x39f84a, + 0x39fbcb, + 0x3a9d0b, + 0x3b4a8a, + 0x2d0783, + 0x231b83, + 0x2135c3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x10c9c9, + 0x15f048, + 0x2d0783, + 0x2695c4, + 0x200c82, + 0x213184, + 0x3ac705, + 0x205283, + 0x24ae04, + 0x2d0783, + 0x23a184, + 0x231b83, + 0x251304, + 0x2da904, + 0x2964c4, + 0x22d603, + 0x204ac3, + 0x200383, + 0x293ac5, + 0x209103, + 0x21aa03, + 0x22c6c3, + 0x258a04, + 0x262904, + 0x35d705, + 0x15f048, + 0x306e44, + 0x20e546, + 0x28a8c4, + 0x20d1c2, + 0x361ac7, + 0x253587, + 0x24f0c4, + 0x25d8c5, + 0x2d1d45, + 0x2b0405, + 0x2964c4, + 0x23cfc8, + 0x33f306, + 0x311f48, + 0x227b05, + 0x2e0405, + 0x377004, + 0x200383, + 0x2f39c4, + 0x355f46, + 0x2717c3, + 0x258a04, + 0x291a45, + 0x363644, + 0x234e84, + 0x205bc2, + 0x25e206, + 0x392206, + 0x3022c5, + 0x204cc2, + 0x368883, + 0x24e0d1c2, + 0x232dc4, + 0x208a42, + 0x20fbc3, + 0x25e402, + 0x204ac3, + 0x200382, + 0x213e83, + 0x24abc3, + 0x15f048, + 0x15f048, + 0x332ec3, + 0x204cc2, + 0x25a0d1c2, + 0x332ec3, + 0x2702c3, + 0x23a0c3, + 0x32bc44, + 0x204ac3, + 0x200383, + 0x15f048, + 0x204cc2, + 0x2620d1c2, + 0x2d0783, + 0x204ac3, + 0x200383, + 0x682, + 0x2044c2, + 0x217082, + 0x205d83, + 0x2ec383, + 0x204cc2, + 0x15f048, + 0x13ecc7, + 0x20d1c2, + 0x231b83, + 0x251304, + 0x202743, + 0x332ec3, + 0x209e43, + 0x20fbc3, + 0x204ac3, + 0x2183c3, + 0x200383, + 0x21d743, + 0x1286d3, + 0x12cb54, + 0x13ecc7, + 0x1fd86, + 0x5ae0b, + 0x28b86, + 0x58c07, + 0x130089, + 0xe9cca, + 0x8cb0d, + 0x16978c, + 0x13d64a, + 0x63c85, + 0xa588, + 0x177ac6, + 0x125886, + 0x201742, + 0x827cc, + 0x19a347, + 0x23551, + 0x2d0783, + 0x5f245, + 0x102c4, + 0x274341c6, + 0x19146, + 0x178146, + 0x920ca, + 0xb2f03, + 0x27a5c984, + 0x130045, + 0xa383, + 0xd2b8c, + 0xf6188, + 0xbaf48, + 0xa3bc9, + 0x20c48, + 0x141dd06, + 0xfbc88, + 0x5e884, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x204cc2, + 0x20d1c2, + 0x332ec3, + 0x20a3c2, + 0x204ac3, + 0x200383, + 0x213e83, + 0x36388f, + 0x363c4e, + 0x15f048, + 0x2d0783, + 0x4cd07, + 0x231b83, + 0x332ec3, + 0x204303, + 0x204ac3, + 0x200383, + 0x21d0c3, + 0x239c47, + 0x200142, + 0x2c1949, + 0x201442, + 0x23f68b, + 0x2b5b8a, + 0x2bcfc9, + 0x200282, + 0x262b46, + 0x26d615, + 0x23f7d5, + 0x274a13, + 0x23fd53, + 0x202342, + 0x20d605, + 0x3ab1cc, + 0x24698b, + 0x29a745, + 0x205ac2, + 0x289c02, + 0x386746, + 0x200f82, + 0x25fb86, + 0x294d0d, + 0x255dcc, + 0x224444, + 0x201342, + 0x203782, + 0x248688, + 0x202302, + 0x208886, + 0x303bc4, + 0x26d7d5, + 0x274b93, + 0x210b83, + 0x33070a, + 0x2f0187, + 0x3b2209, + 0x32dc47, + 0x3124c2, + 0x200002, + 0x3a4386, + 0x20a0c2, + 0x15f048, + 0x200802, + 0x211cc2, + 0x27d407, + 0x3b3507, + 0x21c7c5, + 0x201082, + 0x21d707, + 0x21d8c8, + 0x2413c2, + 0x2c2fc2, + 0x22c1c2, + 0x20e542, + 0x23b688, + 0x218443, + 0x2b72c8, + 0x2e078d, + 0x21fe43, + 0x226288, + 0x23e88f, + 0x23ec4e, + 0x24ac8a, + 0x229d11, + 0x22a190, + 0x2bf0cd, + 0x2bf40c, + 0x38c5c7, + 0x330887, + 0x3b30c9, + 0x204f02, + 0x200702, + 0x25a6cc, + 0x25a9cb, + 0x202ac2, + 0x2dcac6, + 0x20db42, + 0x20c502, + 0x21c402, + 0x20d1c2, + 0x384684, + 0x23c7c7, + 0x220802, + 0x242c07, + 0x243c47, + 0x2271c2, + 0x20e482, + 0x24cbc5, + 0x204d02, + 0x20cb4e, + 0x36f1cd, + 0x231b83, + 0x353a0e, + 0x2c0b8d, + 0x3ab643, + 0x201842, + 0x206744, + 0x208182, + 0x220a42, + 0x33e805, + 0x348447, + 0x372202, + 0x2041c2, + 0x250f07, + 0x2543c8, + 0x2abc02, + 0x2aa106, + 0x25a54c, + 0x25a88b, + 0x20da42, + 0x26588f, + 0x265c50, + 0x26604f, + 0x266415, + 0x266954, + 0x266e4e, + 0x2671ce, + 0x26754f, + 0x26790e, + 0x267c94, + 0x268193, + 0x26864d, + 0x27b549, + 0x28dbc3, + 0x200182, + 0x237b85, + 0x206506, + 0x208a42, + 0x21a2c7, + 0x332ec3, + 0x200642, + 0x36edc8, + 0x229f51, + 0x22a390, + 0x200bc2, + 0x28d387, + 0x200b02, + 0x205fc7, + 0x201b02, + 0x32f249, + 0x386707, + 0x281408, + 0x234006, + 0x2cf4c3, + 0x2cf4c5, + 0x231e02, + 0x204842, + 0x3a4785, + 0x376e05, + 0x205e82, + 0x245f43, + 0x3636c7, + 0x210687, + 0x204982, + 0x3aae04, + 0x214183, + 0x2c9209, + 0x2ed188, + 0x205d82, + 0x2032c2, + 0x26e2c7, + 0x282185, + 0x2ab548, + 0x20d2c7, + 0x216143, + 0x372306, + 0x2bef4d, + 0x2bf2cc, + 0x280346, + 0x208842, + 0x2017c2, + 0x201f02, + 0x23e70f, + 0x23eb0e, + 0x2d1dc7, + 0x203cc2, + 0x2c3345, + 0x2c3346, + 0x20bcc2, + 0x205f02, + 0x28f406, + 0x205f03, + 0x205f06, + 0x2ca585, + 0x2ca58d, + 0x2cab55, + 0x2cb38c, + 0x2cc28d, + 0x2cc652, + 0x20b602, + 0x273fc2, + 0x201302, + 0x240fc6, + 0x2fcf46, + 0x201002, + 0x206586, + 0x211f82, + 0x37edc5, + 0x202382, + 0x20cc89, + 0x2df2cc, + 0x2df60b, + 0x200382, + 0x255688, + 0x213a02, + 0x204c82, + 0x246746, + 0x36b005, + 0x235007, + 0x2567c5, + 0x294805, + 0x24cd82, + 0x20a642, + 0x217902, + 0x2f2847, + 0x24410d, + 0x24448c, + 0x2b3387, + 0x2aa082, + 0x23cf82, + 0x24ba48, + 0x2d0488, + 0x2e5f88, + 0x2f09c4, + 0x2dce87, + 0x2ee483, + 0x2b6042, + 0x200e82, + 0x2f11c9, + 0x395e87, + 0x2054c2, + 0x277245, + 0x201202, + 0x26a102, + 0x349c43, + 0x349c46, + 0x2f74c2, + 0x2f7fc2, + 0x201402, + 0x3b3fc6, + 0x206687, + 0x207842, + 0x200e02, + 0x38bc8f, + 0x35384d, + 0x2b714e, + 0x2c0a0c, + 0x2003c2, + 0x205502, + 0x233e45, + 0x3b4e86, + 0x201ec2, + 0x200fc2, + 0x200682, + 0x20d244, + 0x2e0604, + 0x2d29c6, + 0x202602, + 0x27e787, + 0x22d703, + 0x22d708, + 0x24b048, + 0x390787, + 0x240ec6, + 0x20e5c2, + 0x23b383, + 0x23b387, + 0x272846, + 0x2e4385, + 0x2f0d48, + 0x206342, + 0x34a007, + 0x220c42, + 0x33c282, + 0x203b82, + 0x2dbe09, + 0x22fb02, + 0x200242, + 0x240183, + 0x319ac7, + 0x2018c2, + 0x2df44c, + 0x2df74b, + 0x2803c6, + 0x20a2c5, + 0x222e82, + 0x200a42, + 0x2bd306, + 0x235b83, + 0x39c147, + 0x23bb02, + 0x203382, + 0x26d495, + 0x23f995, + 0x2748d3, + 0x23fed3, + 0x2934c7, + 0x2b5948, + 0x2fb310, + 0x30ee4f, + 0x2b5953, + 0x2bcd92, + 0x2c1510, + 0x2ca1cf, + 0x2d57d2, + 0x2d84d1, + 0x2d9513, + 0x2dbbd2, + 0x2dd20f, + 0x2e57ce, + 0x2f5092, + 0x2f6351, + 0x2f754f, + 0x2f834e, + 0x300011, + 0x355810, + 0x35f212, + 0x3702d1, + 0x2f9bc6, + 0x307487, + 0x373387, + 0x204b42, + 0x284e05, + 0x2febc7, + 0x217082, + 0x203142, + 0x2293c5, + 0x21ee43, + 0x35d986, + 0x2442cd, + 0x24460c, + 0x206602, + 0x3ab04b, + 0x24684a, + 0x30be4a, + 0x2bbf49, + 0x2ef68b, + 0x20d40d, + 0x2ff2cc, + 0x24890a, + 0x275b0c, + 0x27afcb, + 0x29a58c, + 0x2fa34b, + 0x2df243, + 0x35ee06, + 0x3a6502, + 0x2f8b82, + 0x2db2c3, + 0x202502, + 0x202503, + 0x245886, + 0x2665c7, + 0x365146, + 0x385cc8, + 0x2d0188, + 0x2d3186, + 0x2019c2, + 0x301c8d, + 0x301fcc, + 0x2da9c7, + 0x306d07, + 0x21fdc2, + 0x21ac02, + 0x23b302, + 0x254782, + 0x20d1c2, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x213184, + 0x204ac3, + 0x200383, + 0x213e83, + 0x204cc2, + 0x204e02, + 0x29a94005, + 0x29e02e85, + 0x2a3177c6, + 0x15f048, + 0x2a6b5145, + 0x20d1c2, + 0x2000c2, + 0x2ab9c685, + 0x2ae83305, + 0x2b283e07, + 0x2b68b309, + 0x2ba47ac4, + 0x208a42, + 0x200642, + 0x2bf72245, + 0x2c293149, + 0x2c71db88, + 0x2cab2085, + 0x2cf363c7, + 0x2d219b08, + 0x2d6e8605, + 0x2da5b4c6, + 0x2de346c9, + 0x2e2b8648, + 0x2e6c4b48, + 0x2ea9cf0a, + 0x2ee52104, + 0x2f2d6585, + 0x2f6becc8, + 0x2fb51245, + 0x2184c2, + 0x2fe63b83, + 0x302a7786, + 0x3064ea48, + 0x30a24f06, + 0x30ecec88, + 0x3132d1c6, + 0x316e4444, + 0x202082, + 0x31b630c7, + 0x31eaeb84, + 0x3227dc47, + 0x327a1087, + 0x200382, + 0x32aa0685, + 0x32e03bc4, + 0x332d1807, + 0x3362adc7, + 0x33a87406, + 0x33e36085, + 0x3429b807, + 0x346d2688, + 0x34a37f07, + 0x34eb0689, + 0x3538e6c5, + 0x35719c07, + 0x35a92e46, + 0x35e62d48, + 0x2460cd, + 0x24cf09, + 0x2f484b, + 0x25534b, + 0x27de4b, + 0x2aa88b, + 0x30f20b, + 0x30f4cb, + 0x30fd49, + 0x310f0b, + 0x3111cb, + 0x311ccb, + 0x31284a, + 0x312d8a, + 0x31338c, + 0x31608b, + 0x3166ca, + 0x327eca, + 0x3328ce, + 0x333a4e, + 0x333dca, + 0x335d8a, + 0x3369cb, + 0x336c8b, + 0x337a4b, + 0x34c7cb, + 0x34cdca, + 0x34da8b, + 0x34dd4a, + 0x34dfca, + 0x34e24a, + 0x373ecb, + 0x37a2cb, + 0x37c38e, + 0x37c70b, + 0x383ecb, + 0x38500b, + 0x38984a, + 0x389ac9, + 0x389d0a, + 0x38b38a, + 0x39e50b, + 0x39fe8b, + 0x3a09ca, + 0x3a28cb, + 0x3a588b, + 0x3b44cb, + 0x36285b88, + 0x3668c289, + 0x36aa3a49, + 0x36ee0bc8, + 0x33c685, + 0x202943, + 0x212944, + 0x206885, + 0x247806, + 0x25b245, + 0x28adc4, + 0x21a1c8, + 0x30af85, + 0x297a44, + 0x209907, + 0x2a280a, + 0x361d8a, + 0x3101c7, + 0x211f47, + 0x2fdec7, + 0x255b47, + 0x2fad45, + 0x343d06, + 0x22cb47, + 0x26fec4, + 0x2e6b46, + 0x2e6a46, + 0x208305, + 0x3492c4, + 0x38ec86, + 0x2a1647, + 0x22d046, + 0x351b47, + 0x26a783, + 0x2b4846, + 0x232045, + 0x283f07, + 0x270e0a, + 0x26dfc4, + 0x218ec8, + 0x2affc9, + 0x2cb147, + 0x334646, + 0x255908, + 0x200a49, + 0x3b23c4, + 0x2210c4, + 0x278285, + 0x22c848, + 0x2c7f47, + 0x2a7109, + 0x2f9cc8, + 0x347a86, + 0x24c646, + 0x29de88, + 0x354c46, + 0x202e85, + 0x2874c6, + 0x27e108, + 0x254b86, + 0x25d14b, + 0x29dac6, + 0x29f50d, + 0x3b1785, + 0x2aea46, + 0x20f505, + 0x349909, + 0x2abe87, + 0x3195c8, + 0x292986, + 0x29e709, + 0x364546, + 0x270d85, + 0x2a4dc6, + 0x2c99c6, + 0x2cdb89, + 0x200846, + 0x253087, + 0x277885, + 0x202383, + 0x25d2c5, + 0x29f7c7, + 0x358e06, + 0x3b1689, + 0x3177c6, + 0x287706, + 0x215ec9, + 0x286ec9, + 0x2a5607, + 0x2cf688, + 0x377f89, + 0x284a88, + 0x379386, + 0x2d9dc5, + 0x23cb4a, + 0x287786, + 0x3a8506, + 0x2cbbc5, + 0x272188, + 0x215587, + 0x22e68a, + 0x251746, + 0x24d345, + 0x329cc6, + 0x2d6347, + 0x334507, + 0x2c4145, + 0x270f45, + 0x2b2f86, + 0x351746, + 0x387046, + 0x2b8bc4, + 0x286209, + 0x28d146, + 0x30e50a, + 0x222848, + 0x309148, + 0x361d8a, + 0x2145c5, + 0x2a1585, + 0x37f588, + 0x2b6348, + 0x21b507, + 0x293846, + 0x320d48, + 0x3674c7, + 0x285188, + 0x2b9206, + 0x2885c8, + 0x29ad46, + 0x227c87, + 0x272b06, + 0x38ec86, + 0x25d9ca, + 0x384706, + 0x2d9dc9, + 0x2b5446, + 0x2e3d8a, + 0x2e4449, + 0x362586, + 0x2ba844, + 0x237c4d, + 0x28c507, + 0x3268c6, + 0x2c4a05, + 0x3645c5, + 0x375846, + 0x2d1649, + 0x2b4287, + 0x27f886, + 0x2c9546, + 0x28ae49, + 0x264a04, + 0x2d4a44, + 0x3ac808, + 0x245c46, + 0x277308, + 0x2e66c8, + 0x202fc7, + 0x3a80c9, + 0x387247, + 0x2b500a, + 0x2498cf, + 0x250b0a, + 0x233c45, + 0x27e345, + 0x218745, + 0x303b07, + 0x20e183, + 0x2cf888, + 0x3028c6, + 0x3029c9, + 0x2d4006, + 0x3aeb47, + 0x29e4c9, + 0x3194c8, + 0x2cbc87, + 0x30d803, + 0x33c705, + 0x20e105, + 0x2b8a0b, + 0x351304, + 0x257984, + 0x27cbc6, + 0x30e887, + 0x38b10a, + 0x2757c7, + 0x38c807, + 0x283305, + 0x200045, + 0x240909, + 0x38ec86, + 0x27564d, + 0x35af05, + 0x29f4c3, + 0x20ad83, + 0x34f785, + 0x347845, + 0x255908, + 0x280047, + 0x2d47c6, + 0x2a36c6, + 0x2296c5, + 0x231e47, + 0x202ac7, + 0x33f1c7, + 0x2d660a, + 0x2b4908, + 0x2b8bc4, + 0x254907, + 0x281607, + 0x3400c6, + 0x26f8c7, + 0x2eaa08, + 0x2e9e88, + 0x2abd86, + 0x2d1ec8, + 0x2008c4, + 0x22cb46, + 0x247d86, + 0x216646, + 0x3a8c46, + 0x22d9c4, + 0x255c06, + 0x2c31c6, + 0x29d406, + 0x235ec6, + 0x20ac46, + 0x2ea846, + 0x2d46c8, + 0x3af1c8, + 0x2d6e48, + 0x25b448, + 0x37f506, + 0x212485, + 0x2e2006, + 0x2b2105, + 0x388c87, + 0x216605, + 0x2136c3, + 0x203ec5, + 0x33fb44, + 0x20ad85, + 0x2266c3, + 0x338007, + 0x34bc88, + 0x351c06, + 0x32250d, + 0x27e306, + 0x29c985, + 0x2d9743, + 0x2be689, + 0x264b86, + 0x23c0c6, + 0x2a4ec4, + 0x250a87, + 0x233006, + 0x2b4545, + 0x234a83, + 0x207ac4, + 0x2817c6, + 0x2ded04, + 0x32b8c8, + 0x39ba49, + 0x24d849, + 0x2a4cca, + 0x387acd, + 0x208d07, + 0x224bc6, + 0x20a684, + 0x28b309, + 0x28a088, + 0x28c106, + 0x23dfc6, + 0x26f8c7, + 0x2b9a46, + 0x21f706, + 0x3ac246, + 0x3a110a, + 0x219b08, + 0x2464c5, + 0x26fd09, + 0x28568a, + 0x2fa988, + 0x2a0ec8, + 0x29bd48, + 0x2af08c, + 0x316305, + 0x2a3948, + 0x2e8e06, + 0x319746, + 0x3aea07, + 0x2756c5, + 0x287645, + 0x24d709, + 0x213487, + 0x302985, + 0x227487, + 0x20ad83, + 0x2c8485, + 0x20b8c8, + 0x25d647, + 0x2a0d89, + 0x2de405, + 0x307784, + 0x2a6508, + 0x363207, + 0x2cbe48, + 0x368c48, + 0x2dc805, + 0x304286, + 0x278686, + 0x2ac1c9, + 0x31c407, + 0x2b29c6, + 0x3b3907, + 0x221d03, + 0x247ac4, + 0x2a7885, + 0x231f84, + 0x383c84, + 0x286947, + 0x35bdc7, + 0x27fa44, + 0x2a0bd0, + 0x367c87, + 0x200045, + 0x2536cc, + 0x225344, + 0x2b1588, + 0x227b89, + 0x2b4e06, + 0x220d88, + 0x247344, + 0x247348, + 0x22ec86, + 0x235d48, + 0x2a1c06, + 0x2d328b, + 0x202385, + 0x2cb988, + 0x216ac4, + 0x39be8a, + 0x2a0d89, + 0x381346, + 0x218808, + 0x25ebc5, + 0x2b69c4, + 0x2b1486, + 0x33f088, + 0x285b88, + 0x340bc6, + 0x31d104, + 0x23cac6, + 0x3872c7, + 0x27db47, + 0x26f8cf, + 0x205547, + 0x362647, + 0x38eb45, + 0x352245, + 0x2a52c9, + 0x30e1c6, + 0x284045, + 0x2871c7, + 0x2c1108, + 0x29d505, + 0x272b06, + 0x222688, + 0x224f0a, + 0x2e13c8, + 0x28f187, + 0x249d06, + 0x26fcc6, + 0x20df43, + 0x218303, + 0x285849, + 0x377e09, + 0x2b0586, + 0x2de405, + 0x2163c8, + 0x218808, + 0x354dc8, + 0x3ac2cb, + 0x322747, + 0x30b249, + 0x26fb48, + 0x335844, + 0x349588, + 0x291409, + 0x2b2cc5, + 0x303a07, + 0x247b45, + 0x285a88, + 0x293e8b, + 0x29b550, + 0x2ae605, + 0x216a0c, + 0x2d4985, + 0x283383, + 0x29f386, + 0x2c0984, + 0x203cc6, + 0x2a1647, + 0x222704, + 0x24b388, + 0x2cf74d, + 0x35e245, + 0x208d44, + 0x233984, + 0x287bc9, + 0x2990c8, + 0x317647, + 0x22ed08, + 0x2862c8, + 0x27fb85, + 0x20f747, + 0x27fb07, + 0x238287, + 0x270f49, + 0x232e89, + 0x242d86, + 0x2bf606, + 0x26fb06, + 0x289845, + 0x39b744, + 0x3b0e86, + 0x3b5306, + 0x27fbc8, + 0x2d600b, + 0x26de87, + 0x20a684, + 0x364a46, + 0x367a47, + 0x34f0c5, + 0x263645, + 0x212dc4, + 0x232e06, + 0x3b0f08, + 0x28b309, + 0x252f86, + 0x289a48, + 0x2b4606, + 0x342708, + 0x34c34c, + 0x27fa46, + 0x29c64d, + 0x29cacb, + 0x253145, + 0x202c07, + 0x200946, + 0x3343c8, + 0x242e09, + 0x393c88, + 0x200045, + 0x2e2a87, + 0x284b88, + 0x358649, + 0x344106, + 0x252e8a, + 0x334148, + 0x393acb, + 0x3298cc, + 0x247448, + 0x280e46, + 0x303d08, + 0x3a8347, + 0x363489, + 0x29304d, + 0x29f986, + 0x21e608, + 0x3af089, + 0x2bfd08, + 0x2886c8, + 0x2c3a0c, + 0x2c5047, + 0x2c5507, + 0x270d85, + 0x31e5c7, + 0x2c0fc8, + 0x2b1506, + 0x2aaccc, + 0x2f55c8, + 0x2d0d88, + 0x2ba286, + 0x20de87, + 0x242f84, + 0x25b448, + 0x28f50c, + 0x353d0c, + 0x233cc5, + 0x2d2887, + 0x31d086, + 0x20de06, + 0x349ac8, + 0x2027c4, + 0x22d04b, + 0x27e8cb, + 0x249d06, + 0x2cf5c7, + 0x31a2c5, + 0x276545, + 0x22d186, + 0x25eb85, + 0x3512c5, + 0x2cd5c7, + 0x27d1c9, + 0x351904, + 0x34ee05, + 0x2e6fc5, + 0x2dea88, + 0x2287c5, + 0x2bca49, + 0x37aac7, + 0x37aacb, + 0x244806, + 0x2d4409, + 0x349208, + 0x27c385, + 0x238388, + 0x232ec8, + 0x23a6c7, + 0x2e2f87, + 0x2869c9, + 0x235c87, + 0x289149, + 0x2acf8c, + 0x2b0588, + 0x2b6189, + 0x321f87, + 0x286389, + 0x35bf07, + 0x3299c8, + 0x3a8285, + 0x22cac6, + 0x2c4a48, + 0x2f0fc8, + 0x285549, + 0x351307, + 0x276605, + 0x36b6c9, + 0x2b9ec6, + 0x2323c4, + 0x2323c6, + 0x24e8c8, + 0x252847, + 0x2d6208, + 0x2d1f89, + 0x3a1e07, + 0x2a29c6, + 0x202cc4, + 0x203f49, + 0x20f5c8, + 0x2ba147, + 0x343e06, + 0x20e1c6, + 0x3a8484, + 0x247f86, + 0x201b83, + 0x296789, + 0x202346, + 0x2d2205, + 0x2a36c6, + 0x24f305, + 0x285008, + 0x247187, + 0x244b46, + 0x39c6c6, + 0x309148, + 0x2a5447, + 0x29f9c5, + 0x2a09c8, + 0x3ada88, + 0x334148, + 0x2d4845, + 0x22cb46, + 0x24d609, + 0x2ac044, + 0x24f18b, + 0x21f40b, + 0x2463c9, + 0x20ad83, + 0x25bf05, + 0x213a86, + 0x313788, + 0x249844, + 0x351c06, + 0x2d6749, + 0x2bc545, + 0x2cd506, + 0x363206, + 0x2163c4, + 0x2aec0a, + 0x2d2148, + 0x2f0fc6, + 0x2c2585, + 0x3b1987, + 0x231147, + 0x304284, + 0x21f647, + 0x2165c4, + 0x2165c6, + 0x203c83, + 0x270f45, + 0x350e85, + 0x205788, + 0x254ac5, + 0x27f789, + 0x25b287, + 0x25b28b, + 0x2a758c, + 0x2a810a, + 0x3363c7, + 0x204083, + 0x212188, + 0x2d4a05, + 0x29d585, + 0x20ae44, + 0x3298c6, + 0x227b86, + 0x247fc7, + 0x2349cb, + 0x22d9c4, + 0x2e8f04, + 0x219e04, + 0x2cd786, + 0x222704, + 0x22c948, + 0x33c5c5, + 0x244d85, + 0x354d07, + 0x202d09, + 0x347845, + 0x37584a, + 0x277789, + 0x29810a, + 0x3a1249, + 0x335fc4, + 0x2c9605, + 0x2b9b48, + 0x2d18cb, + 0x278285, + 0x2f0086, + 0x2200c4, + 0x27fcc6, + 0x3a1c89, + 0x364b07, + 0x317988, + 0x387e46, + 0x387247, + 0x285b88, + 0x380946, + 0x37f0c4, + 0x363f87, + 0x366085, + 0x377547, + 0x25b4c4, + 0x2008c6, + 0x2f1e08, + 0x29cc88, + 0x2e88c7, + 0x27d548, + 0x29ae05, + 0x20abc4, + 0x361c88, + 0x27d644, + 0x2186c5, + 0x2fac44, + 0x3675c7, + 0x28d207, + 0x2864c8, + 0x2cbfc6, + 0x254a45, + 0x27f588, + 0x2e15c8, + 0x2a4c09, + 0x21f706, + 0x22e708, + 0x39bd0a, + 0x34f148, + 0x2e8605, + 0x2e2206, + 0x277648, + 0x2e2b4a, + 0x20b387, + 0x28a645, + 0x298888, + 0x2b3c44, + 0x272206, + 0x2c5888, + 0x20ac46, + 0x239a88, + 0x29bfc7, + 0x209806, + 0x2ba844, + 0x28ba07, + 0x2b6804, + 0x3a1c47, + 0x23bf0d, + 0x21b585, + 0x2d144b, + 0x2a1d06, + 0x255788, + 0x24b344, + 0x27bc86, + 0x2817c6, + 0x304047, + 0x29c30d, + 0x226dc7, + 0x2b6d48, + 0x271a05, + 0x27f048, + 0x2c7ec6, + 0x29ae88, + 0x223a06, + 0x26a9c7, + 0x336689, + 0x33d2c7, + 0x28c3c8, + 0x279685, + 0x21c848, + 0x20dd45, + 0x396005, + 0x3a14c5, + 0x221443, + 0x235984, + 0x26fd05, + 0x2346c9, + 0x285f86, + 0x2eab08, + 0x2e2d45, + 0x2b8847, + 0x2aee8a, + 0x2cd449, + 0x2c98ca, + 0x2d6ec8, + 0x2272cc, + 0x28724d, + 0x2ff683, + 0x239988, + 0x207a85, + 0x224cc6, + 0x319346, + 0x2e7f05, + 0x3b3a09, + 0x358f45, + 0x27f588, + 0x2841c6, + 0x348806, + 0x2a63c9, + 0x38f247, + 0x294146, + 0x2aee08, + 0x216548, + 0x2e0dc7, + 0x235ece, + 0x2c8105, + 0x358545, + 0x20ab48, + 0x27f3c7, + 0x20e202, + 0x2c3584, + 0x203bca, + 0x2ba208, + 0x367b46, + 0x29e608, + 0x278686, + 0x31a7c8, + 0x2b29c8, + 0x395fc4, + 0x2b8d85, + 0x68a8c4, + 0x68a8c4, + 0x68a8c4, + 0x202403, + 0x20e046, + 0x27fa46, + 0x2a220c, + 0x209843, + 0x285686, + 0x215344, + 0x264b08, + 0x2d6585, + 0x203cc6, + 0x2bedc8, + 0x2d8206, + 0x244ac6, + 0x381148, + 0x2a7907, + 0x235a49, + 0x2d4bca, + 0x208a84, + 0x216605, + 0x2a70c5, + 0x264886, + 0x208d46, + 0x2a2dc6, + 0x2f9ec6, + 0x235b84, + 0x235b8b, + 0x231144, + 0x2a23c5, + 0x2b19c5, + 0x203086, + 0x3b5548, + 0x287107, + 0x317744, + 0x2453c3, + 0x2b3745, + 0x30a847, + 0x28700b, + 0x205687, + 0x2becc8, + 0x2e8b47, + 0x231646, + 0x24d1c8, + 0x2e318b, + 0x2067c6, + 0x213bc9, + 0x2e3305, + 0x30d803, + 0x2cd506, + 0x29bec8, + 0x214cc3, + 0x200a03, + 0x285b86, + 0x278686, + 0x375dca, + 0x280e85, + 0x28160b, + 0x2a360b, + 0x245103, + 0x202043, + 0x2b4f84, + 0x278447, + 0x247444, + 0x202ec4, + 0x2e8c84, + 0x34f448, + 0x2c24c8, + 0x3b2049, + 0x38e748, + 0x200c07, + 0x235ec6, + 0x2ea74f, + 0x2c8246, + 0x2d6504, + 0x2c230a, + 0x30a747, + 0x208386, + 0x292e89, + 0x3b1fc5, + 0x2058c5, + 0x3b2106, + 0x21c983, + 0x2b3c89, + 0x219c86, + 0x212009, + 0x38b106, + 0x270f45, + 0x2340c5, + 0x205543, + 0x278588, + 0x211607, + 0x3028c4, + 0x264988, + 0x2313c4, + 0x338d86, + 0x29f386, + 0x2419c6, + 0x2cb849, + 0x29d505, + 0x38ec86, + 0x2a2fc9, + 0x2c7606, + 0x2ea846, + 0x386e86, + 0x200b45, + 0x2fac46, + 0x26a9c4, + 0x3a8285, + 0x2c4a44, + 0x2b7846, + 0x35aec4, + 0x20f843, + 0x28a145, + 0x232bc8, + 0x2e9687, + 0x2bd949, + 0x28a548, + 0x29dc51, + 0x36328a, + 0x249c47, + 0x2ea1c6, + 0x215344, + 0x2c4b48, + 0x282f48, + 0x29de0a, + 0x2bc80d, + 0x2a4dc6, + 0x381246, + 0x28bac6, + 0x2c3fc7, + 0x2b6e05, + 0x262c07, + 0x264a45, + 0x37ac04, + 0x2ad586, + 0x216287, + 0x2b398d, + 0x277587, + 0x21a0c8, + 0x27f889, + 0x2e2106, + 0x344085, + 0x226704, + 0x24e9c6, + 0x304186, + 0x2ba386, + 0x29ee88, + 0x2179c3, + 0x203043, + 0x3598c5, + 0x2300c6, + 0x2b2985, + 0x388048, + 0x2a180a, + 0x2cee04, + 0x264b08, + 0x29bd48, + 0x202ec7, + 0x2e2e09, + 0x2be9c8, + 0x28b387, + 0x2936c6, + 0x20ac4a, + 0x24ea48, + 0x396449, + 0x299188, + 0x21cec9, + 0x2ea087, + 0x2effc5, + 0x3ac4c6, + 0x2b1388, + 0x285d08, + 0x2a1048, + 0x249e08, + 0x2a23c5, + 0x20f444, + 0x211308, + 0x208484, + 0x3a1044, + 0x270f45, + 0x297a87, + 0x202ac9, + 0x303e47, + 0x215f45, + 0x27cdc6, + 0x34ebc6, + 0x203d44, + 0x2a6706, + 0x254884, + 0x27ef46, + 0x202886, + 0x214b06, + 0x200045, + 0x387f07, + 0x204083, + 0x206b49, + 0x308f48, + 0x264984, + 0x28b20d, + 0x29cd88, + 0x3053c8, + 0x3963c6, + 0x336789, + 0x2cd449, + 0x3a1985, + 0x2a190a, + 0x2adb4a, + 0x2af7cc, + 0x2af946, + 0x27d9c6, + 0x2c83c6, + 0x273209, + 0x224f06, + 0x262c46, + 0x359006, + 0x25b448, + 0x27d546, + 0x2d36cb, + 0x297c05, + 0x244d85, + 0x27dc45, + 0x366f46, + 0x20ac03, + 0x241946, + 0x277507, + 0x2c4a05, + 0x24c705, + 0x3645c5, + 0x327346, + 0x31da84, + 0x31da86, + 0x3add49, + 0x366dcc, + 0x37a948, + 0x33f004, + 0x2fa886, + 0x2a1e06, + 0x29bec8, + 0x218808, + 0x366cc9, + 0x3b1987, + 0x245989, + 0x254106, + 0x22c2c4, + 0x20bf04, + 0x286cc4, + 0x285b88, + 0x20290a, + 0x3477c6, + 0x352107, + 0x36f007, + 0x2d4505, + 0x2a7084, + 0x2913c6, + 0x2b6e46, + 0x202803, + 0x308d87, + 0x368b48, + 0x3a1aca, + 0x2ce348, + 0x2cec88, + 0x35af05, + 0x253245, + 0x26df85, + 0x2d48c6, + 0x33d4c6, + 0x35bd05, + 0x2969c9, + 0x2a6e8c, + 0x26e047, + 0x29de88, + 0x381a45, + 0x68a8c4, + 0x24df84, + 0x25d784, + 0x214486, + 0x2a450e, + 0x205947, + 0x2c41c5, + 0x2abfcc, + 0x231287, + 0x216207, + 0x218089, + 0x218f89, + 0x28a645, + 0x308f48, + 0x24d609, + 0x334005, + 0x2c4948, + 0x322906, + 0x361f06, + 0x2e4444, + 0x2ae848, + 0x251f43, + 0x303084, + 0x2b37c5, + 0x3ac0c7, + 0x210445, + 0x39bbc9, + 0x28aa8d, + 0x299886, + 0x245404, + 0x2937c8, + 0x27d00a, + 0x224107, + 0x23be45, + 0x203143, + 0x2a37ce, + 0x27868c, + 0x2faa87, + 0x2a46c7, + 0x203c03, + 0x224f45, + 0x25d785, + 0x29e9c8, + 0x29bb89, + 0x33ef06, + 0x247444, + 0x249b86, + 0x21e3cb, + 0x2cd1cc, + 0x221507, + 0x2d5c45, + 0x3ad988, + 0x2e0b85, + 0x2c2307, + 0x3630c7, + 0x251f45, + 0x20ac03, + 0x39a644, + 0x212905, + 0x351805, + 0x351806, + 0x34fd08, + 0x216287, + 0x319646, + 0x35c106, + 0x3a1406, + 0x2d5e89, + 0x20f847, + 0x26a5c6, + 0x2cd346, + 0x252006, + 0x2aeb45, + 0x219646, + 0x3768c5, + 0x228848, + 0x2973cb, + 0x291086, + 0x36f044, + 0x2e2909, + 0x25b284, + 0x322888, + 0x2324c7, + 0x2885c4, + 0x2be288, + 0x2c5304, + 0x2aeb84, + 0x28b145, + 0x35e286, + 0x34f387, + 0x239b43, + 0x2a2a85, + 0x322e84, + 0x358586, + 0x3a1a08, + 0x368885, + 0x297089, + 0x3363c5, + 0x2e1e88, + 0x215207, + 0x388dc8, + 0x2bd787, + 0x362709, + 0x255a86, + 0x32b3c6, + 0x359004, + 0x293605, + 0x30150c, + 0x27dc47, + 0x27e207, + 0x36eec8, + 0x299886, + 0x277444, + 0x32e344, + 0x286849, + 0x2c84c6, + 0x240987, + 0x3a8bc4, + 0x286086, + 0x343905, + 0x2cbb07, + 0x2d3646, + 0x252d49, + 0x2aab07, + 0x26f8c7, + 0x2a6246, + 0x3879c5, + 0x283988, + 0x219b08, + 0x2646c6, + 0x3688c5, + 0x261b06, + 0x209983, + 0x29e849, + 0x2a2b4e, + 0x2bd488, + 0x2314c8, + 0x2644cb, + 0x2972c6, + 0x2089c4, + 0x244ac4, + 0x2a2c4a, + 0x216907, + 0x26a685, + 0x213bc9, + 0x2c3285, + 0x3a1087, + 0x2b4c04, + 0x284487, + 0x2e65c8, + 0x2cb206, + 0x21e789, + 0x2beaca, + 0x216886, + 0x29c8c6, + 0x2b1945, + 0x37ccc5, + 0x31a107, + 0x24dd08, + 0x343848, + 0x395fc6, + 0x234145, + 0x208ace, + 0x2b8bc4, + 0x264645, + 0x27c749, + 0x30dfc8, + 0x28f0c6, + 0x2a04cc, + 0x2a1410, + 0x2a414f, + 0x2a51c8, + 0x3363c7, + 0x200045, + 0x26fd05, + 0x34f209, + 0x298a89, + 0x23cbc6, + 0x278307, + 0x2d2805, + 0x21b509, + 0x340146, + 0x224d4d, + 0x286b89, + 0x202ec4, + 0x2bd208, + 0x2113c9, + 0x347986, + 0x27cec5, + 0x32b3c6, + 0x317849, + 0x26ba08, + 0x212485, + 0x2ae844, + 0x2a068b, + 0x347845, + 0x2a07c6, + 0x287586, + 0x26ed86, + 0x287fcb, + 0x297189, + 0x35c045, + 0x388b87, + 0x363206, + 0x220f06, + 0x25d508, + 0x35e389, + 0x219e8c, + 0x30a648, + 0x360406, + 0x340bc3, + 0x303c06, + 0x287e05, + 0x281948, + 0x233b46, + 0x2cbd48, + 0x275845, + 0x29dfc5, + 0x215348, + 0x31a947, + 0x319287, + 0x247fc7, + 0x220d88, + 0x336508, + 0x31e4c6, + 0x2b7687, + 0x247987, + 0x287cca, + 0x254003, + 0x366f46, + 0x202a45, + 0x203bc4, + 0x27f889, + 0x362684, + 0x2a7e44, + 0x2a1c84, + 0x2a46cb, + 0x211547, + 0x208d05, + 0x29ab08, + 0x27cdc6, + 0x27cdc8, + 0x280dc6, + 0x2900c5, + 0x290385, + 0x291f46, + 0x292b08, + 0x292dc8, + 0x27fa46, + 0x29a94f, + 0x29e310, + 0x3b1785, + 0x204083, + 0x22c385, + 0x30b188, + 0x298989, + 0x334148, + 0x2d5d08, + 0x224788, + 0x211607, + 0x27ca89, + 0x2cbf48, + 0x25bd44, + 0x2a1b08, + 0x2deb49, + 0x2b81c7, + 0x29f904, + 0x303f08, + 0x387cca, + 0x2ebe06, + 0x2a4dc6, + 0x21f5c9, + 0x2a1647, + 0x2ce1c8, + 0x30cc88, + 0x3a8a48, + 0x356245, + 0x37dc45, + 0x244d85, + 0x25d745, + 0x37e287, + 0x20ac05, + 0x2c4a05, + 0x2b5546, + 0x334087, + 0x2d1807, + 0x387fc6, + 0x2d7405, + 0x2a07c6, + 0x212245, + 0x2b84c8, + 0x2f1d84, + 0x2c7686, + 0x343744, + 0x2b69c8, + 0x2c778a, + 0x28004c, + 0x234bc5, + 0x2c4086, + 0x21a046, + 0x368706, + 0x30b384, + 0x343bc5, + 0x280c07, + 0x2a16c9, + 0x2cdc87, + 0x68a8c4, + 0x68a8c4, + 0x3175c5, + 0x32dd04, + 0x29fe8a, + 0x27cc46, + 0x24d404, + 0x208305, + 0x37a545, + 0x2b6d44, + 0x2871c7, + 0x36b847, + 0x2cd788, + 0x368ec8, + 0x212489, + 0x340248, + 0x2a004b, + 0x250b44, + 0x221005, + 0x2840c5, + 0x247f49, + 0x35e389, + 0x2e2808, + 0x232248, + 0x203084, + 0x2a1e45, + 0x202943, + 0x264845, + 0x38ed06, + 0x29b9cc, + 0x20f4c6, + 0x247246, + 0x28f345, + 0x3273c8, + 0x2bd606, + 0x2ea346, + 0x2a4dc6, + 0x2297cc, + 0x2ba544, + 0x3a154a, + 0x28f288, + 0x29b807, + 0x322d86, + 0x33efc7, + 0x2f2185, + 0x343e06, + 0x34af86, + 0x356707, + 0x2be7c4, + 0x3676c5, + 0x27c744, + 0x37ac87, + 0x27c988, + 0x27d84a, + 0x284a07, + 0x2d22c7, + 0x336347, + 0x2e0cc9, + 0x29b9ca, + 0x219e43, + 0x2e9645, + 0x200c83, + 0x2e8cc9, + 0x26ac48, + 0x38eb47, + 0x334249, + 0x219c06, + 0x2d4108, + 0x337f85, + 0x2e16ca, + 0x2d8c49, + 0x2abc49, + 0x3aea07, + 0x283049, + 0x214a08, + 0x3568c6, + 0x2c4248, + 0x217b07, + 0x235c87, + 0x277787, + 0x2d2688, + 0x2fa706, + 0x387a85, + 0x280c07, + 0x29c3c8, + 0x3436c4, + 0x30e3c4, + 0x294047, + 0x2b2d47, + 0x24d48a, + 0x356846, + 0x330f0a, + 0x2c34c7, + 0x2b8987, + 0x257e44, + 0x289204, + 0x2d3546, + 0x3b3d44, + 0x3b3d4c, + 0x203505, + 0x218649, + 0x2dfc44, + 0x2b6e05, + 0x27cf88, + 0x292e85, + 0x375846, + 0x217f84, + 0x3ae3ca, + 0x32b7c6, + 0x2a68ca, + 0x237f07, + 0x2d3385, + 0x21c985, + 0x2d454a, + 0x2a6805, + 0x2a4cc6, + 0x208484, + 0x2b5106, + 0x31a1c5, + 0x233c06, + 0x2e88cc, + 0x2cd90a, + 0x2936c4, + 0x235ec6, + 0x2a1647, + 0x2d5204, + 0x25b448, + 0x38e5c6, + 0x208949, + 0x2bb109, + 0x2b0689, + 0x24f346, + 0x217c06, + 0x2c4387, + 0x296908, + 0x217a09, + 0x211547, + 0x29ac86, + 0x3872c7, + 0x28b985, + 0x2b8bc4, + 0x2c3f47, + 0x247b45, + 0x28b085, + 0x235247, + 0x251e08, + 0x3ad906, + 0x29d24d, + 0x29ebcf, + 0x2a360d, + 0x215f84, + 0x232cc6, + 0x2d91c8, + 0x358fc5, + 0x287e88, + 0x23a58a, + 0x202ec4, + 0x21e946, + 0x239607, + 0x22d9c7, + 0x2a79c9, + 0x2c4205, + 0x2b6d44, + 0x2b8cca, + 0x2be589, + 0x283147, + 0x272086, + 0x347986, + 0x2a1d86, + 0x364046, + 0x2d890f, + 0x2d9089, + 0x27d546, + 0x282e46, + 0x32fd89, + 0x2b7787, + 0x226743, + 0x229946, + 0x218303, + 0x2e7dc8, + 0x387107, + 0x2a53c9, + 0x29f208, + 0x3193c8, + 0x351446, + 0x20f409, + 0x23c1c5, + 0x2b7844, + 0x2a73c7, + 0x273285, + 0x215f84, + 0x208dc8, + 0x216bc4, + 0x2b74c7, + 0x34bc06, + 0x2b3045, + 0x299188, + 0x34784b, + 0x319c07, + 0x2d47c6, + 0x2c82c4, + 0x32d146, + 0x270f45, + 0x247b45, + 0x283709, + 0x286dc9, + 0x235cc4, + 0x235d05, + 0x235f05, + 0x2e1546, + 0x309048, + 0x2c2c46, + 0x36898b, + 0x2b4c8a, + 0x2b6905, + 0x290406, + 0x3025c5, + 0x2e0a45, + 0x2ab6c7, + 0x3ac808, + 0x245984, + 0x26c586, + 0x292e46, + 0x214bc7, + 0x30d7c4, + 0x2817c6, + 0x2b9f85, + 0x2b9f89, + 0x2135c4, + 0x2a7209, + 0x27fa46, + 0x2c5108, + 0x235f05, + 0x36f105, + 0x233c06, + 0x219d89, + 0x218f89, + 0x2472c6, + 0x30e0c8, + 0x28abc8, + 0x302584, + 0x2b9004, + 0x2b9008, + 0x3269c8, + 0x245a89, + 0x38ec86, + 0x2a4dc6, + 0x320c0d, + 0x351c06, + 0x34c209, + 0x23d1c5, + 0x3b2106, + 0x262d48, + 0x31d9c5, + 0x2479c4, + 0x270f45, + 0x2866c8, + 0x29fc49, + 0x27c804, + 0x2008c6, + 0x39660a, + 0x2fa988, + 0x24d609, + 0x244c4a, + 0x3341c6, + 0x29ed88, + 0x2c20c5, + 0x2c0e48, + 0x2bd885, + 0x219ac9, + 0x36bd09, + 0x203602, + 0x2e3305, + 0x276286, + 0x27f987, + 0x295705, + 0x2f0ec6, + 0x306288, + 0x299886, + 0x2b9a09, + 0x27e306, + 0x25d388, + 0x2afb85, + 0x25c586, + 0x26aac8, + 0x285b88, + 0x2e9f88, + 0x347b08, + 0x219644, + 0x209fc3, + 0x2b9c44, + 0x249b06, + 0x28b9c4, + 0x231407, + 0x2ea249, + 0x2c7a05, + 0x30cc86, + 0x229946, + 0x34fb4b, + 0x2b6846, + 0x20edc6, + 0x2cb6c8, + 0x24c646, + 0x2bcb03, + 0x2080c3, + 0x2b8bc4, + 0x22e605, + 0x2b4447, + 0x27c988, + 0x27c98f, + 0x280b0b, + 0x308e48, + 0x200946, + 0x30914e, + 0x233c03, + 0x2b43c4, + 0x2b67c5, + 0x2b6bc6, + 0x2914cb, + 0x297b46, + 0x222709, + 0x2b3045, + 0x38a208, + 0x211d88, + 0x218e4c, + 0x2a4706, + 0x264886, + 0x2de405, + 0x28c188, + 0x26aac5, + 0x335848, + 0x2a084a, + 0x2a3a49, + 0x68a8c4, + 0x3760d1c2, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x368883, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x2964c4, + 0x204ac3, + 0x200383, + 0x210e03, + 0x24ae04, + 0x2d0783, + 0x23a184, + 0x231b83, + 0x2da904, + 0x332ec3, + 0x2959c7, + 0x20fbc3, + 0x20abc3, + 0x2842c8, + 0x200383, + 0x2b400b, + 0x2f2a03, + 0x2716c6, + 0x205bc2, + 0x26b44b, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x200383, + 0x200e03, + 0x203383, + 0x204cc2, + 0x15f048, + 0x325b45, + 0x247bc8, + 0x2ec408, + 0x20d1c2, + 0x329dc5, + 0x39c307, + 0x2001c2, + 0x24b587, + 0x208a42, + 0x246f87, + 0x239ec9, + 0x2c1c88, + 0x3a88c9, + 0x338b02, + 0x270647, + 0x2abac4, + 0x39c3c7, + 0x2b4b87, + 0x24ca02, + 0x20fbc3, + 0x20b602, + 0x202082, + 0x200382, + 0x217902, + 0x200e02, + 0x20c4c2, + 0x2af685, + 0x24dec5, + 0xd1c2, + 0x31b83, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x117c3, + 0x701, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x2964c4, + 0x204303, + 0x204ac3, + 0x200383, + 0x21bd03, + 0x3a40d686, + 0x5e303, + 0x854c5, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x8082, + 0x15f048, + 0x4dcc4, + 0xe0f85, + 0x204cc2, + 0x2cfa44, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x236d03, + 0x2b0405, + 0x204303, + 0x205d83, + 0x204ac3, + 0x2104c3, + 0x200383, + 0x213e83, + 0x24ae83, + 0x24abc3, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x20d1c2, + 0x200383, + 0x15f048, + 0x332ec3, + 0x15f048, + 0x26ae03, + 0x2d0783, + 0x22ef04, + 0x231b83, + 0x332ec3, + 0x20a3c2, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20a3c2, + 0x22d603, + 0x204ac3, + 0x200383, + 0x2ec383, + 0x213e83, + 0x204cc2, + 0x20d1c2, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x2716c5, + 0x1540c6, + 0x24ae04, + 0x205bc2, + 0x15f048, + 0x204cc2, + 0x1d508, + 0x20d1c2, + 0x97606, + 0x1681c4, + 0x16e1cb, + 0x3dc06, + 0xfcc7, + 0x231b83, + 0x332ec3, + 0x15ae05, + 0x19c804, + 0x221543, + 0x53fc7, + 0xdc304, + 0x204ac3, + 0x94fc4, + 0x200383, + 0x2f39c4, + 0xfe588, + 0x125886, + 0x114f85, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x20abc3, + 0x200383, + 0x2f2a03, + 0x205bc2, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204143, + 0x213184, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x2da904, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x2716c6, + 0x231b83, + 0x332ec3, + 0x178ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0xfcc7, + 0x15f048, + 0x332ec3, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x40ed0783, + 0x231b83, + 0x204ac3, + 0x200383, + 0x15f048, + 0x204cc2, + 0x20d1c2, + 0x2d0783, + 0x332ec3, + 0x204ac3, + 0x200382, + 0x200383, + 0x316e47, + 0x23860b, + 0x2396c3, + 0x24be08, + 0x296687, + 0x225246, + 0x2c6145, + 0x373549, + 0x20f948, + 0x260d09, + 0x260d10, + 0x35d28b, + 0x385989, + 0x209303, + 0x2b5649, + 0x230806, + 0x23080c, + 0x260f08, + 0x3ae848, + 0x35d7c9, + 0x2a5d0e, + 0x20780b, + 0x2eb20c, + 0x205283, + 0x26cc4c, + 0x205289, + 0x257a87, + 0x231acc, + 0x36aa8a, + 0x24fe44, + 0x393f4d, + 0x26cb08, + 0x210e0d, + 0x272746, + 0x29258b, + 0x31a3c9, + 0x23d087, + 0x339606, + 0x349d89, + 0x38ce8a, + 0x37a0c8, + 0x2f24c4, + 0x34ecc7, + 0x3ac5c7, + 0x3a8dc4, + 0x32d984, + 0x237209, + 0x2ceac9, + 0x237908, + 0x210b85, + 0x392545, + 0x20aa06, + 0x393e09, + 0x23a80d, + 0x2eac88, + 0x20a907, + 0x2c61c8, + 0x382986, + 0x37ed04, + 0x359b85, + 0x202246, + 0x203204, + 0x205187, + 0x206d8a, + 0x211cc4, + 0x2167c6, + 0x2182c9, + 0x2182cf, + 0x2197cd, + 0x21a486, + 0x21d110, + 0x21d506, + 0x21dc47, + 0x21ebc7, + 0x21ebcf, + 0x21f889, + 0x2242c6, + 0x226487, + 0x226488, + 0x227649, + 0x2b3108, + 0x2e7907, + 0x20a203, + 0x378c86, + 0x3abf08, + 0x2a5fca, + 0x21fe49, + 0x20fa83, + 0x39c206, + 0x26c3ca, + 0x2fca47, + 0x2578ca, + 0x26a24e, + 0x21f9c6, + 0x2e3507, + 0x227086, + 0x201806, + 0x37da4b, + 0x30c58a, + 0x317ecd, + 0x217cc7, + 0x359188, + 0x359189, + 0x35918f, + 0x20e28c, + 0x281bc9, + 0x2e928e, + 0x295aca, + 0x3035c6, + 0x2fbbc6, + 0x3b06cc, + 0x3106cc, + 0x311448, + 0x33d1c7, + 0x25b7c5, + 0x2251c4, + 0x2438ce, + 0x38d104, + 0x257bc7, + 0x26d08a, + 0x36e914, + 0x373a4f, + 0x21ed88, + 0x378b48, + 0x357e8d, + 0x357e8e, + 0x3823c9, + 0x3a5b08, + 0x3a5b0f, + 0x2317cc, + 0x2317cf, + 0x232a07, + 0x23acca, + 0x21cc4b, + 0x23bcc8, + 0x23e5c7, + 0x264f4d, + 0x3151c6, + 0x394106, + 0x2417c9, + 0x259888, + 0x24c108, + 0x24c10e, + 0x238707, + 0x226985, + 0x24da85, + 0x205e04, + 0x225506, + 0x237808, + 0x260183, + 0x2efb8e, + 0x265308, + 0x2f198b, + 0x26afc7, + 0x395e05, + 0x26cdc6, + 0x2b0e07, + 0x307048, + 0x319f09, + 0x298fc5, + 0x28a188, + 0x217306, + 0x3a02ca, + 0x2437c9, + 0x231b89, + 0x231b8b, + 0x201148, + 0x3a8c89, + 0x210c46, + 0x22c54a, + 0x2b7f4a, + 0x23aecc, + 0x3acb87, + 0x2c1a8a, + 0x328ecb, + 0x328ed9, + 0x30fa48, + 0x271745, + 0x265106, + 0x258fc9, + 0x261cc6, + 0x21324a, + 0x20fb46, + 0x201e44, + 0x2c9ecd, + 0x201e47, + 0x20b549, + 0x383305, + 0x24e548, + 0x24ee89, + 0x24f0c4, + 0x24fd47, + 0x24fd48, + 0x250287, + 0x26ea08, + 0x2545c7, + 0x35c2c5, + 0x25c70c, + 0x25cf49, + 0x2c4dca, + 0x38f0c9, + 0x2b5749, + 0x2739cc, + 0x263e0b, + 0x2640c8, + 0x265688, + 0x268a44, + 0x288288, + 0x289389, + 0x36ab47, + 0x218506, + 0x317287, + 0x21e1c9, + 0x328b0b, + 0x32cfc7, + 0x200407, + 0x238047, + 0x210d84, + 0x210d85, + 0x2ac905, + 0x33c00b, + 0x399404, + 0x369d08, + 0x26f08a, + 0x2173c7, + 0x341dc7, + 0x290c12, + 0x27ee46, + 0x22e886, + 0x35898e, + 0x281346, + 0x298708, + 0x29938f, + 0x2111c8, + 0x38bb08, + 0x3af64a, + 0x3af651, + 0x2a6b4e, + 0x254e4a, + 0x254e4c, + 0x2014c7, + 0x3a5d10, + 0x3b5388, + 0x2a6d45, + 0x2b114a, + 0x20324c, + 0x29afcd, + 0x2fce06, + 0x2fce07, + 0x2fce0c, + 0x305c8c, + 0x32814c, + 0x28f98b, + 0x289b84, + 0x21f744, + 0x374149, + 0x2fe3c7, + 0x23e389, + 0x2b7d89, + 0x35a587, + 0x36a906, + 0x36a909, + 0x39d403, + 0x2129ca, + 0x32f807, + 0x238acb, + 0x317d4a, + 0x2abb44, + 0x39c546, + 0x284c89, + 0x3b3bc4, + 0x2035ca, + 0x2d4ac5, + 0x2c0005, + 0x2c000d, + 0x2c034e, + 0x378205, + 0x323506, + 0x2712c7, + 0x38684a, + 0x38d406, + 0x35ecc4, + 0x2f8987, + 0x2da18b, + 0x382a47, + 0x282ac4, + 0x24f706, + 0x24f70d, + 0x21de8c, + 0x204986, + 0x2eae8a, + 0x235806, + 0x2f3248, + 0x28bf47, + 0x33f88a, + 0x23d986, + 0x217bc3, + 0x262ec6, + 0x3abd88, + 0x2a024a, + 0x2766c7, + 0x2766c8, + 0x27dd84, + 0x2cc0c7, + 0x23ccc8, + 0x29e008, + 0x288b48, + 0x33110a, + 0x2e0405, + 0x2e0687, + 0x254c93, + 0x2d0806, + 0x26f288, + 0x222c09, + 0x24b448, + 0x3514cb, + 0x2cddc8, + 0x273704, + 0x215446, + 0x3b4f06, + 0x35e0c9, + 0x2c72c7, + 0x25c808, + 0x29e186, + 0x235144, + 0x2ce085, + 0x2c8a08, + 0x2c900a, + 0x2c9b48, + 0x2ce746, + 0x29ef8a, + 0x351988, + 0x2d5008, + 0x2d6a88, + 0x2d70c6, + 0x2d93c6, + 0x20168c, + 0x2d99d0, + 0x28de45, + 0x210fc8, + 0x306790, + 0x210fd0, + 0x260b8e, + 0x20130e, + 0x201314, + 0x31abcf, + 0x31af86, + 0x3319d1, + 0x339793, + 0x339c08, + 0x3aafc5, + 0x35b6c8, + 0x385785, + 0x22854c, + 0x229489, + 0x282449, + 0x245d47, + 0x377009, + 0x243d87, + 0x2fadc6, + 0x359987, + 0x261245, + 0x211803, + 0x260349, + 0x222ec9, + 0x378ac3, + 0x39a544, + 0x35c40d, + 0x3b1b0f, + 0x235185, + 0x35b5c6, + 0x211b07, + 0x325987, + 0x28cd86, + 0x28cd8b, + 0x2a82c5, + 0x25f106, + 0x2fba47, + 0x276ec9, + 0x2290c6, + 0x22e405, + 0x31190b, + 0x23bb46, + 0x3724c5, + 0x28b548, + 0x321d88, + 0x2d75cc, + 0x2d75d0, + 0x2e0149, + 0x2e7107, + 0x30860b, + 0x2e6186, + 0x2e77ca, + 0x2ea4cb, + 0x2eb74a, + 0x2eb9c6, + 0x2ec245, + 0x32f546, + 0x27e4c8, + 0x245e0a, + 0x357b1c, + 0x2f2acc, + 0x2f2dc8, + 0x2716c5, + 0x2f4f07, + 0x26a106, + 0x27d385, + 0x21c2c6, + 0x28cf48, + 0x2be807, + 0x2a5c08, + 0x2e360a, + 0x34a10c, + 0x34a389, + 0x37ee87, + 0x20d244, + 0x24db46, + 0x38b68a, + 0x2b7e85, + 0x20734c, + 0x20b088, + 0x377648, + 0x20d98c, + 0x21be8c, + 0x2206c9, + 0x220907, + 0x342c0c, + 0x3aa644, + 0x23c54a, + 0x2580cc, + 0x278acb, + 0x24140b, + 0x241f46, + 0x383847, + 0x2ddb07, + 0x3a5f4f, + 0x2fda11, + 0x2ddb12, + 0x30d0cd, + 0x30d0ce, + 0x30d40e, + 0x31ad88, + 0x31ad92, + 0x252288, + 0x2962c7, + 0x25260a, + 0x204748, + 0x281305, + 0x37e0ca, + 0x21da47, + 0x305304, + 0x21b083, + 0x2b0fc5, + 0x3af8c7, + 0x2fea07, + 0x29b1ce, + 0x30ff4d, + 0x313c49, + 0x220c45, + 0x33aa03, + 0x25fac6, + 0x36ffc5, + 0x2f1bc8, + 0x30c009, + 0x265145, + 0x26514f, + 0x2ec087, + 0x373485, + 0x21b2ca, + 0x299b86, + 0x2f33c9, + 0x384d0c, + 0x2f99c9, + 0x207b06, + 0x26ee8c, + 0x340cc6, + 0x2fc548, + 0x2fc746, + 0x30fbc6, + 0x349344, + 0x264443, + 0x2b270a, + 0x35b211, + 0x281d8a, + 0x255d05, + 0x277947, + 0x259307, + 0x23cdc4, + 0x23cdcb, + 0x3a8748, + 0x2bd306, + 0x36ef45, + 0x3a05c4, + 0x291949, + 0x330304, + 0x25cd87, + 0x332705, + 0x332707, + 0x358bc5, + 0x2af743, + 0x296188, + 0x34398a, + 0x239b43, + 0x325b8a, + 0x3b4086, + 0x264ecf, + 0x353689, + 0x2efb10, + 0x2dee88, + 0x2d0e89, + 0x29d087, + 0x24f68f, + 0x334604, + 0x2da984, + 0x21d386, + 0x2b3546, + 0x256dca, + 0x383586, + 0x32a787, + 0x3055c8, + 0x3057c7, + 0x306047, + 0x307a4a, + 0x309b4b, + 0x3a2445, + 0x2dd748, + 0x2166c3, + 0x3b120c, + 0x37140f, + 0x25b5cd, + 0x2c4607, + 0x313d89, + 0x217687, + 0x23e148, + 0x36eb0c, + 0x273608, + 0x258908, + 0x3188ce, + 0x32bad4, + 0x32bfe4, + 0x3424ca, + 0x35ea8b, + 0x243e44, + 0x243e49, + 0x21e9c8, + 0x24e105, + 0x25fc8a, + 0x239d87, + 0x2957c4, + 0x368883, + 0x2d0783, + 0x23a184, + 0x231b83, + 0x332ec3, + 0x2964c4, + 0x204303, + 0x20fbc3, + 0x201686, + 0x213184, + 0x204ac3, + 0x200383, + 0x21aa03, + 0x204cc2, + 0x368883, + 0x20d1c2, + 0x2d0783, + 0x23a184, + 0x231b83, + 0x332ec3, + 0x204303, + 0x201686, + 0x204ac3, + 0x200383, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x2135c3, + 0x204ac3, + 0x200383, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x213184, + 0x204ac3, + 0x200383, + 0x204cc2, + 0x21fd43, + 0x20d1c2, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x20e542, + 0x20d882, + 0x20d1c2, + 0x2d0783, + 0x209c02, + 0x201d42, + 0x2964c4, + 0x222044, + 0x223342, + 0x213184, + 0x200382, + 0x200383, + 0x21aa03, + 0x241f46, + 0x217082, + 0x2016c2, + 0x201a82, + 0x436111c3, + 0x43a014c3, + 0x59a86, + 0x59a86, + 0x24ae04, + 0x143768a, + 0x2608c, + 0x21ecc, + 0x852cd, + 0x2ac47, + 0x1a608, + 0x218c8, + 0x19834a, + 0x446db445, + 0x12b089, + 0x103008, + 0x8ed4a, + 0x14a60e, + 0x144b24b, + 0x1681c4, + 0x1672c8, + 0x13edc7, + 0x16f07, + 0x11dd09, + 0x1b3c47, + 0x94b88, + 0x61f49, + 0x4bfc5, + 0x12494e, + 0xafbcd, + 0xfb48, + 0x44a37046, + 0x45437048, + 0x79c88, + 0x117050, + 0x69c87, + 0x6cf47, + 0x71187, + 0x75f87, + 0xa9c2, + 0x62507, + 0x10c74c, + 0x3b9c7, + 0xa9f46, + 0xaa689, + 0xad708, + 0x18d82, + 0x1d42, + 0x24a0b, + 0x2ccc9, + 0x4c809, + 0x17de88, + 0xb5e02, + 0x104389, + 0xd2fca, + 0xdb9c9, + 0xdd048, + 0xddfc7, + 0xe0389, + 0xe4685, + 0xe4a90, + 0x1a8e86, + 0x63c85, + 0x4a84d, + 0x1b3806, + 0xee547, + 0xf39d8, + 0x96b88, + 0xba9ca, + 0x53b4d, + 0x1702, + 0x177ac6, + 0x91788, + 0x1ae208, + 0x15ef09, + 0x56608, + 0x5dece, + 0xd68d, + 0xf8805, + 0x62288, + 0x59688, + 0x6902, + 0x125886, + 0x6c82, + 0x3c1, + 0x8b4c3, + 0x44ef4244, + 0x4529a283, 0x141, - 0x1650c6, + 0x15c06, 0x141, 0x1, - 0x1650c6, - 0x14f60c5, - 0x245dc4, - 0x22d183, - 0x247344, - 0x201604, - 0x238483, - 0x2245c5, - 0x21ca03, - 0x215cc3, - 0x2e9cc5, - 0x223ec3, - 0x3fe2d183, - 0x2343c3, - 0x21eb03, + 0x15c06, + 0x8b4c3, + 0x14e4285, + 0x24fe44, + 0x2d0783, + 0x251304, + 0x2964c4, + 0x204ac3, + 0x222ac5, + 0x21bd03, + 0x2202c3, + 0x370145, + 0x24abc3, + 0x466d0783, + 0x231b83, + 0x332ec3, 0x200041, - 0x211003, - 0x307b04, - 0x212444, - 0x238483, - 0x2264c3, - 0x217643, - 0x880c8, - 0x200882, - 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, + 0x20fbc3, + 0x222044, + 0x213184, + 0x204ac3, + 0x200383, + 0x213e83, + 0x15f048, + 0x204cc2, + 0x368883, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x2135c3, + 0x201d42, + 0x2964c4, + 0x204303, + 0x20fbc3, + 0x204ac3, + 0x20abc3, + 0x200383, + 0x24abc3, + 0x15f048, + 0x371182, + 0xd1c2, + 0x1491b48, + 0x10598e, + 0x47608c42, + 0x32f9c8, + 0x233d86, + 0x210186, + 0x233707, + 0x47a00902, + 0x47f53508, + 0x20ebca, + 0x269708, + 0x201442, + 0x32f649, + 0x3a2487, + 0x218486, + 0x295ec9, + 0x247ec4, + 0x2e4186, + 0x2e1bc4, + 0x26bdc4, + 0x25bf49, + 0x326286, + 0x24df85, + 0x291285, + 0x390387, + 0x2c3747, + 0x2911c4, + 0x233946, + 0x2ffb45, + 0x367445, + 0x302505, + 0x392307, + 0x26ae05, + 0x315e49, + 0x32d305, + 0x307184, + 0x38d347, + 0x32ecce, + 0x330a09, + 0x358849, + 0x3ac9c6, + 0x2fe248, + 0x2b520b, + 0x2e3b0c, + 0x2898c6, + 0x2076c7, + 0x37b305, + 0x32d98a, + 0x237a09, + 0x3aa989, + 0x257646, + 0x2fb805, + 0x2aabc5, + 0x348f89, + 0x30268b, + 0x280f46, + 0x338346, + 0x20a904, + 0x2908c6, + 0x226a08, + 0x3abc06, + 0x20c5c6, + 0x206188, + 0x207f47, + 0x208649, + 0x209705, + 0x15f048, + 0x216e84, + 0x33d5c4, + 0x369f05, + 0x204f49, + 0x222347, + 0x22234b, + 0x223e4a, + 0x228485, + 0x4820a002, + 0x238987, + 0x48629248, + 0x27be07, + 0x2bf945, + 0x3aac0a, + 0xd1c2, + 0x38740b, + 0x25470a, + 0x222dc6, + 0x395e03, + 0x29538d, + 0x3582cc, + 0x37f24d, + 0x381085, + 0x227dc5, + 0x2601c7, + 0x209c09, + 0x20eac6, + 0x383405, + 0x2d8008, + 0x2907c3, + 0x2ec708, + 0x2907c8, + 0x2c6c47, + 0x3b2448, + 0x39b7c9, + 0x2c9747, + 0x238187, + 0x302b88, + 0x38ca44, + 0x38ca47, + 0x272648, + 0x2024c6, + 0x206fcf, + 0x2118c7, + 0x2e7a86, + 0x23e2c5, + 0x223783, + 0x365a47, + 0x36da03, + 0x250446, + 0x251c46, + 0x252a06, + 0x296e85, + 0x26ea03, + 0x388a48, + 0x370c89, + 0x37ffcb, + 0x252b88, + 0x254285, + 0x256405, + 0x48aabc02, + 0x359a49, + 0x296547, + 0x25f185, + 0x25be47, + 0x25dd86, + 0x363f05, + 0x36fe0b, + 0x2640c4, + 0x2692c5, + 0x269407, + 0x27b786, + 0x27bbc5, + 0x288487, 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, - 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, - 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, - 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, + 0x2d1784, + 0x28e04a, + 0x28e508, + 0x2c2149, + 0x3648c5, + 0x2951c6, + 0x226bca, + 0x387646, + 0x26f5c7, + 0x2c1e0d, + 0x2a1f09, + 0x3597c5, + 0x339dc7, + 0x368388, + 0x26a888, + 0x314d07, + 0x20b246, + 0x217807, + 0x221143, + 0x33c004, + 0x3607c5, + 0x38dcc7, + 0x391d09, + 0x22a8c8, + 0x33fac5, + 0x242844, + 0x2f5bc5, + 0x38174d, + 0x203742, + 0x386ac6, + 0x377a06, + 0x2c8bca, + 0x37e686, + 0x38b5c5, + 0x368fc5, + 0x368fc7, + 0x3a010c, + 0x279b0a, + 0x290586, + 0x225085, + 0x290706, + 0x290a47, + 0x292846, + 0x296d8c, + 0x296009, + 0x48e16087, + 0x299745, + 0x299746, + 0x299d08, + 0x236785, + 0x2a8b45, + 0x2a9548, + 0x2a974a, + 0x49258142, + 0x4960c2c2, + 0x2e8f85, + 0x28b9c3, + 0x22b108, + 0x241d03, + 0x2a99c4, + 0x2f350b, + 0x34ef48, + 0x305148, + 0x49b67ec9, + 0x2af389, + 0x2afac6, + 0x2b0a88, + 0x2b0c89, + 0x2b1786, + 0x2b1905, + 0x372a86, + 0x2b1e49, + 0x319d87, + 0x25c446, + 0x233147, + 0x20e947, + 0x362e04, + 0x49f453c9, + 0x2cd008, + 0x353408, + 0x383d07, + 0x2c8686, + 0x235389, + 0x210147, + 0x34970a, + 0x330d48, + 0x349407, + 0x3b1546, + 0x2e834a, + 0x2733c8, + 0x30de45, + 0x36dac5, + 0x2f9807, + 0x371d49, + 0x3097cb, + 0x31e0c8, + 0x32d389, + 0x253487, + 0x2bad4c, + 0x2bb74c, + 0x2bba4a, + 0x2bbccc, + 0x2c5c08, + 0x2c5e08, + 0x2c6004, + 0x2c63c9, + 0x2c6609, + 0x2c684a, + 0x2c6ac9, + 0x2c6e07, + 0x3a448c, + 0x24b946, + 0x35d588, + 0x387706, + 0x330c06, + 0x3596c7, + 0x238ec8, + 0x2618cb, + 0x303207, + 0x359c49, + 0x251489, + 0x25bbc7, + 0x2e1e04, + 0x3643c7, + 0x2e1246, + 0x214046, + 0x2eb045, + 0x2c7408, + 0x2976c4, + 0x2976c6, + 0x2799cb, + 0x212cc9, + 0x209e06, + 0x20c709, + 0x392486, + 0x3aae08, + 0x214183, + 0x2fb985, + 0x215a09, + 0x224085, + 0x2f9644, + 0x27acc6, + 0x2ed005, + 0x2f7346, + 0x309ec7, + 0x328dc6, + 0x3a174b, + 0x22c447, + 0x234886, + 0x3742c6, + 0x390446, + 0x291189, + 0x240aca, + 0x2b8ec5, + 0x21898d, + 0x2a9846, + 0x2babc6, + 0x2ded86, + 0x2f31c5, + 0x2e4d87, + 0x29fa87, + 0x22bd4e, + 0x20fbc3, + 0x2c8649, + 0x263709, + 0x32dd87, + 0x2804c7, + 0x2a2ec5, + 0x343f05, + 0x4a23734f, + 0x2d10c7, + 0x2d1288, + 0x2d25c4, + 0x2d2e86, + 0x4a64db02, + 0x2d7346, + 0x201686, + 0x2638ce, + 0x2ec54a, + 0x28b6c6, + 0x22d88a, + 0x209a09, + 0x323d05, + 0x393948, + 0x3aef46, + 0x359508, + 0x2392c8, + 0x34434b, + 0x233805, + 0x26ae88, + 0x2062cc, + 0x2bf807, + 0x252546, + 0x281fc8, + 0x2253c8, + 0x4aa09282, + 0x25604b, + 0x37b489, + 0x2cf2c9, + 0x2f02c7, + 0x3b3648, + 0x4ae289c8, + 0x20e64b, + 0x37dd09, + 0x33f58d, + 0x27d648, + 0x290188, + 0x4b201882, + 0x3b2f44, + 0x4b60dc42, + 0x2f9486, + 0x4ba038c2, + 0x2448ca, + 0x210546, + 0x22d208, + 0x289e88, + 0x2e4086, + 0x2eb5c6, + 0x2f7106, + 0x2f1b45, + 0x23c804, + 0x4be1de04, + 0x20ae86, + 0x29a787, + 0x4c2f7d07, + 0x2dc60b, + 0x32f089, + 0x227e0a, + 0x263144, + 0x369108, + 0x25c20d, + 0x2f1509, + 0x2f1748, + 0x2f2009, + 0x2f39c4, + 0x20ce44, + 0x283cc5, + 0x317b0b, + 0x34eec6, + 0x33c645, + 0x21fb89, + 0x233a08, + 0x263844, + 0x32db09, + 0x208f45, + 0x2c3788, + 0x238847, + 0x358c48, + 0x284e86, + 0x22b987, + 0x2984c9, + 0x311a89, + 0x372545, + 0x295645, + 0x4c626a82, + 0x306f44, + 0x30ce05, + 0x2c1846, + 0x327285, + 0x2b4707, + 0x20af85, + 0x27b7c4, + 0x3aca86, + 0x383487, + 0x232106, + 0x21e105, + 0x202608, + 0x233f85, + 0x205d07, + 0x20bc49, + 0x212e0a, + 0x2494c7, + 0x2494cc, + 0x24df46, + 0x2e9ac9, + 0x230505, + 0x2366c8, + 0x210c03, + 0x210c05, + 0x2f7b45, + 0x26e707, + 0x4ca27202, + 0x227a07, + 0x2e5206, + 0x345306, + 0x2e62c6, + 0x225306, + 0x2091c8, + 0x35b805, + 0x2e7b47, + 0x2e7b4d, + 0x21b083, + 0x21f305, + 0x21b087, + 0x26b308, + 0x21ac45, + 0x2281c8, + 0x2ab9c6, + 0x32b247, + 0x2c7bc5, + 0x233886, + 0x2cfac5, + 0x22dfca, + 0x2efec6, + 0x25dbc7, + 0x2bc605, + 0x2f44c7, + 0x2f8904, + 0x2f95c6, + 0x3624c5, + 0x32608b, + 0x2e10c9, + 0x23d74a, + 0x3725c8, + 0x3007c8, + 0x300f0c, + 0x306b47, + 0x308c48, + 0x30aa88, + 0x30dac5, + 0x338b4a, + 0x33aa09, + 0x4ce00202, + 0x200206, + 0x20d684, + 0x2ef889, + 0x275d49, + 0x27b1c7, + 0x2fa547, + 0x2b7c09, + 0x331308, + 0x33130f, + 0x2dfa86, + 0x2db10b, + 0x361545, + 0x361547, + 0x374c89, + 0x2171c6, + 0x32da87, + 0x2dde85, + 0x22f544, + 0x26e186, + 0x211984, + 0x2e6c47, + 0x34c5c8, + 0x4d2fb708, + 0x2fbe85, + 0x2fbfc7, + 0x245709, + 0x208444, + 0x208448, + 0x4d7190c8, + 0x23cdc4, + 0x230c88, + 0x3396c4, + 0x220389, + 0x333105, + 0x4da05bc2, + 0x2dfac5, + 0x2e6845, + 0x271b88, + 0x232847, + 0x4de03382, + 0x30cbc5, + 0x2d4e86, + 0x27a786, + 0x306f08, + 0x318308, + 0x327246, + 0x32e246, + 0x249009, + 0x345246, + 0x21708b, + 0x2a12c5, + 0x204686, + 0x382588, + 0x3152c6, + 0x298e46, + 0x21b94a, + 0x22f9ca, + 0x2e8245, + 0x35b8c7, + 0x2f0cc6, + 0x4e206602, + 0x21b1c7, + 0x2a9085, + 0x226b44, + 0x226b45, + 0x263046, + 0x27a447, + 0x20d405, + 0x22fb44, + 0x365008, + 0x298f05, + 0x33c8c7, + 0x39fa85, + 0x22df05, + 0x256b44, + 0x28fbc9, + 0x2ff988, + 0x2ecec6, + 0x2de9c6, + 0x2b9d46, + 0x4e700448, + 0x300647, + 0x3009cd, + 0x30120c, + 0x301809, + 0x301a49, + 0x4eb546c2, + 0x3a5503, + 0x20b303, + 0x2e1305, + 0x38ddca, + 0x327106, + 0x307905, + 0x30a084, + 0x30a08b, + 0x31bdcc, + 0x31c5cc, + 0x31c8d5, + 0x31d74d, + 0x31f44f, + 0x31f812, + 0x31fc8f, + 0x320052, + 0x3204d3, + 0x32098d, + 0x320f4d, + 0x3212ce, + 0x322a8e, + 0x3232cc, + 0x32368c, + 0x323acb, + 0x323e4e, + 0x324f92, + 0x326ecc, + 0x327610, + 0x3335d2, + 0x3347cc, + 0x334e8d, + 0x3351cc, + 0x337611, + 0x3384cd, + 0x33ac4d, + 0x33b24a, + 0x33b4cc, + 0x33bdcc, + 0x33c34c, + 0x33cbcc, + 0x33fc53, + 0x340450, + 0x340850, + 0x340e4d, + 0x34144c, + 0x342209, + 0x342f0d, + 0x343253, + 0x344911, + 0x344d53, + 0x34560f, + 0x3459cc, + 0x345ccf, + 0x34608d, + 0x34668f, + 0x346a50, + 0x3474ce, + 0x34ac8e, + 0x34b590, + 0x34ca8d, + 0x34d40e, + 0x34d78c, + 0x34e753, + 0x351e0e, + 0x352390, + 0x352791, + 0x352bcf, + 0x352f93, + 0x35424d, + 0x35458f, + 0x35494e, + 0x354fd0, + 0x3553c9, + 0x356390, + 0x356acf, + 0x35714f, + 0x357512, + 0x359e8e, + 0x35a74d, + 0x35cc4d, + 0x35cf8d, + 0x35f68d, + 0x35f9cd, + 0x35fd10, + 0x36010b, + 0x36058c, + 0x36090c, + 0x360c0c, + 0x360f0e, + 0x372c10, + 0x374452, + 0x3748cb, + 0x374ece, + 0x37524e, + 0x375ace, + 0x37604b, + 0x4ef76396, + 0x37724d, + 0x378354, + 0x378e0d, + 0x37ae55, + 0x37c04d, + 0x37c9cf, + 0x37d20f, + 0x38028f, + 0x38064e, + 0x380acd, + 0x382f11, + 0x385ecc, + 0x3861cc, + 0x3864cb, + 0x386c4c, + 0x38824f, + 0x388612, + 0x388fcd, 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, + 0x38a40c, + 0x38a70d, + 0x38aa4f, + 0x38ae0e, + 0x38da8c, + 0x38e04d, + 0x38e38b, + 0x38ee8c, + 0x38f40d, + 0x38f74e, + 0x38fac9, + 0x390c53, + 0x39118d, + 0x3914cd, + 0x391acc, + 0x391f4e, + 0x39290f, + 0x392ccc, + 0x392fcd, + 0x39330f, + 0x3936cc, + 0x3943cc, + 0x39484c, + 0x394b4c, + 0x39520d, + 0x395552, + 0x396c0c, + 0x396f0c, + 0x397211, + 0x39764f, + 0x397a0f, + 0x397dd3, + 0x398a8e, + 0x398e0f, + 0x3991cc, + 0x4f39950e, + 0x39988f, + 0x399c56, + 0x39b312, + 0x39d64c, + 0x39e14f, + 0x39e7cd, + 0x39eb0f, + 0x39eecc, + 0x39f1cd, + 0x39f50d, + 0x3a0c4e, + 0x3a2b8c, + 0x3a2e8c, + 0x3a3190, + 0x3a4991, + 0x3a4dcb, + 0x3a510c, + 0x3a540e, 0x3a7051, 0x3a748e, 0x3a780d, - 0x3ace8b, - 0x3adbcf, - 0x3aee94, - 0x21c2c2, - 0x21c2c2, - 0x205903, - 0x21c2c2, - 0x205903, - 0x21c2c2, - 0x205e02, - 0x3830c5, + 0x3aed0b, + 0x3afdcf, + 0x3b09d4, + 0x2630c2, + 0x2630c2, + 0x202583, + 0x2630c2, + 0x202583, + 0x2630c2, + 0x20ae82, + 0x372ac5, 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, + 0x2630c2, + 0x2630c2, + 0x20ae82, + 0x2630c2, + 0x29a385, + 0x212e05, + 0x2630c2, + 0x2630c2, + 0x211cc2, + 0x29a385, + 0x31e789, + 0x34460c, + 0x2630c2, + 0x2630c2, + 0x2630c2, + 0x2630c2, + 0x372ac5, + 0x2630c2, + 0x2630c2, + 0x2630c2, + 0x2630c2, + 0x211cc2, + 0x31e789, + 0x2630c2, + 0x2630c2, + 0x2630c2, + 0x212e05, + 0x2630c2, + 0x212e05, + 0x34460c, 0x3a6d4c, - 0x323ac3, - 0x22d183, - 0x2343c3, - 0x21eb03, - 0x201604, - 0x238483, - 0x2264c3, - 0x141388, - 0x4db44, - 0xed208, - 0x200882, - 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, - 0xc0e85, - 0x481, - 0x3b583, - 0x4af9eb86, - 0x90c43, - 0x1f82, - 0x3a4c4, - 0x1002, - 0x24104, - 0x9c2, - 0x1182, - 0x3182, - 0x4f882, - 0x2ec2, - 0x104e82, - 0x8c2, - 0x1dec2, - 0x37e42, - 0x682, - 0xf82, - 0xb1d82, - 0x343c3, - 0x8042, - 0x202, - 0x6ac2, - 0x21842, - 0xb2c2, - 0x32a02, - 0xf1c2, - 0x42, - 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, - 0x22d183, - 0x2343c3, - 0x211cc3, - 0x201d83, - 0x2348c3, - 0x238483, - 0x2025c3, - 0x2264c3, - 0x290c83, - 0x880c8, - 0x22d183, - 0x2343c3, - 0x211cc3, - 0x211003, - 0x238483, - 0x2025c3, - 0x2264c3, - 0x22d183, - 0x2343c3, - 0x2264c3, - 0x22d183, - 0x2343c3, - 0x21eb03, - 0x200041, - 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, - 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, - 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, - 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, - 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, - 0x880c8, - 0x216582, - 0x2343c3, - 0x21eb03, - 0x200a82, - 0x2264c3, - 0x200882, - 0x200707, - 0x254705, - 0x29f844, - 0x385f86, - 0x366a4b, - 0x263a49, - 0x363b46, - 0x340a89, - 0x2b2c88, - 0x207103, - 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, - 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, - 0x313b02, - 0x880c8, - 0x220045, - 0x200481, - 0x2d183, - 0x200741, - 0x200081, - 0x200c81, - 0x2333c2, - 0x36e144, - 0x383043, - 0x2007c1, - 0x200901, - 0x200041, - 0x2001c1, - 0x2dda87, - 0x2b8f8f, - 0x2cacc6, - 0x2000c1, - 0x25b806, - 0x200341, - 0x200ac1, - 0x341ece, - 0x201501, - 0x2264c3, - 0x2014c1, - 0x260e05, - 0x202002, - 0x241f85, - 0x200b81, - 0x200241, - 0x200a01, - 0x203e42, - 0x2002c1, - 0x204701, - 0x20dec1, - 0x200781, - 0x200641, - 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, - 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, - 0x216582, - 0x2264c3, - 0x880c8, - 0x200882, - 0x216582, - 0x201f82, - 0x200a82, - 0x200342, - 0x238483, - 0x201502, - 0x200882, - 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, - 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, - 0x23d144, - 0x372e82, - 0x2cea08, - 0x238483, - 0x3a2308, - 0x203082, - 0x235885, - 0x3a25c6, - 0x2264c3, - 0x206a42, - 0x2dd0c7, - 0x2002, - 0x26ccc5, - 0x393e85, - 0x2166c2, - 0x226442, - 0x31864a, - 0x26404a, - 0x210fc2, - 0x376c04, - 0x201a02, - 0x38e588, + 0x368883, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x2964c4, + 0x204ac3, + 0x200383, + 0x1f08, + 0x15444, + 0xc1348, 0x204cc2, - 0x2fd448, - 0x2f64c7, - 0x2f67c9, - 0x26cd42, - 0x2fbb85, - 0x2546c5, - 0x2148cb, - 0x2bfdcc, - 0x22f848, - 0x2fbf48, - 0x260dc2, + 0x5020d1c2, + 0x243403, + 0x24c944, + 0x202743, + 0x38e8c4, + 0x22e886, + 0x213843, + 0x31aa84, + 0x288845, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x25084a, + 0x241f46, + 0x3755cc, + 0x15f048, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x22d603, + 0x201686, + 0x204ac3, + 0x200383, + 0x21aa03, + 0xaa288, + 0x3942, + 0x513856c5, + 0x2ac47, + 0xd7a88, + 0xc0ce, + 0x8c792, + 0x16780b, + 0x516db445, + 0x51adb44c, + 0xf207, + 0x13ecc7, + 0x1698ca, + 0x3efd0, + 0x1acd05, + 0x16e1cb, + 0x1672c8, + 0x13edc7, + 0x2f64b, + 0x11dd09, + 0x150f47, + 0x1b3c47, + 0x81187, + 0x20586, + 0x94b88, + 0x52028b86, + 0xafbcd, + 0x169290, + 0x52401742, + 0xfb48, + 0x71f47, + 0x7f149, + 0x59b46, + 0x99f08, + 0x74842, + 0xa4f4a, + 0x2d587, + 0x3b9c7, + 0xaa689, + 0xad708, + 0x15ae05, + 0x194e8e, + 0x14d4e, + 0x26f4f, + 0x2ccc9, + 0x4c809, + 0x77e8b, + 0x878cf, + 0x8fdcc, + 0xadd8b, + 0xc4d08, + 0xdc507, + 0x162908, + 0xfe04b, + 0x12a54c, + 0x141acc, + 0x147f4c, + 0x14b0cd, + 0x17de88, + 0x42602, + 0x104389, + 0x18528b, + 0xc8886, + 0x116f8b, + 0xdd5ca, + 0xde185, + 0xe4a90, + 0x1294c6, + 0x63c85, + 0xe6448, + 0xee547, + 0xee807, + 0x5e987, + 0xf92ca, + 0xd790a, + 0x177ac6, + 0x97ccd, + 0x1ae208, + 0x56608, + 0x56a89, + 0xb9905, + 0x19de4c, + 0x14b2cb, + 0x171c84, + 0xff749, + 0x8146, + 0x16c2, + 0x125886, + 0x10d947, + 0x6c82, + 0xcb605, + 0x29b04, + 0x701, + 0x2bc43, + 0x51fadbc6, + 0x9a283, + 0x8a42, + 0x2d584, + 0x1442, + 0x4ae04, + 0x1342, + 0x2f82, + 0x3682, + 0x1124c2, + 0xe542, + 0xdb442, + 0x2ac2, + 0x1c402, + 0x26982, + 0x4d02, + 0x3b02, + 0x34682, + 0x31b83, + 0x7d02, + 0x1c2, + 0x41c2, + 0xda42, + 0x642, + 0xdc2, + 0x18d82, + 0x1a02, + 0x2282, + 0x1d42, + 0x4303, + 0xb02, + 0x2f02, + 0xb5e02, + 0x1b02, + 0x5d82, + 0x32c2, + 0x73c2, + 0x17c2, + 0x1f02, + 0x173102, + 0x73fc2, + 0x5e402, + 0x4ac3, + 0x2c2, + 0x9282, + 0x1002, + 0x14602, + 0x1724c5, + 0x6ec2, + 0x1202, + 0x41703, + 0x682, + 0xd42, + 0x1702, + 0xe5c2, + 0x1ac2, + 0x3382, + 0x6902, + 0x16c2, + 0x73c07, + 0x213dc3, + 0x204cc2, + 0x2d0783, + 0x231b83, + 0x2135c3, + 0x201d43, + 0x22d603, + 0x204ac3, + 0x20abc3, + 0x200383, + 0x29a2c3, + 0x1a5c3, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x2135c3, + 0x20fbc3, + 0x204ac3, + 0x20abc3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x200041, + 0x20fbc3, + 0x204ac3, + 0x2104c3, + 0x200383, + 0x368883, + 0x2d0783, + 0x231b83, + 0x20fb43, + 0x2135c3, + 0x2300c3, + 0x287703, + 0x210503, + 0x234743, + 0x332ec3, + 0x2964c4, + 0x204ac3, + 0x200383, + 0x24abc3, + 0x200604, + 0x250c83, + 0x5283, + 0x3abd03, + 0x329b88, + 0x2e8384, + 0x2c264a, + 0x224906, + 0x10f9c4, + 0x38c2c7, + 0x21eeca, + 0x2df949, + 0x3a3b07, + 0x3a7dca, + 0x368883, + 0x2e900b, + 0x303349, + 0x2b9e45, + 0x2d7187, + 0xd1c2, + 0x2d0783, + 0x204d07, + 0x248d45, + 0x2e1cc9, + 0x231b83, + 0x233606, + 0x2c56c3, + 0xe1183, + 0x109686, + 0x60546, + 0x137c7, + 0x217546, + 0x222645, + 0x2cf187, + 0x2da587, + 0x54b32ec3, + 0x334a07, + 0x3642c3, + 0x3a2385, + 0x2964c4, + 0x32e3c8, + 0x2751cc, + 0x3a5745, + 0x2a2086, + 0x204bc7, + 0x37ef47, + 0x25b8c7, + 0x31f248, + 0x307ecf, + 0x2dfb85, + 0x243507, + 0x2394c7, + 0x2a9b0a, + 0x2d7e49, + 0x30bc85, + 0x32194a, + 0x1b06, + 0x2c5745, + 0x376284, + 0x289dc6, + 0x2f8cc7, + 0x242507, + 0x38cbc8, + 0x214185, + 0x248c46, + 0x20c545, + 0x387845, + 0x212c04, + 0x2e3f87, + 0x20900a, + 0x234d48, + 0x356946, + 0x2d603, + 0x2e0405, + 0x26c686, + 0x3a46c6, + 0x263b86, + 0x20fbc3, + 0x389247, + 0x239445, + 0x204ac3, + 0x2dd88d, + 0x20abc3, + 0x38ccc8, + 0x39a5c4, + 0x27ba85, + 0x2a9a06, + 0x2362c6, + 0x204587, + 0x2ae707, + 0x270b05, + 0x200383, + 0x27f2c7, + 0x329709, + 0x22b689, + 0x2f590a, + 0x24cd82, + 0x3a2344, + 0x2e76c4, + 0x261787, + 0x2278c8, + 0x2ef309, + 0x21f1c9, + 0x2f0487, + 0x303806, + 0xf22c6, + 0x2f39c4, + 0x2f3fca, + 0x2f6a08, + 0x2f6fc9, + 0x2bfe86, + 0x2b6ec5, + 0x234c08, + 0x2c9c4a, + 0x22c6c3, + 0x200786, + 0x2f0587, + 0x217f85, + 0x39a485, + 0x2717c3, + 0x258a04, + 0x36da85, + 0x288e47, + 0x2ffac5, + 0x2ed686, + 0xfff05, + 0x264a03, + 0x28b789, + 0x27b84c, + 0x2a7e0c, + 0x2d3bc8, + 0x3ade87, + 0x2fc8c8, + 0x2fcc0a, + 0x2fd84b, + 0x303488, + 0x33f408, + 0x2363c6, + 0x262685, + 0x200f4a, + 0x219545, + 0x205bc2, + 0x2c7a87, + 0x2a32c6, + 0x355ec5, + 0x38e989, + 0x26b785, + 0x285ec5, + 0x3a1f49, + 0x257cc6, + 0x3b1088, + 0x23e0c3, + 0x3b3306, + 0x27ac06, + 0x30ba85, + 0x30ba89, + 0x2bc289, + 0x24d0c7, + 0x10b904, + 0x30b907, + 0x21f0c9, + 0x23c905, + 0x4bbc8, + 0x3b3205, + 0x339505, + 0x376c89, + 0x205ac2, + 0x2e95c4, 0x20d782, - 0x200882, - 0x880c8, - 0x216582, - 0x22d183, - 0x201f82, - 0x205902, - 0x201502, - 0x2264c3, - 0x217642, - 0x200882, - 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, - 0x65607a82, - 0x65547, - 0x65a07442, - 0x65e07482, - 0x66217642, - 0x6660a442, - 0xeb58c, - 0x66a24982, - 0x66e6f2c2, - 0x6721dcc2, - 0x67603dc2, - 0x67a2d742, - 0x67e1eb82, - 0x68204702, - 0x68606f42, - 0x68a71282, - 0x68e15ac2, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x75803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x60b6b683, - 0x275803, - 0x377004, - 0x254106, - 0x2e6a83, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x36b683, - 0x275803, - 0x200482, - 0x200482, - 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, - 0x323ac3, - 0x880c8, - 0x22d183, - 0x2343c3, - 0x21eb03, - 0x231ac6, - 0x201604, - 0x202243, - 0x212444, - 0x238483, - 0x2264c3, + 0x200b02, + 0x2ce985, + 0x30f748, + 0x2b9845, + 0x2c6fc3, + 0x2c6fc5, + 0x2d7543, + 0x210882, + 0x2e30c4, + 0x351903, + 0x204c82, + 0x35bb44, + 0x2e85c3, + 0x200e82, + 0x25e903, + 0x291704, + 0x2e7083, + 0x246f04, + 0x202602, + 0x21a903, + 0x215b43, + 0x206342, + 0x33c282, + 0x2bc0c9, + 0x202d82, + 0x28d304, + 0x201782, + 0x234a84, + 0x3037c4, + 0x2bcc44, + 0x2016c2, + 0x241a02, + 0x220883, + 0x225f83, + 0x387944, + 0x269e44, + 0x2bc484, + 0x2ce884, + 0x30b143, + 0x34f743, + 0x201a84, + 0x30d784, + 0x30e786, + 0x2e7782, + 0x20d1c2, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x204cc2, + 0x368883, + 0x2d0783, + 0x231b83, + 0x2001c3, + 0x332ec3, + 0x2964c4, + 0x2bc384, + 0x213184, + 0x204ac3, + 0x200383, + 0x21aa03, + 0x2f4684, + 0x32f983, + 0x2bf3c3, + 0x345184, + 0x3b3006, + 0x211503, + 0x13ecc7, + 0x234fc3, + 0x23a943, + 0x2b6703, + 0x265383, + 0x22d603, + 0x2db6c5, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x2ed143, + 0x2ab343, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204303, + 0x204ac3, + 0x23ee04, + 0x200383, + 0x26a104, + 0x2c2d45, + 0x13ecc7, + 0x20d1c2, + 0x2000c2, + 0x208a42, + 0x202082, + 0x200382, + 0x2d0783, + 0x23a184, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x213184, + 0x204ac3, + 0x200383, + 0x213e83, + 0x24ae04, + 0x15f048, + 0x2d0783, + 0x20abc3, + 0x1a5c3, + 0x24fe44, + 0x15f048, + 0x2d0783, + 0x251304, + 0x2964c4, + 0x20abc3, + 0x201882, + 0x200383, + 0x2202c3, + 0x58a04, + 0x370145, + 0x205bc2, + 0x30d8c3, + 0x204cc2, + 0x15f048, + 0x20d1c2, + 0x231b83, + 0x332ec3, + 0x201d42, + 0x200383, + 0x204cc2, + 0x15f048, + 0x231b83, + 0x332ec3, + 0x204303, + 0x20fbc3, + 0x30b544, + 0x204cc2, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x2da904, + 0x332ec3, + 0x204303, + 0x20fbc3, + 0x204ac3, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x22d603, + 0x204ac3, + 0x200383, + 0x26a103, + 0x213e83, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x1a5c3, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x2964c4, + 0x22d603, + 0x204ac3, + 0x200383, + 0x217082, + 0x200141, + 0x204cc2, + 0x200001, + 0x31f542, + 0x15f048, + 0x21d105, + 0x200701, + 0xd0783, + 0x200101, + 0x2000c1, + 0x201e41, + 0x29da82, + 0x36da04, + 0x372a43, + 0x200181, + 0x200941, + 0x200041, + 0x200081, + 0x2ed7c7, + 0x2eeccf, + 0x2fc146, + 0x201481, + 0x289786, + 0x200c01, + 0x2002c1, + 0x33168e, + 0x200381, + 0x200383, + 0x200e81, + 0x279e45, + 0x210582, + 0x2716c5, + 0x2003c1, + 0x200201, + 0x200241, + 0x205bc2, + 0x200a01, + 0x201a81, + 0x2005c1, + 0x2007c1, + 0x200cc1, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, 0x21bd03, - 0x22d183, - 0x2343c3, - 0x238483, - 0x2264c3, - 0x22d183, - 0x1e1c6, - 0x2343c3, - 0x21eb03, - 0xd1906, - 0x238483, - 0x2264c3, - 0x308a48, - 0x30b989, - 0x31bcc9, - 0x326c48, - 0x37efc8, - 0x37efc9, - 0x333c5, - 0x200882, - 0x20b285, - 0x231b43, - 0x6c216582, - 0x2343c3, - 0x21eb03, - 0x22f647, - 0x206003, - 0x211003, - 0x238483, - 0x201f43, - 0x210783, - 0x2025c3, - 0x2264c3, - 0x3a5946, - 0x203e42, - 0x223ec3, - 0x880c8, - 0x200882, - 0x323ac3, - 0x216582, - 0x22d183, - 0x2343c3, - 0x21eb03, - 0x201604, - 0x211003, - 0x238483, - 0x2264c3, - 0x217643, - 0x14fa806, + 0x2d0783, + 0x332ec3, + 0x91d48, + 0x20fbc3, + 0x204ac3, + 0x48803, + 0x200383, + 0x14ebc48, + 0x15f048, + 0x4dcc4, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x204ac3, + 0x200383, + 0x205283, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x2da904, + 0x200383, + 0x293ac5, + 0x343984, + 0x2d0783, + 0x204ac3, + 0x200383, + 0x16b18a, + 0x20d1c2, + 0x2d0783, + 0x22f489, + 0x231b83, + 0x2d2389, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x2f37c8, + 0x226647, + 0x370145, + 0x3a7f87, + 0x26b0cb, + 0x215cc8, + 0x32eac9, + 0x228087, + 0x200108, + 0x36f906, + 0x2344c7, + 0x29c108, + 0x2ab806, + 0x31d407, + 0x2aa449, + 0x2ba749, + 0x2c2ac6, + 0x2c38c5, + 0x2cce08, + 0x2b4783, + 0x2d7c88, + 0x231d87, + 0x206583, + 0x31d287, + 0x217905, + 0x2eeb08, + 0x359105, + 0x2cea43, + 0x23c289, + 0x2b0e87, + 0x35d504, + 0x2ff244, + 0x307ccb, + 0x308288, + 0x309587, + 0x2d0783, + 0x231b83, + 0x2135c3, + 0x200383, + 0x236ec3, + 0x332ec3, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x77fcb, + 0x204cc2, + 0x20d1c2, + 0x200383, + 0x15f048, + 0x204cc2, + 0x20d1c2, + 0x208a42, + 0x201d42, + 0x203cc2, + 0x204ac3, + 0x200382, + 0x204cc2, + 0x368883, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x208a42, + 0x332ec3, + 0x204303, + 0x20fbc3, + 0x213184, + 0x204ac3, + 0x2183c3, + 0x200383, + 0x30b544, + 0x24abc3, + 0x332ec3, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x20abc3, + 0x200383, + 0x39db07, + 0x2d0783, + 0x26e5c7, + 0x362a86, + 0x215ac3, + 0x2041c3, + 0x332ec3, + 0x209e43, + 0x2964c4, + 0x38b704, + 0x30dbc6, + 0x201303, + 0x204ac3, + 0x200383, + 0x293ac5, + 0x318244, + 0x369dc3, + 0x37ed83, + 0x2c7a87, + 0x2387c5, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x203782, + 0x3ae343, + 0x2c2d43, + 0x368883, + 0x5fed0783, + 0x209c02, + 0x231b83, + 0x202743, + 0x332ec3, + 0x2964c4, + 0x23a0c3, + 0x2dfb83, + 0x20fbc3, + 0x213184, + 0x6020c002, + 0x204ac3, + 0x200383, + 0x209103, + 0x229b03, + 0x217082, + 0x24abc3, + 0x15f048, + 0x332ec3, + 0x1a5c3, + 0x2957c4, + 0x368883, + 0x20d1c2, + 0x2d0783, + 0x23a184, + 0x231b83, + 0x332ec3, + 0x2964c4, + 0x204303, + 0x2cee84, + 0x222044, + 0x201686, + 0x213184, + 0x204ac3, + 0x200383, + 0x21aa03, + 0x2a32c6, + 0x3ddcb, + 0x28b86, + 0x4aa0a, + 0x10adca, + 0x15f048, + 0x20c504, + 0x2d0783, + 0x368844, + 0x231b83, + 0x256bc4, + 0x332ec3, + 0x262fc3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x32e84b, + 0x39f84a, + 0x3b478c, + 0x204cc2, + 0x20d1c2, + 0x208a42, + 0x2b0405, + 0x2964c4, + 0x201f02, + 0x20fbc3, + 0x222044, + 0x202082, + 0x200382, + 0x20c4c2, + 0x217082, + 0x168883, + 0xd882, + 0x2b2409, + 0x259f88, + 0x332d49, + 0x234309, + 0x23b18a, + 0x24550a, + 0x20a182, + 0x21c402, + 0xd1c2, + 0x2d0783, + 0x220802, + 0x2436c6, + 0x356fc2, + 0x20a542, + 0x21ad8e, + 0x21a94e, + 0x281a47, + 0x204a47, + 0x221202, + 0x231b83, + 0x332ec3, + 0x20b502, + 0x201d42, + 0x4143, + 0x24058f, + 0x26b142, + 0x362cc7, + 0x2fa1c7, + 0x39d487, + 0x31e28c, + 0x364d0c, + 0x202444, + 0x283b0a, + 0x21a882, + 0x201b02, + 0x2bc744, + 0x22b1c2, + 0x2c5c02, + 0x364f44, + 0x2184c2, + 0x205d82, + 0x5d83, + 0x2ab887, + 0x33d885, + 0x2073c2, + 0x240504, + 0x373102, + 0x2df088, + 0x204ac3, + 0x203808, + 0x203ac2, + 0x232d85, + 0x203ac6, + 0x200383, + 0x206ec2, + 0x2ef547, + 0x10582, + 0x350845, + 0x31d185, + 0x207c82, + 0x236b82, + 0x3a860a, + 0x27098a, + 0x212bc2, + 0x353f84, + 0x2018c2, + 0x3a2208, + 0x219682, + 0x2a2588, + 0x304987, + 0x304c89, + 0x2037c2, + 0x309e45, + 0x247e85, + 0x21424b, + 0x2ca84c, + 0x22c208, + 0x3186c8, + 0x2e7782, + 0x204642, + 0x204cc2, + 0x15f048, + 0x20d1c2, + 0x2d0783, + 0x208a42, + 0x202082, + 0x200382, + 0x200383, + 0x20c4c2, + 0x204cc2, + 0x6260d1c2, + 0x62b32ec3, + 0x205d83, + 0x201f02, + 0x204ac3, + 0x3a8fc3, + 0x200383, + 0x2ec383, + 0x273d06, + 0x1613e83, + 0x15f048, + 0x63c85, + 0xae2cd, + 0xaafca, + 0x6ebc7, + 0x63201b82, + 0x63601442, + 0x63a00f82, + 0x63e02e02, + 0x642125c2, + 0x6460e542, + 0x13ecc7, + 0x64a0d1c2, + 0x64e0e482, + 0x6520fe42, + 0x65603b02, + 0x21a943, + 0x102c4, + 0x220a43, + 0x65a14002, + 0x65e023c2, + 0x51847, + 0x66214502, + 0x66600b82, + 0x66a00542, + 0x66e0a3c2, + 0x67202282, + 0x67601d42, + 0xbe445, + 0x221443, + 0x3b3bc4, + 0x67a2b1c2, + 0x67e42682, + 0x68202682, + 0x7e5cb, + 0x68600c02, + 0x68e513c2, + 0x69201f02, + 0x69603cc2, + 0x69a0bcc2, + 0x69e05f02, + 0x6a20b602, + 0x6a673fc2, + 0x6aa0c002, + 0x6ae04a02, + 0x6b202082, + 0x6b603702, + 0x6ba12982, + 0x6be31302, + 0x94fc4, + 0x358183, + 0x6c2126c2, + 0x6c61a582, + 0x6ca098c2, + 0x6ce00982, + 0x6d200382, + 0x6d604c82, + 0x78147, + 0x6da054c2, + 0x6de05502, + 0x6e20c4c2, + 0x6e609f42, + 0x19de4c, + 0x6ea22e82, + 0x6ee79242, + 0x6f200a02, + 0x6f606602, + 0x6fa019c2, + 0x6fe3b302, + 0x70206d02, + 0x70613882, + 0x70a7af82, + 0x70e43e02, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x75c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x68a3a0c3, + 0x2075c3, + 0x2db744, + 0x259e86, + 0x2f74c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x20d882, + 0x20d882, + 0x23a0c3, + 0x2075c3, + 0x716d0783, + 0x231b83, + 0x329e83, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x15f048, + 0x20d1c2, + 0x2d0783, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x24fe44, + 0x20d1c2, + 0x2d0783, + 0x3303c3, + 0x231b83, + 0x251304, + 0x2135c3, + 0x332ec3, + 0x2964c4, + 0x204303, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x2202c3, + 0x370145, + 0x2b2703, + 0x24abc3, + 0x20d1c2, + 0x2d0783, + 0x23a0c3, + 0x204ac3, + 0x200383, + 0x204cc2, + 0x368883, + 0x15f048, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x22e886, + 0x2964c4, + 0x204303, + 0x213184, + 0x204ac3, + 0x200383, + 0x21aa03, + 0x2d0783, + 0x231b83, + 0x204ac3, + 0x200383, + 0x2d0783, + 0x28b86, + 0x231b83, + 0x332ec3, + 0xe1946, + 0x204ac3, + 0x200383, + 0x315cc8, + 0x318509, + 0x327a09, + 0x332548, + 0x37d888, + 0x37d889, + 0x9da85, + 0x204cc2, + 0x238605, + 0x205d43, + 0x7420d1c2, + 0x231b83, + 0x332ec3, + 0x33e387, + 0x265383, + 0x20fbc3, + 0x204ac3, + 0x2104c3, + 0x212483, + 0x20abc3, + 0x200383, + 0x241f46, + 0x205bc2, + 0x24abc3, + 0x15f048, + 0x204cc2, + 0x368883, + 0x20d1c2, + 0x2d0783, + 0x231b83, + 0x332ec3, + 0x2964c4, + 0x20fbc3, + 0x204ac3, + 0x200383, + 0x213e83, + 0x153ca46, } // children is the list of nodes' children, the parent's wildcard bit and the @@ -8636,439 +8623,471 @@ var children = [...]uint32{ 0x40000000, 0x50000000, 0x60000000, - 0x185c611, - 0x1860617, - 0x1880618, - 0x19dc620, - 0x19f0677, - 0x1a0467c, - 0x1a14681, - 0x1a30685, - 0x1a3468c, - 0x1a4c68d, - 0x1a70693, - 0x1a7469c, - 0x1a8c69d, - 0x1a906a3, + 0x1860612, + 0x1864618, + 0x1884619, + 0x19e0621, + 0x19f4678, + 0x1a0867d, + 0x1a18682, + 0x1a34686, + 0x1a3868d, + 0x1a5068e, + 0x1a74694, + 0x1a7869d, + 0x1a9069e, 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, + 0x1a986a5, + 0x1ac06a6, + 0x1ac46b0, + 0x21acc6b1, + 0x1b146b3, + 0x1b186c5, + 0x1b386c6, + 0x1b4c6ce, + 0x1b506d3, + 0x1b806d4, + 0x1b9c6e0, + 0x1bc46e7, + 0x1bd06f1, + 0x1bd46f4, + 0x1c686f5, + 0x1c7c71a, + 0x1c9071f, + 0x1cc0724, + 0x1cd0730, + 0x1ce4734, + 0x1d08739, + 0x1e20742, + 0x1e24788, + 0x1e90789, + 0x1ea47a4, + 0x1eb87a9, + 0x1ec07ae, + 0x1ed07b0, + 0x1ed47b4, + 0x1eec7b5, + 0x1f347bb, + 0x1f4c7cd, + 0x1f507d3, + 0x1f547d4, + 0x1f5c7d5, + 0x1f987d7, + 0x61f9c7e6, + 0x1fb07e7, + 0x1fbc7ec, + 0x1fc07ef, + 0x1fd07f0, + 0x20807f4, 0x2084820, - 0x20b8821, - 0x20bc82e, - 0x24f482f, - 0x2254493d, - 0x22548951, - 0x2570952, - 0x257895c, - 0x2257c95e, - 0x258495f, - 0x22594961, - 0x22598965, - 0x25a4966, - 0x225a8969, - 0x25ac96a, + 0x22090821, + 0x22098824, + 0x20cc826, + 0x20d0833, + 0x2514834, + 0x225ac945, 0x225b096b, - 0x25cc96c, - 0x25e4973, - 0x25e8979, - 0x25f897a, - 0x260097e, - 0x22634980, - 0x263898d, - 0x264898e, - 0x267c992, + 0x225b496c, + 0x225c096d, + 0x225c4970, + 0x225d0971, + 0x225d4974, + 0x225d8975, + 0x225dc976, + 0x225e0977, + 0x225e4978, + 0x225f0979, + 0x225f497c, + 0x2260097d, + 0x22604980, + 0x22608981, + 0x2260c982, + 0x22610983, + 0x22614984, + 0x2618985, + 0x2261c986, + 0x22628987, + 0x2262c98a, + 0x263498b, + 0x2264498d, + 0x22648991, + 0x2654992, + 0x22658995, + 0x265c996, + 0x22660997, + 0x267c998, 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, - 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, - 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, + 0x26989a5, + 0x26a89a6, + 0x26b09aa, + 0x26e49ac, + 0x26e89b9, + 0x26f89ba, + 0x27909be, + 0x227949e4, + 0x279c9e5, + 0x27a09e7, + 0x27b89e8, + 0x27cc9ee, + 0x27f49f3, + 0x28149fd, + 0x2844a05, + 0x286ca11, + 0x2870a1b, + 0x2894a1c, + 0x2898a25, + 0x28aca26, + 0x28b0a2b, + 0x28b4a2c, + 0x28d4a2d, + 0x28eca35, + 0x28f0a3b, + 0x228f4a3c, + 0x28f8a3d, + 0x2908a3e, + 0x290ca42, + 0x2984a43, + 0x29a0a61, + 0x29aca68, + 0x29c0a6b, + 0x29d8a70, + 0x29eca76, + 0x2a04a7b, + 0x2a1ca81, + 0x2a34a87, + 0x2a50a8d, + 0x2a68a94, + 0x2ac8a9a, + 0x2ae0ab2, + 0x2ae4ab8, + 0x2af8ab9, + 0x2b3cabe, + 0x2bbcacf, + 0x2be8aef, + 0x2becafa, + 0x2bf4afb, + 0x2c14afd, + 0x2c18b05, + 0x2c38b06, + 0x2c40b0e, + 0x2c78b10, + 0x2cb8b1e, + 0x2cbcb2e, + 0x2d0cb2f, + 0x2d10b43, + 0x22d14b44, + 0x2d2cb45, + 0x2d50b4b, + 0x2d70b54, + 0x3334b5c, + 0x3340ccd, + 0x3360cd0, + 0x351ccd8, + 0x35ecd47, + 0x365cd7b, + 0x36b4d97, + 0x379cdad, + 0x37f4de7, + 0x3830dfd, + 0x392ce0c, + 0x39f8e4b, + 0x3a90e7e, + 0x3b20ea4, + 0x3b84ec8, + 0x3dbcee1, + 0x3e74f6f, + 0x3f40f9d, + 0x3f8cfd0, + 0x4014fe3, + 0x4051005, + 0x40a1014, + 0x4119028, + 0x6411d046, + 0x64121047, + 0x64125048, + 0x41a1049, + 0x41fd068, + 0x427907f, + 0x42f109e, + 0x43710bc, + 0x43dd0dc, + 0x45090f7, + 0x4561142, + 0x64565158, + 0x45fd159, + 0x468517f, + 0x46d11a1, + 0x47391b4, + 0x47e11ce, + 0x48a91f8, + 0x491122a, + 0x4a25244, + 0x64a29289, + 0x64a2d28a, + 0x4a8928b, + 0x4ae52a2, + 0x4b752b9, + 0x4bf12dd, + 0x4c352fc, + 0x4d1930d, + 0x4d4d346, + 0x4dad353, + 0x4e2136b, + 0x4ea9388, + 0x4ee93aa, + 0x4f593ba, + 0x64f5d3d6, + 0x64f613d7, + 0x24f653d8, + 0x4f7d3d9, + 0x4f993df, + 0x4fdd3e6, + 0x4fed3f7, + 0x50053fb, + 0x507d401, + 0x508541f, + 0x5099421, + 0x50b1426, + 0x50d942c, + 0x50dd436, + 0x50e5437, + 0x50f9439, + 0x511543e, + 0x5119445, + 0x5121446, + 0x515d448, + 0x5171457, + 0x517945c, + 0x518145e, + 0x5185460, + 0x51a9461, + 0x51cd46a, + 0x51e5473, + 0x51e9479, + 0x51f147a, + 0x51f547c, + 0x524d47d, + 0x5271493, + 0x529149c, + 0x52ad4a4, + 0x52bd4ab, + 0x52d14af, + 0x52d54b4, + 0x52dd4b5, + 0x52f14b7, + 0x53014bc, + 0x53054c0, + 0x53214c1, + 0x5bb14c8, + 0x5be96ec, + 0x5c156fa, + 0x5c2d705, + 0x5c4d70b, + 0x5c6d713, + 0x5cb171b, + 0x5cb972c, + 0x25cbd72e, + 0x25cc172f, + 0x5cc5730, + 0x5e01731, + 0x25e05780, + 0x25e11781, + 0x25e19784, + 0x25e25786, + 0x5e29789, + 0x5e2d78a, + 0x5e5578b, + 0x5e7d795, + 0x5e8179f, + 0x5eb97a0, + 0x5ecd7ae, + 0x6a257b3, + 0x6a29a89, + 0x6a2da8a, + 0x26a31a8b, + 0x6a35a8c, + 0x26a39a8d, + 0x6a3da8e, + 0x26a49a8f, + 0x6a4da92, + 0x6a51a93, + 0x26a55a94, + 0x6a59a95, + 0x26a61a96, + 0x6a65a98, + 0x6a69a99, + 0x26a79a9a, + 0x6a7da9e, + 0x6a81a9f, + 0x6a85aa0, + 0x6a89aa1, + 0x26a8daa2, + 0x6a91aa3, + 0x6a95aa4, + 0x6a99aa5, + 0x6a9daa6, + 0x26aa5aa7, + 0x6aa9aa9, + 0x6aadaaa, + 0x6ab1aab, + 0x26ab5aac, + 0x6ab9aad, + 0x26ac1aae, + 0x26ac5ab0, + 0x6ae1ab1, + 0x6aedab8, + 0x6b2dabb, + 0x6b31acb, + 0x6b55acc, + 0x6b59ad5, + 0x6cc1ad6, + 0x26cc5b30, + 0x26ccdb31, + 0x26cd1b33, + 0x26cd5b34, + 0x6cddb35, + 0x6db9b37, + 0x6dbdb6e, + 0x6de9b6f, + 0x6dedb7a, + 0x6e0db7b, + 0x6e19b83, + 0x6e39b86, + 0x6e71b8e, + 0x7109b9c, + 0x71c5c42, + 0x71d9c71, + 0x720dc76, + 0x723dc83, + 0x7259c8f, + 0x727dc96, + 0x7299c9f, + 0x72b5ca6, + 0x72d9cad, + 0x72e9cb6, + 0x72edcba, + 0x7321cbb, + 0x733dcc8, + 0x7359ccf, + 0x737dcd6, + 0x739dcdf, + 0x73b1ce7, + 0x73c5cec, + 0x73c9cf1, + 0x73e9cf2, + 0x748dcfa, + 0x74a9d23, + 0x74c9d2a, + 0x74cdd32, + 0x74d1d33, + 0x74d5d34, + 0x74e9d35, + 0x7509d3a, + 0x7515d42, 0x7519d45, - 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, - 0x79f1e7b, - 0x7b01e7c, - 0x7b0dec0, - 0x7b19ec3, - 0x7b25ec6, - 0x7b31ec9, - 0x7b3decc, - 0x7b49ecf, - 0x7b55ed2, - 0x7b61ed5, - 0x7b6ded8, + 0x7549d46, + 0x75c9d52, + 0x75ddd72, + 0x75e1d77, + 0x75f9d78, + 0x75fdd7e, + 0x7609d7f, + 0x760dd82, + 0x7629d83, + 0x7665d8a, + 0x7669d99, + 0x7689d9a, + 0x76d9da2, + 0x76f1db6, + 0x7745dbc, + 0x7749dd1, + 0x774ddd2, + 0x7751dd3, + 0x7795dd4, + 0x77a5de5, + 0x77ddde9, + 0x780ddf7, + 0x7955e03, + 0x7979e55, + 0x79a5e5e, + 0x79b1e69, + 0x79b9e6c, + 0x7ac9e6e, + 0x7ad5eb2, + 0x7ae1eb5, + 0x7aedeb8, + 0x7af9ebb, + 0x7b05ebe, + 0x7b11ec1, + 0x7b1dec4, + 0x7b29ec7, + 0x7b35eca, + 0x7b41ecd, + 0x7b4ded0, + 0x7b59ed3, + 0x7b65ed6, + 0x7b6ded9, 0x7b79edb, 0x7b85ede, 0x7b91ee1, 0x7b9dee4, - 0x7ba5ee7, - 0x7bb1ee9, - 0x7bbdeec, - 0x7bc9eef, - 0x7bd5ef2, - 0x7be1ef5, - 0x7bedef8, - 0x7bf9efb, - 0x7c05efe, - 0x7c11f01, - 0x7c1df04, - 0x7c29f07, - 0x7c35f0a, - 0x7c41f0d, + 0x7ba9ee7, + 0x7bb5eea, + 0x7bc1eed, + 0x7bcdef0, + 0x7bd9ef3, + 0x7be5ef6, + 0x7bf1ef9, + 0x7bfdefc, + 0x7c09eff, + 0x7c15f02, + 0x7c21f05, + 0x7c2df08, + 0x7c39f0b, + 0x7c41f0e, 0x7c4df10, 0x7c59f13, 0x7c65f16, 0x7c71f19, - 0x7c79f1c, - 0x7c85f1e, - 0x7c91f21, - 0x7c9df24, - 0x7ca9f27, - 0x7cb5f2a, - 0x7cc1f2d, - 0x7ccdf30, - 0x7cd9f33, - 0x7ce5f36, + 0x7c7df1c, + 0x7c89f1f, + 0x7c95f22, + 0x7ca1f25, + 0x7cadf28, + 0x7cb9f2b, + 0x7cc5f2e, + 0x7cd1f31, + 0x7cddf34, + 0x7ce5f37, 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, + 0x7d21f45, + 0x7d2df48, + 0x7d39f4b, + 0x7d45f4e, + 0x7d49f51, + 0x7d55f52, + 0x7d6df55, + 0x7d71f5b, + 0x7d81f5c, + 0x7d99f60, + 0x7dddf66, + 0x7df1f77, + 0x7e25f7c, + 0x7e35f89, + 0x7e51f8d, + 0x7e69f94, + 0x7e6df9a, + 0x27eb1f9b, + 0x7eb5fac, + 0x7ee1fad, + 0x7ee5fb8, } -// max children 434 (capacity 511) -// max text offset 27930 (capacity 32767) +// max children 466 (capacity 511) +// max text offset 28023 (capacity 32767) // max text length 36 (capacity 63) -// max hi 8135 (capacity 16383) -// max lo 8134 (capacity 16383) +// max hi 8121 (capacity 16383) +// max lo 8120 (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 5433f3b175..f60c80e79a 100644 --- a/vendor/golang.org/x/net/publicsuffix/table_test.go +++ b/vendor/golang.org/x/net/publicsuffix/table_test.go @@ -541,6 +541,7 @@ var rules = [...]string{ "org.cw", "cx", "gov.cx", + "cy", "ac.cy", "biz.cy", "com.cy", @@ -2207,9 +2208,7 @@ var rules = [...]string{ "aso.kumamoto.jp", "choyo.kumamoto.jp", "gyokuto.kumamoto.jp", - "hitoyoshi.kumamoto.jp", "kamiamakusa.kumamoto.jp", - "kashima.kumamoto.jp", "kikuchi.kumamoto.jp", "kumamoto.kumamoto.jp", "mashiki.kumamoto.jp", @@ -3968,20 +3967,21 @@ var rules = [...]string{ "net.ng", "org.ng", "sch.ng", - "com.ni", - "gob.ni", - "edu.ni", - "org.ni", - "nom.ni", - "net.ni", - "mil.ni", - "co.ni", - "biz.ni", - "web.ni", - "int.ni", + "ni", "ac.ni", + "biz.ni", + "co.ni", + "com.ni", + "edu.ni", + "gob.ni", "in.ni", "info.ni", + "int.ni", + "mil.ni", + "net.ni", + "nom.ni", + "org.ni", + "web.ni", "nl", "bv.nl", "no", @@ -4775,6 +4775,7 @@ var rules = [...]string{ "net.om", "org.om", "pro.om", + "onion", "org", "pa", "ac.pa", @@ -5126,133 +5127,9 @@ var rules = [...]string{ "org.rs", "ru", "ac.ru", - "com.ru", "edu.ru", - "int.ru", - "net.ru", - "org.ru", - "pp.ru", - "adygeya.ru", - "altai.ru", - "amur.ru", - "arkhangelsk.ru", - "astrakhan.ru", - "bashkiria.ru", - "belgorod.ru", - "bir.ru", - "bryansk.ru", - "buryatia.ru", - "cbg.ru", - "chel.ru", - "chelyabinsk.ru", - "chita.ru", - "chukotka.ru", - "chuvashia.ru", - "dagestan.ru", - "dudinka.ru", - "e-burg.ru", - "grozny.ru", - "irkutsk.ru", - "ivanovo.ru", - "izhevsk.ru", - "jar.ru", - "joshkar-ola.ru", - "kalmykia.ru", - "kaluga.ru", - "kamchatka.ru", - "karelia.ru", - "kazan.ru", - "kchr.ru", - "kemerovo.ru", - "khabarovsk.ru", - "khakassia.ru", - "khv.ru", - "kirov.ru", - "koenig.ru", - "komi.ru", - "kostroma.ru", - "krasnoyarsk.ru", - "kuban.ru", - "kurgan.ru", - "kursk.ru", - "lipetsk.ru", - "magadan.ru", - "mari.ru", - "mari-el.ru", - "marine.ru", - "mordovia.ru", - "msk.ru", - "murmansk.ru", - "nalchik.ru", - "nnov.ru", - "nov.ru", - "novosibirsk.ru", - "nsk.ru", - "omsk.ru", - "orenburg.ru", - "oryol.ru", - "palana.ru", - "penza.ru", - "perm.ru", - "ptz.ru", - "rnd.ru", - "ryazan.ru", - "sakhalin.ru", - "samara.ru", - "saratov.ru", - "simbirsk.ru", - "smolensk.ru", - "spb.ru", - "stavropol.ru", - "stv.ru", - "surgut.ru", - "tambov.ru", - "tatarstan.ru", - "tom.ru", - "tomsk.ru", - "tsaritsyn.ru", - "tsk.ru", - "tula.ru", - "tuva.ru", - "tver.ru", - "tyumen.ru", - "udm.ru", - "udmurtia.ru", - "ulan-ude.ru", - "vladikavkaz.ru", - "vladimir.ru", - "vladivostok.ru", - "volgograd.ru", - "vologda.ru", - "voronezh.ru", - "vrn.ru", - "vyatka.ru", - "yakutia.ru", - "yamal.ru", - "yaroslavl.ru", - "yekaterinburg.ru", - "yuzhno-sakhalinsk.ru", - "amursk.ru", - "baikal.ru", - "cmw.ru", - "fareast.ru", - "jamal.ru", - "kms.ru", - "k-uralsk.ru", - "kustanai.ru", - "kuzbass.ru", - "mytis.ru", - "nakhodka.ru", - "nkz.ru", - "norilsk.ru", - "oskol.ru", - "pyatigorsk.ru", - "rubtsovsk.ru", - "snz.ru", - "syzran.ru", - "vdonsk.ru", - "zgrad.ru", "gov.ru", + "int.ru", "mil.ru", "test.ru", "rw", @@ -6379,7 +6256,6 @@ var rules = [...]string{ "education", "email", "emerck", - "emerson", "energy", "engineer", "engineering", @@ -6542,6 +6418,7 @@ var rules = [...]string{ "honda", "honeywell", "horse", + "hospital", "host", "hosting", "hot", @@ -7293,43 +7170,64 @@ var rules = [...]string{ "*.alces.network", "*.alwaysdata.net", "cloudfront.net", - "compute.amazonaws.com", - "ap-northeast-1.compute.amazonaws.com", - "ap-northeast-2.compute.amazonaws.com", - "ap-southeast-1.compute.amazonaws.com", - "ap-southeast-2.compute.amazonaws.com", - "eu-central-1.compute.amazonaws.com", - "eu-west-1.compute.amazonaws.com", - "sa-east-1.compute.amazonaws.com", - "us-gov-west-1.compute.amazonaws.com", - "us-west-1.compute.amazonaws.com", - "us-west-2.compute.amazonaws.com", - "compute-1.amazonaws.com", - "z-1.compute-1.amazonaws.com", - "z-2.compute-1.amazonaws.com", + "*.compute.amazonaws.com", + "*.compute-1.amazonaws.com", + "*.compute.amazonaws.com.cn", "us-east-1.amazonaws.com", - "compute.amazonaws.com.cn", - "cn-north-1.compute.amazonaws.com.cn", - "elasticbeanstalk.com", - "elb.amazonaws.com", - "s3.amazonaws.com", + "elasticbeanstalk.cn-north-1.amazonaws.com.cn", + "*.elasticbeanstalk.com", + "*.elb.amazonaws.com", + "*.elb.amazonaws.com.cn", + "*.s3.amazonaws.com", "s3-ap-northeast-1.amazonaws.com", "s3-ap-northeast-2.amazonaws.com", + "s3-ap-south-1.amazonaws.com", "s3-ap-southeast-1.amazonaws.com", "s3-ap-southeast-2.amazonaws.com", + "s3-ca-central-1.amazonaws.com", "s3-eu-central-1.amazonaws.com", "s3-eu-west-1.amazonaws.com", "s3-external-1.amazonaws.com", - "s3-external-2.amazonaws.com", "s3-fips-us-gov-west-1.amazonaws.com", "s3-sa-east-1.amazonaws.com", "s3-us-gov-west-1.amazonaws.com", + "s3-us-east-2.amazonaws.com", "s3-us-west-1.amazonaws.com", "s3-us-west-2.amazonaws.com", "s3.ap-northeast-2.amazonaws.com", + "s3.ap-south-1.amazonaws.com", "s3.cn-north-1.amazonaws.com.cn", + "s3.ca-central-1.amazonaws.com", "s3.eu-central-1.amazonaws.com", + "s3.us-east-2.amazonaws.com", + "s3.dualstack.ap-northeast-1.amazonaws.com", + "s3.dualstack.ap-northeast-2.amazonaws.com", + "s3.dualstack.ap-south-1.amazonaws.com", + "s3.dualstack.ap-southeast-1.amazonaws.com", + "s3.dualstack.ap-southeast-2.amazonaws.com", + "s3.dualstack.ca-central-1.amazonaws.com", + "s3.dualstack.eu-central-1.amazonaws.com", + "s3.dualstack.eu-west-1.amazonaws.com", + "s3.dualstack.sa-east-1.amazonaws.com", + "s3.dualstack.us-east-1.amazonaws.com", + "s3.dualstack.us-east-2.amazonaws.com", + "s3-website-us-east-1.amazonaws.com", + "s3-website-us-west-1.amazonaws.com", + "s3-website-us-west-2.amazonaws.com", + "s3-website-ap-northeast-1.amazonaws.com", + "s3-website-ap-southeast-1.amazonaws.com", + "s3-website-ap-southeast-2.amazonaws.com", + "s3-website-eu-west-1.amazonaws.com", + "s3-website-sa-east-1.amazonaws.com", + "s3-website.ap-northeast-2.amazonaws.com", + "s3-website.ap-south-1.amazonaws.com", + "s3-website.ca-central-1.amazonaws.com", + "s3-website.eu-central-1.amazonaws.com", + "s3-website.us-east-2.amazonaws.com", + "t3l3p0rt.net", + "tele.amune.org", "on-aptible.com", + "user.party.eus", "pimienta.org", "poivron.org", "potager.org", @@ -7402,6 +7300,15 @@ var rules = [...]string{ "co.nl", "co.no", "*.platform.sh", + "dyn.cosidns.de", + "dynamisches-dns.de", + "dnsupdater.de", + "internet-dns.de", + "l-o-g-i-n.de", + "dynamic-dns.info", + "feste-ip.net", + "knx-server.net", + "static-access.net", "realm.cz", "*.cryptonomic.net", "cupcake.is", @@ -7701,8 +7608,19 @@ var rules = [...]string{ "webhop.org", "worse-than.tv", "writesthisblog.com", + "ddnss.de", + "dyn.ddnss.de", + "dyndns.ddnss.de", + "dyndns1.de", + "dyn-ip24.de", + "home-webserver.de", + "dyn.home-webserver.de", + "myhome-server.de", + "ddnss.org", "dynv6.net", "e4.cz", + "enonic.io", + "customer.enonic.io", "eu.org", "al.eu.org", "asso.eu.org", @@ -7764,11 +7682,14 @@ var rules = [...]string{ "us-1.evennode.com", "us-2.evennode.com", "apps.fbsbx.com", + "map.fastly.net", + "a.prod.fastly.net", + "global.prod.fastly.net", "a.ssl.fastly.net", "b.ssl.fastly.net", "global.ssl.fastly.net", - "a.prod.fastly.net", - "global.prod.fastly.net", + "fastlylb.net", + "map.fastlylb.net", "fhapp.xyz", "firebaseapp.com", "flynnhub.com", @@ -7778,9 +7699,12 @@ var rules = [...]string{ "fbxos.fr", "freebox-os.fr", "freeboxos.fr", + "myfusion.cloud", + "futurehosting.at", "futuremailing.at", "*.ex.ortsinfo.at", "*.kunden.ortsinfo.at", + "*.statics.cloud", "service.gov.uk", "github.io", "githubusercontent.com", @@ -7790,7 +7714,7 @@ var rules = [...]string{ "gist.githubcloud.com", "*.githubcloudusercontent.com", "gitlab.io", - "ro.com", + "homeoffice.gov.uk", "ro.im", "shop.ro", "goip.de", @@ -8036,6 +7960,7 @@ var rules = [...]string{ "pantheonsite.io", "gotpantheon.com", "mypep.link", + "on-web.fr", "xen.prgmr.com", "priv.at", "protonet.io", @@ -8054,19 +7979,34 @@ var rules = [...]string{ "sandcats.io", "logoip.de", "logoip.com", + "firewall-gateway.com", + "firewall-gateway.de", + "my-gateway.de", + "my-router.de", + "spdns.de", + "spdns.eu", + "firewall-gateway.net", + "my-firewall.org", + "myfirewall.org", + "spdns.org", "biz.ua", "co.ua", "pp.ua", + "shiftedit.io", "myshopblocks.com", + "1kapp.com", + "appchizi.com", + "applinzi.com", "sinaapp.com", "vipsinaapp.com", - "1kapp.com", "bounty-full.com", "alpha.bounty-full.com", "beta.bounty-full.com", "static.land", "dev.static.land", "sites.static.land", + "apps.lair.io", + "*.stolos.io", "spacekit.io", "stackspace.space", "diskstation.me", @@ -8094,16 +8034,41 @@ var rules = [...]string{ "*.transurl.eu", "*.transurl.nl", "tuxfamily.org", + "dd-dns.de", + "diskstation.eu", + "diskstation.org", + "dray-dns.de", + "draydns.de", + "dyn-vpn.de", + "dynvpn.de", + "mein-vigor.de", + "my-vigor.de", + "my-wan.de", + "syno-ds.de", + "synology-diskstation.de", + "synology-ds.de", "hk.com", "hk.org", "ltd.hk", "inc.hk", "lib.de.us", "router.management", + "remotewd.com", "wmflabs.org", "yolasite.com", + "ybo.faith", + "yombo.me", + "homelink.one", + "ybo.party", + "ybo.review", + "ybo.science", + "ybo.trade", "za.net", "za.org", + "now.sh", + "cc.ua", + "inf.ua", + "ltd.ua", } var nodeLabels = [...]string{ @@ -8497,7 +8462,6 @@ var nodeLabels = [...]string{ "eg", "email", "emerck", - "emerson", "energy", "engineer", "engineering", @@ -8693,6 +8657,7 @@ var nodeLabels = [...]string{ "honda", "honeywell", "horse", + "hospital", "host", "hosting", "hot", @@ -9034,6 +8999,7 @@ var nodeLabels = [...]string{ "omega", "one", "ong", + "onion", "onl", "online", "onyourside", @@ -9811,6 +9777,7 @@ var nodeLabels = [...]string{ "ac", "biz", "co", + "futurehosting", "futuremailing", "gv", "info", @@ -10134,6 +10101,8 @@ var nodeLabels = [...]string{ "gov", "mil", "magentosite", + "myfusion", + "statics", "cloudns", "co", "com", @@ -10186,8 +10155,9 @@ var nodeLabels = [...]string{ "amazonaws", "cn-north-1", "compute", + "elb", + "elasticbeanstalk", "s3", - "cn-north-1", "arts", "com", "edu", @@ -10209,6 +10179,8 @@ var nodeLabels = [...]string{ "africa", "alpha-myqnapcloud", "amazonaws", + "appchizi", + "applinzi", "appspot", "ar", "betainabox", @@ -10265,6 +10237,7 @@ var nodeLabels = [...]string{ "familyds", "fbsbx", "firebaseapp", + "firewall-gateway", "flynnhub", "freebox-os", "freeboxos", @@ -10429,8 +10402,8 @@ var nodeLabels = [...]string{ "qc", "quicksytes", "rackmaze", + "remotewd", "rhcloud", - "ro", "ru", "sa", "saves-the-whales", @@ -10472,39 +10445,75 @@ var nodeLabels = [...]string{ "xenapponazure", "yolasite", "za", + "ap-northeast-1", "ap-northeast-2", + "ap-south-1", + "ap-southeast-1", + "ap-southeast-2", + "ca-central-1", "compute", "compute-1", "elb", "eu-central-1", + "eu-west-1", "s3", "s3-ap-northeast-1", "s3-ap-northeast-2", + "s3-ap-south-1", "s3-ap-southeast-1", "s3-ap-southeast-2", + "s3-ca-central-1", "s3-eu-central-1", "s3-eu-west-1", "s3-external-1", - "s3-external-2", "s3-fips-us-gov-west-1", "s3-sa-east-1", + "s3-us-east-2", "s3-us-gov-west-1", "s3-us-west-1", "s3-us-west-2", - "us-east-1", - "s3", - "ap-northeast-1", - "ap-northeast-2", - "ap-southeast-1", - "ap-southeast-2", - "eu-central-1", - "eu-west-1", + "s3-website-ap-northeast-1", + "s3-website-ap-southeast-1", + "s3-website-ap-southeast-2", + "s3-website-eu-west-1", + "s3-website-sa-east-1", + "s3-website-us-east-1", + "s3-website-us-west-1", + "s3-website-us-west-2", "sa-east-1", - "us-gov-west-1", - "us-west-1", - "us-west-2", - "z-1", - "z-2", + "us-east-1", + "us-east-2", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "s3-website", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "dualstack", + "s3", + "s3-website", "s3", "alpha", "beta", @@ -10559,17 +10568,46 @@ var nodeLabels = [...]string{ "realm", "blogspot", "com", + "cosidns", + "dd-dns", + "ddnss", "dnshome", + "dnsupdater", + "dray-dns", + "draydns", + "dyn-ip24", + "dyn-vpn", + "dynamisches-dns", + "dyndns1", + "dynvpn", + "firewall-gateway", "fuettertdasnetz", "goip", + "home-webserver", + "internet-dns", "isteingeek", "istmein", "keymachine", + "l-o-g-i-n", "lebtimnetz", "leitungsen", "logoip", + "mein-vigor", + "my-gateway", + "my-router", + "my-vigor", + "my-wan", + "myhome-server", + "spdns", + "syno-ds", + "synology-diskstation", + "synology-ds", "taifun-dns", "traeumtgerade", + "dyn", + "dyn", + "dyndns", + "dyn", "biz", "blogspot", "co", @@ -10648,9 +10686,14 @@ var nodeLabels = [...]string{ "net", "org", "cloudns", + "diskstation", "mycd", + "spdns", "transurl", "wellbeingzone", + "party", + "user", + "ybo", "aland", "blogspot", "dy", @@ -10679,6 +10722,7 @@ var nodeLabels = [...]string{ "medecin", "nom", "notaires", + "on-web", "pharmacien", "port", "prd", @@ -10878,6 +10922,7 @@ var nodeLabels = [...]string{ "barrell-of-knowledge", "cloudns", "dvrcam", + "dynamic-dns", "dyndns", "for-our", "groks-the", @@ -10896,16 +10941,22 @@ var nodeLabels = [...]string{ "com", "dedyn", "drud", + "enonic", "github", "gitlab", "hasura-app", "hzc", + "lair", "ngrok", "nid", "pantheonsite", "protonet", "sandcats", + "shiftedit", "spacekit", + "stolos", + "customer", + "apps", "com", "edu", "gov", @@ -12226,9 +12277,7 @@ var nodeLabels = [...]string{ "aso", "choyo", "gyokuto", - "hitoyoshi", "kamiamakusa", - "kashima", "kikuchi", "kumamoto", "mashiki", @@ -13289,6 +13338,7 @@ var nodeLabels = [...]string{ "priv", "synology", "webhop", + "yombo", "co", "com", "edu", @@ -13986,6 +14036,9 @@ var nodeLabels = [...]string{ "endofinternet", "familyds", "fastly", + "fastlylb", + "feste-ip", + "firewall-gateway", "from-az", "from-co", "from-la", @@ -14005,6 +14058,7 @@ var nodeLabels = [...]string{ "isa-geek", "jp", "kicks-ass", + "knx-server", "mydissent", "myeffect", "myfritz", @@ -14027,12 +14081,15 @@ var nodeLabels = [...]string{ "serveblog", "serveftp", "serveminecraft", + "static-access", "sytes", + "t3l3p0rt", "thruhere", "uk", "webhop", "za", "r", + "map", "prod", "ssl", "a", @@ -14040,6 +14097,7 @@ var nodeLabels = [...]string{ "a", "b", "global", + "map", "alces", "arts", "com", @@ -14883,7 +14941,9 @@ var nodeLabels = [...]string{ "net", "org", "pro", + "homelink", "ae", + "amune", "blogdns", "blogsite", "bmoattachments", @@ -14895,6 +14955,8 @@ var nodeLabels = [...]string{ "cloudns", "collegefan", "couchpotatofries", + "ddnss", + "diskstation", "dnsalias", "dnsdojo", "doesntexist", @@ -14942,6 +15004,8 @@ var nodeLabels = [...]string{ "kicks-ass", "misconfused", "mlbfan", + "my-firewall", + "myfirewall", "myftp", "mysecuritycamera", "nflfan", @@ -14957,6 +15021,7 @@ var nodeLabels = [...]string{ "servebbs", "serveftp", "servegame", + "spdns", "stuff-4-sale", "sweetpepper", "tunk", @@ -14967,6 +15032,7 @@ var nodeLabels = [...]string{ "wmflabs", "za", "zapto", + "tele", "c", "rsc", "origin", @@ -15040,6 +15106,7 @@ var nodeLabels = [...]string{ "nom", "org", "sld", + "ybo", "blogspot", "com", "edu", @@ -15359,6 +15426,7 @@ var nodeLabels = [...]string{ "blogspot", "com", "nom", + "ybo", "arts", "blogspot", "com", @@ -15380,136 +15448,12 @@ var nodeLabels = [...]string{ "in", "org", "ac", - "adygeya", - "altai", - "amur", - "amursk", - "arkhangelsk", - "astrakhan", - "baikal", - "bashkiria", - "belgorod", - "bir", "blogspot", - "bryansk", - "buryatia", - "cbg", - "chel", - "chelyabinsk", - "chita", - "chukotka", - "chuvashia", - "cmw", - "com", - "dagestan", - "dudinka", - "e-burg", "edu", - "fareast", "gov", - "grozny", "int", - "irkutsk", - "ivanovo", - "izhevsk", - "jamal", - "jar", - "joshkar-ola", - "k-uralsk", - "kalmykia", - "kaluga", - "kamchatka", - "karelia", - "kazan", - "kchr", - "kemerovo", - "khabarovsk", - "khakassia", - "khv", - "kirov", - "kms", - "koenig", - "komi", - "kostroma", - "krasnoyarsk", - "kuban", - "kurgan", - "kursk", - "kustanai", - "kuzbass", - "lipetsk", - "magadan", - "mari", - "mari-el", - "marine", "mil", - "mordovia", - "msk", - "murmansk", - "mytis", - "nakhodka", - "nalchik", - "net", - "nkz", - "nnov", - "norilsk", - "nov", - "novosibirsk", - "nsk", - "omsk", - "orenburg", - "org", - "oryol", - "oskol", - "palana", - "penza", - "perm", - "pp", - "ptz", - "pyatigorsk", - "rnd", - "rubtsovsk", - "ryazan", - "sakhalin", - "samara", - "saratov", - "simbirsk", - "smolensk", - "snz", - "spb", - "stavropol", - "stv", - "surgut", - "syzran", - "tambov", - "tatarstan", "test", - "tom", - "tomsk", - "tsaritsyn", - "tsk", - "tula", - "tuva", - "tver", - "tyumen", - "udm", - "udmurtia", - "ulan-ude", - "vdonsk", - "vladikavkaz", - "vladimir", - "vladivostok", - "volgograd", - "vologda", - "voronezh", - "vrn", - "vyatka", - "yakutia", - "yamal", - "yaroslavl", - "yekaterinburg", - "yuzhno-sakhalinsk", - "zgrad", "ac", "co", "com", @@ -15537,6 +15481,7 @@ var nodeLabels = [...]string{ "gov", "net", "org", + "ybo", "com", "edu", "gov", @@ -15598,6 +15543,7 @@ var nodeLabels = [...]string{ "hashbang", "mil", "net", + "now", "org", "platform", "blogspot", @@ -15761,6 +15707,7 @@ var nodeLabels = [...]string{ "web", "blogspot", "gov", + "ybo", "aero", "biz", "co", @@ -15809,6 +15756,7 @@ var nodeLabels = [...]string{ "sc", "tv", "biz", + "cc", "cherkassy", "cherkasy", "chernigov", @@ -15832,6 +15780,7 @@ var nodeLabels = [...]string{ "gov", "if", "in", + "inf", "ivano-frankivsk", "kh", "kharkiv", @@ -15849,6 +15798,7 @@ var nodeLabels = [...]string{ "kyiv", "lg", "lt", + "ltd", "lugansk", "lutsk", "lv", @@ -15910,6 +15860,7 @@ var nodeLabels = [...]string{ "blogspot", "no-ip", "wellbeingzone", + "homeoffice", "service", "ak", "al", diff --git a/vendor/golang.org/x/net/route/address.go b/vendor/golang.org/x/net/route/address.go index a56909c105..e6bfa39e93 100644 --- a/vendor/golang.org/x/net/route/address.go +++ b/vendor/golang.org/x/net/route/address.go @@ -24,6 +24,39 @@ type LinkAddr struct { // Family implements the Family method of Addr interface. func (a *LinkAddr) Family() int { return sysAF_LINK } +func (a *LinkAddr) lenAndSpace() (int, int) { + l := 8 + len(a.Name) + len(a.Addr) + return l, roundup(l) +} + +func (a *LinkAddr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + nlen, alen := len(a.Name), len(a.Addr) + if nlen > 255 || alen > 255 { + return 0, errInvalidAddr + } + b[0] = byte(l) + b[1] = sysAF_LINK + if a.Index > 0 { + nativeEndian.PutUint16(b[2:4], uint16(a.Index)) + } + data := b[8:] + if nlen > 0 { + b[5] = byte(nlen) + copy(data[:nlen], a.Addr) + data = data[nlen:] + } + if alen > 0 { + b[6] = byte(alen) + copy(data[:alen], a.Name) + data = data[alen:] + } + return ll, nil +} + func parseLinkAddr(b []byte) (Addr, error) { if len(b) < 8 { return nil, errInvalidAddr @@ -90,6 +123,21 @@ type Inet4Addr struct { // Family implements the Family method of Addr interface. func (a *Inet4Addr) Family() int { return sysAF_INET } +func (a *Inet4Addr) lenAndSpace() (int, int) { + return sizeofSockaddrInet, roundup(sizeofSockaddrInet) +} + +func (a *Inet4Addr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + b[0] = byte(l) + b[1] = sysAF_INET + copy(b[4:8], a.IP[:]) + return ll, nil +} + // An Inet6Addr represents an internet address for IPv6. type Inet6Addr struct { IP [16]byte // IP address @@ -99,18 +147,36 @@ type Inet6Addr struct { // Family implements the Family method of Addr interface. func (a *Inet6Addr) Family() int { return sysAF_INET6 } +func (a *Inet6Addr) lenAndSpace() (int, int) { + return sizeofSockaddrInet6, roundup(sizeofSockaddrInet6) +} + +func (a *Inet6Addr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + b[0] = byte(l) + b[1] = sysAF_INET6 + copy(b[8:24], a.IP[:]) + if a.ZoneID > 0 { + nativeEndian.PutUint32(b[24:28], uint32(a.ZoneID)) + } + return ll, nil +} + // parseInetAddr parses b as an internet address for IPv4 or IPv6. func parseInetAddr(af int, b []byte) (Addr, error) { switch af { case sysAF_INET: - if len(b) < 16 { + if len(b) < sizeofSockaddrInet { return nil, errInvalidAddr } a := &Inet4Addr{} copy(a.IP[:], b[4:8]) return a, nil case sysAF_INET6: - if len(b) < 28 { + if len(b) < sizeofSockaddrInet6 { return nil, errInvalidAddr } a := &Inet6Addr{ZoneID: int(nativeEndian.Uint32(b[24:28]))} @@ -174,7 +240,7 @@ func parseKernelInetAddr(af int, b []byte) (int, Addr, error) { off6 = 8 // offset of in6_addr ) switch { - case b[0] == 28: // size of sockaddr_in6 + case b[0] == sizeofSockaddrInet6: a := &Inet6Addr{} copy(a.IP[:], b[off6:off6+16]) return int(b[0]), a, nil @@ -186,7 +252,7 @@ func parseKernelInetAddr(af int, b []byte) (int, Addr, error) { copy(a.IP[:], b[l-off6:l]) } return int(b[0]), a, nil - case b[0] == 16: // size of sockaddr_in + case b[0] == sizeofSockaddrInet: a := &Inet4Addr{} copy(a.IP[:], b[off4:off4+4]) return int(b[0]), a, nil @@ -211,6 +277,24 @@ type DefaultAddr struct { // Family implements the Family method of Addr interface. func (a *DefaultAddr) Family() int { return a.af } +func (a *DefaultAddr) lenAndSpace() (int, int) { + l := len(a.Raw) + return l, roundup(l) +} + +func (a *DefaultAddr) marshal(b []byte) (int, error) { + l, ll := a.lenAndSpace() + if len(b) < ll { + return 0, errShortBuffer + } + if l > 255 { + return 0, errInvalidAddr + } + b[1] = byte(l) + copy(b[:l], a.Raw) + return ll, nil +} + func parseDefaultAddr(b []byte) (Addr, error) { if len(b) < 2 || len(b) < int(b[0]) { return nil, errInvalidAddr @@ -219,6 +303,66 @@ func parseDefaultAddr(b []byte) (Addr, error) { return a, nil } +func addrsSpace(as []Addr) int { + var l int + for _, a := range as { + switch a := a.(type) { + case *LinkAddr: + _, ll := a.lenAndSpace() + l += ll + case *Inet4Addr: + _, ll := a.lenAndSpace() + l += ll + case *Inet6Addr: + _, ll := a.lenAndSpace() + l += ll + case *DefaultAddr: + _, ll := a.lenAndSpace() + l += ll + } + } + return l +} + +// marshalAddrs marshals as and returns a bitmap indicating which +// address is stored in b. +func marshalAddrs(b []byte, as []Addr) (uint, error) { + var attrs uint + for i, a := range as { + switch a := a.(type) { + case *LinkAddr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + case *Inet4Addr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + case *Inet6Addr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + case *DefaultAddr: + l, err := a.marshal(b) + if err != nil { + return 0, err + } + b = b[l:] + attrs |= 1 << uint(i) + } + } + return attrs, nil +} + func parseAddrs(attrs uint, fn func(int, []byte) (int, Addr, error), b []byte) ([]Addr, error) { var as [sysRTAX_MAX]Addr af := int(sysAF_UNSPEC) diff --git a/vendor/golang.org/x/net/route/binary.go b/vendor/golang.org/x/net/route/binary.go index 4c561631b9..6910520eca 100644 --- a/vendor/golang.org/x/net/route/binary.go +++ b/vendor/golang.org/x/net/route/binary.go @@ -9,7 +9,7 @@ package route // This file contains duplicates of encoding/binary package. // // This package is supposed to be used by the net package of standard -// library. Therefore a package set used in the package must be the +// library. Therefore the package set used in the package must be the // same as net package. var ( diff --git a/vendor/golang.org/x/net/route/defs_darwin.go b/vendor/golang.org/x/net/route/defs_darwin.go index f452ad14ce..e7716442d2 100644 --- a/vendor/golang.org/x/net/route/defs_darwin.go +++ b/vendor/golang.org/x/net/route/defs_darwin.go @@ -13,6 +13,8 @@ package route #include #include #include + +#include */ import "C" @@ -23,6 +25,8 @@ const ( sysAF_LINK = C.AF_LINK sysAF_INET6 = C.AF_INET6 + sysSOCK_RAW = C.SOCK_RAW + sysNET_RT_DUMP = C.NET_RT_DUMP sysNET_RT_FLAGS = C.NET_RT_FLAGS sysNET_RT_IFLIST = C.NET_RT_IFLIST @@ -103,4 +107,8 @@ const ( sizeofRtMsghdrDarwin15 = C.sizeof_struct_rt_msghdr sizeofRtMsghdr2Darwin15 = C.sizeof_struct_rt_msghdr2 sizeofRtMetricsDarwin15 = C.sizeof_struct_rt_metrics + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 ) diff --git a/vendor/golang.org/x/net/route/defs_dragonfly.go b/vendor/golang.org/x/net/route/defs_dragonfly.go index c737751d76..dd31de269a 100644 --- a/vendor/golang.org/x/net/route/defs_dragonfly.go +++ b/vendor/golang.org/x/net/route/defs_dragonfly.go @@ -13,6 +13,8 @@ package route #include #include #include + +#include */ import "C" @@ -23,6 +25,8 @@ const ( sysAF_LINK = C.AF_LINK sysAF_INET6 = C.AF_INET6 + sysSOCK_RAW = C.SOCK_RAW + sysNET_RT_DUMP = C.NET_RT_DUMP sysNET_RT_FLAGS = C.NET_RT_FLAGS sysNET_RT_IFLIST = C.NET_RT_IFLIST @@ -102,4 +106,8 @@ const ( sizeofRtMsghdrDragonFlyBSD4 = C.sizeof_struct_rt_msghdr sizeofRtMetricsDragonFlyBSD4 = C.sizeof_struct_rt_metrics + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 ) diff --git a/vendor/golang.org/x/net/route/defs_freebsd.go b/vendor/golang.org/x/net/route/defs_freebsd.go index 8f834e81db..d95594d8ea 100644 --- a/vendor/golang.org/x/net/route/defs_freebsd.go +++ b/vendor/golang.org/x/net/route/defs_freebsd.go @@ -14,6 +14,8 @@ package route #include #include +#include + struct if_data_freebsd7 { u_char ifi_type; u_char ifi_physical; @@ -222,6 +224,8 @@ const ( sysAF_LINK = C.AF_LINK sysAF_INET6 = C.AF_INET6 + sysSOCK_RAW = C.SOCK_RAW + sysNET_RT_DUMP = C.NET_RT_DUMP sysNET_RT_FLAGS = C.NET_RT_FLAGS sysNET_RT_IFLIST = C.NET_RT_IFLIST @@ -326,4 +330,8 @@ const ( sizeofIfDataFreeBSD9Emu = C.sizeof_struct_if_data_freebsd9 sizeofIfDataFreeBSD10Emu = C.sizeof_struct_if_data_freebsd10 sizeofIfDataFreeBSD11Emu = C.sizeof_struct_if_data_freebsd11 + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 ) diff --git a/vendor/golang.org/x/net/route/defs_netbsd.go b/vendor/golang.org/x/net/route/defs_netbsd.go index b18d85e016..b0abd549a0 100644 --- a/vendor/golang.org/x/net/route/defs_netbsd.go +++ b/vendor/golang.org/x/net/route/defs_netbsd.go @@ -13,6 +13,8 @@ package route #include #include #include + +#include */ import "C" @@ -23,6 +25,8 @@ const ( sysAF_LINK = C.AF_LINK sysAF_INET6 = C.AF_INET6 + sysSOCK_RAW = C.SOCK_RAW + sysNET_RT_DUMP = C.NET_RT_DUMP sysNET_RT_FLAGS = C.NET_RT_FLAGS sysNET_RT_IFLIST = C.NET_RT_IFLIST @@ -101,4 +105,8 @@ const ( sizeofRtMsghdrNetBSD7 = C.sizeof_struct_rt_msghdr sizeofRtMetricsNetBSD7 = C.sizeof_struct_rt_metrics + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 ) diff --git a/vendor/golang.org/x/net/route/defs_openbsd.go b/vendor/golang.org/x/net/route/defs_openbsd.go index 5df7a43bc3..0f66d3619c 100644 --- a/vendor/golang.org/x/net/route/defs_openbsd.go +++ b/vendor/golang.org/x/net/route/defs_openbsd.go @@ -13,6 +13,8 @@ package route #include #include #include + +#include */ import "C" @@ -23,6 +25,8 @@ const ( sysAF_LINK = C.AF_LINK sysAF_INET6 = C.AF_INET6 + sysSOCK_RAW = C.SOCK_RAW + sysNET_RT_DUMP = C.NET_RT_DUMP sysNET_RT_FLAGS = C.NET_RT_FLAGS sysNET_RT_IFLIST = C.NET_RT_IFLIST @@ -91,3 +95,11 @@ const ( sysRTAX_LABEL = C.RTAX_LABEL sysRTAX_MAX = C.RTAX_MAX ) + +const ( + sizeofRtMsghdr = C.sizeof_struct_rt_msghdr + + sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage + sizeofSockaddrInet = C.sizeof_struct_sockaddr_in + sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 +) diff --git a/vendor/golang.org/x/net/route/message.go b/vendor/golang.org/x/net/route/message.go index d7ae0eb50f..0fa7e09f46 100644 --- a/vendor/golang.org/x/net/route/message.go +++ b/vendor/golang.org/x/net/route/message.go @@ -7,9 +7,6 @@ package route // A Message represents a routing message. -// -// Note: This interface will be changed to support Marshal method in -// future version. type Message interface { // Sys returns operating system-specific information. Sys() []Sys @@ -52,11 +49,10 @@ func ParseRIB(typ RIBType, b []byte) ([]Message, error) { b = b[l:] continue } - mtyp := int(b[3]) - if fn, ok := parseFns[mtyp]; !ok { + if w, ok := wireFormats[int(b[3])]; !ok { nskips++ } else { - m, err := fn(typ, b) + m, err := w.parse(typ, b) if err != nil { return nil, err } diff --git a/vendor/golang.org/x/net/route/message_test.go b/vendor/golang.org/x/net/route/message_test.go index c0c7c57a9a..b3bc60c626 100644 --- a/vendor/golang.org/x/net/route/message_test.go +++ b/vendor/golang.org/x/net/route/message_test.go @@ -33,11 +33,28 @@ func TestFetchAndParseRIB(t *testing.T) { } } +var ( + rtmonSock int + rtmonErr error +) + +func init() { + // We need to keep rtmonSock alive to avoid treading on + // recycled socket descriptors. + rtmonSock, rtmonErr = syscall.Socket(sysAF_ROUTE, sysSOCK_RAW, sysAF_UNSPEC) +} + +// TestMonitorAndParseRIB leaks a worker goroutine and a socket +// descriptor but that's intentional. func TestMonitorAndParseRIB(t *testing.T) { if testing.Short() || os.Getuid() != 0 { t.Skip("must be root") } + if rtmonErr != nil { + t.Fatal(rtmonErr) + } + // We suppose that using an IPv4 link-local address and the // dot1Q ID for Token Ring and FDDI doesn't harm anyone. pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"} @@ -49,16 +66,18 @@ func TestMonitorAndParseRIB(t *testing.T) { } pv.teardown() - s, err := syscall.Socket(syscall.AF_ROUTE, syscall.SOCK_RAW, syscall.AF_UNSPEC) - if err != nil { - t.Fatal(err) - } - defer syscall.Close(s) - go func() { b := make([]byte, os.Getpagesize()) for { - n, err := syscall.Read(s, b) + // There's no easy way to unblock this read + // call because the routing message exchange + // over routing socket is a connectionless + // message-oriented protocol, no control plane + // for signaling connectivity, and we cannot + // use the net package of standard library due + // to the lack of support for routing socket + // and circular dependency. + n, err := syscall.Read(rtmonSock, b) if err != nil { return } @@ -116,3 +135,99 @@ func TestParseRIBWithFuzz(t *testing.T) { } } } + +func TestRouteMessage(t *testing.T) { + s, err := syscall.Socket(sysAF_ROUTE, sysSOCK_RAW, sysAF_UNSPEC) + if err != nil { + t.Fatal(err) + } + defer syscall.Close(s) + + var ms []RouteMessage + for _, af := range []int{sysAF_INET, sysAF_INET6} { + rs, err := fetchAndParseRIB(af, sysNET_RT_DUMP) + if err != nil || len(rs) == 0 { + continue + } + switch af { + case sysAF_INET: + ms = append(ms, []RouteMessage{ + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet4Addr{IP: [4]byte{127, 0, 0, 1}}, + nil, + nil, + nil, + &LinkAddr{}, + &Inet4Addr{}, + nil, + &Inet4Addr{}, + }, + }, + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet4Addr{IP: [4]byte{127, 0, 0, 1}}, + }, + }, + }...) + case sysAF_INET6: + ms = append(ms, []RouteMessage{ + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet6Addr{IP: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}, + nil, + nil, + nil, + &LinkAddr{}, + &Inet6Addr{}, + nil, + &Inet6Addr{}, + }, + }, + { + Type: sysRTM_GET, + Addrs: []Addr{ + &Inet6Addr{IP: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}, + }, + }, + }...) + } + } + for i, m := range ms { + m.ID = uintptr(os.Getpid()) + m.Seq = i + 1 + wb, err := m.Marshal() + if err != nil { + t.Fatalf("%v: %v", m, err) + } + if _, err := syscall.Write(s, wb); err != nil { + t.Fatalf("%v: %v", m, err) + } + rb := make([]byte, os.Getpagesize()) + n, err := syscall.Read(s, rb) + if err != nil { + t.Fatalf("%v: %v", m, err) + } + rms, err := ParseRIB(0, rb[:n]) + if err != nil { + t.Fatalf("%v: %v", m, err) + } + for _, rm := range rms { + err := rm.(*RouteMessage).Err + if err != nil { + t.Errorf("%v: %v", m, err) + } + } + ss, err := msgs(rms).validate() + if err != nil { + t.Fatalf("%v: %v", m, err) + } + for _, s := range ss { + t.Log(s) + } + + } +} diff --git a/vendor/golang.org/x/net/route/route.go b/vendor/golang.org/x/net/route/route.go index c986e29ebc..081da0d5c1 100644 --- a/vendor/golang.org/x/net/route/route.go +++ b/vendor/golang.org/x/net/route/route.go @@ -24,21 +24,70 @@ var ( errMessageTooShort = errors.New("message too short") errInvalidMessage = errors.New("invalid message") errInvalidAddr = errors.New("invalid address") + errShortBuffer = errors.New("short buffer") ) // A RouteMessage represents a message conveying an address prefix, a // nexthop address and an output interface. +// +// Unlike other messages, this message can be used to query adjacency +// information for the given address prefix, to add a new route, and +// to delete or modify the existing route from the routing information +// base inside the kernel by writing and reading route messages on a +// routing socket. +// +// For the manipulation of routing information, the route message must +// contain appropriate fields that include: +// +// Version = +// Type = +// Flags = +// Index = +// ID = +// Seq = +// Addrs = +// +// The Type field specifies a type of manipulation, the Flags field +// specifies a class of target information and the Addrs field +// specifies target information like the following: +// +// route.RouteMessage{ +// Version: RTM_VERSION, +// Type: RTM_GET, +// Flags: RTF_UP | RTF_HOST, +// ID: uintptr(os.Getpid()), +// Seq: 1, +// Addrs: []route.Addrs{ +// RTAX_DST: &route.Inet4Addr{ ... }, +// RTAX_IFP: &route.LinkAddr{ ... }, +// RTAX_BRD: &route.Inet4Addr{ ... }, +// }, +// } +// +// The values for the above fields depend on the implementation of +// each operating system. +// +// The Err field on a response message contains an error value on the +// requested operation. If non-nil, the requested operation is failed. type RouteMessage struct { - Version int // message version - Type int // message type - Flags int // route flags - Index int // interface index when atatched - Addrs []Addr // addresses + Version int // message version + Type int // message type + Flags int // route flags + Index int // interface index when atatched + ID uintptr // sender's identifier; usually process ID + Seq int // sequence number + Err error // error on requested operation + Addrs []Addr // addresses extOff int // offset of header extension raw []byte // raw message } +// Marshal returns the binary encoding of m. +func (m *RouteMessage) Marshal() ([]byte, error) { + return m.marshal() +} + // A RIBType reprensents a type of routing information base. type RIBType int diff --git a/vendor/golang.org/x/net/route/route_classic.go b/vendor/golang.org/x/net/route/route_classic.go index d333c6aa52..61b2bb4add 100644 --- a/vendor/golang.org/x/net/route/route_classic.go +++ b/vendor/golang.org/x/net/route/route_classic.go @@ -6,6 +6,36 @@ package route +import "syscall" + +func (m *RouteMessage) marshal() ([]byte, error) { + w, ok := wireFormats[m.Type] + if !ok { + return nil, errUnsupportedMessage + } + l := w.bodyOff + addrsSpace(m.Addrs) + b := make([]byte, l) + nativeEndian.PutUint16(b[:2], uint16(l)) + if m.Version == 0 { + b[2] = sysRTM_VERSION + } else { + b[2] = byte(m.Version) + } + b[3] = byte(m.Type) + nativeEndian.PutUint32(b[8:12], uint32(m.Flags)) + nativeEndian.PutUint16(b[4:6], uint16(m.Index)) + nativeEndian.PutUint32(b[16:20], uint32(m.ID)) + nativeEndian.PutUint32(b[20:24], uint32(m.Seq)) + attrs, err := marshalAddrs(b[w.bodyOff:], m.Addrs) + if err != nil { + return nil, err + } + if attrs > 0 { + nativeEndian.PutUint32(b[12:16], uint32(attrs)) + } + return b, nil +} + func (w *wireFormat) parseRouteMessage(typ RIBType, b []byte) (Message, error) { if len(b) < w.bodyOff { return nil, errMessageTooShort @@ -19,9 +49,15 @@ func (w *wireFormat) parseRouteMessage(typ RIBType, b []byte) (Message, error) { Type: int(b[3]), Flags: int(nativeEndian.Uint32(b[8:12])), Index: int(nativeEndian.Uint16(b[4:6])), + ID: uintptr(nativeEndian.Uint32(b[16:20])), + Seq: int(nativeEndian.Uint32(b[20:24])), extOff: w.extOff, raw: b[:l], } + errno := syscall.Errno(nativeEndian.Uint32(b[28:32])) + if errno != 0 { + m.Err = errno + } var err error m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[w.bodyOff:]) if err != nil { diff --git a/vendor/golang.org/x/net/route/route_openbsd.go b/vendor/golang.org/x/net/route/route_openbsd.go index 76eae40d80..daf2e90c47 100644 --- a/vendor/golang.org/x/net/route/route_openbsd.go +++ b/vendor/golang.org/x/net/route/route_openbsd.go @@ -4,8 +4,35 @@ package route +import "syscall" + +func (m *RouteMessage) marshal() ([]byte, error) { + l := sizeofRtMsghdr + addrsSpace(m.Addrs) + b := make([]byte, l) + nativeEndian.PutUint16(b[:2], uint16(l)) + if m.Version == 0 { + b[2] = sysRTM_VERSION + } else { + b[2] = byte(m.Version) + } + b[3] = byte(m.Type) + nativeEndian.PutUint16(b[4:6], uint16(sizeofRtMsghdr)) + nativeEndian.PutUint32(b[16:20], uint32(m.Flags)) + nativeEndian.PutUint16(b[6:8], uint16(m.Index)) + nativeEndian.PutUint32(b[24:28], uint32(m.ID)) + nativeEndian.PutUint32(b[28:32], uint32(m.Seq)) + attrs, err := marshalAddrs(b[sizeofRtMsghdr:], m.Addrs) + if err != nil { + return nil, err + } + if attrs > 0 { + nativeEndian.PutUint32(b[12:16], uint32(attrs)) + } + return b, nil +} + func (*wireFormat) parseRouteMessage(_ RIBType, b []byte) (Message, error) { - if len(b) < 40 { + if len(b) < sizeofRtMsghdr { return nil, errMessageTooShort } l := int(nativeEndian.Uint16(b[:2])) @@ -17,12 +44,18 @@ func (*wireFormat) parseRouteMessage(_ RIBType, b []byte) (Message, error) { Type: int(b[3]), Flags: int(nativeEndian.Uint32(b[16:20])), Index: int(nativeEndian.Uint16(b[6:8])), + ID: uintptr(nativeEndian.Uint32(b[24:28])), + Seq: int(nativeEndian.Uint32(b[28:32])), raw: b[:l], } ll := int(nativeEndian.Uint16(b[4:6])) if len(b) < ll { return nil, errInvalidMessage } + errno := syscall.Errno(nativeEndian.Uint32(b[32:36])) + if errno != 0 { + m.Err = errno + } as, err := parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[ll:]) if err != nil { return nil, err diff --git a/vendor/golang.org/x/net/route/sys.go b/vendor/golang.org/x/net/route/sys.go index 80ca83ae13..3d0ee9b148 100644 --- a/vendor/golang.org/x/net/route/sys.go +++ b/vendor/golang.org/x/net/route/sys.go @@ -11,7 +11,7 @@ import "unsafe" var ( nativeEndian binaryByteOrder kernelAlign int - parseFns map[int]parseFn + wireFormats map[int]*wireFormat ) func init() { @@ -22,7 +22,7 @@ func init() { } else { nativeEndian = bigEndian } - kernelAlign, parseFns = probeRoutingStack() + kernelAlign, wireFormats = probeRoutingStack() } func roundup(l int) int { @@ -32,9 +32,8 @@ func roundup(l int) int { return (l + kernelAlign - 1) & ^(kernelAlign - 1) } -type parseFn func(RIBType, []byte) (Message, error) - type wireFormat struct { extOff int // offset of header extension bodyOff int // offset of message body + parse func(RIBType, []byte) (Message, error) } diff --git a/vendor/golang.org/x/net/route/sys_darwin.go b/vendor/golang.org/x/net/route/sys_darwin.go index fff3a0fd1d..e742c919db 100644 --- a/vendor/golang.org/x/net/route/sys_darwin.go +++ b/vendor/golang.org/x/net/route/sys_darwin.go @@ -49,32 +49,39 @@ func (m *InterfaceMessage) Sys() []Sys { } } -func probeRoutingStack() (int, map[int]parseFn) { +func probeRoutingStack() (int, map[int]*wireFormat) { rtm := &wireFormat{extOff: 36, bodyOff: sizeofRtMsghdrDarwin15} + rtm.parse = rtm.parseRouteMessage rtm2 := &wireFormat{extOff: 36, bodyOff: sizeofRtMsghdr2Darwin15} + rtm2.parse = rtm2.parseRouteMessage ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDarwin15} + ifm.parse = ifm.parseInterfaceMessage ifm2 := &wireFormat{extOff: 32, bodyOff: sizeofIfMsghdr2Darwin15} + ifm2.parse = ifm2.parseInterfaceMessage ifam := &wireFormat{extOff: sizeofIfaMsghdrDarwin15, bodyOff: sizeofIfaMsghdrDarwin15} + ifam.parse = ifam.parseInterfaceAddrMessage ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDarwin15, bodyOff: sizeofIfmaMsghdrDarwin15} + ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage ifmam2 := &wireFormat{extOff: sizeofIfmaMsghdr2Darwin15, bodyOff: sizeofIfmaMsghdr2Darwin15} + ifmam2.parse = ifmam2.parseInterfaceMulticastAddrMessage // Darwin kernels require 32-bit aligned access to routing facilities. - return 4, map[int]parseFn{ - sysRTM_ADD: rtm.parseRouteMessage, - sysRTM_DELETE: rtm.parseRouteMessage, - sysRTM_CHANGE: rtm.parseRouteMessage, - sysRTM_GET: rtm.parseRouteMessage, - sysRTM_LOSING: rtm.parseRouteMessage, - sysRTM_REDIRECT: rtm.parseRouteMessage, - sysRTM_MISS: rtm.parseRouteMessage, - sysRTM_LOCK: rtm.parseRouteMessage, - sysRTM_RESOLVE: rtm.parseRouteMessage, - sysRTM_NEWADDR: ifam.parseInterfaceAddrMessage, - sysRTM_DELADDR: ifam.parseInterfaceAddrMessage, - sysRTM_IFINFO: ifm.parseInterfaceMessage, - sysRTM_NEWMADDR: ifmam.parseInterfaceMulticastAddrMessage, - sysRTM_DELMADDR: ifmam.parseInterfaceMulticastAddrMessage, - sysRTM_IFINFO2: ifm2.parseInterfaceMessage, - sysRTM_NEWMADDR2: ifmam2.parseInterfaceMulticastAddrMessage, - sysRTM_GET2: rtm2.parseRouteMessage, + return 4, map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_NEWMADDR: ifmam, + sysRTM_DELMADDR: ifmam, + sysRTM_IFINFO2: ifm2, + sysRTM_NEWMADDR2: ifmam2, + sysRTM_GET2: rtm2, } } diff --git a/vendor/golang.org/x/net/route/sys_dragonfly.go b/vendor/golang.org/x/net/route/sys_dragonfly.go index da848b3d07..b175cb18ce 100644 --- a/vendor/golang.org/x/net/route/sys_dragonfly.go +++ b/vendor/golang.org/x/net/route/sys_dragonfly.go @@ -44,28 +44,33 @@ func (m *InterfaceMessage) Sys() []Sys { } } -func probeRoutingStack() (int, map[int]parseFn) { +func probeRoutingStack() (int, map[int]*wireFormat) { var p uintptr rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrDragonFlyBSD4} + rtm.parse = rtm.parseRouteMessage ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrDragonFlyBSD4} + ifm.parse = ifm.parseInterfaceMessage ifam := &wireFormat{extOff: sizeofIfaMsghdrDragonFlyBSD4, bodyOff: sizeofIfaMsghdrDragonFlyBSD4} + ifam.parse = ifam.parseInterfaceAddrMessage ifmam := &wireFormat{extOff: sizeofIfmaMsghdrDragonFlyBSD4, bodyOff: sizeofIfmaMsghdrDragonFlyBSD4} + ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrDragonFlyBSD4, bodyOff: sizeofIfAnnouncemsghdrDragonFlyBSD4} - return int(unsafe.Sizeof(p)), map[int]parseFn{ - sysRTM_ADD: rtm.parseRouteMessage, - sysRTM_DELETE: rtm.parseRouteMessage, - sysRTM_CHANGE: rtm.parseRouteMessage, - sysRTM_GET: rtm.parseRouteMessage, - sysRTM_LOSING: rtm.parseRouteMessage, - sysRTM_REDIRECT: rtm.parseRouteMessage, - sysRTM_MISS: rtm.parseRouteMessage, - sysRTM_LOCK: rtm.parseRouteMessage, - sysRTM_RESOLVE: rtm.parseRouteMessage, - sysRTM_NEWADDR: ifam.parseInterfaceAddrMessage, - sysRTM_DELADDR: ifam.parseInterfaceAddrMessage, - sysRTM_IFINFO: ifm.parseInterfaceMessage, - sysRTM_NEWMADDR: ifmam.parseInterfaceMulticastAddrMessage, - sysRTM_DELMADDR: ifmam.parseInterfaceMulticastAddrMessage, - sysRTM_IFANNOUNCE: ifanm.parseInterfaceAnnounceMessage, + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + return int(unsafe.Sizeof(p)), map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_NEWMADDR: ifmam, + sysRTM_DELMADDR: ifmam, + sysRTM_IFANNOUNCE: ifanm, } } diff --git a/vendor/golang.org/x/net/route/sys_freebsd.go b/vendor/golang.org/x/net/route/sys_freebsd.go index 7b05c1a5a0..010d4ae782 100644 --- a/vendor/golang.org/x/net/route/sys_freebsd.go +++ b/vendor/golang.org/x/net/route/sys_freebsd.go @@ -54,7 +54,7 @@ func (m *InterfaceMessage) Sys() []Sys { } } -func probeRoutingStack() (int, map[int]parseFn) { +func probeRoutingStack() (int, map[int]*wireFormat) { var p uintptr wordSize := int(unsafe.Sizeof(p)) align := int(unsafe.Sizeof(p)) @@ -130,21 +130,26 @@ func probeRoutingStack() (int, map[int]parseFn) { ifm.bodyOff = sizeofIfMsghdrFreeBSD11 } } - return align, map[int]parseFn{ - sysRTM_ADD: rtm.parseRouteMessage, - sysRTM_DELETE: rtm.parseRouteMessage, - sysRTM_CHANGE: rtm.parseRouteMessage, - sysRTM_GET: rtm.parseRouteMessage, - sysRTM_LOSING: rtm.parseRouteMessage, - sysRTM_REDIRECT: rtm.parseRouteMessage, - sysRTM_MISS: rtm.parseRouteMessage, - sysRTM_LOCK: rtm.parseRouteMessage, - sysRTM_RESOLVE: rtm.parseRouteMessage, - sysRTM_NEWADDR: ifam.parseInterfaceAddrMessage, - sysRTM_DELADDR: ifam.parseInterfaceAddrMessage, - sysRTM_IFINFO: ifm.parseInterfaceMessage, - sysRTM_NEWMADDR: ifmam.parseInterfaceMulticastAddrMessage, - sysRTM_DELMADDR: ifmam.parseInterfaceMulticastAddrMessage, - sysRTM_IFANNOUNCE: ifanm.parseInterfaceAnnounceMessage, + rtm.parse = rtm.parseRouteMessage + ifm.parse = ifm.parseInterfaceMessage + ifam.parse = ifam.parseInterfaceAddrMessage + ifmam.parse = ifmam.parseInterfaceMulticastAddrMessage + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + return align, map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_NEWMADDR: ifmam, + sysRTM_DELMADDR: ifmam, + sysRTM_IFANNOUNCE: ifanm, } } diff --git a/vendor/golang.org/x/net/route/sys_netbsd.go b/vendor/golang.org/x/net/route/sys_netbsd.go index 4d8076b518..b4e3301403 100644 --- a/vendor/golang.org/x/net/route/sys_netbsd.go +++ b/vendor/golang.org/x/net/route/sys_netbsd.go @@ -42,26 +42,30 @@ func (m *InterfaceMessage) Sys() []Sys { } } -func probeRoutingStack() (int, map[int]parseFn) { +func probeRoutingStack() (int, map[int]*wireFormat) { rtm := &wireFormat{extOff: 40, bodyOff: sizeofRtMsghdrNetBSD7} + rtm.parse = rtm.parseRouteMessage ifm := &wireFormat{extOff: 16, bodyOff: sizeofIfMsghdrNetBSD7} + ifm.parse = ifm.parseInterfaceMessage ifam := &wireFormat{extOff: sizeofIfaMsghdrNetBSD7, bodyOff: sizeofIfaMsghdrNetBSD7} + ifam.parse = ifam.parseInterfaceAddrMessage ifanm := &wireFormat{extOff: sizeofIfAnnouncemsghdrNetBSD7, bodyOff: sizeofIfAnnouncemsghdrNetBSD7} + ifanm.parse = ifanm.parseInterfaceAnnounceMessage // NetBSD 6 and above kernels require 64-bit aligned access to // routing facilities. - return 8, map[int]parseFn{ - sysRTM_ADD: rtm.parseRouteMessage, - sysRTM_DELETE: rtm.parseRouteMessage, - sysRTM_CHANGE: rtm.parseRouteMessage, - sysRTM_GET: rtm.parseRouteMessage, - sysRTM_LOSING: rtm.parseRouteMessage, - sysRTM_REDIRECT: rtm.parseRouteMessage, - sysRTM_MISS: rtm.parseRouteMessage, - sysRTM_LOCK: rtm.parseRouteMessage, - sysRTM_RESOLVE: rtm.parseRouteMessage, - sysRTM_NEWADDR: ifam.parseInterfaceAddrMessage, - sysRTM_DELADDR: ifam.parseInterfaceAddrMessage, - sysRTM_IFANNOUNCE: ifanm.parseInterfaceAnnounceMessage, - sysRTM_IFINFO: ifm.parseInterfaceMessage, + return 8, map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFANNOUNCE: ifanm, + sysRTM_IFINFO: ifm, } } diff --git a/vendor/golang.org/x/net/route/sys_openbsd.go b/vendor/golang.org/x/net/route/sys_openbsd.go index 26d0438696..8798dc4ca3 100644 --- a/vendor/golang.org/x/net/route/sys_openbsd.go +++ b/vendor/golang.org/x/net/route/sys_openbsd.go @@ -51,22 +51,29 @@ func (m *InterfaceMessage) Sys() []Sys { } } -func probeRoutingStack() (int, map[int]parseFn) { +func probeRoutingStack() (int, map[int]*wireFormat) { var p uintptr - nooff := &wireFormat{extOff: -1, bodyOff: -1} - return int(unsafe.Sizeof(p)), map[int]parseFn{ - sysRTM_ADD: nooff.parseRouteMessage, - sysRTM_DELETE: nooff.parseRouteMessage, - sysRTM_CHANGE: nooff.parseRouteMessage, - sysRTM_GET: nooff.parseRouteMessage, - sysRTM_LOSING: nooff.parseRouteMessage, - sysRTM_REDIRECT: nooff.parseRouteMessage, - sysRTM_MISS: nooff.parseRouteMessage, - sysRTM_LOCK: nooff.parseRouteMessage, - sysRTM_RESOLVE: nooff.parseRouteMessage, - sysRTM_NEWADDR: nooff.parseInterfaceAddrMessage, - sysRTM_DELADDR: nooff.parseInterfaceAddrMessage, - sysRTM_IFINFO: nooff.parseInterfaceMessage, - sysRTM_IFANNOUNCE: nooff.parseInterfaceAnnounceMessage, + rtm := &wireFormat{extOff: -1, bodyOff: -1} + rtm.parse = rtm.parseRouteMessage + ifm := &wireFormat{extOff: -1, bodyOff: -1} + ifm.parse = ifm.parseInterfaceMessage + ifam := &wireFormat{extOff: -1, bodyOff: -1} + ifam.parse = ifam.parseInterfaceAddrMessage + ifanm := &wireFormat{extOff: -1, bodyOff: -1} + ifanm.parse = ifanm.parseInterfaceAnnounceMessage + return int(unsafe.Sizeof(p)), map[int]*wireFormat{ + sysRTM_ADD: rtm, + sysRTM_DELETE: rtm, + sysRTM_CHANGE: rtm, + sysRTM_GET: rtm, + sysRTM_LOSING: rtm, + sysRTM_REDIRECT: rtm, + sysRTM_MISS: rtm, + sysRTM_LOCK: rtm, + sysRTM_RESOLVE: rtm, + sysRTM_NEWADDR: ifam, + sysRTM_DELADDR: ifam, + sysRTM_IFINFO: ifm, + sysRTM_IFANNOUNCE: ifanm, } } diff --git a/vendor/golang.org/x/net/route/syscall.go b/vendor/golang.org/x/net/route/syscall.go index d136325a30..c211188b10 100644 --- a/vendor/golang.org/x/net/route/syscall.go +++ b/vendor/golang.org/x/net/route/syscall.go @@ -11,10 +11,6 @@ import ( "unsafe" ) -// TODO: replace with runtime.KeepAlive when available -//go:noescape -func keepAlive(p unsafe.Pointer) - var zero uintptr func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) error { @@ -25,7 +21,6 @@ func sysctl(mib []int32, old *byte, oldlen *uintptr, new *byte, newlen uintptr) p = unsafe.Pointer(&zero) } _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(p), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - keepAlive(p) if errno != 0 { return error(errno) } diff --git a/vendor/golang.org/x/net/route/syscall.s b/vendor/golang.org/x/net/route/syscall.s deleted file mode 100644 index fa6297f0aa..0000000000 --- a/vendor/golang.org/x/net/route/syscall.s +++ /dev/null @@ -1,8 +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. - -#include "textflag.h" - -TEXT ·keepAlive(SB),NOSPLIT,$0 - RET diff --git a/vendor/golang.org/x/net/route/zsys_darwin.go b/vendor/golang.org/x/net/route/zsys_darwin.go index 265b81cd50..4e2e1ab090 100644 --- a/vendor/golang.org/x/net/route/zsys_darwin.go +++ b/vendor/golang.org/x/net/route/zsys_darwin.go @@ -10,6 +10,8 @@ const ( sysAF_LINK = 0x12 sysAF_INET6 = 0x1e + sysSOCK_RAW = 0x3 + sysNET_RT_DUMP = 0x1 sysNET_RT_FLAGS = 0x2 sysNET_RT_IFLIST = 0x3 @@ -90,4 +92,8 @@ const ( sizeofRtMsghdrDarwin15 = 0x5c sizeofRtMsghdr2Darwin15 = 0x5c sizeofRtMetricsDarwin15 = 0x38 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c ) diff --git a/vendor/golang.org/x/net/route/zsys_dragonfly.go b/vendor/golang.org/x/net/route/zsys_dragonfly.go index dd36dece0f..719c88d11f 100644 --- a/vendor/golang.org/x/net/route/zsys_dragonfly.go +++ b/vendor/golang.org/x/net/route/zsys_dragonfly.go @@ -10,6 +10,8 @@ const ( sysAF_LINK = 0x12 sysAF_INET6 = 0x1c + sysSOCK_RAW = 0x3 + sysNET_RT_DUMP = 0x1 sysNET_RT_FLAGS = 0x2 sysNET_RT_IFLIST = 0x3 @@ -89,4 +91,8 @@ const ( sizeofRtMsghdrDragonFlyBSD4 = 0x98 sizeofRtMetricsDragonFlyBSD4 = 0x70 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c ) diff --git a/vendor/golang.org/x/net/route/zsys_freebsd_386.go b/vendor/golang.org/x/net/route/zsys_freebsd_386.go index 9bac2e3900..b03bc01f65 100644 --- a/vendor/golang.org/x/net/route/zsys_freebsd_386.go +++ b/vendor/golang.org/x/net/route/zsys_freebsd_386.go @@ -10,6 +10,8 @@ const ( sysAF_LINK = 0x12 sysAF_INET6 = 0x1c + sysSOCK_RAW = 0x3 + sysNET_RT_DUMP = 0x1 sysNET_RT_FLAGS = 0x2 sysNET_RT_IFLIST = 0x3 @@ -117,4 +119,8 @@ const ( sizeofIfDataFreeBSD9Emu = 0x98 sizeofIfDataFreeBSD10Emu = 0x98 sizeofIfDataFreeBSD11Emu = 0x98 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c ) diff --git a/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go index b1920d7ac1..0b675b3d3f 100644 --- a/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go +++ b/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go @@ -10,6 +10,8 @@ const ( sysAF_LINK = 0x12 sysAF_INET6 = 0x1c + sysSOCK_RAW = 0x3 + sysNET_RT_DUMP = 0x1 sysNET_RT_FLAGS = 0x2 sysNET_RT_IFLIST = 0x3 @@ -114,4 +116,8 @@ const ( sizeofIfDataFreeBSD9Emu = 0x98 sizeofIfDataFreeBSD10Emu = 0x98 sizeofIfDataFreeBSD11Emu = 0x98 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c ) diff --git a/vendor/golang.org/x/net/route/zsys_freebsd_arm.go b/vendor/golang.org/x/net/route/zsys_freebsd_arm.go index a034d6fcbf..58f8ea16f2 100644 --- a/vendor/golang.org/x/net/route/zsys_freebsd_arm.go +++ b/vendor/golang.org/x/net/route/zsys_freebsd_arm.go @@ -10,6 +10,8 @@ const ( sysAF_LINK = 0x12 sysAF_INET6 = 0x1c + sysSOCK_RAW = 0x3 + sysNET_RT_DUMP = 0x1 sysNET_RT_FLAGS = 0x2 sysNET_RT_IFLIST = 0x3 @@ -114,4 +116,8 @@ const ( sizeofIfDataFreeBSD9Emu = 0x60 sizeofIfDataFreeBSD10Emu = 0x60 sizeofIfDataFreeBSD11Emu = 0x98 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c ) diff --git a/vendor/golang.org/x/net/route/zsys_netbsd.go b/vendor/golang.org/x/net/route/zsys_netbsd.go index aa4aad1613..e0df45e8b5 100644 --- a/vendor/golang.org/x/net/route/zsys_netbsd.go +++ b/vendor/golang.org/x/net/route/zsys_netbsd.go @@ -10,6 +10,8 @@ const ( sysAF_LINK = 0x12 sysAF_INET6 = 0x18 + sysSOCK_RAW = 0x3 + sysNET_RT_DUMP = 0x1 sysNET_RT_FLAGS = 0x2 sysNET_RT_IFLIST = 0x5 @@ -88,4 +90,8 @@ const ( sizeofRtMsghdrNetBSD7 = 0x78 sizeofRtMetricsNetBSD7 = 0x50 + + sizeofSockaddrStorage = 0x80 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c ) diff --git a/vendor/golang.org/x/net/route/zsys_openbsd.go b/vendor/golang.org/x/net/route/zsys_openbsd.go index 4fadc4e8fa..f5a1ff9673 100644 --- a/vendor/golang.org/x/net/route/zsys_openbsd.go +++ b/vendor/golang.org/x/net/route/zsys_openbsd.go @@ -10,6 +10,8 @@ const ( sysAF_LINK = 0x12 sysAF_INET6 = 0x18 + sysSOCK_RAW = 0x3 + sysNET_RT_DUMP = 0x1 sysNET_RT_FLAGS = 0x2 sysNET_RT_IFLIST = 0x3 @@ -78,3 +80,11 @@ const ( sysRTAX_LABEL = 0xa sysRTAX_MAX = 0xb ) + +const ( + sizeofRtMsghdr = 0x60 + + sizeofSockaddrStorage = 0x100 + sizeofSockaddrInet = 0x10 + sizeofSockaddrInet6 = 0x1c +) diff --git a/vendor/golang.org/x/net/webdav/internal/xml/marshal.go b/vendor/golang.org/x/net/webdav/internal/xml/marshal.go index 3c3b6aca58..cb82ec2143 100644 --- a/vendor/golang.org/x/net/webdav/internal/xml/marshal.go +++ b/vendor/golang.org/x/net/webdav/internal/xml/marshal.go @@ -26,9 +26,9 @@ const ( // // Marshal handles an array or slice by marshalling each of the elements. // Marshal handles a pointer by marshalling the value it points at or, if the -// pointer is nil, by writing nothing. Marshal handles an interface value by +// pointer is nil, by writing nothing. Marshal handles an interface value by // marshalling the value it contains or, if the interface value is nil, by -// writing nothing. Marshal handles all other data by writing one or more XML +// writing nothing. Marshal handles all other data by writing one or more XML // elements containing the data. // // The name for the XML elements is taken from, in order of preference: @@ -61,7 +61,7 @@ const ( // value were part of the outer struct. // // If a field uses a tag "a>b>c", then the element c will be nested inside -// parent elements a and b. Fields that appear next to each other that name +// parent elements a and b. Fields that appear next to each other that name // the same parent will be enclosed in one XML element. // // See MarshalIndent for an example. @@ -222,7 +222,7 @@ func (enc *Encoder) EncodeToken(t Token) error { return p.cachedWriteError() case ProcInst: // First token to be encoded which is also a ProcInst with target of xml - // is the xml declaration. The only ProcInst where target of xml is allowed. + // is the xml declaration. The only ProcInst where target of xml is allowed. if t.Target == "xml" && p.Buffered() != 0 { return fmt.Errorf("xml: EncodeToken of ProcInst xml target only valid for xml declaration, first token encoded") } 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 3ece08c497..4089056a1f 100644 --- a/vendor/golang.org/x/net/webdav/internal/xml/read.go +++ b/vendor/golang.org/x/net/webdav/internal/xml/read.go @@ -27,7 +27,7 @@ import ( // discarded. // // Because Unmarshal uses the reflect package, it can only assign -// to exported (upper case) fields. Unmarshal uses a case-sensitive +// to exported (upper case) fields. Unmarshal uses a case-sensitive // comparison to match XML element names to tag values and struct // field names. // @@ -37,7 +37,7 @@ import ( // // * If the struct has a field of type []byte or string with tag // ",innerxml", Unmarshal accumulates the raw XML nested inside the -// element in that field. The rest of the rules still apply. +// element in that field. The rest of the rules still apply. // // * If the struct has a field named XMLName of type xml.Name, // Unmarshal records the element name in that field. @@ -59,7 +59,7 @@ import ( // // * If the XML element contains comments, they are accumulated in // the first struct field that has tag ",comment". The struct -// field may have type []byte or string. If there is no such +// field may have type []byte or string. If there is no such // field, the comments are discarded. // // * If the XML element contains a sub-element whose name matches @@ -102,7 +102,7 @@ import ( // // Unmarshal maps an XML element or attribute value to an integer or // floating-point field by setting the field to the result of -// interpreting the string value in decimal. There is no check for +// interpreting the string value in decimal. There is no check for // overflow. // // Unmarshal maps an XML element to an xml.Name by recording the diff --git a/vendor/golang.org/x/net/webdav/internal/xml/xml.go b/vendor/golang.org/x/net/webdav/internal/xml/xml.go index ffab4a70c9..5b79cbecb4 100644 --- a/vendor/golang.org/x/net/webdav/internal/xml/xml.go +++ b/vendor/golang.org/x/net/webdav/internal/xml/xml.go @@ -252,7 +252,7 @@ func NewDecoder(r io.Reader) *Decoder { // // Slices of bytes in the returned token data refer to the // parser's internal buffer and remain valid only until the next -// call to Token. To acquire a copy of the bytes, call CopyToken +// call to Token. To acquire a copy of the bytes, call CopyToken // or the token's Copy method. // // Token expands self-closing elements such as
    @@ -360,7 +360,7 @@ func (d *Decoder) switchToReader(r io.Reader) { } // Parsing state - stack holds old name space translations -// and the current set of open elements. The translations to pop when +// and the current set of open elements. The translations to pop when // ending a given tag are *below* it on the stack, which is // more work but forced on us by XML. type stack struct { @@ -1253,7 +1253,7 @@ func isNameString(s string) bool { // These tables were generated by cut and paste from Appendix B of // the XML spec at http://www.xml.com/axml/testaxml.htm -// and then reformatting. First corresponds to (Letter | '_' | ':') +// and then reformatting. First corresponds to (Letter | '_' | ':') // and second corresponds to NameChar. var first = &unicode.RangeTable{ diff --git a/vendor/golang.org/x/sys/unix/asm.s b/vendor/golang.org/x/sys/unix/asm.s deleted file mode 100644 index 8ed2fdb94b..0000000000 --- a/vendor/golang.org/x/sys/unix/asm.s +++ /dev/null @@ -1,10 +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. - -// +build !gccgo - -#include "textflag.h" - -TEXT ·use(SB),NOSPLIT,$0 - RET diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index 2a1473f161..c1fc2adb88 100755 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -89,6 +89,8 @@ case "$1" in -syscalls) for i in zsyscall*go do + # Run the command line that appears in the first line + # of the generated file to regenerate it. sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i rm _$i done @@ -280,7 +282,7 @@ esac syscall_goos="syscall_bsd.go $syscall_goos" ;; esac - if [ -n "$mksyscall" ]; then echo "$mksyscall $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi + if [ -n "$mksyscall" ]; then echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi ;; esac if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 7e6276b9c3..8da63576a3 100755 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -114,13 +114,16 @@ includes_Linux=' #include #include #include +#include #include #include #include #include #include +#include #include #include +#include #include #include #include @@ -129,6 +132,7 @@ includes_Linux=' #include #include #include +#include #include #include @@ -144,6 +148,10 @@ includes_Linux=' #define PTRACE_SETREGS 0xd #endif +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + #ifdef SOL_BLUETOOTH // SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h // but it is already in bluetooth_linux.go @@ -312,6 +320,7 @@ ccflags="$@" $2 ~ /^IN_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 ~ /^FALLOC_/ || $2 == "ICMPV6_FILTER" || $2 == "SOMAXCONN" || $2 == "NAME_MAX" || @@ -341,8 +350,13 @@ ccflags="$@" $2 ~ /^(BPF|DLT)_/ || $2 ~ /^CLOCK_/ || $2 ~ /^CAN_/ || + $2 ~ /^ALG_/ || + $2 ~ /^GRND_/ || + $2 ~ /^SPLICE_/ || + $2 ~ /^(VM|VMADDR)_/ || $2 !~ "WMESGLEN" && - $2 ~ /^W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^W[A-Z0-9]+$/ || + $2 ~ /^BLK/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} @@ -456,7 +470,7 @@ main(void) printf("\t%d: \"%s\",\n", e, buf); } printf("}\n\n"); - + printf("\n\n// Signal table\n"); printf("var signals = [...]string {\n"); qsort(signals, nelem(signals), sizeof signals[0], intcmp); diff --git a/vendor/golang.org/x/sys/unix/mksyscall.pl b/vendor/golang.org/x/sys/unix/mksyscall.pl index b1e7766dae..34f8ef829b 100755 --- a/vendor/golang.org/x/sys/unix/mksyscall.pl +++ b/vendor/golang.org/x/sys/unix/mksyscall.pl @@ -29,6 +29,7 @@ my $openbsd = 0; my $netbsd = 0; my $dragonfly = 0; my $arm = 0; # 64-bit value should use (even, odd)-pair +my $tags = ""; # build tags if($ARGV[0] eq "-b32") { $_32bit = "big-endian"; @@ -57,14 +58,14 @@ if($ARGV[0] eq "-arm") { $arm = 1; shift; } - -if($ARGV[0] =~ /^-/) { - print STDERR "usage: mksyscall.pl [-b32 | -l32] [file ...]\n"; - exit 1; +if($ARGV[0] eq "-tags") { + shift; + $tags = $ARGV[0]; + shift; } -if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { - print STDERR "GOARCH or GOOS not defined in environment\n"; +if($ARGV[0] =~ /^-/) { + print STDERR "usage: mksyscall.pl [-b32 | -l32] [-tags x,y] [file ...]\n"; exit 1; } @@ -132,7 +133,6 @@ while(<>) { # Prepare arguments to Syscall. my @args = (); - my @uses = (); my $n = 0; foreach my $p (@in) { my ($name, $type) = parseparam($p); @@ -143,14 +143,12 @@ while(<>) { $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; push @args, "uintptr(unsafe.Pointer(_p$n))"; - push @uses, "use(unsafe.Pointer(_p$n))"; $n++; } elsif($type eq "string") { print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; $text .= "\tvar _p$n *byte\n"; $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; push @args, "uintptr(unsafe.Pointer(_p$n))"; - push @uses, "use(unsafe.Pointer(_p$n))"; $n++; } elsif($type =~ /^\[\](.*)/) { # Convert slice into pointer, length. @@ -185,7 +183,7 @@ while(<>) { } } elsif($type eq "int64" && $_32bit ne "") { if(@args % 2 && $arm) { - # arm abi specifies 64-bit argument uses + # arm abi specifies 64-bit argument uses # (even, odd) pair push @args, "0" } @@ -278,11 +276,8 @@ while(<>) { } else { $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; } - foreach my $use (@uses) { - $text .= "\t$use\n"; - } $text .= $body; - + if ($plan9 && $ret[2] eq "e1") { $text .= "\tif int32(r0) == -1 {\n"; $text .= "\t\terr = e1\n"; @@ -307,7 +302,7 @@ print <) { # Prepare arguments to Syscall. my @args = (); - my @uses = (); my $n = 0; foreach my $p (@in) { my ($name, $type) = parseparam($p); @@ -149,14 +149,12 @@ while(<>) { $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; push @args, "uintptr(unsafe.Pointer(_p$n))"; - push @uses, "use(unsafe.Pointer(_p$n))"; $n++; } elsif($type eq "string") { print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; $text .= "\tvar _p$n $strconvtype\n"; $text .= "\t_p$n, _ = $strconvfunc($name)\n"; push @args, "uintptr(unsafe.Pointer(_p$n))"; - push @uses, "use(unsafe.Pointer(_p$n))"; $n++; } elsif($type =~ /^\[\](.*)/) { # Convert slice into pointer, length. @@ -243,9 +241,6 @@ while(<>) { } else { $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; } - foreach my $use (@uses) { - $text .= "\t$use\n"; - } $text .= $body; if ($do_errno) { @@ -265,7 +260,7 @@ print <){ if(/^#define __NR_Linux\s+([0-9]+)/){ # mips/mips64: extract offset $offset = $1; } + elsif(/^#define __NR(\w*)_SYSCALL_BASE\s+([0-9]+)/){ + # arm: extract offset + $offset = $1; + } elsif(/^#define __NR_syscalls\s+/) { # ignore redefinitions of __NR_syscalls } + elsif(/^#define __NR_(\w*)Linux_syscalls\s+/) { + # mips/mips64: ignore definitions about the number of syscalls + } elsif(/^#define __NR_(\w+)\s+([0-9]+)/){ $prev = $2; fmt($1, $2); @@ -61,6 +68,9 @@ while(){ elsif(/^#define __NR_(\w+)\s+\(__NR_Linux \+ ([0-9]+)/){ fmt($1, $2); } + elsif(/^#define __NR_(\w+)\s+\(__NR_SYSCALL_BASE \+ ([0-9]+)/){ + fmt($1, $2); + } } print < 13 { + return nil, 0, EINVAL + } + if len(sa.Name) > 63 { + return nil, 0, EINVAL + } + + sa.raw.Family = AF_ALG + sa.raw.Feat = sa.Feature + sa.raw.Mask = sa.Mask + + typ, err := ByteSliceFromString(sa.Type) + if err != nil { + return nil, 0, err + } + name, err := ByteSliceFromString(sa.Name) + if err != nil { + return nil, 0, err + } + + copy(sa.raw.Type[:], typ) + copy(sa.raw.Name[:], name) + + return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil +} + +// SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets. +// SockaddrVM provides access to Linux VM sockets: a mechanism that enables +// bidirectional communication between a hypervisor and its guest virtual +// machines. +type SockaddrVM struct { + // CID and Port specify a context ID and port address for a VM socket. + // Guests have a unique CID, and hosts may have a well-known CID of: + // - VMADDR_CID_HYPERVISOR: refers to the hypervisor process. + // - VMADDR_CID_HOST: refers to other processes on the host. + CID uint32 + Port uint32 + raw RawSockaddrVM +} + +func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_VSOCK + sa.raw.Port = sa.Port + sa.raw.Cid = sa.CID + + return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil +} + func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_NETLINK: @@ -521,6 +642,14 @@ func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { sa.Addr[i] = pp.Addr[i] } return sa, nil + + case AF_VSOCK: + pp := (*RawSockaddrVM)(unsafe.Pointer(rsa)) + sa := &SockaddrVM{ + CID: pp.Cid, + Port: pp.Port, + } + return sa, nil } return nil, EAFNOSUPPORT } @@ -939,6 +1068,7 @@ func Getpgrp() (pid int) { //sysnb Getpid() (pid int) //sysnb Getppid() (ppid int) //sys Getpriority(which int, who int) (prio int, err error) +//sys Getrandom(buf []byte, flags int) (n int, err error) //sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Getsid(pid int) (sid int, err error) //sysnb Gettid() (tid int) @@ -1019,6 +1149,25 @@ func Munmap(b []byte) (err error) { //sys Mlockall(flags int) (err error) //sys Munlockall() (err error) +// Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, +// using the specified flags. +func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { + n, _, errno := Syscall6( + SYS_VMSPLICE, + uintptr(fd), + uintptr(unsafe.Pointer(&iovs[0])), + uintptr(len(iovs)), + uintptr(flags), + 0, + 0, + ) + if errno != 0 { + return 0, syscall.Errno(errno) + } + + return int(n), nil +} + /* * Unimplemented */ @@ -1146,7 +1295,6 @@ func Munmap(b []byte) (err error) { // Utimensat // Vfork // Vhangup -// Vmsplice // Vserver // Waitid // _Sysctl diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index 5ed801369d..be77d24a4a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -73,7 +73,6 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, func Fstatfs(fd int, buf *Statfs_t) (err error) { _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) - use(unsafe.Pointer(buf)) if e != 0 { err = errnoErr(e) } @@ -86,7 +85,6 @@ func Statfs(path string, buf *Statfs_t) (err error) { return err } _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(p)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) - use(unsafe.Pointer(p)) if e != 0 { err = errnoErr(e) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index 81c5f47322..1708a4bbf9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -132,7 +132,6 @@ func (cmsg *Cmsghdr) SetLen(length int) { func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)} r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0) - use(unsafe.Pointer(&mmap_args[0])) xaddr = uintptr(r0) if e1 != 0 { err = errnoErr(e1) diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 554a823426..246131d2af 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -111,7 +111,6 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) } r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = e1 diff --git a/vendor/golang.org/x/sys/unix/types_linux.go b/vendor/golang.org/x/sys/unix/types_linux.go index f3d8f90ee2..ae79779ed3 100644 --- a/vendor/golang.org/x/sys/unix/types_linux.go +++ b/vendor/golang.org/x/sys/unix/types_linux.go @@ -59,6 +59,8 @@ package unix #include #include #include +#include +#include #ifdef TCSETS2 // On systems that have "struct termios2" use this as type Termios. @@ -221,6 +223,10 @@ type RawSockaddrHCI C.struct_sockaddr_hci type RawSockaddrCAN C.struct_sockaddr_can +type RawSockaddrALG C.struct_sockaddr_alg + +type RawSockaddrVM C.struct_sockaddr_vm + type RawSockaddr C.struct_sockaddr type RawSockaddrAny C.struct_sockaddr_any @@ -262,6 +268,8 @@ const ( SizeofSockaddrNetlink = C.sizeof_struct_sockaddr_nl SizeofSockaddrHCI = C.sizeof_struct_sockaddr_hci SizeofSockaddrCAN = C.sizeof_struct_sockaddr_can + SizeofSockaddrALG = C.sizeof_struct_sockaddr_alg + SizeofSockaddrVM = C.sizeof_struct_sockaddr_vm SizeofLinger = C.sizeof_struct_linger SizeofIPMreq = C.sizeof_struct_ip_mreq SizeofIPMreqn = C.sizeof_struct_ip_mreqn diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index b40d0299b5..2d02caf0e4 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -51,8 +51,16 @@ const ( AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 @@ -145,6 +153,21 @@ const ( B75 = 0x2 B921600 = 0x1007 B9600 = 0xd + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 @@ -385,6 +408,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -424,6 +453,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 @@ -808,6 +839,7 @@ const ( NLM_F_ATOMIC = 0x400 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 @@ -1247,6 +1279,7 @@ const ( SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a + SOL_NETLINK = 0x10e SOL_PACKET = 0x107 SOL_RAW = 0xff SOL_SOCKET = 0x1 @@ -1292,6 +1325,17 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1464,6 +1508,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x6 VQUIT = 0x1 VREPRINT = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 9f0600ccbd..f21dcd9dc7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -51,8 +51,16 @@ const ( AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 @@ -145,6 +153,21 @@ const ( B75 = 0x2 B921600 = 0x1007 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 @@ -385,6 +408,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -424,6 +453,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 @@ -766,6 +797,7 @@ const ( NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe @@ -778,14 +810,19 @@ const ( NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 @@ -808,6 +845,7 @@ const ( NLM_F_ATOMIC = 0x400 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 @@ -1248,6 +1286,7 @@ const ( SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a + SOL_NETLINK = 0x10e SOL_PACKET = 0x107 SOL_RAW = 0xff SOL_SOCKET = 0x1 @@ -1293,6 +1332,17 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1465,7 +1515,13 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VREPRINT = 0xc VSTART = 0x8 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index 647a796e39..7889e6477c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -50,8 +50,16 @@ const ( AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 @@ -141,6 +149,21 @@ const ( B75 = 0x2 B921600 = 0x1007 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 @@ -370,6 +393,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -409,6 +438,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 @@ -726,6 +757,7 @@ const ( NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe NETLINK_DROP_MEMBERSHIP = 0x2 NETLINK_ECRYPTFS = 0x13 @@ -742,8 +774,11 @@ const ( NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 @@ -766,6 +801,7 @@ const ( NLM_F_ATOMIC = 0x400 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 NLM_F_MATCH = 0x200 @@ -1171,6 +1207,7 @@ const ( SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a + SOL_NETLINK = 0x10e SOL_PACKET = 0x107 SOL_RAW = 0xff SOL_SOCKET = 0x1 @@ -1216,6 +1253,17 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1388,6 +1436,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x6 VQUIT = 0x1 VREPRINT = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index a6d1e1fa34..16a18f595b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -54,6 +54,13 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 @@ -149,6 +156,21 @@ const ( B75 = 0x2 B921600 = 0x1007 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 @@ -399,6 +421,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -438,6 +466,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 @@ -795,6 +825,7 @@ const ( NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe @@ -807,6 +838,8 @@ const ( NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 @@ -840,6 +873,7 @@ const ( NLM_F_ATOMIC = 0x400 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 @@ -1294,6 +1328,7 @@ const ( SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a + SOL_NETLINK = 0x10e SOL_PACKET = 0x107 SOL_RAW = 0xff SOL_SOCKET = 0x1 @@ -1347,7 +1382,18 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1542,6 +1588,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x6 VQUIT = 0x1 VREPRINT = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index e4fb9ad579..80e69e4cb0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -50,8 +50,16 @@ const ( AF_TIPC = 0x1e AF_UNIX = 0x1 AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 @@ -144,6 +152,21 @@ const ( B75 = 0x2 B921600 = 0x1007 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 @@ -375,6 +398,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -414,6 +443,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 @@ -753,6 +784,7 @@ const ( NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe @@ -765,14 +797,19 @@ const ( NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 NETLINK_PKTINFO = 0x3 NETLINK_RDMA = 0x14 NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 NETLINK_SCSITRANSPORT = 0x12 NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 @@ -795,6 +832,7 @@ const ( NLM_F_ATOMIC = 0x400 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 @@ -1221,6 +1259,7 @@ const ( SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a + SOL_NETLINK = 0x10e SOL_PACKET = 0x107 SOL_RAW = 0xff SOL_SOCKET = 0xffff @@ -1267,6 +1306,17 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1435,6 +1485,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VQUIT = 0x1 VREPRINT = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 36535b242d..9c91dbf601 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -56,6 +56,13 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 @@ -152,6 +159,21 @@ const ( B75 = 0x2 B921600 = 0x1007 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 @@ -374,6 +396,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FLUSHO = 0x2000 @@ -413,6 +441,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 ICANON = 0x2 ICMPV6_FILTER = 0x1 @@ -806,6 +836,7 @@ const ( NLM_F_ATOMIC = 0x400 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 @@ -1304,6 +1335,7 @@ const ( SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a + SOL_NETLINK = 0x10e SOL_PACKET = 0x107 SOL_RAW = 0xff SOL_SOCKET = 0xffff @@ -1362,7 +1394,18 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1540,6 +1583,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VQUIT = 0x1 VREPRINT = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 112f05de56..fb15b41ed2 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -56,6 +56,13 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 @@ -152,6 +159,21 @@ const ( B75 = 0x2 B921600 = 0x1007 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BPF_A = 0x10 BPF_ABS = 0x20 BPF_ADD = 0x0 @@ -374,6 +396,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FLUSHO = 0x2000 @@ -413,6 +441,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 ICANON = 0x2 ICMPV6_FILTER = 0x1 @@ -806,6 +836,7 @@ const ( NLM_F_ATOMIC = 0x400 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 @@ -1304,6 +1335,7 @@ const ( SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a + SOL_NETLINK = 0x10e SOL_PACKET = 0x107 SOL_RAW = 0xff SOL_SOCKET = 0xffff @@ -1362,7 +1394,18 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1540,6 +1583,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VQUIT = 0x1 VREPRINT = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 0f5ee22375..9a3a73766c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -57,6 +57,13 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 @@ -153,6 +160,21 @@ const ( B75 = 0x2 B921600 = 0x1007 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 @@ -411,6 +433,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -453,6 +481,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 @@ -1437,7 +1467,18 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1641,6 +1682,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VQUIT = 0x1 VREPRINT = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 4e4193951b..4d602e6d2b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -54,6 +54,13 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 @@ -150,6 +157,21 @@ const ( B75 = 0x2 B921600 = 0x16 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1f BPF_A = 0x10 BPF_ABS = 0x20 @@ -401,6 +423,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -443,6 +471,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x4000 IBSHIFT = 0x10 ICANON = 0x100 @@ -785,6 +815,7 @@ const ( NETLINK_ADD_MEMBERSHIP = 0x1 NETLINK_AUDIT = 0x9 NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa NETLINK_CONNECTOR = 0xb NETLINK_CRYPTO = 0x15 NETLINK_DNRTMSG = 0xe @@ -797,6 +828,8 @@ const ( NETLINK_IP6_FW = 0xd NETLINK_ISCSI = 0x8 NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 NETLINK_NETFILTER = 0xc NETLINK_NFLOG = 0x5 NETLINK_NO_ENOBUFS = 0x5 @@ -832,6 +865,7 @@ const ( NLM_F_ATOMIC = 0x400 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 @@ -1361,6 +1395,7 @@ const ( SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a + SOL_NETLINK = 0x10e SOL_PACKET = 0x107 SOL_RAW = 0xff SOL_SOCKET = 0x1 @@ -1415,7 +1450,18 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1614,6 +1660,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x5 VQUIT = 0x1 VREPRINT = 0xb diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 407e6b5392..5280d9e8c0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -54,6 +54,13 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 ARPHRD_ARCNET = 0x7 @@ -149,6 +156,21 @@ const ( B75 = 0x2 B921600 = 0x16 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1f BPF_A = 0x10 BPF_ABS = 0x20 @@ -397,6 +419,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -436,6 +464,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x4000 IBSHIFT = 0x10 ICANON = 0x100 @@ -840,6 +870,7 @@ const ( NLM_F_ATOMIC = 0x400 NLM_F_CREATE = 0x400 NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 NLM_F_DUMP_INTR = 0x10 NLM_F_ECHO = 0x8 NLM_F_EXCL = 0x200 @@ -1361,6 +1392,7 @@ const ( SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a + SOL_NETLINK = 0x10e SOL_PACKET = 0x107 SOL_RAW = 0xff SOL_SOCKET = 0x1 @@ -1414,7 +1446,18 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1613,6 +1656,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x5 VQUIT = 0x1 VREPRINT = 0xb diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 40c9b87931..81ad7a8760 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -56,6 +56,13 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 @@ -152,6 +159,21 @@ const ( B75 = 0x2 B921600 = 0x1007 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 @@ -407,6 +429,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -449,6 +477,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x2 F_WRLCK = 0x1 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 @@ -1412,6 +1442,7 @@ const ( SOL_IP = 0x0 SOL_IPV6 = 0x29 SOL_IRDA = 0x10a + SOL_NETLINK = 0x10e SOL_PACKET = 0x107 SOL_RAW = 0xff SOL_SOCKET = 0x1 @@ -1469,7 +1500,18 @@ const ( SO_TIMESTAMPING = 0x25 SO_TIMESTAMPNS = 0x23 SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x29 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1672,6 +1714,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x6 VQUIT = 0x1 VREPRINT = 0xc diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 62680ed8aa..95de199fc4 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -57,6 +57,13 @@ const ( AF_VSOCK = 0x28 AF_WANPIPE = 0x19 AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 ARPHRD_6LOWPAN = 0x339 ARPHRD_ADAPT = 0x108 ARPHRD_APPLETLK = 0x8 @@ -156,6 +163,21 @@ const ( B76800 = 0x1005 B921600 = 0x1009 B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 BOTHER = 0x1000 BPF_A = 0x10 BPF_ABS = 0x20 @@ -415,6 +437,12 @@ const ( EXTA = 0xe EXTB = 0xf EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -457,6 +485,8 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x3 F_WRLCK = 0x2 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 HUPCL = 0x400 IBSHIFT = 0x10 ICANON = 0x2 @@ -1510,7 +1540,18 @@ const ( SO_TIMESTAMPING = 0x23 SO_TIMESTAMPNS = 0x21 SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 SO_WIFI_STATUS = 0x25 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 S_BLKSIZE = 0x200 S_IEXEC = 0x40 S_IFBLK = 0x6000 @@ -1715,6 +1756,11 @@ const ( VINTR = 0x0 VKILL = 0x3 VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff VMIN = 0x4 VQUIT = 0x1 VREPRINT = 0xc diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go index 031034a345..e48f4a5c1c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -1,7 +1,7 @@ -// mksyscall.pl -l32 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go +// mksyscall.pl -l32 -tags darwin,386 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build 386,darwin +// +build darwin,386 package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -307,7 +305,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -333,7 +330,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -349,7 +345,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -365,7 +360,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -381,7 +375,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -397,7 +390,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -449,8 +441,6 @@ func Exchangedata(path1 string, path2 string, options int) (err error) { return } _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -727,7 +717,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -748,8 +737,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -775,7 +762,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -791,7 +777,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -807,7 +792,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -823,7 +807,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -907,7 +890,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -924,7 +906,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -998,7 +979,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1020,8 +1000,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1037,7 +1015,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1053,7 +1030,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1120,7 +1096,6 @@ func Setlogin(name string) (err error) { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1227,7 +1202,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1243,7 +1217,6 @@ func Statfs(path string, stat *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1264,8 +1237,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1291,7 +1262,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1315,7 +1285,6 @@ func Undelete(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1331,7 +1300,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1347,7 +1315,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index ee96f78bad..672ada0e44 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go +// mksyscall.pl -tags darwin,amd64 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build amd64,darwin +// +build darwin,amd64 package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -307,7 +305,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -333,7 +330,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -349,7 +345,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -365,7 +360,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -381,7 +375,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -397,7 +390,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -449,8 +441,6 @@ func Exchangedata(path1 string, path2 string, options int) (err error) { return } _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -727,7 +717,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -748,8 +737,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -775,7 +762,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -791,7 +777,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -807,7 +792,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -823,7 +807,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -907,7 +890,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -924,7 +906,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -998,7 +979,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1020,8 +1000,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1037,7 +1015,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1053,7 +1030,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1120,7 +1096,6 @@ func Setlogin(name string) (err error) { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1227,7 +1202,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1243,7 +1217,6 @@ func Statfs(path string, stat *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1264,8 +1237,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1291,7 +1262,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1315,7 +1285,6 @@ func Undelete(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1331,7 +1300,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1347,7 +1315,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1423,7 +1390,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go index e52cd0d54c..d516409dbe 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go +// mksyscall.pl -l32 -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build arm,darwin +// +build darwin,arm package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -307,7 +305,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -333,7 +330,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -349,7 +345,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -365,7 +360,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -381,7 +375,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -397,7 +390,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -449,8 +441,6 @@ func Exchangedata(path1 string, path2 string, options int) (err error) { return } _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -558,7 +548,7 @@ func Fsync(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { - _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } @@ -727,7 +717,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -748,8 +737,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -775,7 +762,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -791,7 +777,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -807,7 +792,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -823,7 +807,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -907,7 +890,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -924,7 +906,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -941,7 +922,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -958,7 +939,7 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -998,7 +979,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1020,8 +1000,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1037,7 +1015,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1053,7 +1030,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1063,8 +1039,8 @@ func Rmdir(path string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { - r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) - newoffset = int64(r0) + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) if e1 != 0 { err = errnoErr(e1) } @@ -1120,7 +1096,6 @@ func Setlogin(name string) (err error) { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1227,7 +1202,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1243,7 +1217,6 @@ func Statfs(path string, stat *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1264,8 +1237,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1290,8 +1261,7 @@ func Truncate(path string, length int64) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) if e1 != 0 { err = errnoErr(e1) } @@ -1315,7 +1285,6 @@ func Undelete(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1331,7 +1300,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1347,7 +1315,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1374,7 +1341,7 @@ func write(fd int, p []byte) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { - r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index 9863ef99e3..e97759c357 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go +// mksyscall.pl -tags darwin,arm64 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build arm64,darwin +// +build darwin,arm64 package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -307,7 +305,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -333,7 +330,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -349,7 +345,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -365,7 +360,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -381,7 +375,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -397,7 +390,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -449,8 +441,6 @@ func Exchangedata(path1 string, path2 string, options int) (err error) { return } _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -727,7 +717,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -748,8 +737,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -775,7 +762,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -791,7 +777,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -807,7 +792,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -823,7 +807,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -907,7 +890,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -924,7 +906,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -998,7 +979,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1020,8 +1000,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1037,7 +1015,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1053,7 +1030,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1120,7 +1096,6 @@ func Setlogin(name string) (err error) { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1227,7 +1202,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1243,7 +1217,6 @@ func Statfs(path string, stat *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1264,8 +1237,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1291,7 +1262,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1315,7 +1285,6 @@ func Undelete(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1331,7 +1300,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1347,7 +1315,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index 78de48dcf3..3e9d82a27e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -1,7 +1,7 @@ -// mksyscall.pl -dragonfly syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go +// mksyscall.pl -dragonfly -tags dragonfly,amd64 syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build amd64,dragonfly +// +build dragonfly,amd64 package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -321,7 +319,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -347,7 +344,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -363,7 +359,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -379,7 +374,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +389,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -411,7 +404,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -739,7 +731,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -760,8 +751,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -787,7 +776,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -803,7 +791,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -819,7 +806,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -835,7 +821,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -929,7 +914,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -946,7 +930,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -986,7 +969,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1008,8 +990,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1025,7 +1005,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1041,7 +1020,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1108,7 +1086,6 @@ func Setlogin(name string) (err error) { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1225,7 +1202,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1241,7 +1217,6 @@ func Statfs(path string, stat *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1262,8 +1237,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1289,7 +1262,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1313,7 +1285,6 @@ func Undelete(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1329,7 +1300,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1345,7 +1315,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go index fade994dcf..f53801ceef 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -1,7 +1,7 @@ -// mksyscall.pl -l32 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go +// mksyscall.pl -l32 -tags freebsd,386 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build 386,freebsd +// +build freebsd,386 package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -287,7 +285,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -313,7 +310,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -329,7 +325,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -345,7 +340,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -361,7 +355,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -377,7 +370,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -431,7 +423,6 @@ func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbyt return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -448,7 +439,6 @@ func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbyt return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -465,7 +455,6 @@ func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -497,8 +486,6 @@ func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -520,8 +507,6 @@ func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -543,8 +528,6 @@ func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err err return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -560,7 +543,6 @@ func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) ( return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -582,8 +564,6 @@ func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -605,8 +585,6 @@ func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -628,8 +606,6 @@ func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err err return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -645,7 +621,6 @@ func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) ( return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -946,7 +921,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -967,8 +941,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -994,7 +966,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1010,7 +981,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1026,7 +996,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1042,7 +1011,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1136,7 +1104,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1153,7 +1120,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1227,7 +1193,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1249,8 +1214,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1266,7 +1229,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1282,7 +1244,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1349,7 +1310,6 @@ func Setlogin(name string) (err error) { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1466,7 +1426,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1482,7 +1441,6 @@ func Statfs(path string, stat *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1503,8 +1461,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1530,7 +1486,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1554,7 +1509,6 @@ func Undelete(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1570,7 +1524,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1586,7 +1539,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go index c28281e83e..55b07412cb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go +// mksyscall.pl -tags freebsd,amd64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build amd64,freebsd +// +build freebsd,amd64 package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -287,7 +285,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -313,7 +310,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -329,7 +325,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -345,7 +340,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -361,7 +355,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -377,7 +370,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -431,7 +423,6 @@ func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbyt return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -448,7 +439,6 @@ func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbyt return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -465,7 +455,6 @@ func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -497,8 +486,6 @@ func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -520,8 +507,6 @@ func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -543,8 +528,6 @@ func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err err return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -560,7 +543,6 @@ func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) ( return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -582,8 +564,6 @@ func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -605,8 +585,6 @@ func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -628,8 +606,6 @@ func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err err return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -645,7 +621,6 @@ func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) ( return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -946,7 +921,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -967,8 +941,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -994,7 +966,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1010,7 +981,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1026,7 +996,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1042,7 +1011,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1136,7 +1104,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1153,7 +1120,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1227,7 +1193,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1249,8 +1214,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1266,7 +1229,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1282,7 +1244,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1349,7 +1310,6 @@ func Setlogin(name string) (err error) { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1466,7 +1426,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1482,7 +1441,6 @@ func Statfs(path string, stat *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1503,8 +1461,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1530,7 +1486,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1554,7 +1509,6 @@ func Undelete(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1570,7 +1524,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1586,7 +1539,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go index a18ba5c88b..0e9b42bf4f 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -1,7 +1,7 @@ -// mksyscall.pl -l32 -arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go +// mksyscall.pl -l32 -arm -tags freebsd,arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build arm,freebsd +// +build freebsd,arm package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -287,7 +285,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -313,7 +310,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -329,7 +325,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -345,7 +340,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -361,7 +355,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -377,7 +370,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -431,7 +423,6 @@ func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbyt return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -448,7 +439,6 @@ func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbyt return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -465,7 +455,6 @@ func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -497,8 +486,6 @@ func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -520,8 +507,6 @@ func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -543,8 +528,6 @@ func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err err return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -560,7 +543,6 @@ func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) ( return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -582,8 +564,6 @@ func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -605,8 +585,6 @@ func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintpt return } r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -628,8 +606,6 @@ func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err err return } _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -645,7 +621,6 @@ func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) ( return } r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) - use(unsafe.Pointer(_p0)) ret = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -946,7 +921,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -967,8 +941,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -994,7 +966,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1010,7 +981,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1026,7 +996,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1042,7 +1011,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1136,7 +1104,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1153,7 +1120,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1227,7 +1193,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1249,8 +1214,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1266,7 +1229,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1282,7 +1244,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1349,7 +1310,6 @@ func Setlogin(name string) (err error) { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1466,7 +1426,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1482,7 +1441,6 @@ func Statfs(path string, stat *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1503,8 +1461,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1530,7 +1486,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1554,7 +1509,6 @@ func Undelete(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1570,7 +1524,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1586,7 +1539,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index fa92387b1a..d4ec806db8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -1,7 +1,7 @@ -// mksyscall.pl -l32 syscall_linux.go syscall_linux_386.go +// mksyscall.pl -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build 386,linux +// +build linux,386 package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1351,7 +1334,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1367,7 +1349,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1499,7 +1480,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1525,7 +1505,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1652,7 +1631,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index b34d5c26f0..8b2e87dfc8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_linux.go syscall_linux_amd64.go +// mksyscall.pl -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build amd64,linux +// +build linux,amd64 package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1368,7 +1351,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1394,7 +1376,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1578,7 +1559,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1594,7 +1574,6 @@ func Statfs(path string, buf *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1620,7 +1599,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1826,7 +1804,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 2e5cb39845..82d36a411b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -1,7 +1,7 @@ -// mksyscall.pl -l32 -arm syscall_linux.go syscall_linux_arm.go +// mksyscall.pl -l32 -arm -tags linux,arm syscall_linux.go syscall_linux_arm.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build arm,linux +// +build linux,arm package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1480,7 +1463,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1506,7 +1488,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1625,7 +1606,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1712,7 +1692,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index 0d584cc0de..f6cc3200d2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_linux.go syscall_linux_arm64.go +// mksyscall.pl -tags linux,arm64 syscall_linux.go syscall_linux_arm64.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build arm64,linux +// +build linux,arm64 package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1255,7 +1238,6 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1501,7 +1483,6 @@ func Statfs(path string, buf *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1527,7 +1508,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index a18e0b1712..f91afb481e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -1,7 +1,7 @@ -// mksyscall.pl -b32 -arm syscall_linux.go syscall_linux_mipsx.go +// mksyscall.pl -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build mips,linux +// +build linux,mips package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1280,7 +1263,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1453,7 +1435,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length>>32), uintptr(length), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1700,7 +1681,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1726,7 +1706,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1742,7 +1721,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index bf6f3603ba..657d11eff9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_linux.go syscall_linux_mips64x.go +// mksyscall.pl -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build mips64,linux +// +build linux,mips64 package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1307,7 +1290,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1501,7 +1483,6 @@ func Statfs(path string, buf *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1527,7 +1508,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1743,7 +1723,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1779,7 +1758,6 @@ func lstat(path string, st *stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1795,7 +1773,6 @@ func stat(path string, st *stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index 8c86bd70b3..31ff1774c3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_linux.go syscall_linux_mips64x.go +// mksyscall.pl -tags linux,mips64le syscall_linux.go syscall_linux_mips64x.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build mips64le,linux +// +build linux,mips64le package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1307,7 +1290,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1501,7 +1483,6 @@ func Statfs(path string, buf *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1527,7 +1508,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1743,7 +1723,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1779,7 +1758,6 @@ func lstat(path string, st *stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1795,7 +1773,6 @@ func stat(path string, st *stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index 645e00ebd6..797e6336e3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -1,7 +1,7 @@ -// mksyscall.pl -l32 -arm syscall_linux.go syscall_linux_mipsx.go +// mksyscall.pl -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build mipsle,linux +// +build linux,mipsle package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1280,7 +1263,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1453,7 +1435,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1700,7 +1681,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1726,7 +1706,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1742,7 +1721,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index f5d488b4a5..307dbb5bde 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_linux.go syscall_linux_ppc64x.go +// mksyscall.pl -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build ppc64,linux +// +build linux,ppc64 package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1358,7 +1341,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1384,7 +1366,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1568,7 +1549,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1584,7 +1564,6 @@ func Statfs(path string, buf *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1610,7 +1589,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1837,7 +1815,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 5183711ec8..f458a63ad5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_linux.go syscall_linux_ppc64x.go +// mksyscall.pl -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build ppc64le,linux +// +build linux,ppc64le package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1358,7 +1341,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1384,7 +1366,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1568,7 +1549,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1584,7 +1564,6 @@ func Statfs(path string, buf *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1610,7 +1589,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1837,7 +1815,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 4c7ed08cc4..b1d5a9bc35 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_linux.go syscall_linux_s390x.go +// mksyscall.pl -tags linux,s390x syscall_linux.go syscall_linux_s390x.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build s390x,linux +// +build linux,s390x package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1348,7 +1331,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1364,7 +1346,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1538,7 +1519,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1554,7 +1534,6 @@ func Statfs(path string, buf *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1580,7 +1559,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1627,7 +1605,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index beb83e4fdc..ce3ec585b6 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -1,7 +1,7 @@ -// mksyscall.pl syscall_linux.go syscall_linux_sparc64.go +// mksyscall.pl -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build sparc64,linux +// +build linux,sparc64 package unix @@ -26,8 +26,6 @@ func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags in return } _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -43,7 +41,6 @@ func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -77,7 +74,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -99,8 +95,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -116,7 +110,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -132,7 +125,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -148,7 +140,6 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error return } _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -212,7 +203,6 @@ func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { return } _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -238,9 +228,6 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt return } _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) - use(unsafe.Pointer(_p2)) if e1 != 0 { err = errnoErr(e1) } @@ -256,7 +243,6 @@ func Acct(path string) (err error) { return } _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -283,7 +269,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -299,7 +284,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -395,7 +379,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -441,7 +424,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -457,7 +439,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -562,6 +543,23 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -609,8 +607,6 @@ func Getxattr(path string, attr string, dest []byte) (sz int, err error) { _p2 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -627,7 +623,6 @@ func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err e return } r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) - use(unsafe.Pointer(_p0)) watchdesc = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -699,7 +694,6 @@ func Listxattr(path string, dest []byte) (sz int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) - use(unsafe.Pointer(_p0)) sz = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -716,7 +710,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -732,7 +725,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -763,8 +755,6 @@ func PivotRoot(newroot string, putold string) (err error) { return } _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -822,8 +812,6 @@ func Removexattr(path string, attr string) (err error) { return } _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -844,8 +832,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -955,8 +941,6 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { _p2 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1039,7 +1023,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1338,7 +1321,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1364,7 +1346,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1548,7 +1529,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1564,7 +1544,6 @@ func Statfs(path string, buf *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1590,7 +1569,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1806,7 +1784,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index b16e1d0ee3..3182345ece 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1,7 +1,7 @@ -// mksyscall.pl -l32 -netbsd syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go +// mksyscall.pl -l32 -netbsd -tags netbsd,386 syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build 386,netbsd +// +build netbsd,386 package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -304,7 +302,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -330,7 +327,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -346,7 +342,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -362,7 +357,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -378,7 +372,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -394,7 +387,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -687,7 +679,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -708,8 +699,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -735,7 +724,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -751,7 +739,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -767,7 +754,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -783,7 +769,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -877,7 +862,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -894,7 +878,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -968,7 +951,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -990,8 +972,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1007,7 +987,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1023,7 +1002,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1171,7 +1149,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1192,8 +1169,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1219,7 +1194,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1243,7 +1217,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1259,7 +1232,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index b63667da9c..74ba8189a5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1,7 +1,7 @@ -// mksyscall.pl -netbsd syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go +// mksyscall.pl -netbsd -tags netbsd,amd64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build amd64,netbsd +// +build netbsd,amd64 package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -304,7 +302,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -330,7 +327,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -346,7 +342,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -362,7 +357,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -378,7 +372,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -394,7 +387,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -687,7 +679,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -708,8 +699,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -735,7 +724,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -751,7 +739,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -767,7 +754,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -783,7 +769,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -877,7 +862,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -894,7 +878,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -968,7 +951,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -990,8 +972,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1007,7 +987,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1023,7 +1002,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1171,7 +1149,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1192,8 +1169,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1219,7 +1194,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1243,7 +1217,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1259,7 +1232,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index b0d19038d2..1f346e2f52 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1,7 +1,7 @@ -// mksyscall.pl -l32 -arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go +// mksyscall.pl -l32 -arm -tags netbsd,arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build arm,netbsd +// +build netbsd,arm package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -304,7 +302,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -330,7 +327,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -346,7 +342,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -362,7 +357,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -378,7 +372,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -394,7 +387,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -687,7 +679,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -708,8 +699,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -735,7 +724,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -751,7 +739,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -767,7 +754,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -783,7 +769,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -877,7 +862,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -894,7 +878,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -968,7 +951,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -990,8 +972,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1007,7 +987,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1023,7 +1002,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1171,7 +1149,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1192,8 +1169,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1219,7 +1194,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1243,7 +1217,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1259,7 +1232,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index f91a5b8564..ca3e813926 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -1,7 +1,7 @@ -// mksyscall.pl -l32 -openbsd syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go +// mksyscall.pl -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build 386,openbsd +// +build openbsd,386 package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -302,7 +300,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -328,7 +325,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -344,7 +340,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -360,7 +355,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -376,7 +370,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -392,7 +385,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -695,7 +687,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -716,8 +707,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -743,7 +732,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -759,7 +747,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -775,7 +762,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -791,7 +777,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -885,7 +870,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -902,7 +886,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -976,7 +959,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -998,8 +980,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1015,7 +995,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1031,7 +1010,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1098,7 +1076,6 @@ func Setlogin(name string) (err error) { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1215,7 +1192,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1231,7 +1207,6 @@ func Statfs(path string, stat *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1252,8 +1227,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1279,7 +1252,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1303,7 +1275,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1319,7 +1290,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 2e8d59d724..bf63d552ed 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -1,7 +1,7 @@ -// mksyscall.pl -openbsd syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go +// mksyscall.pl -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build amd64,openbsd +// +build openbsd,amd64 package unix @@ -222,7 +222,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) _p0 = unsafe.Pointer(&_zero) } _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) - use(_p0) if e1 != 0 { err = errnoErr(e1) } @@ -238,7 +237,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { return } _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -302,7 +300,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -328,7 +325,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -344,7 +340,6 @@ func Chflags(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -360,7 +355,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -376,7 +370,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -392,7 +385,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -695,7 +687,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -716,8 +707,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -743,7 +732,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -759,7 +747,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -775,7 +762,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -791,7 +777,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -885,7 +870,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -902,7 +886,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -976,7 +959,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = unsafe.Pointer(&_zero) } r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -998,8 +980,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1015,7 +995,6 @@ func Revoke(path string) (err error) { return } _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1031,7 +1010,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1098,7 +1076,6 @@ func Setlogin(name string) (err error) { return } _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1215,7 +1192,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1231,7 +1207,6 @@ func Statfs(path string, stat *Statfs_t) (err error) { return } _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1252,8 +1227,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = errnoErr(e1) } @@ -1279,7 +1252,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1303,7 +1275,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } @@ -1319,7 +1290,6 @@ func Unmount(path string, flags int) (err error) { return } _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index c0ecfc044a..bdf140b180 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -1,7 +1,7 @@ -// mksyscall_solaris.pl syscall_solaris.go syscall_solaris_amd64.go +// mksyscall_solaris.pl -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go // MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT -// +build amd64,solaris +// +build solaris,amd64 package unix @@ -442,7 +442,6 @@ func utimes(path string, times *[2]Timeval) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -456,7 +455,6 @@ func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -530,7 +528,6 @@ func Access(path string, mode uint32) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAccess)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -552,7 +549,6 @@ func Chdir(path string) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -566,7 +562,6 @@ func Chmod(path string, mode uint32) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChmod)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -580,7 +575,6 @@ func Chown(path string, uid int, gid int) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -594,7 +588,6 @@ func Chroot(path string) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -616,7 +609,6 @@ func Creat(path string, mode uint32) (fd int, err error) { return } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = e1 @@ -669,7 +661,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -691,7 +682,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -838,7 +828,6 @@ func Lchown(path string, uid int, gid int) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLchown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -857,8 +846,6 @@ func Link(path string, link string) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = e1 } @@ -880,7 +867,6 @@ func Lstat(path string, stat *Stat_t) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLstat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -906,7 +892,6 @@ func Mkdir(path string, mode uint32) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdir)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -920,7 +905,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -934,7 +918,6 @@ func Mkfifo(path string, mode uint32) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -948,7 +931,6 @@ func Mkfifoat(dirfd int, path string, mode uint32) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -962,7 +944,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknod)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -976,7 +957,6 @@ func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -1050,7 +1030,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpen)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = e1 @@ -1065,7 +1044,6 @@ func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) return } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) - use(unsafe.Pointer(_p0)) fd = int(r0) if e1 != 0 { err = e1 @@ -1080,7 +1058,6 @@ func Pathconf(path string, name int) (val int, err error) { return } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPathconf)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) val = int(r0) if e1 != 0 { err = e1 @@ -1146,7 +1123,6 @@ func Readlink(path string, buf []byte) (n int, err error) { _p1 = &buf[0] } r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procReadlink)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(len(buf)), 0, 0, 0) - use(unsafe.Pointer(_p0)) n = int(r0) if e1 != 0 { err = e1 @@ -1166,8 +1142,6 @@ func Rename(from string, to string) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRename)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = e1 } @@ -1186,8 +1160,6 @@ func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err e return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = e1 } @@ -1201,7 +1173,6 @@ func Rmdir(path string) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRmdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -1325,7 +1296,6 @@ func Stat(path string, stat *Stat_t) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -1344,8 +1314,6 @@ func Symlink(path string, link string) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSymlink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) - use(unsafe.Pointer(_p1)) if e1 != 0 { err = e1 } @@ -1376,7 +1344,6 @@ func Truncate(path string, length int64) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procTruncate)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -1420,7 +1387,6 @@ func Unmount(target string, flags int) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -1434,7 +1400,6 @@ func Unlink(path string) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlink)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -1448,7 +1413,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } @@ -1470,7 +1434,6 @@ func Utime(path string, buf *Utimbuf) (err error) { return } _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) - use(unsafe.Pointer(_p0)) if e1 != 0 { err = e1 } diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index ba952c6754..206b3c2815 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/asm/unistd_32.h +// mksysnum_linux.pl -Ilinux/usr/include -m32 -D__i386__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build 386,linux @@ -226,7 +226,6 @@ const ( SYS_PIVOT_ROOT = 217 SYS_MINCORE = 218 SYS_MADVISE = 219 - SYS_MADVISE1 = 219 SYS_GETDENTS64 = 220 SYS_FCNTL64 = 221 SYS_GETTID = 224 @@ -352,4 +351,38 @@ const ( SYS_SETNS = 346 SYS_PROCESS_VM_READV = 347 SYS_PROCESS_VM_WRITEV = 348 + SYS_KCMP = 349 + SYS_FINIT_MODULE = 350 + SYS_SCHED_SETATTR = 351 + SYS_SCHED_GETATTR = 352 + SYS_RENAMEAT2 = 353 + SYS_SECCOMP = 354 + SYS_GETRANDOM = 355 + SYS_MEMFD_CREATE = 356 + SYS_BPF = 357 + SYS_EXECVEAT = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_USERFAULTFD = 374 + SYS_MEMBARRIER = 375 + SYS_MLOCK2 = 376 + SYS_COPY_FILE_RANGE = 377 + SYS_PREADV2 = 378 + SYS_PWRITEV2 = 379 + SYS_PKEY_MPROTECT = 380 + SYS_PKEY_ALLOC = 381 + SYS_PKEY_FREE = 382 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index ddac31f58a..904231736a 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/asm/unistd_64.h +// mksysnum_linux.pl -Ilinux/usr/include -m64 linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build amd64,linux @@ -318,4 +318,24 @@ const ( SYS_GETCPU = 309 SYS_PROCESS_VM_READV = 310 SYS_PROCESS_VM_WRITEV = 311 + SYS_KCMP = 312 + SYS_FINIT_MODULE = 313 + SYS_SCHED_SETATTR = 314 + SYS_SCHED_GETATTR = 315 + SYS_RENAMEAT2 = 316 + SYS_SECCOMP = 317 + SYS_GETRANDOM = 318 + SYS_MEMFD_CREATE = 319 + SYS_KEXEC_FILE_LOAD = 320 + SYS_BPF = 321 + SYS_EXECVEAT = 322 + SYS_USERFAULTFD = 323 + SYS_MEMBARRIER = 324 + SYS_MLOCK2 = 325 + SYS_COPY_FILE_RANGE = 326 + SYS_PREADV2 = 327 + SYS_PWRITEV2 = 328 + SYS_PKEY_MPROTECT = 329 + SYS_PKEY_ALLOC = 330 + SYS_PKEY_FREE = 331 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index 45ced17fc4..e3e6745629 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl +// mksysnum_linux.pl -Ilinux/usr/include -m32 -D__ARM_EABI__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build arm,linux @@ -6,8 +6,6 @@ package unix const ( - SYS_OABI_SYSCALL_BASE = 0 - SYS_SYSCALL_BASE = 0 SYS_RESTART_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 @@ -20,21 +18,16 @@ const ( SYS_UNLINK = 10 SYS_EXECVE = 11 SYS_CHDIR = 12 - SYS_TIME = 13 SYS_MKNOD = 14 SYS_CHMOD = 15 SYS_LCHOWN = 16 SYS_LSEEK = 19 SYS_GETPID = 20 SYS_MOUNT = 21 - SYS_UMOUNT = 22 SYS_SETUID = 23 SYS_GETUID = 24 - SYS_STIME = 25 SYS_PTRACE = 26 - SYS_ALARM = 27 SYS_PAUSE = 29 - SYS_UTIME = 30 SYS_ACCESS = 33 SYS_NICE = 34 SYS_SYNC = 36 @@ -69,20 +62,16 @@ const ( SYS_SIGPENDING = 73 SYS_SETHOSTNAME = 74 SYS_SETRLIMIT = 75 - SYS_GETRLIMIT = 76 SYS_GETRUSAGE = 77 SYS_GETTIMEOFDAY = 78 SYS_SETTIMEOFDAY = 79 SYS_GETGROUPS = 80 SYS_SETGROUPS = 81 - SYS_SELECT = 82 SYS_SYMLINK = 83 SYS_READLINK = 85 SYS_USELIB = 86 SYS_SWAPON = 87 SYS_REBOOT = 88 - SYS_READDIR = 89 - SYS_MMAP = 90 SYS_MUNMAP = 91 SYS_TRUNCATE = 92 SYS_FTRUNCATE = 93 @@ -92,7 +81,6 @@ const ( SYS_SETPRIORITY = 97 SYS_STATFS = 99 SYS_FSTATFS = 100 - SYS_SOCKETCALL = 102 SYS_SYSLOG = 103 SYS_SETITIMER = 104 SYS_GETITIMER = 105 @@ -100,11 +88,9 @@ const ( SYS_LSTAT = 107 SYS_FSTAT = 108 SYS_VHANGUP = 111 - SYS_SYSCALL = 113 SYS_WAIT4 = 114 SYS_SWAPOFF = 115 SYS_SYSINFO = 116 - SYS_IPC = 117 SYS_FSYNC = 118 SYS_SIGRETURN = 119 SYS_CLONE = 120 @@ -353,4 +339,23 @@ const ( SYS_SETNS = 375 SYS_PROCESS_VM_READV = 376 SYS_PROCESS_VM_WRITEV = 377 + SYS_KCMP = 378 + SYS_FINIT_MODULE = 379 + SYS_SCHED_SETATTR = 380 + SYS_SCHED_GETATTR = 381 + SYS_RENAMEAT2 = 382 + SYS_SECCOMP = 383 + SYS_GETRANDOM = 384 + SYS_MEMFD_CREATE = 385 + SYS_BPF = 386 + SYS_EXECVEAT = 387 + SYS_USERFAULTFD = 388 + SYS_MEMBARRIER = 389 + SYS_MLOCK2 = 390 + SYS_COPY_FILE_RANGE = 391 + SYS_PREADV2 = 392 + SYS_PWRITEV2 = 393 + SYS_PKEY_MPROTECT = 394 + SYS_PKEY_ALLOC = 395 + SYS_PKEY_FREE = 396 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 2e9514f280..90e43d0061 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/asm-generic/unistd.h +// mksysnum_linux.pl -Ilinux/usr/include -m64 linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build arm64,linux @@ -269,4 +269,17 @@ const ( SYS_SCHED_GETATTR = 275 SYS_RENAMEAT2 = 276 SYS_SECCOMP = 277 + SYS_GETRANDOM = 278 + SYS_MEMFD_CREATE = 279 + SYS_BPF = 280 + SYS_EXECVEAT = 281 + SYS_USERFAULTFD = 282 + SYS_MEMBARRIER = 283 + SYS_MLOCK2 = 284 + SYS_COPY_FILE_RANGE = 285 + SYS_PREADV2 = 286 + SYS_PWRITEV2 = 287 + SYS_PKEY_MPROTECT = 288 + SYS_PKEY_ALLOC = 289 + SYS_PKEY_FREE = 290 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 0786867e98..77ff644d7d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/mips-linux-gnu/asm/unistd.h +// mksysnum_linux.pl -Ilinux/usr/include -m32 -D_MIPS_SIM=_MIPS_SIM_ABI32 -D__MIPSEB__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build mips,linux @@ -352,8 +352,23 @@ const ( SYS_SETNS = 4344 SYS_PROCESS_VM_READV = 4345 SYS_PROCESS_VM_WRITEV = 4346 - SYS_LINUX_SYSCALLS = 4346 - SYS_O32_LINUX_SYSCALLS = 4346 - SYS_64_LINUX_SYSCALLS = 4305 - SYS_N32_LINUX_SYSCALLS = 4310 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 5ffe1c7191..fc86fcdb6b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/asm/unistd.h +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D_MIPS_SIM=_MIPS_SIM_ABI64 -D__MIPSEB__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build mips64,linux @@ -324,4 +324,11 @@ const ( SYS_EXECVEAT = 5316 SYS_USERFAULTFD = 5317 SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index d192b940ce..993873c379 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/asm/unistd.h +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D_MIPS_SIM=_MIPS_SIM_ABI64 -D__MIPSEL__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build mips64le,linux @@ -324,4 +324,11 @@ const ( SYS_EXECVEAT = 5316 SYS_USERFAULTFD = 5317 SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 25d231708f..f0155ba5a6 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/mips-linux-gnu/asm/unistd.h +// mksysnum_linux.pl -Ilinux/usr/include -m32 -D_MIPS_SIM=_MIPS_SIM_ABI32 -D__MIPSEL__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build mipsle,linux @@ -352,8 +352,23 @@ const ( SYS_SETNS = 4344 SYS_PROCESS_VM_READV = 4345 SYS_PROCESS_VM_WRITEV = 4346 - SYS_LINUX_SYSCALLS = 4346 - SYS_O32_LINUX_SYSCALLS = 4346 - SYS_64_LINUX_SYSCALLS = 4305 - SYS_N32_LINUX_SYSCALLS = 4310 + SYS_KCMP = 4347 + SYS_FINIT_MODULE = 4348 + SYS_SCHED_SETATTR = 4349 + SYS_SCHED_GETATTR = 4350 + SYS_RENAMEAT2 = 4351 + SYS_SECCOMP = 4352 + SYS_GETRANDOM = 4353 + SYS_MEMFD_CREATE = 4354 + SYS_BPF = 4355 + SYS_EXECVEAT = 4356 + SYS_USERFAULTFD = 4357 + SYS_MEMBARRIER = 4358 + SYS_MLOCK2 = 4359 + SYS_COPY_FILE_RANGE = 4360 + SYS_PREADV2 = 4361 + SYS_PWRITEV2 = 4362 + SYS_PKEY_MPROTECT = 4363 + SYS_PKEY_ALLOC = 4364 + SYS_PKEY_FREE = 4365 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index e1b08f00d3..0deec82c7c 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/asm/unistd.h +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D__powerpc64__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build ppc64,linux @@ -357,4 +357,13 @@ const ( SYS_GETRANDOM = 359 SYS_MEMFD_CREATE = 360 SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 45e63f51a4..3f701be7ca 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/powerpc64le-linux-gnu/asm/unistd.h +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D__powerpc64__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build ppc64le,linux @@ -350,4 +350,20 @@ const ( SYS_PROCESS_VM_WRITEV = 352 SYS_FINIT_MODULE = 353 SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 42d4f5cda8..8b35997d6e 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/asm/unistd.h +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D__s390x__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build s390x,linux @@ -303,6 +303,9 @@ const ( SYS_RECVMSG = 372 SYS_SHUTDOWN = 373 SYS_MLOCK2 = 374 + SYS_COPY_FILE_RANGE = 375 + SYS_PREADV2 = 376 + SYS_PWRITEV2 = 377 SYS_SELECT = 142 SYS_GETRLIMIT = 191 SYS_LCHOWN = 198 diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 46b5bee1db..c9c129dc42 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -1,4 +1,4 @@ -// mksysnum_linux.pl /usr/include/sparc64-linux-gnu/asm/unistd.h +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D__arch64__ linux/usr/include/asm/unistd.h // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT // +build sparc64,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index a3631053c7..99dfd588ad 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -210,6 +210,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -334,6 +350,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 0573e6cd24..c9e1e64a2c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -212,6 +212,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -338,6 +354,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 0578b53964..4bfba2a9e2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -214,6 +214,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -338,6 +354,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 808e04669a..e58c500c11 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -213,6 +213,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -339,6 +355,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 2eaff573d0..a960085f82 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -213,6 +213,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -336,6 +352,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 73e4b76c0c..9d46a62c74 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -213,6 +213,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -338,6 +354,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 479ca3e1b8..267bfe903d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -213,6 +213,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -338,6 +354,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 7617a69d02..950515a8ee 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -213,6 +213,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -336,6 +352,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 2db548b905..88538cbdc4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -214,6 +214,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -340,6 +356,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 4bfdcc0aca..2f63bc0326 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -214,6 +214,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]uint8 @@ -340,6 +356,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 435cd792f8..2c5bb05d1b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -213,6 +213,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -338,6 +354,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 439f96914f..22bdab9614 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -218,6 +218,22 @@ type RawSockaddrCAN struct { Addr [8]byte } +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + type RawSockaddr struct { Family uint16 Data [14]int8 @@ -343,6 +359,8 @@ const ( SizeofSockaddrNetlink = 0xc SizeofSockaddrHCI = 0x6 SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc diff --git a/vendor/gopkg.in/gomail.v2/.travis.yml b/vendor/gopkg.in/gomail.v2/.travis.yml new file mode 100644 index 0000000000..24edf22cc9 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/.travis.yml @@ -0,0 +1,8 @@ +language: go + +go: + - 1.2 + - 1.3 + - 1.4 + - 1.5 + - tip diff --git a/vendor/gopkg.in/gomail.v2/CHANGELOG.md b/vendor/gopkg.in/gomail.v2/CHANGELOG.md new file mode 100644 index 0000000000..a797ab4c09 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/CHANGELOG.md @@ -0,0 +1,20 @@ +# Change Log +All notable changes to this project will be documented in this file. +This project adheres to [Semantic Versioning](http://semver.org/). + +## [2.0.0] - 2015-09-02 + +- Mailer has been removed. It has been replaced by Dialer and Sender. +- `File` type and the `CreateFile` and `OpenFile` functions have been removed. +- `Message.Attach` and `Message.Embed` have a new signature. +- `Message.GetBodyWriter` has been removed. Use `Message.AddAlternativeWriter` +instead. +- `Message.Export` has been removed. `Message.WriteTo` can be used instead. +- `Message.DelHeader` has been removed. +- The `Bcc` header field is no longer sent. It is far more simpler and +efficient: the same message is sent to all recipients instead of sending a +different email to each Bcc address. +- LoginAuth has been removed. `NewPlainDialer` now implements the LOGIN +authentication mechanism when needed. +- Go 1.2 is now required instead of Go 1.3. No external dependency are used when +using Go 1.5. diff --git a/vendor/gopkg.in/gomail.v2/CONTRIBUTING.md b/vendor/gopkg.in/gomail.v2/CONTRIBUTING.md new file mode 100644 index 0000000000..d5601c257a --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/CONTRIBUTING.md @@ -0,0 +1,20 @@ +Thank you for contributing to Gomail! Here are a few guidelines: + +## Bugs + +If you think you found a bug, create an issue and supply the minimum amount +of code triggering the bug so it can be reproduced. + + +## Fixing a bug + +If you want to fix a bug, you can send a pull request. It should contains a +new test or update an existing one to cover that bug. + + +## New feature proposal + +If you think Gomail lacks a feature, you can open an issue or send a pull +request. I want to keep Gomail code and API as simple as possible so please +describe your needs so we can discuss whether this feature should be added to +Gomail or not. diff --git a/vendor/gopkg.in/gomail.v2/LICENSE b/vendor/gopkg.in/gomail.v2/LICENSE new file mode 100644 index 0000000000..5f5c12af73 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Alexandre Cesaro + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/gopkg.in/gomail.v2/README.md b/vendor/gopkg.in/gomail.v2/README.md new file mode 100644 index 0000000000..18cb881300 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/README.md @@ -0,0 +1,97 @@ +# Gomail +[![Build Status](https://travis-ci.org/go-gomail/gomail.svg?branch=v2)](https://travis-ci.org/go-gomail/gomail) [![Code Coverage](http://gocover.io/_badge/gopkg.in/gomail.v2)](http://gocover.io/gopkg.in/gomail.v2) [![Documentation](https://godoc.org/gopkg.in/gomail.v2?status.svg)](https://godoc.org/gopkg.in/gomail.v2) + +## Introduction + +Gomail is a simple and efficient package to send emails. It is well tested and +documented. + +It is versioned using [gopkg.in](https://gopkg.in) so I promise +they will never be backward incompatible changes within each version. + +It requires Go 1.2 or newer. With Go 1.5, no external dependencies are used. + + +## Features + +Gomail supports: +- Attachments +- Embedded images +- HTML and text templates +- Automatic encoding of special characters +- SSL and TLS +- Sending multiple emails with the same SMTP connection +- Any method to send emails: SMTP, postfix (not included but easily doable), etc + + +## Documentation + +https://godoc.org/gopkg.in/gomail.v2 + + +## Download + + go get gopkg.in/gomail.v2 + + +## Examples + +See the [examples in the documentation](https://godoc.org/gopkg.in/gomail.v2#example-package). + + +## FAQ + +### x509: certificate signed by unknown authority + +If you get this error it means the certificate used by the SMTP server is not +considered valid by the client running Gomail. As a quick workaround you can +bypass the verification of the server's certificate chain and host name by using +`SetTLSConfig`: + + d := gomail.NewPlainDialer("smtp.example.com", "user", "123456", 587) + d.TLSConfig = &tls.Config{InsecureSkipVerify: true} + +Note, however, that this is insecure and should not be used in production. + + +## Contribute + +Contributions are more than welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for +more info. + + +## Change log + +See [CHANGELOG.md](CHANGELOG.md). + + +## License + +[MIT](LICENSE) + + +## Contact + +You can ask questions on the [Gomail +thread](https://groups.google.com/d/topic/golang-nuts/jMxZHzvvEVg/discussion) +in the Go mailing-list. + + +## Support + +If you want to support the development of Gomail, I gladly accept donations. + +I will give 100% of the money I receive to +[Enfants, Espoir Du Monde](http://www.eedm.fr/). +EEDM is a French NGO which helps children in Bangladesh, Cameroun, Haiti, India +and Madagascar. + +All its members are volunteers so its operating costs are only +1.9%. So your money will directly helps children of these countries. + +As an added bonus, your donations will also tip me by lowering my taxes :smile: + +I will send an email with the receipt of the donation to EEDM annually to all +donors. + +[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=PYQKC7VFVXCFG) diff --git a/vendor/gopkg.in/gomail.v2/auth.go b/vendor/gopkg.in/gomail.v2/auth.go new file mode 100644 index 0000000000..4bcdd06202 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/auth.go @@ -0,0 +1,67 @@ +package gomail + +import ( + "bytes" + "errors" + "fmt" + "net/smtp" +) + +// plainAuth is an smtp.Auth that implements the PLAIN authentication mechanism. +// It fallbacks to the LOGIN mechanism if it is the only mechanism advertised +// by the server. +type plainAuth struct { + username string + password string + host string + login bool +} + +func (a *plainAuth) Start(server *smtp.ServerInfo) (string, []byte, error) { + if server.Name != a.host { + return "", nil, errors.New("gomail: wrong host name") + } + + var plain, login bool + for _, a := range server.Auth { + switch a { + case "PLAIN": + plain = true + case "LOGIN": + login = true + } + } + + if !server.TLS && !plain && !login { + return "", nil, errors.New("gomail: unencrypted connection") + } + + if !plain && login { + a.login = true + return "LOGIN", nil, nil + } + + return "PLAIN", []byte("\x00" + a.username + "\x00" + a.password), nil +} + +func (a *plainAuth) Next(fromServer []byte, more bool) ([]byte, error) { + if !a.login { + if more { + return nil, errors.New("gomail: unexpected server challenge") + } + return nil, nil + } + + if !more { + return nil, nil + } + + switch { + case bytes.Equal(fromServer, []byte("Username:")): + return []byte(a.username), nil + case bytes.Equal(fromServer, []byte("Password:")): + return []byte(a.password), nil + default: + return nil, fmt.Errorf("gomail: unexpected server challenge: %s", fromServer) + } +} diff --git a/vendor/gopkg.in/gomail.v2/auth_test.go b/vendor/gopkg.in/gomail.v2/auth_test.go new file mode 100644 index 0000000000..20b4772141 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/auth_test.go @@ -0,0 +1,156 @@ +package gomail + +import ( + "net/smtp" + "testing" +) + +const ( + testUser = "user" + testPwd = "pwd" + testHost = "smtp.example.com" +) + +var testAuth = &plainAuth{ + username: testUser, + password: testPwd, + host: testHost, +} + +type plainAuthTest struct { + auths []string + challenges []string + tls bool + wantProto string + wantData []string + wantError bool +} + +func TestNoAdvertisement(t *testing.T) { + testPlainAuth(t, &plainAuthTest{ + auths: []string{}, + challenges: []string{"Username:", "Password:"}, + tls: false, + wantProto: "PLAIN", + wantError: true, + }) +} + +func TestNoAdvertisementTLS(t *testing.T) { + testPlainAuth(t, &plainAuthTest{ + auths: []string{}, + challenges: []string{"Username:", "Password:"}, + tls: true, + wantProto: "PLAIN", + wantData: []string{"\x00" + testUser + "\x00" + testPwd}, + }) +} + +func TestPlain(t *testing.T) { + testPlainAuth(t, &plainAuthTest{ + auths: []string{"PLAIN"}, + challenges: []string{"Username:", "Password:"}, + tls: false, + wantProto: "PLAIN", + wantData: []string{"\x00" + testUser + "\x00" + testPwd}, + }) +} + +func TestPlainTLS(t *testing.T) { + testPlainAuth(t, &plainAuthTest{ + auths: []string{"PLAIN"}, + challenges: []string{"Username:", "Password:"}, + tls: true, + wantProto: "PLAIN", + wantData: []string{"\x00" + testUser + "\x00" + testPwd}, + }) +} + +func TestPlainAndLogin(t *testing.T) { + testPlainAuth(t, &plainAuthTest{ + auths: []string{"PLAIN", "LOGIN"}, + challenges: []string{"Username:", "Password:"}, + tls: false, + wantProto: "PLAIN", + wantData: []string{"\x00" + testUser + "\x00" + testPwd}, + }) +} + +func TestPlainAndLoginTLS(t *testing.T) { + testPlainAuth(t, &plainAuthTest{ + auths: []string{"PLAIN", "LOGIN"}, + challenges: []string{"Username:", "Password:"}, + tls: true, + wantProto: "PLAIN", + wantData: []string{"\x00" + testUser + "\x00" + testPwd}, + }) +} + +func TestLogin(t *testing.T) { + testPlainAuth(t, &plainAuthTest{ + auths: []string{"LOGIN"}, + challenges: []string{"Username:", "Password:"}, + tls: false, + wantProto: "LOGIN", + wantData: []string{"", testUser, testPwd}, + }) +} + +func TestLoginTLS(t *testing.T) { + testPlainAuth(t, &plainAuthTest{ + auths: []string{"LOGIN"}, + challenges: []string{"Username:", "Password:"}, + tls: true, + wantProto: "LOGIN", + wantData: []string{"", testUser, testPwd}, + }) +} + +func testPlainAuth(t *testing.T, test *plainAuthTest) { + auth := &plainAuth{ + username: testUser, + password: testPwd, + host: testHost, + } + server := &smtp.ServerInfo{ + Name: testHost, + TLS: test.tls, + Auth: test.auths, + } + proto, toServer, err := auth.Start(server) + if err != nil && !test.wantError { + t.Fatalf("plainAuth.Start(): %v", err) + } + if err != nil && test.wantError { + return + } + if proto != test.wantProto { + t.Errorf("invalid protocol, got %q, want %q", proto, test.wantProto) + } + + i := 0 + got := string(toServer) + if got != test.wantData[i] { + t.Errorf("Invalid response, got %q, want %q", got, test.wantData[i]) + } + + if proto == "PLAIN" { + return + } + + for _, challenge := range test.challenges { + i++ + if i >= len(test.wantData) { + t.Fatalf("unexpected challenge: %q", challenge) + } + + toServer, err = auth.Next([]byte(challenge), true) + if err != nil { + t.Fatalf("plainAuth.Auth(): %v", err) + } + got = string(toServer) + if got != test.wantData[i] { + t.Errorf("Invalid response, got %q, want %q", got, test.wantData[i]) + } + } +} diff --git a/vendor/gopkg.in/gomail.v2/doc.go b/vendor/gopkg.in/gomail.v2/doc.go new file mode 100644 index 0000000000..a8f5091f54 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/doc.go @@ -0,0 +1,5 @@ +// Package gomail provides a simple interface to compose emails and to mail them +// efficiently. +// +// More info on Github: https://github.com/go-gomail/gomail +package gomail diff --git a/vendor/gopkg.in/gomail.v2/example_test.go b/vendor/gopkg.in/gomail.v2/example_test.go new file mode 100644 index 0000000000..8d9c6c2931 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/example_test.go @@ -0,0 +1,215 @@ +package gomail_test + +import ( + "fmt" + "html/template" + "io" + "log" + "time" + + "gopkg.in/gomail.v2" +) + +func Example() { + m := gomail.NewMessage() + m.SetHeader("From", "alex@example.com") + m.SetHeader("To", "bob@example.com", "cora@example.com") + m.SetAddressHeader("Cc", "dan@example.com", "Dan") + m.SetHeader("Subject", "Hello!") + m.SetBody("text/html", "Hello Bob and Cora!") + m.Attach("/home/Alex/lolcat.jpg") + + d := gomail.NewPlainDialer("smtp.example.com", 587, "user", "123456") + + // Send the email to Bob, Cora and Dan. + if err := d.DialAndSend(m); err != nil { + panic(err) + } +} + +// A daemon that listens to a channel and sends all incoming messages. +func Example_daemon() { + ch := make(chan *gomail.Message) + + go func() { + d := gomail.NewPlainDialer("smtp.example.com", 587, "user", "123456") + + var s gomail.SendCloser + var err error + open := false + for { + select { + case m, ok := <-ch: + if !ok { + return + } + if !open { + if s, err = d.Dial(); err != nil { + panic(err) + } + open = true + } + if err := gomail.Send(s, m); err != nil { + log.Print(err) + } + // Close the connection to the SMTP server if no email was sent in + // the last 30 seconds. + case <-time.After(30 * time.Second): + if open { + if err := s.Close(); err != nil { + panic(err) + } + open = false + } + } + } + }() + + // Use the channel in your program to send emails. + + // Close the channel to stop the mail daemon. + close(ch) +} + +// Efficiently send a customized newsletter to a list of recipients. +func Example_newsletter() { + // The list of recipients. + var list []struct { + Name string + Address string + } + + d := gomail.NewPlainDialer("smtp.example.com", 587, "user", "123456") + s, err := d.Dial() + if err != nil { + panic(err) + } + + m := gomail.NewMessage() + for _, r := range list { + m.SetHeader("From", "no-reply@example.com") + m.SetAddressHeader("To", r.Address, r.Name) + m.SetHeader("Subject", "Newsletter #1") + m.SetBody("text/html", fmt.Sprintf("Hello %s!", r.Name)) + + if err := gomail.Send(s, m); err != nil { + log.Printf("Could not send email to %q: %v", r.Address, err) + } + m.Reset() + } +} + +// Send an email using a local SMTP server. +func Example_noAuth() { + m := gomail.NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.SetHeader("Subject", "Hello!") + m.SetBody("text/plain", "Hello!") + + d := gomail.Dialer{Host: "localhost", Port: 587} + if err := d.DialAndSend(m); err != nil { + panic(err) + } +} + +// Send an email using an API or postfix. +func Example_noSMTP() { + m := gomail.NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.SetHeader("Subject", "Hello!") + m.SetBody("text/plain", "Hello!") + + s := gomail.SendFunc(func(from string, to []string, msg io.WriterTo) error { + // Implements you email-sending function, for example by calling + // an API, or running postfix, etc. + fmt.Println("From:", from) + fmt.Println("To:", to) + return nil + }) + + if err := gomail.Send(s, m); err != nil { + panic(err) + } + // Output: + // From: from@example.com + // To: [to@example.com] +} + +var m *gomail.Message + +func ExampleSetCopyFunc() { + m.Attach("foo.txt", gomail.SetCopyFunc(func(w io.Writer) error { + _, err := w.Write([]byte("Content of foo.txt")) + return err + })) +} + +func ExampleSetHeader() { + h := map[string][]string{"Content-ID": {""}} + m.Attach("foo.jpg", gomail.SetHeader(h)) +} + +func ExampleMessage_AddAlternative() { + m.SetBody("text/plain", "Hello!") + m.AddAlternative("text/html", "

    Hello!

    ") +} + +func ExampleMessage_AddAlternativeWriter() { + t := template.Must(template.New("example").Parse("Hello {{.}}!")) + m.AddAlternativeWriter("text/plain", func(w io.Writer) error { + return t.Execute(w, "Bob") + }) +} + +func ExampleMessage_Attach() { + m.Attach("/tmp/image.jpg") +} + +func ExampleMessage_Embed() { + m.Embed("/tmp/image.jpg") + m.SetBody("text/html", `My image`) +} + +func ExampleMessage_FormatAddress() { + m.SetHeader("To", m.FormatAddress("bob@example.com", "Bob"), m.FormatAddress("cora@example.com", "Cora")) +} + +func ExampleMessage_FormatDate() { + m.SetHeaders(map[string][]string{ + "X-Date": {m.FormatDate(time.Now())}, + }) +} + +func ExampleMessage_SetAddressHeader() { + m.SetAddressHeader("To", "bob@example.com", "Bob") +} + +func ExampleMessage_SetBody() { + m.SetBody("text/plain", "Hello!") +} + +func ExampleMessage_SetDateHeader() { + m.SetDateHeader("X-Date", time.Now()) +} + +func ExampleMessage_SetHeader() { + m.SetHeader("Subject", "Hello!") +} + +func ExampleMessage_SetHeaders() { + m.SetHeaders(map[string][]string{ + "From": {m.FormatAddress("alex@example.com", "Alex")}, + "To": {"bob@example.com", "cora@example.com"}, + "Subject": {"Hello"}, + }) +} + +func ExampleSetCharset() { + m = gomail.NewMessage(gomail.SetCharset("ISO-8859-1")) +} + +func ExampleSetEncoding() { + m = gomail.NewMessage(gomail.SetEncoding(gomail.Base64)) +} diff --git a/vendor/gopkg.in/gomail.v2/message.go b/vendor/gopkg.in/gomail.v2/message.go new file mode 100644 index 0000000000..2f75368bda --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/message.go @@ -0,0 +1,302 @@ +package gomail + +import ( + "bytes" + "io" + "os" + "path/filepath" + "time" +) + +// Message represents an email. +type Message struct { + header header + parts []part + attachments []*file + embedded []*file + charset string + encoding Encoding + hEncoder mimeEncoder + buf bytes.Buffer +} + +type header map[string][]string + +type part struct { + header header + copier func(io.Writer) error +} + +// NewMessage creates a new message. It uses UTF-8 and quoted-printable encoding +// by default. +func NewMessage(settings ...MessageSetting) *Message { + m := &Message{ + header: make(header), + charset: "UTF-8", + encoding: QuotedPrintable, + } + + m.applySettings(settings) + + if m.encoding == Base64 { + m.hEncoder = bEncoding + } else { + m.hEncoder = qEncoding + } + + return m +} + +// Reset resets the message so it can be reused. The message keeps its previous +// settings so it is in the same state that after a call to NewMessage. +func (m *Message) Reset() { + for k := range m.header { + delete(m.header, k) + } + m.parts = nil + m.attachments = nil + m.embedded = nil +} + +func (m *Message) applySettings(settings []MessageSetting) { + for _, s := range settings { + s(m) + } +} + +// A MessageSetting can be used as an argument in NewMessage to configure an +// email. +type MessageSetting func(m *Message) + +// SetCharset is a message setting to set the charset of the email. +func SetCharset(charset string) MessageSetting { + return func(m *Message) { + m.charset = charset + } +} + +// SetEncoding is a message setting to set the encoding of the email. +func SetEncoding(enc Encoding) MessageSetting { + return func(m *Message) { + m.encoding = enc + } +} + +// Encoding represents a MIME encoding scheme like quoted-printable or base64. +type Encoding string + +const ( + // QuotedPrintable represents the quoted-printable encoding as defined in + // RFC 2045. + QuotedPrintable Encoding = "quoted-printable" + // Base64 represents the base64 encoding as defined in RFC 2045. + Base64 Encoding = "base64" + // Unencoded can be used to avoid encoding the body of an email. The headers + // will still be encoded using quoted-printable encoding. + Unencoded Encoding = "8bit" +) + +// SetHeader sets a value to the given header field. +func (m *Message) SetHeader(field string, value ...string) { + m.encodeHeader(value) + m.header[field] = value +} + +func (m *Message) encodeHeader(values []string) { + for i := range values { + values[i] = m.encodeString(values[i]) + } +} + +func (m *Message) encodeString(value string) string { + return m.hEncoder.Encode(m.charset, value) +} + +// SetHeaders sets the message headers. +func (m *Message) SetHeaders(h map[string][]string) { + for k, v := range h { + m.SetHeader(k, v...) + } +} + +// SetAddressHeader sets an address to the given header field. +func (m *Message) SetAddressHeader(field, address, name string) { + m.header[field] = []string{m.FormatAddress(address, name)} +} + +// FormatAddress formats an address and a name as a valid RFC 5322 address. +func (m *Message) FormatAddress(address, name string) string { + enc := m.encodeString(name) + if enc == name { + m.buf.WriteByte('"') + for i := 0; i < len(name); i++ { + b := name[i] + if b == '\\' || b == '"' { + m.buf.WriteByte('\\') + } + m.buf.WriteByte(b) + } + m.buf.WriteByte('"') + } else if hasSpecials(name) { + m.buf.WriteString(bEncoding.Encode(m.charset, name)) + } else { + m.buf.WriteString(enc) + } + m.buf.WriteString(" <") + m.buf.WriteString(address) + m.buf.WriteByte('>') + + addr := m.buf.String() + m.buf.Reset() + return addr +} + +func hasSpecials(text string) bool { + for i := 0; i < len(text); i++ { + switch c := text[i]; c { + case '(', ')', '<', '>', '[', ']', ':', ';', '@', '\\', ',', '.', '"': + return true + } + } + + return false +} + +// SetDateHeader sets a date to the given header field. +func (m *Message) SetDateHeader(field string, date time.Time) { + m.header[field] = []string{m.FormatDate(date)} +} + +// FormatDate formats a date as a valid RFC 5322 date. +func (m *Message) FormatDate(date time.Time) string { + return date.Format(time.RFC1123Z) +} + +// GetHeader gets a header field. +func (m *Message) GetHeader(field string) []string { + return m.header[field] +} + +// SetBody sets the body of the message. +func (m *Message) SetBody(contentType, body string) { + m.parts = []part{ + { + header: m.getPartHeader(contentType), + copier: func(w io.Writer) error { + _, err := io.WriteString(w, body) + return err + }, + }, + } +} + +// AddAlternative adds an alternative part to the message. +// +// It is commonly used to send HTML emails that default to the plain text +// version for backward compatibility. +// +// More info: http://en.wikipedia.org/wiki/MIME#Alternative +func (m *Message) AddAlternative(contentType, body string) { + m.parts = append(m.parts, + part{ + header: m.getPartHeader(contentType), + copier: func(w io.Writer) error { + _, err := io.WriteString(w, body) + return err + }, + }, + ) +} + +// AddAlternativeWriter adds an alternative part to the message. It can be +// useful with the text/template or html/template packages. +func (m *Message) AddAlternativeWriter(contentType string, f func(io.Writer) error) { + m.parts = []part{ + { + header: m.getPartHeader(contentType), + copier: f, + }, + } +} + +func (m *Message) getPartHeader(contentType string) header { + return map[string][]string{ + "Content-Type": {contentType + "; charset=" + m.charset}, + "Content-Transfer-Encoding": {string(m.encoding)}, + } +} + +type file struct { + Name string + Header map[string][]string + CopyFunc func(w io.Writer) error +} + +func (f *file) setHeader(field, value string) { + f.Header[field] = []string{value} +} + +// A FileSetting can be used as an argument in Message.Attach or Message.Embed. +type FileSetting func(*file) + +// SetHeader is a file setting to set the MIME header of the message part that +// contains the file content. +// +// Mandatory headers are automatically added if they are not set when sending +// the email. +func SetHeader(h map[string][]string) FileSetting { + return func(f *file) { + for k, v := range h { + f.Header[k] = v + } + } +} + +// SetCopyFunc is a file setting to replace the function that runs when the +// message is sent. It should copy the content of the file to the io.Writer. +// +// The default copy function opens the file with the given filename, and copy +// its content to the io.Writer. +func SetCopyFunc(f func(io.Writer) error) FileSetting { + return func(fi *file) { + fi.CopyFunc = f + } +} + +func (m *Message) appendFile(list []*file, name string, settings []FileSetting) []*file { + f := &file{ + Name: filepath.Base(name), + Header: make(map[string][]string), + CopyFunc: func(w io.Writer) error { + h, err := os.Open(name) + if err != nil { + return err + } + if _, err := io.Copy(w, h); err != nil { + h.Close() + return err + } + return h.Close() + }, + } + + for _, s := range settings { + s(f) + } + + if list == nil { + return []*file{f} + } + + return append(list, f) +} + +// Attach attaches the files to the email. +func (m *Message) Attach(filename string, settings ...FileSetting) { + m.attachments = m.appendFile(m.attachments, filename, settings) +} + +// Embed embeds the images to the email. +func (m *Message) Embed(filename string, settings ...FileSetting) { + m.embedded = m.appendFile(m.embedded, filename, settings) +} diff --git a/vendor/gopkg.in/gomail.v2/message_test.go b/vendor/gopkg.in/gomail.v2/message_test.go new file mode 100644 index 0000000000..fdd9ff9bd3 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/message_test.go @@ -0,0 +1,630 @@ +package gomail + +import ( + "bytes" + "encoding/base64" + "io" + "io/ioutil" + "path/filepath" + "regexp" + "strconv" + "strings" + "testing" + "time" +) + +func init() { + now = func() time.Time { + return time.Date(2014, 06, 25, 17, 46, 0, 0, time.UTC) + } +} + +type message struct { + from string + to []string + content string +} + +func TestMessage(t *testing.T) { + m := NewMessage() + m.SetAddressHeader("From", "from@example.com", "Señor From") + m.SetHeader("To", m.FormatAddress("to@example.com", "Señor To"), "tobis@example.com") + m.SetAddressHeader("Cc", "cc@example.com", "A, B") + m.SetAddressHeader("X-To", "ccbis@example.com", "à, b") + m.SetDateHeader("X-Date", now()) + m.SetHeader("X-Date-2", m.FormatDate(now())) + m.SetHeader("Subject", "¡Hola, señor!") + m.SetHeaders(map[string][]string{ + "X-Headers": {"Test", "Café"}, + }) + m.SetBody("text/plain", "¡Hola, señor!") + + want := &message{ + from: "from@example.com", + to: []string{ + "to@example.com", + "tobis@example.com", + "cc@example.com", + }, + content: "From: =?UTF-8?q?Se=C3=B1or_From?= \r\n" + + "To: =?UTF-8?q?Se=C3=B1or_To?= , tobis@example.com\r\n" + + "Cc: \"A, B\" \r\n" + + "X-To: =?UTF-8?b?w6AsIGI=?= \r\n" + + "X-Date: Wed, 25 Jun 2014 17:46:00 +0000\r\n" + + "X-Date-2: Wed, 25 Jun 2014 17:46:00 +0000\r\n" + + "X-Headers: Test, =?UTF-8?q?Caf=C3=A9?=\r\n" + + "Subject: =?UTF-8?q?=C2=A1Hola,_se=C3=B1or!?=\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "=C2=A1Hola, se=C3=B1or!", + } + + testMessage(t, m, 0, want) +} + +func TestBodyWriter(t *testing.T) { + m := NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.AddAlternativeWriter("text/plain", func(w io.Writer) error { + _, err := w.Write([]byte("Test message")) + return err + }) + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "Test message", + } + + testMessage(t, m, 0, want) +} + +func TestCustomMessage(t *testing.T) { + m := NewMessage(SetCharset("ISO-8859-1"), SetEncoding(Base64)) + m.SetHeaders(map[string][]string{ + "From": {"from@example.com"}, + "To": {"to@example.com"}, + "Subject": {"Café"}, + }) + m.SetBody("text/html", "¡Hola, señor!") + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Subject: =?ISO-8859-1?b?Q2Fmw6k=?=\r\n" + + "Content-Type: text/html; charset=ISO-8859-1\r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + "wqFIb2xhLCBzZcOxb3Ih", + } + + testMessage(t, m, 0, want) +} + +func TestUnencodedMessage(t *testing.T) { + m := NewMessage(SetEncoding(Unencoded)) + m.SetHeaders(map[string][]string{ + "From": {"from@example.com"}, + "To": {"to@example.com"}, + "Subject": {"Café"}, + }) + m.SetBody("text/html", "¡Hola, señor!") + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Subject: =?UTF-8?q?Caf=C3=A9?=\r\n" + + "Content-Type: text/html; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: 8bit\r\n" + + "\r\n" + + "¡Hola, señor!", + } + + testMessage(t, m, 0, want) +} + +func TestRecipients(t *testing.T) { + m := NewMessage() + m.SetHeaders(map[string][]string{ + "From": {"from@example.com"}, + "To": {"to@example.com"}, + "Cc": {"cc@example.com"}, + "Bcc": {"bcc1@example.com", "bcc2@example.com"}, + "Subject": {"Hello!"}, + }) + m.SetBody("text/plain", "Test message") + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com", "cc@example.com", "bcc1@example.com", "bcc2@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Cc: cc@example.com\r\n" + + "Subject: Hello!\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "Test message", + } + + testMessage(t, m, 0, want) +} + +func TestAlternative(t *testing.T) { + m := NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.SetBody("text/plain", "¡Hola, señor!") + m.AddAlternative("text/html", "¡Hola, señor!") + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: multipart/alternative; boundary=_BOUNDARY_1_\r\n" + + "\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "=C2=A1Hola, se=C3=B1or!\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: text/html; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "=C2=A1Hola, se=C3=B1or!\r\n" + + "--_BOUNDARY_1_--\r\n", + } + + testMessage(t, m, 1, want) +} + +func TestAttachmentOnly(t *testing.T) { + m := NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.Attach(mockCopyFile("/tmp/test.pdf")) + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: application/pdf; name=\"test.pdf\"\r\n" + + "Content-Disposition: attachment; filename=\"test.pdf\"\r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + base64.StdEncoding.EncodeToString([]byte("Content of test.pdf")), + } + + testMessage(t, m, 0, want) +} + +func TestAttachment(t *testing.T) { + m := NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.SetBody("text/plain", "Test") + m.Attach(mockCopyFile("/tmp/test.pdf")) + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: multipart/mixed; boundary=_BOUNDARY_1_\r\n" + + "\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "Test\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: application/pdf; name=\"test.pdf\"\r\n" + + "Content-Disposition: attachment; filename=\"test.pdf\"\r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + base64.StdEncoding.EncodeToString([]byte("Content of test.pdf")) + "\r\n" + + "--_BOUNDARY_1_--\r\n", + } + + testMessage(t, m, 1, want) +} + +func TestAttachmentsOnly(t *testing.T) { + m := NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.Attach(mockCopyFile("/tmp/test.pdf")) + m.Attach(mockCopyFile("/tmp/test.zip")) + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: multipart/mixed; boundary=_BOUNDARY_1_\r\n" + + "\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: application/pdf; name=\"test.pdf\"\r\n" + + "Content-Disposition: attachment; filename=\"test.pdf\"\r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + base64.StdEncoding.EncodeToString([]byte("Content of test.pdf")) + "\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: application/zip; name=\"test.zip\"\r\n" + + "Content-Disposition: attachment; filename=\"test.zip\"\r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + base64.StdEncoding.EncodeToString([]byte("Content of test.zip")) + "\r\n" + + "--_BOUNDARY_1_--\r\n", + } + + testMessage(t, m, 1, want) +} + +func TestAttachments(t *testing.T) { + m := NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.SetBody("text/plain", "Test") + m.Attach(mockCopyFile("/tmp/test.pdf")) + m.Attach(mockCopyFile("/tmp/test.zip")) + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: multipart/mixed; boundary=_BOUNDARY_1_\r\n" + + "\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "Test\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: application/pdf; name=\"test.pdf\"\r\n" + + "Content-Disposition: attachment; filename=\"test.pdf\"\r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + base64.StdEncoding.EncodeToString([]byte("Content of test.pdf")) + "\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: application/zip; name=\"test.zip\"\r\n" + + "Content-Disposition: attachment; filename=\"test.zip\"\r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + base64.StdEncoding.EncodeToString([]byte("Content of test.zip")) + "\r\n" + + "--_BOUNDARY_1_--\r\n", + } + + testMessage(t, m, 1, want) +} + +func TestEmbedded(t *testing.T) { + m := NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.Embed(mockCopyFileWithHeader(m, "image1.jpg", map[string][]string{"Content-ID": {""}})) + m.Embed(mockCopyFile("image2.jpg")) + m.SetBody("text/plain", "Test") + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: multipart/related; boundary=_BOUNDARY_1_\r\n" + + "\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "Test\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: image/jpeg; name=\"image1.jpg\"\r\n" + + "Content-Disposition: inline; filename=\"image1.jpg\"\r\n" + + "Content-ID: \r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + base64.StdEncoding.EncodeToString([]byte("Content of image1.jpg")) + "\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: image/jpeg; name=\"image2.jpg\"\r\n" + + "Content-Disposition: inline; filename=\"image2.jpg\"\r\n" + + "Content-ID: \r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + base64.StdEncoding.EncodeToString([]byte("Content of image2.jpg")) + "\r\n" + + "--_BOUNDARY_1_--\r\n", + } + + testMessage(t, m, 1, want) +} + +func TestFullMessage(t *testing.T) { + m := NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.SetBody("text/plain", "¡Hola, señor!") + m.AddAlternative("text/html", "¡Hola, señor!") + m.Attach(mockCopyFile("test.pdf")) + m.Embed(mockCopyFile("image.jpg")) + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: multipart/mixed; boundary=_BOUNDARY_1_\r\n" + + "\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: multipart/related; boundary=_BOUNDARY_2_\r\n" + + "\r\n" + + "--_BOUNDARY_2_\r\n" + + "Content-Type: multipart/alternative; boundary=_BOUNDARY_3_\r\n" + + "\r\n" + + "--_BOUNDARY_3_\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "=C2=A1Hola, se=C3=B1or!\r\n" + + "--_BOUNDARY_3_\r\n" + + "Content-Type: text/html; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "=C2=A1Hola, se=C3=B1or!\r\n" + + "--_BOUNDARY_3_--\r\n" + + "\r\n" + + "--_BOUNDARY_2_\r\n" + + "Content-Type: image/jpeg; name=\"image.jpg\"\r\n" + + "Content-Disposition: inline; filename=\"image.jpg\"\r\n" + + "Content-ID: \r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + base64.StdEncoding.EncodeToString([]byte("Content of image.jpg")) + "\r\n" + + "--_BOUNDARY_2_--\r\n" + + "\r\n" + + "--_BOUNDARY_1_\r\n" + + "Content-Type: application/pdf; name=\"test.pdf\"\r\n" + + "Content-Disposition: attachment; filename=\"test.pdf\"\r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + base64.StdEncoding.EncodeToString([]byte("Content of test.pdf")) + "\r\n" + + "--_BOUNDARY_1_--\r\n", + } + + testMessage(t, m, 3, want) + + want = &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + "Test reset", + } + m.Reset() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.SetBody("text/plain", "Test reset") + testMessage(t, m, 0, want) +} + +func TestQpLineLength(t *testing.T) { + m := NewMessage() + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.SetBody("text/plain", + strings.Repeat("0", 76)+"\r\n"+ + strings.Repeat("0", 75)+"à\r\n"+ + strings.Repeat("0", 74)+"à\r\n"+ + strings.Repeat("0", 73)+"à\r\n"+ + strings.Repeat("0", 72)+"à\r\n"+ + strings.Repeat("0", 75)+"\r\n"+ + strings.Repeat("0", 76)+"\n") + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + strings.Repeat("0", 75) + "=\r\n0\r\n" + + strings.Repeat("0", 75) + "=\r\n=C3=A0\r\n" + + strings.Repeat("0", 74) + "=\r\n=C3=A0\r\n" + + strings.Repeat("0", 73) + "=\r\n=C3=A0\r\n" + + strings.Repeat("0", 72) + "=C3=\r\n=A0\r\n" + + strings.Repeat("0", 75) + "\r\n" + + strings.Repeat("0", 75) + "=\r\n0\r\n", + } + + testMessage(t, m, 0, want) +} + +func TestBase64LineLength(t *testing.T) { + m := NewMessage(SetCharset("UTF-8"), SetEncoding(Base64)) + m.SetHeader("From", "from@example.com") + m.SetHeader("To", "to@example.com") + m.SetBody("text/plain", strings.Repeat("0", 58)) + + want := &message{ + from: "from@example.com", + to: []string{"to@example.com"}, + content: "From: from@example.com\r\n" + + "To: to@example.com\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + strings.Repeat("MDAw", 19) + "\r\nMA==", + } + + testMessage(t, m, 0, want) +} + +func testMessage(t *testing.T, m *Message, bCount int, want *message) { + err := Send(stubSendMail(t, bCount, want), m) + if err != nil { + t.Error(err) + } +} + +func stubSendMail(t *testing.T, bCount int, want *message) SendFunc { + return func(from string, to []string, m io.WriterTo) error { + if from != want.from { + t.Fatalf("Invalid from, got %q, want %q", from, want.from) + } + + if len(to) != len(want.to) { + t.Fatalf("Invalid recipient count, \ngot %d: %q\nwant %d: %q", + len(to), to, + len(want.to), want.to, + ) + } + for i := range want.to { + if to[i] != want.to[i] { + t.Fatalf("Invalid recipient, got %q, want %q", + to[i], want.to[i], + ) + } + } + + buf := new(bytes.Buffer) + _, err := m.WriteTo(buf) + if err != nil { + t.Error(err) + } + got := buf.String() + wantMsg := string("Mime-Version: 1.0\r\n" + + "Date: Wed, 25 Jun 2014 17:46:00 +0000\r\n" + + want.content) + if bCount > 0 { + boundaries := getBoundaries(t, bCount, got) + for i, b := range boundaries { + wantMsg = strings.Replace(wantMsg, "_BOUNDARY_"+strconv.Itoa(i+1)+"_", b, -1) + } + } + + compareBodies(t, got, wantMsg) + + return nil + } +} + +func compareBodies(t *testing.T, got, want string) { + // We cannot do a simple comparison since the ordering of headers' fields + // is random. + gotLines := strings.Split(got, "\r\n") + wantLines := strings.Split(want, "\r\n") + + // We only test for too many lines, missing lines are tested after + if len(gotLines) > len(wantLines) { + t.Fatalf("Message has too many lines, \ngot %d:\n%s\nwant %d:\n%s", len(gotLines), got, len(wantLines), want) + } + + isInHeader := true + headerStart := 0 + for i, line := range wantLines { + if line == gotLines[i] { + if line == "" { + isInHeader = false + } else if !isInHeader && len(line) > 2 && line[:2] == "--" { + isInHeader = true + headerStart = i + 1 + } + continue + } + + if !isInHeader { + missingLine(t, line, got, want) + } + + isMissing := true + for j := headerStart; j < len(gotLines); j++ { + if gotLines[j] == "" { + break + } + if gotLines[j] == line { + isMissing = false + break + } + } + if isMissing { + missingLine(t, line, got, want) + } + } +} + +func missingLine(t *testing.T, line, got, want string) { + t.Fatalf("Missing line %q\ngot:\n%s\nwant:\n%s", line, got, want) +} + +func getBoundaries(t *testing.T, count int, m string) []string { + if matches := boundaryRegExp.FindAllStringSubmatch(m, count); matches != nil { + boundaries := make([]string, count) + for i, match := range matches { + boundaries[i] = match[1] + } + return boundaries + } + + t.Fatal("Boundary not found in body") + return []string{""} +} + +var boundaryRegExp = regexp.MustCompile("boundary=(\\w+)") + +func mockCopyFile(name string) (string, FileSetting) { + return name, SetCopyFunc(func(w io.Writer) error { + _, err := w.Write([]byte("Content of " + filepath.Base(name))) + return err + }) +} + +func mockCopyFileWithHeader(m *Message, name string, h map[string][]string) (string, FileSetting, FileSetting) { + name, f := mockCopyFile(name) + return name, f, SetHeader(h) +} + +func BenchmarkFull(b *testing.B) { + discardFunc := SendFunc(func(from string, to []string, m io.WriterTo) error { + _, err := m.WriteTo(ioutil.Discard) + return err + }) + + m := NewMessage() + b.ResetTimer() + for n := 0; n < b.N; n++ { + m.SetAddressHeader("From", "from@example.com", "Señor From") + m.SetHeaders(map[string][]string{ + "To": {"to@example.com"}, + "Cc": {"cc@example.com"}, + "Bcc": {"bcc1@example.com", "bcc2@example.com"}, + "Subject": {"¡Hola, señor!"}, + }) + m.SetBody("text/plain", "¡Hola, señor!") + m.AddAlternative("text/html", "

    ¡Hola, señor!

    ") + m.Attach(mockCopyFile("benchmark.txt")) + m.Embed(mockCopyFile("benchmark.jpg")) + + if err := Send(discardFunc, m); err != nil { + panic(err) + } + m.Reset() + } +} diff --git a/vendor/gopkg.in/gomail.v2/mime.go b/vendor/gopkg.in/gomail.v2/mime.go new file mode 100644 index 0000000000..51cba724b6 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/mime.go @@ -0,0 +1,19 @@ +// +build go1.5 + +package gomail + +import ( + "mime" + "mime/quotedprintable" +) + +var newQPWriter = quotedprintable.NewWriter + +type mimeEncoder struct { + mime.WordEncoder +} + +var ( + bEncoding = mimeEncoder{mime.BEncoding} + qEncoding = mimeEncoder{mime.QEncoding} +) diff --git a/vendor/gopkg.in/gomail.v2/mime_go14.go b/vendor/gopkg.in/gomail.v2/mime_go14.go new file mode 100644 index 0000000000..246e2e5e5a --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/mime_go14.go @@ -0,0 +1,16 @@ +// +build !go1.5 + +package gomail + +import "gopkg.in/alexcesaro/quotedprintable.v3" + +var newQPWriter = quotedprintable.NewWriter + +type mimeEncoder struct { + quotedprintable.WordEncoder +} + +var ( + bEncoding = mimeEncoder{quotedprintable.BEncoding} + qEncoding = mimeEncoder{quotedprintable.QEncoding} +) diff --git a/vendor/gopkg.in/gomail.v2/send.go b/vendor/gopkg.in/gomail.v2/send.go new file mode 100644 index 0000000000..3e67265097 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/send.go @@ -0,0 +1,117 @@ +package gomail + +import ( + "errors" + "fmt" + "io" + "net/mail" +) + +// Sender is the interface that wraps the Send method. +// +// Send sends an email to the given addresses. +type Sender interface { + Send(from string, to []string, msg io.WriterTo) error +} + +// SendCloser is the interface that groups the Send and Close methods. +type SendCloser interface { + Sender + Close() error +} + +// A SendFunc is a function that sends emails to the given adresses. +// +// The SendFunc type is an adapter to allow the use of ordinary functions as +// email senders. If f is a function with the appropriate signature, SendFunc(f) +// is a Sender object that calls f. +type SendFunc func(from string, to []string, msg io.WriterTo) error + +// Send calls f(from, to, msg). +func (f SendFunc) Send(from string, to []string, msg io.WriterTo) error { + return f(from, to, msg) +} + +// Send sends emails using the given Sender. +func Send(s Sender, msg ...*Message) error { + for i, m := range msg { + if err := send(s, m); err != nil { + return fmt.Errorf("gomail: could not send email %d: %v", i+1, err) + } + } + + return nil +} + +func send(s Sender, m *Message) error { + from, err := m.getFrom() + if err != nil { + return err + } + + to, err := m.getRecipients() + if err != nil { + return err + } + + if err := s.Send(from, to, m); err != nil { + return err + } + + return nil +} + +func (m *Message) getFrom() (string, error) { + from := m.header["Sender"] + if len(from) == 0 { + from = m.header["From"] + if len(from) == 0 { + return "", errors.New(`gomail: invalid message, "From" field is absent`) + } + } + + return parseAddress(from[0]) +} + +func (m *Message) getRecipients() ([]string, error) { + n := 0 + for _, field := range []string{"To", "Cc", "Bcc"} { + if addresses, ok := m.header[field]; ok { + n += len(addresses) + } + } + list := make([]string, 0, n) + + for _, field := range []string{"To", "Cc", "Bcc"} { + if addresses, ok := m.header[field]; ok { + for _, a := range addresses { + addr, err := parseAddress(a) + if err != nil { + return nil, err + } + list = addAddress(list, addr) + } + } + } + + return list, nil +} + +func addAddress(list []string, addr string) []string { + for _, a := range list { + if addr == a { + return list + } + } + + return append(list, addr) +} + +func parseAddress(field string) (string, error) { + a, err := mail.ParseAddress(field) + if a == nil { + return "", err + } + + return a.Address, err +} diff --git a/vendor/gopkg.in/gomail.v2/send_test.go b/vendor/gopkg.in/gomail.v2/send_test.go new file mode 100644 index 0000000000..ba59cd3dc9 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/send_test.go @@ -0,0 +1,80 @@ +package gomail + +import ( + "bytes" + "io" + "reflect" + "testing" +) + +const ( + testTo1 = "to1@example.com" + testTo2 = "to2@example.com" + testFrom = "from@example.com" + testBody = "Test message" + testMsg = "To: " + testTo1 + ", " + testTo2 + "\r\n" + + "From: " + testFrom + "\r\n" + + "Mime-Version: 1.0\r\n" + + "Date: Wed, 25 Jun 2014 17:46:00 +0000\r\n" + + "Content-Type: text/plain; charset=UTF-8\r\n" + + "Content-Transfer-Encoding: quoted-printable\r\n" + + "\r\n" + + testBody +) + +type mockSender SendFunc + +func (s mockSender) Send(from string, to []string, msg io.WriterTo) error { + return s(from, to, msg) +} + +type mockSendCloser struct { + mockSender + close func() error +} + +func (s *mockSendCloser) Close() error { + return s.close() +} + +func TestSend(t *testing.T) { + s := &mockSendCloser{ + mockSender: stubSend(t, testFrom, []string{testTo1, testTo2}, testMsg), + close: func() error { + t.Error("Close() should not be called in Send()") + return nil + }, + } + if err := Send(s, getTestMessage()); err != nil { + t.Errorf("Send(): %v", err) + } +} + +func getTestMessage() *Message { + m := NewMessage() + m.SetHeader("From", testFrom) + m.SetHeader("To", testTo1, testTo2) + m.SetBody("text/plain", testBody) + + return m +} + +func stubSend(t *testing.T, wantFrom string, wantTo []string, wantBody string) mockSender { + return func(from string, to []string, msg io.WriterTo) error { + if from != wantFrom { + t.Errorf("invalid from, got %q, want %q", from, wantFrom) + } + if !reflect.DeepEqual(to, wantTo) { + t.Errorf("invalid to, got %v, want %v", to, wantTo) + } + + buf := new(bytes.Buffer) + _, err := msg.WriteTo(buf) + if err != nil { + t.Fatal(err) + } + compareBodies(t, buf.String(), wantBody) + + return nil + } +} diff --git a/vendor/gopkg.in/gomail.v2/smtp.go b/vendor/gopkg.in/gomail.v2/smtp.go new file mode 100644 index 0000000000..cf773a1027 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/smtp.go @@ -0,0 +1,175 @@ +package gomail + +import ( + "crypto/tls" + "fmt" + "io" + "net" + "net/smtp" +) + +// A Dialer is a dialer to an SMTP server. +type Dialer struct { + // Host represents the host of the SMTP server. + Host string + // Port represents the port of the SMTP server. + Port int + // Auth represents the authentication mechanism used to authenticate to the + // SMTP server. + Auth smtp.Auth + // SSL defines whether an SSL connection is used. It should be false in + // most cases since the authentication mechanism should use the STARTTLS + // extension instead. + SSL bool + // TSLConfig represents the TLS configuration used for the TLS (when the + // STARTTLS extension is used) or SSL connection. + TLSConfig *tls.Config +} + +// NewPlainDialer returns a Dialer. The given parameters are used to connect to +// the SMTP server via a PLAIN authentication mechanism. +// +// It fallbacks to the LOGIN mechanism if it is the only mechanism advertised by +// the server. +func NewPlainDialer(host string, port int, username, password string) *Dialer { + return &Dialer{ + Host: host, + Port: port, + Auth: &plainAuth{ + username: username, + password: password, + host: host, + }, + SSL: port == 465, + } +} + +// Dial dials and authenticates to an SMTP server. The returned SendCloser +// should be closed when done using it. +func (d *Dialer) Dial() (SendCloser, error) { + c, err := d.dial() + if err != nil { + return nil, err + } + + if d.Auth != nil { + if ok, _ := c.Extension("AUTH"); ok { + if err = c.Auth(d.Auth); err != nil { + c.Close() + return nil, err + } + } + } + + return &smtpSender{c}, nil +} + +func (d *Dialer) dial() (smtpClient, error) { + if d.SSL { + return d.sslDial() + } + return d.starttlsDial() +} + +func (d *Dialer) starttlsDial() (smtpClient, error) { + c, err := smtpDial(addr(d.Host, d.Port)) + if err != nil { + return nil, err + } + + if ok, _ := c.Extension("STARTTLS"); ok { + if err := c.StartTLS(d.tlsConfig()); err != nil { + c.Close() + return nil, err + } + } + + return c, nil +} + +func (d *Dialer) sslDial() (smtpClient, error) { + conn, err := tlsDial("tcp", addr(d.Host, d.Port), d.tlsConfig()) + if err != nil { + return nil, err + } + + return newClient(conn, d.Host) +} + +func (d *Dialer) tlsConfig() *tls.Config { + if d.TLSConfig == nil { + return &tls.Config{ServerName: d.Host} + } + + return d.TLSConfig +} + +func addr(host string, port int) string { + return fmt.Sprintf("%s:%d", host, port) +} + +// DialAndSend opens a connection to the SMTP server, sends the given emails and +// closes the connection. +func (d *Dialer) DialAndSend(m ...*Message) error { + s, err := d.Dial() + if err != nil { + return err + } + defer s.Close() + + return Send(s, m...) +} + +type smtpSender struct { + smtpClient +} + +func (c *smtpSender) Send(from string, to []string, msg io.WriterTo) error { + if err := c.Mail(from); err != nil { + return err + } + + for _, addr := range to { + if err := c.Rcpt(addr); err != nil { + return err + } + } + + w, err := c.Data() + if err != nil { + return err + } + + if _, err = msg.WriteTo(w); err != nil { + w.Close() + return err + } + + return w.Close() +} + +func (c *smtpSender) Close() error { + return c.Quit() +} + +// Stubbed out for tests. +var ( + smtpDial = func(addr string) (smtpClient, error) { + return smtp.Dial(addr) + } + tlsDial = tls.Dial + newClient = func(conn net.Conn, host string) (smtpClient, error) { + return smtp.NewClient(conn, host) + } +) + +type smtpClient interface { + Extension(string) (bool, string) + StartTLS(*tls.Config) error + Auth(smtp.Auth) error + Mail(string) error + Rcpt(string) error + Data() (io.WriteCloser, error) + Quit() error + Close() error +} diff --git a/vendor/gopkg.in/gomail.v2/smtp_test.go b/vendor/gopkg.in/gomail.v2/smtp_test.go new file mode 100644 index 0000000000..c8503489b5 --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/smtp_test.go @@ -0,0 +1,254 @@ +package gomail + +import ( + "bytes" + "crypto/tls" + "io" + "net" + "net/smtp" + "reflect" + "testing" +) + +const ( + testPort = 587 + testSSLPort = 465 +) + +var ( + testTLSConn = &tls.Conn{} + testConfig = &tls.Config{InsecureSkipVerify: true} +) + +func TestDialer(t *testing.T) { + d := NewPlainDialer(testHost, testPort, "user", "pwd") + testSendMail(t, d, []string{ + "Extension STARTTLS", + "StartTLS", + "Extension AUTH", + "Auth", + "Mail " + testFrom, + "Rcpt " + testTo1, + "Rcpt " + testTo2, + "Data", + "Write message", + "Close writer", + "Quit", + "Close", + }) +} + +func TestDialerSSL(t *testing.T) { + d := NewPlainDialer(testHost, testSSLPort, "user", "pwd") + testSendMail(t, d, []string{ + "Extension AUTH", + "Auth", + "Mail " + testFrom, + "Rcpt " + testTo1, + "Rcpt " + testTo2, + "Data", + "Write message", + "Close writer", + "Quit", + "Close", + }) +} + +func TestDialerConfig(t *testing.T) { + d := NewPlainDialer(testHost, testPort, "user", "pwd") + d.TLSConfig = testConfig + testSendMail(t, d, []string{ + "Extension STARTTLS", + "StartTLS", + "Extension AUTH", + "Auth", + "Mail " + testFrom, + "Rcpt " + testTo1, + "Rcpt " + testTo2, + "Data", + "Write message", + "Close writer", + "Quit", + "Close", + }) +} + +func TestDialerSSLConfig(t *testing.T) { + d := NewPlainDialer(testHost, testSSLPort, "user", "pwd") + d.TLSConfig = testConfig + testSendMail(t, d, []string{ + "Extension AUTH", + "Auth", + "Mail " + testFrom, + "Rcpt " + testTo1, + "Rcpt " + testTo2, + "Data", + "Write message", + "Close writer", + "Quit", + "Close", + }) +} + +func TestDialerNoAuth(t *testing.T) { + d := &Dialer{ + Host: testHost, + Port: testPort, + } + testSendMail(t, d, []string{ + "Extension STARTTLS", + "StartTLS", + "Mail " + testFrom, + "Rcpt " + testTo1, + "Rcpt " + testTo2, + "Data", + "Write message", + "Close writer", + "Quit", + "Close", + }) +} + +type mockClient struct { + t *testing.T + i int + want []string + addr string + auth smtp.Auth + config *tls.Config +} + +func (c *mockClient) Extension(ext string) (bool, string) { + c.do("Extension " + ext) + return true, "" +} + +func (c *mockClient) StartTLS(config *tls.Config) error { + assertConfig(c.t, config, c.config) + c.do("StartTLS") + return nil +} + +func (c *mockClient) Auth(a smtp.Auth) error { + assertAuth(c.t, a, c.auth) + c.do("Auth") + return nil +} + +func (c *mockClient) Mail(from string) error { + c.do("Mail " + from) + return nil +} + +func (c *mockClient) Rcpt(to string) error { + c.do("Rcpt " + to) + return nil +} + +func (c *mockClient) Data() (io.WriteCloser, error) { + c.do("Data") + return &mockWriter{c: c, want: testMsg}, nil +} + +func (c *mockClient) Quit() error { + c.do("Quit") + return nil +} + +func (c *mockClient) Close() error { + c.do("Close") + return nil +} + +func (c *mockClient) do(cmd string) { + if c.i >= len(c.want) { + c.t.Fatalf("Invalid command %q", cmd) + } + + if cmd != c.want[c.i] { + c.t.Fatalf("Invalid command, got %q, want %q", cmd, c.want[c.i]) + } + c.i++ +} + +type mockWriter struct { + want string + c *mockClient + buf bytes.Buffer +} + +func (w *mockWriter) Write(p []byte) (int, error) { + if w.buf.Len() == 0 { + w.c.do("Write message") + } + w.buf.Write(p) + return len(p), nil +} + +func (w *mockWriter) Close() error { + compareBodies(w.c.t, w.buf.String(), w.want) + w.c.do("Close writer") + return nil +} + +func testSendMail(t *testing.T, d *Dialer, want []string) { + testClient := &mockClient{ + t: t, + want: want, + addr: addr(d.Host, d.Port), + auth: testAuth, + config: d.TLSConfig, + } + + smtpDial = func(addr string) (smtpClient, error) { + assertAddr(t, addr, testClient.addr) + return testClient, nil + } + + tlsDial = func(network, addr string, config *tls.Config) (*tls.Conn, error) { + if network != "tcp" { + t.Errorf("Invalid network, got %q, want tcp", network) + } + assertAddr(t, addr, testClient.addr) + assertConfig(t, config, testClient.config) + return testTLSConn, nil + } + + newClient = func(conn net.Conn, host string) (smtpClient, error) { + if conn != testTLSConn { + t.Error("Invalid TLS connection used") + } + if host != testHost { + t.Errorf("Invalid host, got %q, want %q", host, testHost) + } + return testClient, nil + } + + if err := d.DialAndSend(getTestMessage()); err != nil { + t.Error(err) + } +} + +func assertAuth(t *testing.T, got, want smtp.Auth) { + if !reflect.DeepEqual(got, want) { + t.Errorf("Invalid auth, got %#v, want %#v", got, want) + } +} + +func assertAddr(t *testing.T, got, want string) { + if got != want { + t.Errorf("Invalid addr, got %q, want %q", got, want) + } +} + +func assertConfig(t *testing.T, got, want *tls.Config) { + if want == nil { + want = &tls.Config{ServerName: testHost} + } + if got.ServerName != want.ServerName { + t.Errorf("Invalid field ServerName in config, got %q, want %q", got.ServerName, want.ServerName) + } + if got.InsecureSkipVerify != want.InsecureSkipVerify { + t.Errorf("Invalid field InsecureSkipVerify in config, got %v, want %v", got.InsecureSkipVerify, want.InsecureSkipVerify) + } +} diff --git a/vendor/gopkg.in/gomail.v2/writeto.go b/vendor/gopkg.in/gomail.v2/writeto.go new file mode 100644 index 0000000000..57a1dd7f1e --- /dev/null +++ b/vendor/gopkg.in/gomail.v2/writeto.go @@ -0,0 +1,242 @@ +package gomail + +import ( + "encoding/base64" + "errors" + "io" + "mime" + "mime/multipart" + "path/filepath" + "time" +) + +// WriteTo implements io.WriterTo. It dumps the whole message into w. +func (m *Message) WriteTo(w io.Writer) (int64, error) { + mw := &messageWriter{w: w} + mw.writeMessage(m) + return mw.n, mw.err +} + +func (w *messageWriter) writeMessage(m *Message) { + if _, ok := m.header["Mime-Version"]; !ok { + w.writeString("Mime-Version: 1.0\r\n") + } + if _, ok := m.header["Date"]; !ok { + w.writeHeader("Date", m.FormatDate(now())) + } + w.writeHeaders(m.header) + + if m.hasMixedPart() { + w.openMultipart("mixed") + } + + if m.hasRelatedPart() { + w.openMultipart("related") + } + + if m.hasAlternativePart() { + w.openMultipart("alternative") + } + for _, part := range m.parts { + w.writeHeaders(part.header) + w.writeBody(part.copier, m.encoding) + } + if m.hasAlternativePart() { + w.closeMultipart() + } + + w.addFiles(m.embedded, false) + if m.hasRelatedPart() { + w.closeMultipart() + } + + w.addFiles(m.attachments, true) + if m.hasMixedPart() { + w.closeMultipart() + } +} + +func (m *Message) hasMixedPart() bool { + return (len(m.parts) > 0 && len(m.attachments) > 0) || len(m.attachments) > 1 +} + +func (m *Message) hasRelatedPart() bool { + return (len(m.parts) > 0 && len(m.embedded) > 0) || len(m.embedded) > 1 +} + +func (m *Message) hasAlternativePart() bool { + return len(m.parts) > 1 +} + +type messageWriter struct { + w io.Writer + n int64 + writers [3]*multipart.Writer + partWriter io.Writer + depth uint8 + err error +} + +func (w *messageWriter) openMultipart(mimeType string) { + mw := multipart.NewWriter(w) + contentType := "multipart/" + mimeType + "; boundary=" + mw.Boundary() + w.writers[w.depth] = mw + + if w.depth == 0 { + w.writeHeader("Content-Type", contentType) + w.writeString("\r\n") + } else { + w.createPart(map[string][]string{ + "Content-Type": {contentType}, + }) + } + w.depth++ +} + +func (w *messageWriter) createPart(h map[string][]string) { + w.partWriter, w.err = w.writers[w.depth-1].CreatePart(h) +} + +func (w *messageWriter) closeMultipart() { + if w.depth > 0 { + w.writers[w.depth-1].Close() + w.depth-- + } +} + +func (w *messageWriter) addFiles(files []*file, isAttachment bool) { + for _, f := range files { + if _, ok := f.Header["Content-Type"]; !ok { + mediaType := mime.TypeByExtension(filepath.Ext(f.Name)) + if mediaType == "" { + mediaType = "application/octet-stream" + } + f.setHeader("Content-Type", mediaType+`; name="`+f.Name+`"`) + } + + if _, ok := f.Header["Content-Transfer-Encoding"]; !ok { + f.setHeader("Content-Transfer-Encoding", string(Base64)) + } + + if _, ok := f.Header["Content-Disposition"]; !ok { + var disp string + if isAttachment { + disp = "attachment" + } else { + disp = "inline" + } + f.setHeader("Content-Disposition", disp+`; filename="`+f.Name+`"`) + } + + if !isAttachment { + if _, ok := f.Header["Content-ID"]; !ok { + f.setHeader("Content-ID", "<"+f.Name+">") + } + } + w.writeHeaders(f.Header) + w.writeBody(f.CopyFunc, Base64) + } +} + +func (w *messageWriter) Write(p []byte) (int, error) { + if w.err != nil { + return 0, errors.New("gomail: cannot write as writer is in error") + } + + var n int + n, w.err = w.w.Write(p) + w.n += int64(n) + return n, w.err +} + +func (w *messageWriter) writeString(s string) { + n, _ := io.WriteString(w.w, s) + w.n += int64(n) +} + +func (w *messageWriter) writeStrings(a []string, sep string) { + if len(a) > 0 { + w.writeString(a[0]) + if len(a) == 1 { + return + } + } + for _, s := range a[1:] { + w.writeString(sep) + w.writeString(s) + } +} + +func (w *messageWriter) writeHeader(k string, v ...string) { + w.writeString(k) + w.writeString(": ") + w.writeStrings(v, ", ") + w.writeString("\r\n") +} + +func (w *messageWriter) writeHeaders(h map[string][]string) { + if w.depth == 0 { + for k, v := range h { + if k != "Bcc" { + w.writeHeader(k, v...) + } + } + } else { + w.createPart(h) + } +} + +func (w *messageWriter) writeBody(f func(io.Writer) error, enc Encoding) { + var subWriter io.Writer + if w.depth == 0 { + w.writeString("\r\n") + subWriter = w.w + } else { + subWriter = w.partWriter + } + + if enc == Base64 { + wc := base64.NewEncoder(base64.StdEncoding, newBase64LineWriter(subWriter)) + w.err = f(wc) + wc.Close() + } else if enc == Unencoded { + w.err = f(subWriter) + } else { + wc := newQPWriter(subWriter) + w.err = f(wc) + wc.Close() + } +} + +// As required by RFC 2045, 6.7. (page 21) for quoted-printable, and +// RFC 2045, 6.8. (page 25) for base64. +const maxLineLen = 76 + +// base64LineWriter limits text encoded in base64 to 76 characters per line +type base64LineWriter struct { + w io.Writer + lineLen int +} + +func newBase64LineWriter(w io.Writer) *base64LineWriter { + return &base64LineWriter{w: w} +} + +func (w *base64LineWriter) Write(p []byte) (int, error) { + n := 0 + for len(p)+w.lineLen > maxLineLen { + w.w.Write(p[:maxLineLen-w.lineLen]) + w.w.Write([]byte("\r\n")) + p = p[maxLineLen-w.lineLen:] + n += maxLineLen - w.lineLen + w.lineLen = 0 + } + + w.w.Write(p) + w.lineLen += len(p) + + return n + len(p), nil +} + +// Stubbed out for testing. +var now = time.Now diff --git a/vendor/gopkg.in/yaml.v2/scannerc.go b/vendor/gopkg.in/yaml.v2/scannerc.go index 25808000f2..2c9d5111f9 100644 --- a/vendor/gopkg.in/yaml.v2/scannerc.go +++ b/vendor/gopkg.in/yaml.v2/scannerc.go @@ -9,7 +9,7 @@ import ( // ************ // // The following notes assume that you are familiar with the YAML specification -// (http://yaml.org/spec/cvs/current.html). We mostly follow it, although in +// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in // some cases we are less restrictive that it requires. // // The process of transforming a YAML stream into a sequence of events is